Part Number:TMS320F28335
我通过使用EPWM1中断实现EPWM1与EPWM4的内移相程序(即初始EPWM1与EPWM4的移相角为半个周期),期间EPWM2与EPWM3的时钟关闭。当EPWM1与EPWM4的移相比为0,即同相时打开EPWM2与EPWM3的时钟,但我打开EPWM2与EPWM3的时钟时,初始TBCTR不为0,这是为什么呢?
EPwm1Regs.ETSEL.bit.INTEN=0; //关PWM1(内移相)中断 EALLOW;EPwm2Regs.TBCTR=0;EPwm3Regs.TBCTR=0;EPwm5Regs.TBCTR=0;EPwm6Regs.TBCTR=0; //CpuTimer0Regs.TCR.bit.TSS = 0; //启动PID中断,即启动定时器0 //DELAY_US(1.1); //为了错开启动PWM2,3时因PWM1产生同步信号而产生的影响while(EPwm1Regs.TBCTR != 0);SysCtrlRegs.PCLKCR1.bit.EPWM2ENCLK=1; //PWM2,3时钟开启SysCtrlRegs.PCLKCR1.bit.EPWM3ENCLK=1;SysCtrlRegs.PCLKCR1.bit.EPWM5ENCLK=1; //PWM2,3时钟开启SysCtrlRegs.PCLKCR1.bit.EPWM6ENCLK=1;EPwm2Regs.TZCLR.bit.OST=1; //清除PWM2,3错误联防标志位EPwm3Regs.TZCLR.bit.OST=1;EPwm5Regs.TZCLR.bit.OST=1; //清除PWM2,3错误联防标志位EPwm6Regs.TZCLR.bit.OST=1;EDIS;
? ?:
以上问题找到原因了,可能是关闭EPWM2和EPWM3时钟后,更改不了TBCTR的值。但我现在想在EPWM1上升沿的时候(也即EPWM的TBCTR=0)打开EPWM2的时钟并赋值TBCTR,我现在用的是while,见代码第9行,但是因为指令周期与TBCTR之间存在时间差,并不能在第一时间就判断成功,而是时快时慢,请问有什么办法能更好地判断EPWM1上升沿(也即EPWM的TBCTR=0)时打开EPWM2的时钟吗?
,
Ben Qin:
你好,可以尝试使用中断,在中断中打开EPWM2.
,
? ?:
代码就是在EPWM1的中断程序里面的
,
? ?:
就算使用中断,也不能完全保证当EPWM1的TBCTR=0的时候就判断成功,因为进中断后TBCTR仍然在计数。
,
Ben Qin:
我查看下相关资料后回复您
,
Ben Qin:
对的,这种情况应该是不可避免的吧。
,
? ?:
那使用while之后,给对应PEWM的TBCTR相应补偿一些值应该就可以
,
Ben Qin:
是的
,
? ?:
在使用这种方法时遇到一个问题,有时候会一直卡在while(EPwm1Regs.TBCTR != 0);这里,形成死循环,能规避吗?