This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

28335的ePWM使用死区模块以后如何彻底关断(全部拉低)PWM脉冲?



原设计使用ePWM的AQ模块输入PWMxA,PWMxB两个互补的脉冲,没有使用死区,使用AQCSFRC寄存器控制AQ模块输出,关闭时两个管脚均强制输出低电平。
后来使能死区DB模块以后,经过死区模块DB以后,使用AQ模块输出的PWMxA作为上升沿和下降沿延时。关闭AQCSFRC寄存器控制关闭PWM脉冲以后,互补的一对脉冲变成了一高一低,不是需要的两个低电平。
使用死区以后如何能强制PWM输出低电平呢?

  • 由于死区控制位于动作限定模块之后,如果都要关闭,则需要关闭死区功能,再次使能脉冲的时候再使能死区功能

  • 建议勇TZ模块强制关闭,可以用软件强制触发one-shot功能的方法。

  • 设计便是如此吗? TZ模块我使用了,用于在外部故障时直接关闭全部PWM脉冲。 我这里只是需要在正常运行时开关脉冲而已,也必须用TZ模块来开关吗? 如果这样,感觉是不合理的。

  • 建议用TZ,TZ强制PWM高低比较直接,如果你用AQ模块强制高低的话,就需要计算DB模块的反相器影响。

  • 以下两个开关PWM的函数,是否是这样实现的?初始化时设置TZ行为,比如强制低。
    关闭PWM时,软件通过设置TZFRC.bit.OST制造一个TZ事件,使能PWM的时候再清掉这个事件。
    这方法总感觉怪怪的,还是使用AQCSFRC设置感觉顺一点。

    void EnablePWM(void)
    {

      EALLOW;
      EPwm1Regs.TZCLR.bit.OST = 1;
      EPwm2Regs.TZCLR.bit.OST = 1;
      EPwm3Regs.TZCLR.bit.OST = 1;
      EPwm4Regs.TZCLR.bit.OST = 1;
      EPwm5Regs.TZCLR.bit.OST = 1;
      EPwm6Regs.TZCLR.bit.OST = 1;
      EDIS;

     

    }

    void DisablePWM(void)
    {
      EALLOW;
      EPwm1Regs.TZFRC.bit.OST = 1;
      EPwm2Regs.TZFRC.bit.OST = 1;
      EPwm3Regs.TZFRC.bit.OST = 1;
      EPwm4Regs.TZFRC.bit.OST = 1;
      EPwm5Regs.TZFRC.bit.OST = 1;
      EPwm6Regs.TZFRC.bit.OST = 1;
      EDIS;
    }

  • 我的TZ模块用了5个输入,分别连接硬件保护信号,低电平硬件保护,软件通过查询TZFLG.bit.OST来确定外部硬件故障。
    现在加入软件TZ 关闭PWM脉冲以后,软件无法判断是硬件故障保护关闭的PWM脉冲还是软件正常关闭的PWM脉冲,看了一下TZ部分的寄存器,似乎不能确定TZ的源,也就是无法区分TZ来自哪一个硬件输入或者软件强制。
    有没有比较好的解决办法? 

  • 是的,TZ无法区分是哪一种信号,你也可以试一下CSFA, CSFB, AQ模块的关脉冲功能

  • 另外你之前遇到用这个功能会出高电平的原因是AQ模块后面是DB模块,你在用死区的时候打开了反相器,所以本来AQ置低的变成了高,你只需要将CSFA控制低,CSFB控制出高就可以了。

  • 问题是AQ模块在DB模块之前,使用DB模块以后,DB模块实际上只使用了AQ模块的A输出,也就是只有CSFA有效,控制CSFB没有意义。

  • 您好!跟您碰到的是同一个问题,想请教您最后是怎么解决这个问题的!谢谢您!期待您的回复啊~