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.

TMS320F28335: EPWM移相的时候会出现长时间低/高电平

Part Number: TMS320F28335


以EPWM1为参考,使用EPWM移相寄存器控制其他EPWM进行移相时,当更改PHSDIR功能位从1到0时(移相比从正值逐渐变化到负值),PWM会出现很长时间的低/高电平,想请教一下各位有什么好的办法能够避免这个问题吗?

  • 请上传一下配置和波形

  • EPwm5Regs.TBSTS.all=0;
    	        EPwm5Regs.TBPHS.half.TBPHS=0;     
    	        EPwm5Regs.TBCTR=0;                
    
    	        EPwm5Regs.CMPCTL.all=0x50;        
    	        EPwm5Regs.CMPA.half.CMPA =750*0.5;   
    	        EPwm5Regs.CMPB=0;
    
    	        EPwm5Regs.AQCTLA.all=0x6;        
    	                                                  
    	        EPwm5Regs.AQCTLB.all=0;
    	        EPwm5Regs.AQSFRC.all=0;
    	        EPwm5Regs.AQCSFRC.all=0;
    
    	        EPwm5Regs.TZSEL.all=0x0300;
    	        EPwm5Regs.TZCTL.all=0;
    	        EPwm5Regs.TZEINT.all=0;
    	        EPwm5Regs.TZFLG.all=0;
    	        EPwm5Regs.TZCLR.all=0;
    	        EPwm5Regs.TZCTL.bit.TZA = 0x2;   
    	        EPwm5Regs.TZCTL.bit.TZB = 0x2;
    	                                                  
    	        EPwm5Regs.DBRED=10;              
    	        EPwm5Regs.DBFED=10;
    
    	        EPwm5Regs.ETSEL.all=0;           
    	        EPwm5Regs.ETFLG.all=0;
    	        EPwm5Regs.ETCLR.all=0;
    	        EPwm5Regs.ETFRC.all=0;
    
    	        EPwm5Regs.PCCTL.all=0;
    	        EPwm5Regs.TBCTL.all=0x0020+200E;   
    	        EPwm5Regs.TBCTL.bit.PHSEN = 0;         
    	        EPwm5Regs.TBPRD=750;               
                  if(PWM2_CC_Duty < -0.4)
                  {
                   PWM2_CC_Duty1 = 0.4;
                   PWM2_CC_Duty = -0.4;
          	       EPwm5Regs.TBCTL.all=0x0020+200E;
                   EPwm5Regs.TBPHS.half.TBPHS=PWM2_CC_Duty1*phase_shift_cycle;
    
                  }
                  else if(PWM2_CC_Duty >= -0.4 && PWM2_CC_Duty < -0.007)
                  {
                  PWM2_CC_Duty1 = -PWM2_CC_Duty;
          	      EPwm5Regs.TBCTL.all=0x0020+200E;
                  EPwm5Regs.TBPHS.half.TBPHS=PWM2_CC_Duty1*phase_shift_cycle;
                  }
                  
                    if(PWM2_CC_Duty >= 0 && PWM2_CC_Duty <= 0.4)
                     {
             	     EPwm5Regs.TBCTL.all=0x0020+000E;   
             	     PWM2_CC_Duty1 = PWM2_CC_Duty;
                     EPwm5Regs.TBPHS.half.TBPHS=PWM2_CC_Duty1*phase_shift_cycle;
                     }
    ,移相比(PWM2_CC_Duty)是利用PI算的。

  • 第一段代码的第32行,方便解释一下200E是什么吗?

  • 就是为了使用TBPHS来进行移相操作,PHSDIR值为1,用来控制移相方向。

  • 同步信号是由哪个模块在什么时刻产生的?这个问题复现的概率是多大?

  • EPWM1的CTR=CMPB的时候,产生同步信号,这里相当于等于0的时候,这个问题只要是从滞后移相到超前移相就会出现。

  • 通过循环改变PWM2_CC_Duty的值,可以实现改变TBPHS的值,即TBPHS=PWM2_CC_Duty1*phase_shift_cycle,其中phase_shift_cycle=750.当PWM2_CC_Duty1从正变为负,即PHSDIR从0变到1,从超前移相到滞后移相,即相对于EPWM1的位置从右往左移相。越过0相位左右时发生持续低电平现象。

  • 两个模块的周期相同吗?

    这里相当于等于0的时候

    为什么说相当于等于0的时候,是CMPB设置为0吗?这个芯片上TBPHS寄存器没有影子寄存器,同步信号到来时便会立即装载。设计的时候有没有考虑这个因素?

  • 周期都是一样的,CMPB设置的是0,我直接更改的TBPHS来更改移相值,这个和有无影子寄存器有影响吗?

  • 因为我改变TBPHS值的方式是通过PI调节改变PWM2_CC_Duty1,通过它改变的TBPHS的值,基本是线性改变,对于实现移相功能,有没有影子寄存器对他没什么影响吧?

  • EPWM1和EPWM4的配置是一样的,都是在CTR=CMPB,我设置的CMPB=0,也就是CTR=0的时候发出同步信号,之后EPWM5直接将TBPHS的值装载到TBCTR,其他时刻都没问题,就是EPWM5相对于EPWM4也就是EPWM1从滞后移相到超前移相的时候,即从右往左移相的时候。当PWM2_CC_Duty1<0.007的时候EPWM5A就会保持长时间的低电平,对应5B为长时间的高电平。

  • 你好,能麻烦回复一下吗

  • 程序可以在最小系统板上单独运行吗?方便的话上传一下工程,我看一下。

  • 好的,我稍后吧工程发给您

  • 你好,我把工程文件发给您了。

  • 你好,请问收到文件了吗

  • 收到了,我需要一些时间来看一下

  • 您好,您复现出问题了吗?

  • 已经在看了。因为这款芯片时间比较久了,手头没有合适的板子来调试。我再想想办法

  • 我这里运行正常,没有出现长时间的低电平,程序按照预期执行。

    黄色是EPWM2A,紫色是EPWM5A。

  • 这样看可能不好看出来,需要使用触发设置低电平时间超过6us来看才看得出来长时间低电平,您的示波器可以吗

  • 我之后换一台试一下。

    有没有在别的板子上试过?有没有做过ABA测试?

  • 我试过很多板子,都有问题,都是从滞后到超前移相过零点附近就会出现长时间低电平

  • ,黄色是EPWM1A,蓝色分别是EPWM5A,5B。

  • TI 的PWM在移相操作时需要特别注意移相值和AQCTLA(CMPA)、AQCTLB(CMPB)的位置,如果移相值在CMPA、CMPB附近左右变化时就会出现丢波的问题,原因是同步信号载入移相值时,是的PWM CTR值突变,会跳过CMPA或CMPAB指定值,导致AQCTLA,AQCTLB指定的动作没有发生。

    你这里又带入了动态切换同步信号产生时调整PHSDIR的处理,这样更容易出现上上述问题。

    如果你是做DAB的拓扑,需要原副边PWM具有超前也有滞后的相位关系,我建议一个PWM方案,

    PWM1作为同步源,PWM2作为原边PWM,PWM4作为副边PWM,这样PWM2和PWM4都只需要相对PWM1进行一个方向移相就能达到PWM4超前或滞后PWM2的相位关系。仅供参考。

  • 可是载入移相值的频率和PWM的频率是一样的,移相值被转载进去后,在下一个同步信号到来之前也会经过一个周期,也会到达CMPB,理论上应该会动作,可是实际却没有发生动作。

  • 如果你只载入一次,那么如你所说在下次同步信号来自前会到达CMPB。到时每个周期都会执行载入值,那情况就严重了。

    举个例子,在ZERO点PWM置高,移相后的计数方向为UP,在某个时间段载入的移相值为0附近,假设为1,slave的计数器有可能还未计数到0就被同步信号改变为1了,而且是UP计数,所以本周期不会再到0,PWM本周期也不会置高,丢失一个周期的内的高电平,下个周期的载入值如果还是1,那么问题又回复现。

    至于你的测试丢了多个周期的高电平,要根据实际情况去查为什么。

    这个问题我是在项目中经过反复验证的,如果移相值在动作值附近,肯定会导致PWM丢波的问题。

  • 非常感谢参与讨论!

    手里的问题有些多,之前的问题确实有些记得不太清楚了。。

    ,我也找到了原来的中文帖,可以参考一下:

    https://e2echina.ti.com/support/microcontrollers/c2000/f/c2000-microcontrollers-forum/349506/tms320f280049c-pwm-0-0

  • 好的,感谢!

  • 客气了~我们非常欢迎大家来TI E2E论坛上讨论