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.

[参考译文] TMS320F280049C:没有 SYNC IN 脉冲、ePWM 不会启动

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1181348/tms320f280049c-epwm-not-started-without-sync-in-pulse

器件型号:TMS320F280049C

您好!

我使用的是4个 ePWM、它们通过 SYNCI 上的外部脉冲进行同步。

我的问题是:

1) 1)为什么 EPWM 需要 SYNCI 脉冲来开始计数? 我希望它们在 SYNCI 信号出现之前不同步、而不是禁用它们。

2) 2)以及当 SYNCI 上没有更多脉冲时、它们为什么继续工作? 如果他们需要一个 SYNCI 脉冲来开始计数、为什么在没有 SYNCI 脉冲的情况下继续计数?

谢谢、

Sebastien

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

    ePWM 不依赖于 SYNCI 来启动。 您的 ePWM 设置是什么?

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

    您好!

    感谢您的回答、第一个 ePWM 设置如下所示(除相移值外、其他3个设置相同):

       ePWM_setClockPrescaler (myEPWM1_base、ePWM_CLOCK 分频器_1、ePWM_HSCLOCK_divider 1);
       ePWM_setTimeBasePeriod (myEPWM1_base、1000);
       ePWM_setTimeBaseCounterMode (myEPWM1_base、ePWM_COUNTER_MODE_UP);
       ePWM_setTimeBaseCounter (myEPWM1_base、0);
       ePWM_selectPeriodLoadEvent (base、ePWM_shadow_load_mode_sync);
       ePWM_setPhaseShift (myEPWM1_base、0);
       ePWM_enablePhaseShiftLoad (myEPWM1_base);


       ePWM_setCounterCompareValue (myEPWM1_base、ePWM_COUNTER_COMPARE_A、500);
       ePWM_setCounterCompareShadowImage LoadMode (myEPWM1_base、ePWM_COUNTER_COMPARE_A、ePWM_COMP_LOAD_ON_CNTR_ZERO);
       ePWM_setCounterCompareValue (myEPWM1_base、ePWM_COUNTER_COMPARE_B、0);
       ePWM_setCounterCompareShadowImage LoadMode (myEPWM1_base、ePWM_COUNTER_COMPARE_B、ePWM_COMP_LOAD_ON_CNTR_ZERO);

    ePWM_setActionQualifierAction (myEPWM1_base、ePWM_AQ_output_A、ePWM_AQ_output_high、           ePWM_AQ_output_on_timebase_zero);
       ePWM_setActionQualifierAction (myEPWM1_base、ePWM_AQ_output_A、ePWM_AQ_output_no_change、ePWM_AQ_output_on_timebase_period);
       ePWM_setActionQualifierAction (myEPWM1_base、ePWM_AQ_output_A、ePWM_AQ_output_low、ePWM_AQ_output_on_timebase_up_CMPA);
       ePWM_setActionQualifierAction (myEPWM1_base、ePWM_AQ_output_A、ePWM_AQ_output_no_change、ePWM_AQ_output_on_timebase_down_cmPA);
       ePWM_setActionQualifierAction (myEPWM1_base、ePWM_AQ_output_A、ePWM_AQ_output_no_change、ePWM_AQ_output_on_timebase_up_CMPB);
       ePWM_setActionQualifierAction (myEPWM1_base、ePWM_AQ_output_A、ePWM_AQ_output_no_change、ePWM_AQ_output_on_timebase_down_CMPB);
       ePWM_setActionQualifierAction (myEPWM1_base、ePWM_AQ_output_B、ePWM_AQ_output_no_change、ePWM_AQ_output_on_timebase_zero);
       ePWM_setActionQualifierAction (myEPWM1_base、ePWM_AQ_output_B、ePWM_AQ_output_no_change、ePWM_AQ_output_on_timebase_period);
       ePWM_setActionQualifierAction (myEPWM1_base、ePWM_AQ_output_B、ePWM_AQ_output_no_change、ePWM_AQ_output_on_timebase_up_cmPA);
       ePWM_setActionQualifierAction (myEPWM1_base、ePWM_AQ_output_B、ePWM_AQ_output_no_change、ePWM_AQ_output_on_timebase_down_cmPA);
       ePWM_setActionQualifierAction (myEPWM1_base、ePWM_AQ_output_B、ePWM_AQ_output_no_change、ePWM_AQ_output_on_timebase_up_CMPB);
       ePWM_setActionQualifierAction (myEPWM1_base、ePWM_AQ_output_B、ePWM_AQ_output_no_change、ePWM_AQ_output_on_timebase_down_CMPB);

       ePWM_setDeadBandDelayPolarity (myEPWM1_base、ePWM_DB_FED、ePWM_DB_POLICLE_ACTIVE_LOW);
       ePWM_setDeadBandDelayMode (myEPWM1_base、ePWM_DB_RED、true);
       ePWM_setRisingEdgeDelayCount (myEPWM1_base、BUCK_DFLT_ePWM_RED_TICKs);
       ePWM_enableRisingEdgeDelayCountShadowImage LoadMode (myEPWM1_base);
       ePWM_setRisingEdgeDelayCountShadowImage LoadMode (myEPWM1_base、ePWM_RED_LOAD_ON_CNTR_ZERO);
       ePWM_setDeadBandDelayMode (myEPWM1_base、ePWM_DB_FED、true);
       ePWM_setFallingEdgeDelayCount (myEPWM1_base、BUCK_DFLT_ePWM_FED_TICKs);
       ePWM_enableFallingEdgeDelayCountShadowImage LoadMode (myEPWM1_base);
       ePWM_setFallingEdgeDelayCountShadowImage LoadMode (myEPWM1_base、ePWM_FED_LOAD_ON_CNTR_ZERO);

       //由 ADC 和 FSI/DMA 使用
       ePWM_enableADCtrigger (myEPWM1_base、ePWM_SOC_A);
       ePWM_setADCTriggerSource (myEPWM1_base、ePWM_SOC_A、ePWM_SOC_TBCTR_ZERO);
       ePWM_setADCTriggerEventPrescale (myEPWM1_base、ePWM_SOC_A、1);

       //由 FSI/DMA 使用
       ePWM_enableADCtrigger (myEPWM1_base、ePWM_SOC_B);
       ePWM_setADCTriggerSource (myEPWM1_base、ePWM_SOC_B、ePWM_SOC_TBCTR_ZERO);
       ePWM_setADCTriggerEventPrescale (myEPWM1_base、ePWM_SOC_B、1);

       ePWM_DisableInterrupt (myEPWM1_base);
       ePWM_clearEventTriggerInterruptFlag (myEPWM1_base);
       ePWM_setInterruptSource (myEPWM1_base、ePWM_INT_TBCTR_ZERO);
       ePWM_setInterruptEventCount (myEPWM1_BASE、1);

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

     在 ePWM 初始化之后、您在主函数中使用了 SYSCTL_enableMolde 和 TBCLKSYNC?

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

    我找到了这种行为的原因。 这是由于 ePWM_selectPeriodLoadEvent (base、ePWM_SHAD_LOAD_MODE_SYNC)。 因此、只有在接收到 SYNCI 时、周期才会从影子寄存器加载到活动寄存器。 如果未接收到 SYNCI、ePWM 周期(有效寄存器)将保持为0、因此在接收到同步之前它们不执行任何操作。