Part Number:TMS320F28374S
在使用EPWM模块来产生PWM驱动的时候,出现了一些很异常的现象,即会出现PWM驱动丢失或者PWM密集输出的情况
(使用到了载波移相,EPWM3的具体配置如下)
// Set-up TBCLK
EPWM_setClockPrescaler(EPWM3_BASE, EPWM_CLOCK_DIVIDER_1, EPWM_HSCLOCK_DIVIDER_1);
EPWM_setTimeBasePeriod(EPWM3_BASE, INV_PWM_PERIOD);
EPWM_setTimeBaseCounter(EPWM3_BASE, 0U);
EPWM_setTimeBaseCounterMode(EPWM3_BASE, EPWM_COUNTER_MODE_UP_DOWN);
EPWM_enablePhaseShiftLoad(EPWM3_BASE);
EPWM_setPhaseShift(EPWM3_BASE, INV_PWM_PHASERELOAD);
EPWM_setCountModeAfterSync(EPWM3_BASE,EPWM_COUNT_MODE_DOWN_AFTER_SYNC);
EPWM_setSyncOutPulseMode(EPWM3_BASE, EPWM_SYNC_OUT_PULSE_ON_EPWMxSYNCIN);
// Set up shadowing
EPWM_setCounterCompareShadowLoadMode(EPWM3_BASE, EPWM_COUNTER_COMPARE_A, EPWM_COMP_LOAD_ON_CNTR_PERIOD);
// Set Compare values
EPWM_setCounterCompareValue(EPWM3_BASE, EPWM_COUNTER_COMPARE_A, 0);
// Set actions
EPWM_setActionQualifierAction(EPWM3_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_LOW, EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPA);
EPWM_setActionQualifierAction(EPWM3_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_HIGH, EPWM_AQ_OUTPUT_ON_TIMEBASE_DOWN_CMPA);
// Set dead-band – Use EPWMA as the input for both RED and FED
EPWM_setRisingEdgeDeadBandDelayInput(EPWM3_BASE, EPWM_DB_INPUT_EPWMA);
EPWM_setFallingEdgeDeadBandDelayInput(EPWM3_BASE, EPWM_DB_INPUT_EPWMA);
// Set dead-band – Set the RED and FED values
EPWM_setFallingEdgeDelayCount(EPWM3_BASE, INV_PWM_DB);
EPWM_setRisingEdgeDelayCount(EPWM3_BASE, INV_PWM_DB);
// Set dead-band – Do not invert the delayed outputs (AH)
EPWM_setDeadBandDelayPolarity(EPWM3_BASE, EPWM_DB_RED, EPWM_DB_POLARITY_ACTIVE_HIGH);
EPWM_setDeadBandDelayPolarity(EPWM3_BASE, EPWM_DB_FED, EPWM_DB_POLARITY_ACTIVE_LOW);
// Set dead-band – Use the delayed signals instead of the original signals
EPWM_setDeadBandDelayMode(EPWM3_BASE, EPWM_DB_RED, false);
EPWM_setDeadBandDelayMode(EPWM3_BASE, EPWM_DB_FED, false);
在PWM驱动输出时,控制EPWM1和3按照下面两个条件进行输出,每一个PWM周期切换一次
EPWM_setCounterCompareValue(EPWM1_BASE, EPWM_COUNTER_COMPARE_A, 0.5*TIMEBASEPRD);
EPWM_setCounterCompareValue(EPWM3_BASE, EPWM_COUNTER_COMPARE_A, 0U);
EPWM_setCounterCompareValue(EPWM1_BASE, EPWM_COUNTER_COMPARE_A, 0U);
EPWM_setCounterCompareValue(EPWM3_BASE, EPWM_COUNTER_COMPARE_A, 0.5*TIMEBASEPRD);
想请问专家,什么情况下可能会出现驱动丢失呢?如何排查该问题呢?
如果将上面EPWM的周期寄存器写0修改为通过软件强制来触发,即EPWM_setActionQualifierContSWForceAction(EPWM1_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_SW_DISABLED)
然后将3个PWM周期作为一个输出单元,又会随机出现丢失一个PWM周期驱动的情况,如下
(上图中的黄的PWM输出,第三个pwm波还会随机被砍掉一块,如下图)
EPWM_setActionQualifierContSWForceAction,这个软件强制指令立刻生效吗?是否有shadowmode之类的?
另外,在解除软件强制的时候,PWM输出在那个瞬间是什么样的呢?会根据比较寄存器和周期寄存器的大小来立刻输出PWM驱动吗?
还有在对一路PWM的计数寄存器更新的时候,可能会出现更新的效果被同步到了另外一路,如下图
Yale Li:
之前碰到过类似的问题,请参考一下这两个帖子以及其中对应的英文贴:
https://e2echina.ti.com/support/microcontrollers/c2000/f/c2000-microcontrollers-forum/349506/tms320f280049c-pwm-0-0
https://e2echina.ti.com/support/microcontrollers/c2000/f/c2000-microcontrollers-forum/756634/tms320f28335-epwm
,
user980814:
感谢大佬恢复。
在发帖之前,看到过上面提到的两个帖子,帖子里提到的情况主要是PHASEN数据和比较寄存器接近,或者动态修改,导致错过比较匹配的情况
但我这里是将移相值固定设置为周期寄存器,而且是有点随机出现PWM紊乱的情况,和帖子里提到的情况不一样。
大佬看看是否还有其他可能呢?目前已知是错过PWM匹配动作会产生脉冲丢失,但这种主要是出现在动态调整移相值,和我这里的情况不相同。
,
Yale Li:
user980814 said:
在PWM驱动输出时,控制EPWM1和3按照下面两个条件进行输出,每一个PWM周期切换一次
EPWM_setCounterCompareValue(EPWM1_BASE, EPWM_COUNTER_COMPARE_A, 0.5*TIMEBASEPRD); EPWM_setCounterCompareValue(EPWM3_BASE, EPWM_COUNTER_COMPARE_A, 0U);
EPWM_setCounterCompareValue(EPWM1_BASE, EPWM_COUNTER_COMPARE_A, 0U);EPWM_setCounterCompareValue(EPWM3_BASE, EPWM_COUNTER_COMPARE_A, 0.5*TIMEBASEPRD);
虽然移相值是固定的,但是CC值是变化的。这也是有可能造成丢波的。移相值和CC值具体是多少?可以顺着这个方向再考虑一下。
user980814 said:EPWM_setActionQualifierContSWForceAction,这个软件强制指令立刻生效吗?是否有shadowmode之类的?
对于持续性的软件动作,是有shadowmode的;
user980814 said:另外,在解除软件强制的时候,PWM输出在那个瞬间是什么样的呢?会根据比较寄存器和周期寄存器的大小来立刻输出PWM驱动吗?
如果不加软件动作的话,原本是什么动作,撤掉软件动作之后,就是什么动作。
,
user980814:
感谢您的回复。
Yale Li said:虽然移相值是固定的,但是CC值是变化的。这也是有可能造成丢波的。移相值和CC值具体是多少?可以顺着这个方向再考虑一下
移相值固定,表示两个的载波是相对固定的
我在计数器达到周期寄存器数据时,对比较寄存器进行更新。这样的话,按理说每一次更新比较寄存器后的瞬间,计数寄存器等于周期寄存器,比较寄存器要么被更新为0,要么被更新为0.5倍的周期寄存器,因此在接下来的调制中,应该会按照设定的稳定输出PWM波吧?感觉不可能会出现匹配丢失造成丢波的情况