Part Number:TMS320F280049C
PWM2和PWM3是一样的配置,同时都是以PWM1作为master。操作PWM3相对PWM2移相180度后,发现PWM3相比PWM2滞后了10ns, 根据我的配置,1个TBCLK的周期是10ns。 这种情况是什么原因导致的呢?要怎么解决?
移相接口是库函数:EPWM_setPhaseShift(uint32_t base, uint16_t phaseCount);
Swein Zhang:
补充下:问题的现象是移相后的波形比预期的滞后了10ns.
,
Green Deng:
一般来说,PWM各模块间同步会有1~2个系统时钟周期的误差,也就是信号到达后,计数器置入周期值的延时。如果TB子模块没有分频,即TBCLK = SYSCLKOUT,那么延时是2个系统时钟周期。即当EPWM1产生同步信号的瞬间,经过2个时钟周期,被同步的模块才能将TBPHS设置的值置入计数器。例如设置EPWM1. SYNCOSEL = 01 (CTR = 0时输出同步脉冲),只要你后续的模块EPWM2、EPWM3、EPWM4、EPWM5都设置了SYNCOSEL = 00 (输入脉冲直接输出),那么这个信号对于后续模块都是在CTR = 0同时到达的,这一点可以通过状态寄存器TBSTS的同步事件状态位观察是不是在该时刻发生了同步事件。只是后续模块在当前时刻不置数,1个周期后CTR = 1也不置数,2个周期后CTR = 2的上升沿才置数,即TBPHS置入TBCTR,即发生了同步。如果设置TBPHS = 200, 那么你会发现实际的计数值差是198,这是因为2个周期之后才置数;所以若要想保持差值是200,就要考虑延时,设置TBPHS = 200 + 2 = 202,这样差值就是200.
如果TB子模块有分频,即TBCLK ~= SYSCLKOUT,也就是比系统时钟慢,那么一个TBCLK就可以同步了。即设置200 + 1 = 201.
,
Swein Zhang:
谢谢这么详细的解释!
您的解释我很认可,芯片的TRM中有简单的提及同步的delay, 解释远没你的详细。
The delay from internal master module to slave modules is given by:– if ( TBCLK = EPWMCLK): 2 x EPWMCLK– if ( TBCLK < EPWMCLK): 1 x TBCLK
不过我的工程已经是补偿了2个TBCLK的相移了,PWM1作为master,PWM2移相2,PWM3移相500+2,TBPRD为1000,按照预期PWM3应该是相对PWM2移相了半个周期,即500。但是实际PWM3移动了499,少了1个counter, 不知道是什么原因引起的?
,
Green Deng:
说实话,上述的分析是基于理论的,但是实际会不会多(或者少)一两个周期可能会跟具体使用情况相关。不知道如果程序上补齐了这一个counter之后能不能达到完美的同步呢?
,
Swein Zhang:
我用的是UP count模式,我举例的应用的频率是100K, 将TBPRD设为1000,会出现上述问题,将TBPRD设为999后,就不出现问题了。从测试结果看UP count模式,从PRD到ZERO会被当作一个CTR,所以造成少移了一个CTR的现象。