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.

TMS320F28374S: 关于EPWM驱动丢失的问题

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的计数寄存器更新的时候,可能会出现更新的效果被同步到了另外一路,如下图