Part Number:TMS320F28335
以EPWM1为参考,使用EPWM移相寄存器控制其他EPWM进行移相时,当更改PHSDIR功能位从1到0时(移相比从正值逐渐变化到负值),PWM会出现很长时间的低/高电平,想请教一下各位有什么好的办法能够避免这个问题吗?
Yale Li:
请上传一下配置和波形
,
Fan Pu:
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算的。
,
Fan Pu:
,
Yale Li:
第一段代码的第32行,方便解释一下200E是什么吗?
,
Fan Pu:
就是为了使用TBPHS来进行移相操作,PHSDIR值为1,用来控制移相方向。
,
Yale Li:
同步信号是由哪个模块在什么时刻产生的?这个问题复现的概率是多大?
,
Fan Pu:
EPWM1的CTR=CMPB的时候,产生同步信号,这里相当于等于0的时候,这个问题只要是从滞后移相到超前移相就会出现。
,
Fan Pu:
通过循环改变PWM2_CC_Duty的值,可以实现改变TBPHS的值,即TBPHS=PWM2_CC_Duty1*phase_shift_cycle,其中phase_shift_cycle=750.当PWM2_CC_Duty1从正变为负,即PHSDIR从0变到1,从超前移相到滞后移相,即相对于EPWM1的位置从右往左移相。越过0相位左右时发生持续低电平现象。
,
Yale Li:
两个模块的周期相同吗?
Fan Pu 说:这里相当于等于0的时候
为什么说相当于等于0的时候,是CMPB设置为0吗?这个芯片上TBPHS寄存器没有影子寄存器,同步信号到来时便会立即装载。设计的时候有没有考虑这个因素?
,
Fan Pu:
周期都是一样的,CMPB设置的是0,我直接更改的TBPHS来更改移相值,这个和有无影子寄存器有影响吗?
,
Fan Pu:
因为我改变TBPHS值的方式是通过PI调节改变PWM2_CC_Duty1,通过它改变的TBPHS的值,基本是线性改变,对于实现移相功能,有没有影子寄存器对他没什么影响吧?
,
Fan Pu:
EPWM1和EPWM4的配置是一样的,都是在CTR=CMPB,我设置的CMPB=0,也就是CTR=0的时候发出同步信号,之后EPWM5直接将TBPHS的值装载到TBCTR,其他时刻都没问题,就是EPWM5相对于EPWM4也就是EPWM1从滞后移相到超前移相的时候,即从右往左移相的时候。当PWM2_CC_Duty1<0.007的时候EPWM5A就会保持长时间的低电平,对应5B为长时间的高电平。
,
Fan Pu:
你好,能麻烦回复一下吗
,
Yale Li:
程序可以在最小系统板上单独运行吗?方便的话上传一下工程,我看一下。
,
Fan Pu:
好的,我稍后吧工程发给您
,
Fan Pu:
Phase.zip
,
Fan Pu:
你好,我把工程文件发给您了。
,
Fan Pu:
你好,请问收到文件了吗
,
Yale Li:
收到了,我需要一些时间来看一下
,
Fan Pu:
您好,您复现出问题了吗?
,
Yale Li:
已经在看了。因为这款芯片时间比较久了,手头没有合适的板子来调试。我再想想办法
,
Yale Li:
我这里运行正常,没有出现长时间的低电平,程序按照预期执行。
(function(id)
{var v = document.getElementById(id);var op = v.style.position, ol = v.style.left, or = v.style.right, fe = [];var nodeLimit = 50;checkVideo = function() {if (!v.canPlayType || v.error) {var bound = 0;while (v.childNodes.length > 0 && bound < nodeLimit) {bound++;if (v.childNodes[0].nodeName != 'SOURCE') {v.parentNode.insertBefore(v.childNodes[0], v);}}v.parentNode.removeChild(v);} else if (v.readyState == 0) {window.setTimeout(checkVideo, 249);}},checkVideoRendered = function() {if (v.networkState == 1 && v.readyState == 4) {v.style.position = op;v.style.left = ol;v.style.right = or;for (var i = 0; i < fe.length; i++) {fe[i].parentNode.removeChild(fe[i]);}} else {window.setTimeout(checkVideoRendered, 249);}}if (navigator.userAgent.indexOf('iPad') == -1 && navigator.userAgent.indexOf('iPhone') == -1 && navigator.userAgent.indexOf('iPod') == -1) {window.setTimeout(checkVideo, 249);}
})('v_409d4a7c5a914f318213bd25945184d8');黄色是EPWM2A,紫色是EPWM5A。
,
Fan Pu:
这样看可能不好看出来,需要使用触发设置低电平时间超过6us来看才看得出来长时间低电平,您的示波器可以吗
,
Yale Li:
我之后换一台试一下。
有没有在别的板子上试过?有没有做过ABA测试?
,
Fan Pu:
我试过很多板子,都有问题,都是从滞后到超前移相过零点附近就会出现长时间低电平
,
Fan Pu:
(function(id)
{var v = document.getElementById(id);var op = v.style.position, ol = v.style.left, or = v.style.right, fe = [];var nodeLimit = 50;checkVideo = function() {if (!v.canPlayType || v.error) {var bound = 0;while (v.childNodes.length > 0 && bound < nodeLimit) {bound++;if (v.childNodes[0].nodeName != 'SOURCE') {v.parentNode.insertBefore(v.childNodes[0], v);}}v.parentNode.removeChild(v);} else if (v.readyState == 0) {window.setTimeout(checkVideo, 249);}},checkVideoRendered = function() {if (v.networkState == 1 && v.readyState == 4) {v.style.position = op;v.style.left = ol;v.style.right = or;for (var i = 0; i < fe.length; i++) {fe[i].parentNode.removeChild(fe[i]);}} else {window.setTimeout(checkVideoRendered, 249);}}if (navigator.userAgent.indexOf('iPad') == -1 && navigator.userAgent.indexOf('iPhone') == -1 && navigator.userAgent.indexOf('iPod') == -1) {window.setTimeout(checkVideo, 249);}
})('v_9aa33c0d1ccc46688633113fd5b5f82a');
(function(id)
{var v = document.getElementById(id);var op = v.style.position, ol = v.style.left, or = v.style.right, fe = [];var nodeLimit = 50;checkVideo = function() {if (!v.canPlayType || v.error) {var bound = 0;while (v.childNodes.length > 0 && bound < nodeLimit) {bound++;if (v.childNodes[0].nodeName != 'SOURCE') {v.parentNode.insertBefore(v.childNodes[0], v);}}v.parentNode.removeChild(v);} else if (v.readyState == 0) {window.setTimeout(checkVideo, 249);}},checkVideoRendered = function() {if (v.networkState == 1 && v.readyState == 4) {v.style.position = op;v.style.left = ol;v.style.right = or;for (var i = 0; i < fe.length; i++) {fe[i].parentNode.removeChild(fe[i]);}} else {window.setTimeout(checkVideoRendered, 249);}}if (navigator.userAgent.indexOf('iPad') == -1 && navigator.userAgent.indexOf('iPhone') == -1 && navigator.userAgent.indexOf('iPod') == -1) {window.setTimeout(checkVideo, 249);}
})('v_cc9da6f1d6b14cbbb27984018feeaf6d');,黄色是EPWM1A,蓝色分别是EPWM5A,5B。
,
Yale Li:
好的
,
Aiden zhang:
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的相位关系。仅供参考。
,
Fan Pu:
可是载入移相值的频率和PWM的频率是一样的,移相值被转载进去后,在下一个同步信号到来之前也会经过一个周期,也会到达CMPB,理论上应该会动作,可是实际却没有发生动作。
,
Aiden zhang:
如果你只载入一次,那么如你所说在下次同步信号来自前会到达CMPB。到时每个周期都会执行载入值,那情况就严重了。
举个例子,在ZERO点PWM置高,移相后的计数方向为UP,在某个时间段载入的移相值为0附近,假设为1,slave的计数器有可能还未计数到0就被同步信号改变为1了,而且是UP计数,所以本周期不会再到0,PWM本周期也不会置高,丢失一个周期的内的高电平,下个周期的载入值如果还是1,那么问题又回复现。
至于你的测试丢了多个周期的高电平,要根据实际情况去查为什么。
这个问题我是在项目中经过反复验证的,如果移相值在动作值附近,肯定会导致PWM丢波的问题。
,
Aiden zhang:
TMS320F280049C: The first period of the output waveform is abnormal after the PWM phase shift value changes from 0 to non-0 – C2000 microcontrollers forum – C2000︎ microcontrollers – TI E2E support forums这个帖子你可以看看