跳转至内容
  • 版块
  • 最新
  • 标签
  • 热门
折叠
品牌标识

YunTu Forum

YTMicro.com
  1. 主页
  2. Discussion & Question
  3. YTM32B1L系列
  4. 使用ptmr产生1S定时器,在定时器内让PTC2和PTC3交叉输出PWM(20KHZ,占空比20%)和高电平,程序出现卡死

使用ptmr产生1S定时器,在定时器内让PTC2和PTC3交叉输出PWM(20KHZ,占空比20%)和高电平,程序出现卡死

已定时 已固定 已锁定 已移动 YTM32B1L系列
11 帖子 3 发布者 186 浏览
  • 从旧到新
  • 从新到旧
  • 最多赞同
登录后回复
此主题已被删除。只有拥有主题管理权限的用户可以查看。
  • DigaD 离线
    DigaD 离线
    Diga
    写于 最后由 编辑
    #2

    你说的这个过程可以全程用 PWM 实现。例如0%占空比就是低电平,100%占空比就是高电平,你可以在你的定时器中断里去更新 PWM 的占空比与频率,就不用修改引脚配置了,Task 也会比较简单

    ryw3509R 1 条回复 最后回复
    0
    • ryw3509R 离线
      ryw3509R 离线
      ryw3509
      在 回复了 Diga 最后由 编辑
      #3

      Diga 你好!

      按照你所述,我这里做了调整,现在遇到一个新的问题:
      void Etmr_Drv_Init(void)
      {
      eTMR_DRV_Init(eTMR0_INST,&ETMR_CM_Config0,&ETMR_CM_Config0_State);
      eTMR_DRV_InitPwm(eTMR0_INST,&ETMR_PWM_Config0);
      /* PWM is generated when eTMR enable, the duty cycle is configured in the initial function */
      eTMR_DRV_Enable(eTMR0_INST);
      OSIF_TimeDelay(10);

      /* The following code shows how to switch the different duty cycle */
      /* channel 2 duty cycle is 20% */
      eTMR_DRV_UpdatePwmChannel(eTMR0_INST, 2, 0x8000U, 0);
      /* channel 3 duty cycle is 20% */
      eTMR_DRV_UpdatePwmChannel(eTMR0_INST, 3, 0x8000U, 0);
      eTMR_DRV_SetLdok(0);
      OSIF_TimeDelay(10);
      

      // PRINTF("CH2 output 20KHZ duty 20, CH3 output 20KHZ duty 20\n");
      }
      按照当前配置,正常应该是输出高电平,但是实测全部是低电平,将两路的0x8000U更改为0x0000U,输出的也是低电平,请问怎么回事啊?

      谢谢~

      1 条回复 最后回复
      0
      • ryw3509R 离线
        ryw3509R 离线
        ryw3509
        写于 最后由 编辑
        #4

        eTMR_DRV_UpdatePwmChannel(eTMR0_INST, 2, 0x4000U, 0);
        eTMR_DRV_UpdatePwmChannel(eTMR0_INST, 3, 0x8000U, 0);
        按照这样的配置,2输出的占空比为50%,频率为20K的波形,但3输出的还是低电平。

        1 条回复 最后回复
        0
        • DigaD 离线
          DigaD 离线
          Diga
          写于 最后由 编辑
          #5

          此时输出别的占空比波形正确嘛?会不会引脚的PINMUX被修改了,或者引脚接错了

          ryw3509R 1 条回复 最后回复
          0
          • ryw3509R 离线
            ryw3509R 离线
            ryw3509
            在 回复了 Diga 最后由 编辑
            #6

            Diga 经过实测,只要不是0x8000U和0x0000U,输出的波形都是正常的。

            1 条回复 最后回复
            0
            • qinzhaoQ 离线
              qinzhaoQ 离线
              qinzhao
              写于 最后由 编辑
              #7

              0x8000是100%占空比,0是0%占空比。极性反了就相反

              1 条回复 最后回复
              0
              • DigaD 离线
                DigaD 离线
                Diga
                写于 最后由 编辑
                #8

                这个是因为 YTM32B1LE0 无法通过 SDK 直接输出 100%占空比,设置 0x0 or 0x8000 都是0%PWM。
                云途有个相关 Errata,里面有介绍如何真正输出 100% PWM,可以向云途的 FAE或销售咨询获取

                ryw3509R 1 条回复 最后回复
                0
                • ryw3509R 离线
                  ryw3509R 离线
                  ryw3509
                  在 回复了 Diga 最后由 编辑
                  #9

                  Diga 参考了例程,里面有这样的说明:
                  /* The following code shows how to switch the different duty cycle /
                  /
                  channel 2 duty cycle is 50% /
                  eTMR_DRV_UpdatePwmChannel(0, 2, 0x4000U, 0);
                  /
                  channel 3 duty cycle is 50% */
                  eTMR_DRV_UpdatePwmChannel(0, 3, 0x4000U, 0);
                  eTMR_DRV_SetLdok(0);
                  OSIF_TimeDelay(10);

                  **/* channel 2 100% duty cycle, here is the workaround for 100% duty cycle */
                  eTMR0->CH[2].VAL0 = 0;
                  eTMR0->CH[2].VAL1 = eTMR0->MOD + 1;
                  eTMR_DRV_SetLdok(0);
                  OSIF_TimeDelay(10);**
                  

                  按照这样的配置,通道2输出的是100%占空比,也就是高电平了。
                  通道3是50%占空比。

                  1 条回复 最后回复
                  0
                  • ryw3509R 离线
                    ryw3509R 离线
                    ryw3509
                    写于 最后由 编辑
                    #10

                    留存记录:
                    卡死原因:在定时器内加入了延时导致。

                    DigaD 1 条回复 最后回复
                    0
                    • DigaD 离线
                      DigaD 离线
                      Diga
                      在 回复了 ryw3509 最后由 编辑
                      #11

                      ryw3509 OSIF_TimeDelay() 延时是通过 Systick 来计数的,通常 Systick 优先级设置成比模块中断低或者相等。如果在模块中断中调用该函数,由于Systick 无法抢占当前中断,内部的一个 Counter 计数不会变化,这个函数会死等,也就是卡死。

                      1 条回复 最后回复
                      0

                    • 云途论坛规则/Yuntu Forum Rules

                      发帖前请查看

                    • YCT离线License申请流程

                      帮助没办法联网的电脑使用YCT

                    • YT CONFIG TOOL调查问卷

                      帮助改进和优化YT CONFIG TOOL,有机会抽取YTM32B1ME0 EVB哦...

                    • demo
                      12
                      can
                      9
                      lin stack
                      6
                      yt-link
                      5
                      vscode
                      3
                      adc模块
                      2
                      i2c
                      2
                      uuid
                      2
                      Online Users
                      YanglzY
                      Yanglz
                      YTCQ_shejiwangY
                      YTCQ_shejiwang
                      kasselK
                      kassel
                      FrankieF
                      Frankie
                      KeanuChenQAQK
                      KeanuChenQAQ
                      jankyJ
                      janky
                      • 登录

                      • 登录或注册以进行搜索。
                      • 第一个帖子
                        最后一个帖子
                      0
                      • 版块
                      • 最新
                      • 标签
                      • 热门