请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
器件型号:TMS320F28P659DK-Q1主题:SysConfig 中讨论的其他器件
尊敬的德克萨斯团队:
我目前正在测试一个三相逆变器。
我的输出可以正常工作、但我正在努力找到正确的方法来覆盖 PWM 输出 使用了 跳闸区 。 具体来说、我需要三个具有互补输出的 PWM、可以根据软件控制同时强制这些 PWM 为零(或释放)。
除了这一点、三个 PWM 的配置方式相同 PWM_A 生成同步输出信号、而 PWM_B 和 PWM_C 将其用作同步输入信号。 它们按预期运行、但当我调用函数PwmRunModeOff并PwmRunModeOn控制覆盖时、代码有时仅关闭一个或两个输出、而不是全部关闭。
下面附上了相关代码:
void PwmRunModeOff(void) {
uint16_t i;
// Optional: freeze TBCLK if you want simultaneity across modules
// SysCtl_disablePeripheral(SYSCTL_PERIPH_CLK_TBCLKSYNC);
for (i = 0; i < sizeof(kPwmBases) / sizeof(kPwmBases[0]); ++i) {
const uint32_t base = kPwmBases[i];
EALLOW;
// Ensure trip actions will force final outputs LOW
EPWM_setTripZoneAction(base, EPWM_TZ_ACTION_EVENT_TZA, EPWM_TZ_ACTION_LOW);
EPWM_setTripZoneAction(base, EPWM_TZ_ACTION_EVENT_TZB, EPWM_TZ_ACTION_LOW);
// Prevent a TZ ISR from clearing OST while we hold
EPWM_disableTripZoneInterrupt(base, EPWM_TZ_INTERRUPT_OST | EPWM_TZ_INTERRUPT_CBC);
// Make sure AQ continuous SW forces are not active
EPWM_setActionQualifierContSWForceAction(base, EPWM_AQ_OUTPUT_A, EPWM_AQ_SW_DISABLED);
EPWM_setActionQualifierContSWForceAction(base, EPWM_AQ_OUTPUT_B, EPWM_AQ_SW_DISABLED);
// Clear stale latches so our new OST is the only one observed
EPWM_clearTripZoneFlag(base,
EPWM_TZ_INTERRUPT_OST | EPWM_TZ_INTERRUPT_CBC |
EPWM_TZ_FLAG_DCAEVT1 | EPWM_TZ_FLAG_DCAEVT2 |
EPWM_TZ_FLAG_DCBEVT1 | EPWM_TZ_FLAG_DCBEVT2);
// Latch OST (post-deadband outputs go LOW)
EPWM_forceTripZoneEvent(base, EPWM_TZ_FORCE_EVENT_OST);
EDIS;
}
// Verify latch once
for (i = 0; i < sizeof(kPwmBases) / sizeof(kPwmBases[0]); ++i) {
const uint32_t base = kPwmBases[i];
if ((EPWM_getTripZoneFlagStatus(base) & EPWM_TZ_FLAG_OST) == 0U) {
EALLOW;
EPWM_forceTripZoneEvent(base, EPWM_TZ_FORCE_EVENT_OST);
EDIS;
}
}
// SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_TBCLKSYNC);
turn_off_drivers();
}
void PwmRunModeOn(void) {
uint16_t i;
// Optional: align release to TBCTR==0 on your master for a clean first edge
// while (EPWM_getTimeBaseCounter(PWM_A_BASE) != 0U) {}
for (i = 0; i < sizeof(kPwmBases) / sizeof(kPwmBases[0]); ++i) {
const uint32_t base = kPwmBases[i];
EALLOW;
// Clear OST/CBC & DC flags so PWM resumes
EPWM_clearTripZoneFlag(base,
EPWM_TZ_INTERRUPT_OST | EPWM_TZ_INTERRUPT_CBC |
EPWM_TZ_FLAG_DCAEVT1 | EPWM_TZ_FLAG_DCAEVT2 |
EPWM_TZ_FLAG_DCBEVT1 | EPWM_TZ_FLAG_DCBEVT2);
// Ensure no AQ SW force
EPWM_setActionQualifierContSWForceAction(base, EPWM_AQ_OUTPUT_A, EPWM_AQ_SW_DISABLED);
EPWM_setActionQualifierContSWForceAction(base, EPWM_AQ_OUTPUT_B, EPWM_AQ_SW_DISABLED);
// Unmask TZ interrupts again if you use them elsewhere
EPWM_enableTripZoneInterrupt(base, EPWM_TZ_INTERRUPT_OST | EPWM_TZ_INTERRUPT_CBC);
EDIS;
}
turn_on_drivers();
}
您能否建议使用跳闸区实现此同步 PWM 覆盖的正确或建议方法?
提前感谢您、

