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.

[参考译文] TMS320F28379D:TMS320F28379D:相移 PWM、缺少脉冲

Guru**** 2524550 points
Other Parts Discussed in Thread: SYSCONFIG

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1312604/tms320f28379d-tms320f28379d-phase-shift-pwm-missing-pulse

器件型号:TMS320F28379D
主题中讨论的其他器件:SysConfig

您好!
我正在运行一个在 ePWM1和 ePWM2之间具有相移控制功能的直流/直流转换器、占空比为50%、TBPRD=2000、CMPA=1000。
加载相移时、每次 TBPHS 通过1000时、我都缺少一个 PWM 周期。

ePWM2如下所示:

我已尝试避免跳过1000、但改为在超过1000时使 TBPHS 递增、但这不会产生任何差异、仍然缺少一个周期。
如果在 TBPHS 等于1001时发生同步脉冲、我认为 TBCTR 应该为1000 (最后一个 TBPHS 值)并将输出设置为高电平、但事实似乎不是这样。
设置 TBPHS 的函数未与 TBCTR 同步运行、但不管 TBPHS 何时置位、其行为似乎都是相同的。
你能给我启示我应该做什么或想什么吗?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Kenneth:

    在我看来、 当同步脉冲以特定值发生时、缺少操作。 可能发生的一个已知问题 是  、当发生同步脉冲时、TBCTR 可能会跳过 CMPA 并错过您在 CMPA 上设置的动作限定符(这取决于 TBPHS 值、计数器方向和 CMPA 值等因素)。 您能否发送 ePWM 配置代码以便我更好地了解一下? 是否更改 EPWM1和 EPWM2的 TBPHS? 该问题是否 仅在 EPWM2上出现?

    此致、

    艾里森

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Allison:感谢您的回复。

    ´m 仅更改 EPWM2上的 TBPHS、问题仅出现在此处。

    以下是由 SysConfig 创建的 EPWM1和 EPWM2的启动代码:

    EPWM_setEmulationMode (PWM_Prim1_base、EPWM_emulation_free_run);
    ePWM_setClockPrescaler (PWM_Prim1_base、ePWM_Clock_divider _1、ePWM_HSCLOCK 除法器_1);
    EPWM_setTimeBasePeriod (PWM_Prim1_base、2000);
    EPWM_setTimeBaseCounter (PWM_Prim1_base、0);
    EPWM_setTimeBaseCounterMode (PWM_Prim1_base、EPWM_COUNTER_MODE_UP_DOWN);
    ePWM_setCountModeAfterSync (PWM_Prim1_base、ePWM_COUNT_MODE_UP_AFTER_SYNC);
    EPWM_disablePhaseShiftLoad (PWM_Prim1_base);
    EPWM_setPhaseShift (PWM_Prim1_base、0);
    EPWM_FORCESyncPulse (PWM_Prim1_base);
    EPWM_setSyncOutPulseMode (PWM_Prim1_base、EPWM_SYNC_OUT_PULSE_ON_COUNTER_ZERO);
    EPWM_setSyncPulseSource (PWM_Prim1_base、HRPWM_PWMSYNC_SOURCE_ZERO);
    EPWM_setCounterCompareValue (PWM_Prim1_base、EPWM_COUNTER_COMPARE_A、1000);
    EPWM_setCounterCompareShadowLoadMode (PWM_Prim1_base、EPWM_COUNTER_COMPARE_A、EPWM_COMP_LOAD_ON_CNTR_ZERO);
    EPWM_setCounterCompareValue (PWM_Prim1_base、EPWM_COUNTER_COMPARE_B、1000);
    EPWM_setCounterCompareShadowLoadMode (PWM_Prim1_base、EPWM_COUNTER_COMPARE_B、EPWM_COMP_LOAD_ON_CNTR_ZERO);
    EPWM_setActionQualifierAction (PWM_Prim1_BASE、EPWM_AQ_OUTPUT_A、EPWM_AQ_OUTPUT_NO_CHANGE、EPWM_AQ_OUTPUT_ON_TIMEBASE_ZERO);
    EPWM_setActionQualifierAction (PWM_Prim1_BASE、EPWM_AQ_OUTPUT_A、EPWM_AQ_OUTPUT_NO_CHANGE、EPWM_AQ_OUTPUT_ON_TIMEBASE_PERIOD);
    EPWM_setActionQualifierAction (PWM_Prim1_base、EPWM_AQ_OUTPUT_A、EPWM_AQ_OUTPUT_HIGH、EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPA);
    EPWM_setActionQualifierAction (PWM_Prim1_base、EPWM_AQ_OUTPUT_A、EPWM_AQ_OUTPUT_LOW、EPWM_AQ_OUTPUT_ON_TIMEBASE_DOWN_CMPA);
    EPWM_setActionQualifierAction (PWM_Prim1_BASE、EPWM_AQ_OUTPUT_A、EPWM_AQ_OUTPUT_NO_CHANGE、EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPB);
    EPWM_setActionQualifierAction (PWM_Prim1_BASE、EPWM_AQ_OUTPUT_A、EPWM_AQ_OUTPUT_NO_CHANGE、EPWM_AQ_OUTPUT_ON_TIMEBASE_DOWN_CMPB);
    EPWM_setActionQualifierAction (PWM_Prim1_BASE、EPWM_AQ_OUTPUT_B、EPWM_AQ_OUTPUT_NO_CHANGE、EPWM_AQ_OUTPUT_ON_TIMEBASE_ZERO);
    EPWM_setActionQualifierAction (PWM_Prim1_BASE、EPWM_AQ_OUTPUT_B、EPWM_AQ_OUTPUT_NO_CHANGE、EPWM_AQ_OUTPUT_ON_TIMEBASE_PERIOD);
    EPWM_setActionQualifierAction (PWM_Prim1_base、EPWM_AQ_OUTPUT_B、EPWM_AQ_OUTPUT_NO_CHANGE、EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPA);
    EPWM_setActionQualifierAction (PWM_Prim1_BASE、EPWM_AQ_OUTPUT_B、EPWM_AQ_OUTPUT_NO_CHANGE、EPWM_AQ_OUTPUT_ON_TIMEBASE_DOWN_CMPA);
    EPWM_setActionQualifierAction (PWM_Prim1_base、EPWM_AQ_OUTPUT_B、EPWM_AQ_OUTPUT_LOW、EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPB);
    EPWM_setActionQualifierAction (PWM_Prim1_BASE、EPWM_AQ_OUTPUT_B、EPWM_AQ_OUTPUT_HIGH、EPWM_AQ_OUTPUT_ON_TIMEBASE_DOWN_CMPB);
    ePWM_enableTripZoneAdvAction (PWM_Prim1_base);
    ePWM_setTripZoneAdvAction (PWM_Prim1_base、ePWM_TZ_ADV_ACTION_EVENT_TZB_D、ePWM_TZ_ADV_ACTION_LOW);
    ePWM_setTripZoneAdvAction (PWM_Prim1_base、ePWM_TZ_ADV_ACTION_EVENT_TZB_U、ePWM_TZ_ADV_ACTION_LOW);
    ePWM_setTripZoneAdvAction (PWM_Prim1_base、ePWM_TZ_ADV_ACTION_EVENT_TZA_D、ePWM_TZ_ADV_ACTION_LOW);
    ePWM_setTripZoneAdvAction (PWM_Prim1_base、ePWM_TZ_ADV_ACTION_EVENT_TZA_U、ePWM_TZ_ADV_ACTION_LOW);
    ePWM_setTripZoneAdvDigitalCompareActionA (PWM_Prim1_base、ePWM_TZ_ADV_ACTION_EVENT_DCxEVT1_U、ePWM_TZ_ADV_ACTION_LOW);
    ePWM_setTripZoneAdvDigitalCompareActionA (PWM_Prim1_base、ePWM_TZ_ADV_ACTION_EVENT_DCxEVT1_D、ePWM_TZ_ADV_ACTION_LOW);
    ePWM_setTripZoneAdvDigitalCompareActionB (PWM_Prim1_base、ePWM_TZ_ADV_ACTION_EVENT_DCxEVT1_U、ePWM_TZ_ADV_ACTION_LOW);
    ePWM_setTripZoneAdvDigitalCompareActionB (PWM_Prim1_base、ePWM_TZ_ADV_ACTION_EVENT_DCxEVT1_D、ePWM_TZ_ADV_ACTION_LOW);
    ePWM_enableTripZoneSignals (PWM_Prim1_base、ePWM_TZ_SIGNAL_DCAEVT1);
    EPWM_setDeadBandDelayPolarity (PWM_Prim1_BASE、EPWM_DB_FED、EPWM_DB_POLICY_ACTIVE_LOW);
    ePWM_setDeadBandDelayMode (PWM_Prim1_base、ePWM_DB_RED、TRUE);
    EPWM_setRisingEdgeDelayCount (PWM_Prim1_base、50)
    ePWM_setDeadBandDelayMode (PWM_Prim1_BASE、ePWM_DB_FED、true);
    EPWM_setFallingEdgeDelayCount (PWM_Prim1_BASE、50);
    EPWM_setEmulationMode (PWM_Prim2_base、EPWM_emulation_free_run);
    ePWM_setClockPrescaler (PWM_Prim2_base、ePWM_Clock_divider _1、ePWM_HSCLOCK_divider _1);
    ePWM_setPeriodLoadMode (PWM_Prim2_base、ePWM_Period_Direct_load);
    ePWM_setTimeBasePeriod (PWM_Prim2_base、2000);
    EPWM_setTimeBaseCounter (PWM_Prim2_base、0);
    EPWM_setTimeBaseCounterMode (PWM_Prim2_base、EPWM_COUNTER_MODE_UP_DOWN);
    ePWM_setCountModeAfterSync (PWM_Prim2_base、ePWM_COUNT_MODE_UP_AFTER_SYNC);
    EPWM_enablePhaseShiftLoad (PWM_Prim2_base);
    EPWM_setPhaseShift (PWM_Prim2_base、0);
    EPWM_setSyncOutPulseMode (PWM_Prim2_base、EPWM_SYNC_OUT_PULSE_DISABLED);
    EPWM_setSyncPulseSource (PWM_Prim2_base、HRPWM_PWMSYNC_SOURCE_ZERO);
    EPWM_setCounterCompareValue (PWM_Prim2_base、epwm_counter_compare_A、1000);
    EPWM_setCounterCompareShadowLoadMode (PWM_Prim2_base、EPWM_COUNTER_COMPARE_A、EPWM_COMP_LOAD_ON_CNTR_ZERO);
    EPWM_setCounterCompareValue (PWM_Prim2_base、EPWM_COUNTER_COMPARE_B、1000);
    EPWM_setCounterCompareShadowLoadMode (PWM_Prim2_base、EPWM_COUNTER_COMPARE_B、EPWM_COMP_LOAD_ON_CNTR_ZERO);
    EPWM_setActionQualifierAction (PWM_Prim2_base、EPWM_AQ_OUTPUT_A、EPWM_AQ_OUTPUT_NO_CHANGE、EPWM_AQ_OUTPUT_ON_TIMEBASE_ZERO);
    EPWM_setActionQualifierAction (PWM_Prim2_base、EPWM_AQ_OUTPUT_A、EPWM_AQ_OUTPUT_NO_CHANGE、EPWM_AQ_OUTPUT_ON_TIMEBASE_PERIOD);
    EPWM_setActionQualifierAction (PWM_Prim2_base、EPWM_AQ_OUTPUT_A、EPWM_AQ_OUTPUT_HIGH、EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPA);
    EPWM_setActionQualifierAction (PWM_Prim2_base、EPWM_AQ_OUTPUT_A、EPWM_AQ_OUTPUT_LOW、EPWM_AQ_OUTPUT_ON_TIMEBASE_DOWN_CMPA);
    EPWM_setActionQualifierAction (PWM_Prim2_base、EPWM_AQ_OUTPUT_A、EPWM_AQ_OUTPUT_NO_CHANGE、EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPB);
    EPWM_setActionQualifierAction (PWM_Prim2_base、EPWM_AQ_OUTPUT_A、EPWM_AQ_OUTPUT_NO_CHANGE、EPWM_AQ_OUTPUT_ON_TIMEBASE_DOWN_CMPB);
    EPWM_setActionQualifierAction (PWM_Prim2_base、EPWM_AQ_OUTPUT_B、EPWM_AQ_OUTPUT_NO_CHANGE、EPWM_AQ_OUTPUT_ON_TIMEBASE_ZERO);
    EPWM_setActionQualifierAction (PWM_Prim2_base、EPWM_AQ_OUTPUT_B、EPWM_AQ_OUTPUT_NO_CHANGE、EPWM_AQ_OUTPUT_ON_TIMEBASE_PERIOD);
    EPWM_setActionQualifierAction (PWM_Prim2_base、EPWM_AQ_OUTPUT_B、EPWM_AQ_OUTPUT_NO_CHANGE、EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPA);
    EPWM_setActionQualifierAction (PWM_Prim2_base、EPWM_AQ_OUTPUT_B、EPWM_AQ_OUTPUT_NO_CHANGE、EPWM_AQ_OUTPUT_ON_TIMEBASE_DOWN_CMPA);
    EPWM_setActionQualifierAction (PWM_Prim2_base、EPWM_AQ_OUTPUT_B、EPWM_AQ_OUTPUT_NO_CHANGE、EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPB);
    EPWM_setActionQualifierAction (PWM_Prim2_base、EPWM_AQ_OUTPUT_B、EPWM_AQ_OUTPUT_NO_CHANGE、EPWM_AQ_OUTPUT_ON_TIMEBASE_DOWN_CMPB);
    ePWM_enableTripZoneAdvAction (PWM_Prim2_base);
    EPWM_setTripZoneAction (PWM_Prim2_base、EPWM_TZ_ACTION_EVENT_DCAEVT1、EPWM_TZ_ACTION_LOW);
    EPWM_setTripZoneAction (PWM_Prim2_base、EPWM_TZ_ACTION_EVENT_DCAEVT2、EPWM_TZ_ACTION_LOW);
    ePWM_setTripZoneAdvAction (PWM_Prim2_base、ePWM_TZ_ADV_ACTION_EVENT_TZB_D、ePWM_TZ_ADV_ACTION_LOW);
    ePWM_setTripZoneAdvAction (PWM_Prim2_base、ePWM_TZ_ADV_ACTION_EVENT_TZB_U、ePWM_TZ_ADV_ACTION_LOW);
    ePWM_setTripZoneAdvAction (PWM_Prim2_base、ePWM_TZ_ADV_ACTION_EVENT_TZA_D、ePWM_TZ_ADV_ACTION_LOW);
    ePWM_setTripZoneAdvAction (PWM_Prim2_base、ePWM_TZ_ADV_ACTION_EVENT_TZA_U、ePWM_TZ_ADV_ACTION_LOW);
    ePWM_setTripZoneAdvDigitalCompareActionA (PWM_Prim2_base、ePWM_TZ_ADV_ACTION_EVENT_DCxEVT1_U、ePWM_TZ_ADV_ACTION_LOW);
    ePWM_setTripZoneAdvDigitalCompareActionA (PWM_Prim2_base、ePWM_TZ_ADV_ACTION_EVENT_DCxEVT1_D、ePWM_TZ_ADV_ACTION_LOW);
    ePWM_setTripZoneAdvDigitalCompareActionB (PWM_Prim2_base、ePWM_TZ_ADV_ACTION_EVENT_DCxEVT1_U、ePWM_TZ_ADV_ACTION_LOW);
    ePWM_setTripZoneAdvDigitalCompareActionB (PWM_Prim2_base、ePWM_TZ_ADV_ACTION_EVENT_DCxEVT1_D、ePWM_TZ_ADV_ACTION_LOW);
    ePWM_enableTripZoneSignals (PWM_Prim2_base、ePWM_TZ_SIGNAL_DCAEVT1);
    EPWM_setDeadBandDelayPolarity (PWM_Prim2_base、EPWM_DB_FED、EPWM_DB_POLICY_ACTIVE_LOW);
    ePWM_setDeadBandDelayMode (PWM_Prim2_base、ePWM_DB_RED、TRUE);
    ePWM_setRisingEdgeDelayCount (PWM_Prim2_base、50);
    ePWM_setDeadBandDelayMode (PWM_Prim2_base、ePWM_DB_FED、true);
    EPWM_setFallingEdgeDelayCount (PWM_Prim2_base、50);

    我尝试使用以下非常简单的代码来避免跳过 CMPA。 它以5kHz 的频率运行、PWM 以25kHz 的频率运行:


    PHASE =((TimeBasePeriod *(uint32_t) PHI_prim))/ 1000;

    if ((PHASE > 1000)&(OLD_PHASE < 1000)){// upcount
     相位= 1000;

    OLD_PHASE =((TimeBasePeriod *(uint32_t) PHI_prim))/ 1000;

    ePWM_setPhaseShift (PWM_Prim2_base、(uint16_t) phase);// PWM_Prim2_base 控制初级侧的内部相位

    此致

    肯尼斯

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Kenneth:

    感谢您提供的信息和配置。 您要使用什么来更新 TBPHS 值(是否使用 ISR? PHI_prim 的来源是什么?)。 对于在不断变化的同步脉冲上缺少 AQ、建议的一种权变措施是检查/比较 TBPHS 和 CMPA 值(几乎 类似于上述响应中的做法) 但是、然后使用 T1和 T2动作限定器事件来执行将丢失的操作。

    以下是帮助说明的简要说明。 通常在以下情况下会漏掉 AQ:

    1. TBCTR 小于 CMPA 且 TBPHS 值大于 CMPA (计数器 正在递增计数)。
      • 因此、当发生同步时、TBCTR 从 CMPA 以下跳到 CMPA 以上、并错过了 CMPA-UP 上本应发生的操作。
      • 在本例中、您将跳过 CMPAU 操作。
    2. TBCTR 大于 CMPA 且 TBPHS 值小于 CMPA (计数器正在递减计数)。  
      • 因此、当发生同步时、TBCTR 从 CMPA 以上跳到 CMPA 以下、并错过了 CMPA-DOWN 上本应发生的操作。  
      • 在本例中、您跳过了 CMPAD 操作。

    在这两种情况下、您都可以使 T1或 T2能够执行跳过的操作(您可以 在此处区分 t1-up 和 t1-down 动作限定符)。  例如、如果上面的第一个情况为真、您可以选择 EPWMxSYNC 作为 T1事件源、然后将 对 T1-UP 执行的操作 设置为将 EPWM2A 设置为高电平。 这样,t1-up 事件的操作 将补充缺失 CMPA (up)=1000操作所完成的操作。  

    请记住、当这些条件不为真时、需要禁用 T1向上/向下事件、以防止其影响您所需的占空比。 如果您在此还有其他问题或有任何其他进展、请告诉我。

    此致、

    艾里森

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Allison:

    感谢你的帮助。 T1向上/向下事件解决了我的问题。

    此致

    肯尼斯