以EPWM1为参考,使用EPWM移相寄存器控制其他EPWM进行移相时,当更改PHSDIR功能位从1到0时(移相比从正值逐渐变化到负值),PWM会出现很长时间的低/高电平,想请教一下各位有什么好的办法能够避免这个问题吗?
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.
以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算的。我这里运行正常,没有出现长时间的低电平,程序按照预期执行。
黄色是EPWM2A,紫色是EPWM5A。
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的相位关系。仅供参考。
如果你只载入一次,那么如你所说在下次同步信号来自前会到达CMPB。到时每个周期都会执行载入值,那情况就严重了。
举个例子,在ZERO点PWM置高,移相后的计数方向为UP,在某个时间段载入的移相值为0附近,假设为1,slave的计数器有可能还未计数到0就被同步信号改变为1了,而且是UP计数,所以本周期不会再到0,PWM本周期也不会置高,丢失一个周期的内的高电平,下个周期的载入值如果还是1,那么问题又回复现。
至于你的测试丢了多个周期的高电平,要根据实际情况去查为什么。
这个问题我是在项目中经过反复验证的,如果移相值在动作值附近,肯定会导致PWM丢波的问题。