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.

[参考译文] TMS320F28375D:0%和100%占空比 ePWM 权变措施

Guru**** 2419530 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/892054/tms320f28375d-0-and-100-duty-cycle-epwm-workaround

器件型号:TMS320F28375D

SPRUHM8I 的第15.6.5节建议将 CMPR 值保持在1至 TBPRD-1的范围内、以确保 PWM 正常运行。  然后、它引用了一个旧(2006) AppNote SPRAAI1、该器件具有实现0%和100%占空比的变通方法。  在本论坛上进行搜索后、我发现有几个不完整的答案、即在具有4类 ePWM 模块的较新器件上是否确实需要此功能。  我找到的最完整的答案是:

https://e2e.ti.com/support/microcontrollers/c2000/f/171/t/646249

链接的线程似乎表示 CMPx=0应该正常工作、但从 CMPx=0转换到 CMPx!=0可能会出现问题。  线程类型在该线程之后消失。  这是否意味着我们不必执行任何特殊的转换到 CMPx = 0、但变通办法仍然适用于转换回非零值?  CMPx = TBPRD 呢?   

我的配置

-向上/向下计数模式

-影子加载 ZRO 和 TBPRD 上的 CMPx 寄存器

-在 ZRO 和 TBPRD 事件上都有一个 ISR,所以我在每个 PWM 周期中加载两次 CMPx 寄存器

-操作限定符配置为设置向上计数和清除向下计数

假设这种变通办法是必要的、并且由于我在 ZRO 和 TBPRD 上加载 CMPx 寄存器、我是否需要针对 CMPx = 0和 CMPx = TBPRD 实施变通办法?

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

    我不认为 CMPx=TBPRD 会导致任何问题。 仅在 CMPx=0上实现的权变措施应该可以解决您的问题。 总的来说、如果您不在 ePWM 内使用高分辨率(HRPWM)子模块、您可以定义0%和100%占空比。

    NIMA

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

    我解释变通办法 AppNote SPRAA1中的向上向下计数模式示例的方式是、比较寄存器的 ISR 和影子加载发生在 TBCNT = ZRO 上。  由于影子加载在本示例中发生在 ZRO 上、因此它们仅作为一个特殊情况处理 CMPx = 0是合理的。  然后、我假设有人在 TBCNT = TBPRD 处进行影子加载、他们必须作为一个特殊情况处理 CMPx = TBPRD。  同意?   

    在我的示例中、我对 ZRO 和 TBPRD 事件都进行影子加载、对这两个事件都有 ISR。  每个 PWM 周期、我将更新 CMPx 两次。  因此、扩展了上一段中的思考过程、如果这仍然是4类 ePWM 模块的问题、那么我必须同时处理 CMPx = ZRO 和 CMPx = TBPRD。  同意?

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

    我同意这两个项目。 通常、您会尝试同时实现0%占空比和100%占空比、当我上次编写符合该要求的 EPWM 代码时、我没有任何问题。 我想 看看我是否可以找到我的旧的 Type4 PWM 代码。

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

    我可以使用以下代码获得0%至100%的占空比:

    void init(){
    ePWM_setTimeBasePeriod (ePWM_base、ePWM_TBPRD - 1);
    ePWM_setPhaseShift (ePWM_base、0U);
    ePWM_setTimeBaseCounter (ePWM_base、0U);
    ePWM_setEmulationMode (ePWM_base、ePWM_emulation_free_run);
    
    ePWM_setCounterCompareValue (ePWM_base、
    ePWM_COUNTER_COMPARE_A、
    0);
    ePWM_setCounterCompareValue (ePWM_base、
    ePWM_COUNTER_COMPARE_B、
    0);
    
    ePWM_setTimeBaseCounterMode (ePWM_base、ePWM_COUNTER_MODE_UP);
    ePWM_DisablePhaseShiftLoad (ePWM_base);
    ePWM_setClockPrescaler (ePWM_base、
    ePWM_CLOCK 分频器_1、
    ePWM_HSCLOCK_DEVIDER_1);
    
    ePWM_setCounterCompareShadowImage LoadMode (ePWM_base、
    ePWM_COUNTER_COMPARE_A、
    ePWM_COMP_LOAD_ON_CNTR_ZERO);
    ePWM_setCounterCompareShadowImage LoadMode (ePWM_base、
    ePWM_COUNTER_COMPARE_B、
    ePWM_COMP_LOAD_ON_CNTR_ZERO);
    
    
    ePWM_setActionQualifierAction (ePWM_base、
    ePWM_AQ_OUTPUT _B、
    ePWM_AQ_OUTPUT 高电平、
    ePWM_AQ_output_on_timebase_zero);
    
    ePWM_setActionQualifierAction (ePWM_base、
    ePWM_AQ_OUTPUT A、
    ePWM_AQ_OUTPUT 高电平、
    ePWM_AQ_output_on_timebase_zero);
    
    ePWM_setActionQualifierAction (ePWM_base、
    ePWM_AQ_OUTPUT A、
    ePWM_AQ_OUTPUT 低电平、
    ePWM_AQ_output_on_timebase_up_CMPA);
    ePWM_setActionQualifierAction (ePWM_base、
    ePWM_AQ_OUTPUT _B、
    ePWM_AQ_OUTPUT 低电平、
    ePWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPB);
    
    }
    void booster _ePWM_setDuty (uint32_t ePWM_base、ePWM_CounterCompareModule CMP_MODULE、uint32_t Duty)
    {
    uint16_t 结果=(uint16_t)(((Duty *(ePWM_TBPRD))))/100);
    ePWM_setCounterCompareValue (ePWM_base、
    CMP_MODULE、
    结果);
    }