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.

[参考译文] TMS320F280025C:通过 ePWM 生成中断

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1136250/tms320f280025c-generate-an-interrupt-by-epwm

器件型号:TMS320F280025C
主题中讨论的其他器件:C2000WARE

/**ePWM initialization with phase shift*/
void epwm_init(uint32_t base, uint16_t phi)
{
    /**Parameters*/
    EPWM_setTimeBaseCounterMode(base, EPWM_COUNTER_MODE_UP);
    EPWM_setTimeBasePeriod(base, EPWM_TBPRD);
    EPWM_setTimeBaseCounter(base, 0U);
    EPWM_setClockPrescaler(base, EPWM_CLOCK_DIVIDER_4, EPWM_HSCLOCK_DIVIDER_4);
    /**Set up shadowing*/
    EPWM_setCounterCompareShadowLoadMode(base, EPWM_COUNTER_COMPARE_A, EPWM_COMP_LOAD_ON_CNTR_ZERO);

    /**Set actions
    For boost assembly*/
    EPWM_setActionQualifierAction(base, SPWM_TOP, EPWM_AQ_OUTPUT_HIGH, EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPA);
    EPWM_setActionQualifierAction(base, SPWM_TOP, EPWM_AQ_OUTPUT_LOW, EPWM_AQ_OUTPUT_ON_TIMEBASE_ZERO);
    /**For buck assembly*/
    EPWM_setActionQualifierAction(base, SPWM_BOT, EPWM_AQ_OUTPUT_HIGH, EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPB);
    EPWM_setActionQualifierAction(base, SPWM_BOT, EPWM_AQ_OUTPUT_LOW, EPWM_AQ_OUTPUT_ON_TIMEBASE_ZERO);

    /// To force command MOS ePWM at a low state.
    if((base == SPWM_U) ||
       (base == SPWM_V) ||
       (base == SPWM_W))
    {
        EPWM_setActionQualifierContSWForceAction(SPWM_U, SPWM_BOT, EPWM_AQ_SW_OUTPUT_LOW);
        EPWM_setActionQualifierContSWForceAction(SPWM_V, SPWM_BOT, EPWM_AQ_SW_OUTPUT_LOW);
        EPWM_setActionQualifierContSWForceAction(SPWM_W, SPWM_BOT, EPWM_AQ_SW_OUTPUT_LOW);
        EPWM_setActionQualifierContSWForceAction(SPWM_U, SPWM_TOP, EPWM_AQ_SW_OUTPUT_LOW);
        EPWM_setActionQualifierContSWForceAction(SPWM_V, SPWM_TOP, EPWM_AQ_SW_OUTPUT_LOW);
        EPWM_setActionQualifierContSWForceAction(SPWM_W, SPWM_TOP, EPWM_AQ_SW_OUTPUT_LOW);
    }

    if(base == SPWM_FOR_ADC)
    {
        EPWM_setTimeBasePeriod(base, EPWM_TBPRD_ADC);
        /**Initialize PWM to add samples ADC in loop close regulation*/
        EPWM_setCounterCompareValue(base, EPWM_COUNTER_COMPARE_A, CMPA_EPWM_ADC);
    }
    if(base == SPWM_REGU)
    {
        EPWM_setTimeBasePeriod(base, EPWM_TBPRD_REGU);
        /**Initialize PWM to regulation interrupt*/
        EPWM_setCounterCompareValue(base, EPWM_COUNTER_COMPARE_A, CMPA_EPWM_REGU);
    }

    /**Configure ePMWs*/
    // Todo comments to explain
    if(phi == 0)
    {
        EPWM_disablePhaseShiftLoad(base);
        EPWM_setPhaseShift(base, phi);
        EPWM_enableSyncOutPulseSource(base, EPWM_SYNC_OUT_PULSE_ON_CNTR_ZERO);
    }
    else
    {
        uint16_t tbphs = epwm_get_tbphs_from_phi(base, phi);
        EPWM_setSyncInPulseSource(base, EPWM_SYNC_IN_PULSE_SRC_SYNCOUT_EPWM1);
        EPWM_enablePhaseShiftLoad(base);
        EPWM_selectPeriodLoadEvent(base, EPWM_SHADOW_LOAD_MODE_SYNC);
        EPWM_setPhaseShift(base, tbphs);
        EPWM_setTimeBaseCounter(base, tbphs);
    }
}

EPWM_setInterruptSource(SPWM_REGU, EPWM_INT_TBCTR_ZERO);
EPWM_enableInterrupt(SPWM_REGU);
Interrupt_register(INT_EPWM3, &isr_regulation);
Interrupt_enable(INT_EPWM3); // Delete after test because it's active in case run in the state machine.

您好!

配置 ePWM 中断时遇到问题、我希望在 ePWM 信号的每个周期生成中断。 它不起作用,我从不输入中断,我必须忘记配置部件? 可以帮帮我吗?

谢谢  

Damien

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

    尊敬的 Damien:

    我建议从 C2000ware 开始配置 ePWM 中断。 路径如下: C:\ti\c2000\C2000Ware_4_01_00_00\driverlib\f28004x\examples\interrupt

    此致、

    插孔

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

    尊敬的 Jack:

    谢谢、很好。

    Damien

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

    是的、Damien 查看这些示例、并确保您的 ePWM 正在运行。 TBCLKSYNC 被使能。 还有其他建议吗?

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

    您好!

    我唯一要问的问题是、Damien、最后4行是否是代码中其他位置的节选(目前、它们位于任何函数之外)、以及您是否已在 某个位置将 SPWM_regu 定义为 EPWM3_base、 因为我不认为这是我们的内置定义之一。

    我不确定其中的任何一个都是当前存在的问题(如果是、我不确定您的代码是否能够编译)、但确定这一点不会有任何影响。 除此之外、我只同意、查看以前存在的功能中断示例是熟悉它们工作原理的奇妙方式!

    此致、

    Jason Osborn

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

    Jason、

    是的、最后4行是代码的摘录、它们存在于函数位中、我没有复制整个项目、因为它太大了、我更喜欢转到本质。

    Tahnks 为您提供反馈、我在示例中找到了我的解释。

    Damien