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.

[参考译文] TMS320F28379S:高分辨率 PWM 不能在 ePWM1B 输出上工作

Guru**** 2513185 points
Other Parts Discussed in Thread: C2000WARE, SYSCONFIG

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1402608/tms320f28379s-high-resolution-pwm-doesn-t-work-on-the-epwm1b-output

器件型号:TMS320F28379S
主题中讨论的其他器件:C2000WARESysConfig

工具与软件:

hi champs、

我尝试通过遵循代码示例来测试 HRPWM。。。

device_support\f2837xs+ examples\cpu1\HRPWM_DEADBAND_SFO_v8\cpu01
driverlib\f2837xs+ examples\cpu1\HRPWM\HRPWM_ex4_DUTY_UPDOWN_SFO

这里是我的初始代码。

void epwm1_init(void)
{
    EPWM_setEmulationMode(EPWM1_BASE, EPWM_EMULATION_FREE_RUN);

    //
    // Set-up TBCLK
    //
    EPWM_setTimeBasePeriod(EPWM1_BASE, 357);
    EPWM_setPhaseShift(EPWM1_BASE, 0U);
    EPWM_setTimeBaseCounter(EPWM1_BASE, 0U);

    //
    // set duty 50% initially
    //
    HRPWM_setCounterCompareValue(EPWM1_BASE, HRPWM_COUNTER_COMPARE_A, ((uint32_t)357<< 8)/2);


    //
    // Set up counter mode
    //
    EPWM_setTimeBaseCounterMode(EPWM1_BASE, EPWM_COUNTER_MODE_UP_DOWN);
    EPWM_disablePhaseShiftLoad(EPWM1_BASE);
    EPWM_setClockPrescaler(EPWM1_BASE,
                            EPWM_CLOCK_DIVIDER_1,
                            EPWM_HSCLOCK_DIVIDER_1);
    EPWM_setSyncOutPulseMode(EPWM1_BASE, EPWM_SYNC_OUT_PULSE_DISABLED);

    //
    // Set up shadowing
    // MUST BE CTR=(ZER & PRD)
    //
    EPWM_setCounterCompareShadowLoadMode(EPWM1_BASE,
                                            EPWM_COUNTER_COMPARE_A,
                                            EPWM_COMP_LOAD_ON_CNTR_ZERO_PERIOD);

    //
    // Set actions
    //

    EPWM_setActionQualifierAction(EPWM1_BASE,
                                    EPWM_AQ_OUTPUT_A,
                                    EPWM_AQ_OUTPUT_HIGH,
                                    EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPA);
    EPWM_setActionQualifierAction(EPWM1_BASE,
                                    EPWM_AQ_OUTPUT_A,
                                    EPWM_AQ_OUTPUT_LOW,
                                    EPWM_AQ_OUTPUT_ON_TIMEBASE_DOWN_CMPA);


    HRPWM_setMEPEdgeSelect(EPWM1_BASE, HRPWM_CHANNEL_A, HRPWM_MEP_CTRL_RISING_AND_FALLING_EDGE);
    HRPWM_setMEPControlMode(EPWM1_BASE, HRPWM_CHANNEL_A, HRPWM_MEP_DUTY_PERIOD_CTRL);

    HRPWM_setMEPEdgeSelect(EPWM1_BASE, HRPWM_CHANNEL_B, HRPWM_MEP_CTRL_RISING_AND_FALLING_EDGE);
    HRPWM_setMEPControlMode(EPWM1_BASE, HRPWM_CHANNEL_B, HRPWM_MEP_DUTY_PERIOD_CTRL);

    //
    // Set up shadowing
    // MUST BE CTR=(ZER & PRD)
    //
    HRPWM_setCounterCompareShadowLoadEvent(EPWM1_BASE, HRPWM_CHANNEL_A, HRPWM_LOAD_ON_CNTR_ZERO_PERIOD);
    HRPWM_setCounterCompareShadowLoadEvent(EPWM1_BASE, HRPWM_CHANNEL_B, HRPWM_LOAD_ON_CNTR_ZERO_PERIOD);

    HRPWM_enableAutoConversion(EPWM1_BASE);

    //
    // Turn on high-resolution period control for DUTY to take HR on BOTH EDGEs.
    //

    HRPWM_enablePeriodControl(EPWM1_BASE);
    HRPWM_disablePhaseShiftLoad(EPWM1_BASE);

    //------ Dead band configuration ------
    //
    // Use EPWMA as the input for both RED and FED
    //
    EPWM_setRisingEdgeDeadBandDelayInput(EPWM1_BASE, EPWM_DB_INPUT_EPWMA);
    EPWM_setFallingEdgeDeadBandDelayInput(EPWM1_BASE, EPWM_DB_INPUT_EPWMA);

    //
    // Invert only the Falling Edge delayed output (AHC)
    //
    EPWM_setDeadBandDelayPolarity(EPWM1_BASE, EPWM_DB_RED, EPWM_DB_POLARITY_ACTIVE_HIGH);
    EPWM_setDeadBandDelayPolarity(EPWM1_BASE, EPWM_DB_FED, EPWM_DB_POLARITY_ACTIVE_LOW);

    //
    // Use the delayed signals instead of the original signals
    //
    EPWM_setDeadBandDelayMode(EPWM1_BASE, EPWM_DB_RED, true);
    EPWM_setDeadBandDelayMode(EPWM1_BASE, EPWM_DB_FED, true);

    EPWM_setRisingEdgeDelayCountShadowLoadMode(EPWM1_BASE, EPWM_RED_LOAD_ON_CNTR_ZERO_PERIOD);
    EPWM_setFallingEdgeDelayCountShadowLoadMode(EPWM1_BASE, EPWM_FED_LOAD_ON_CNTR_ZERO_PERIOD);

    EPWM_setDeadBandCounterClock(EPWM1_BASE, EPWM_DB_COUNTER_CLOCK_HALF_CYCLE);

    //
    // Set the RED and FED values
    //
    HRPWM_setFallingEdgeDelay(EPWM1_BASE, (uint32_t)64<<7);
    HRPWM_setRisingEdgeDelay(EPWM1_BASE, (uint32_t)64<<7);

    HRPWM_setDeadbandMEPEdgeSelect(EPWM1_BASE,HRPWM_DB_MEP_CTRL_RED_FED);
    HRPWM_setRisingEdgeDelayLoadMode(EPWM1_BASE,HRPWM_LOAD_ON_CNTR_ZERO_PERIOD);
    HRPWM_setFallingEdgeDelayLoadMode(EPWM1_BASE,HRPWM_LOAD_ON_CNTR_ZERO_PERIOD);
}

基本上、我为时基设置100MHz 时钟、并选择向上/向下模式。 输出频率为140kHz。

ePWM1A 和 ePWM1B 是互补输出、插入了死区区域。

我想检查一下它是否可以执行0.1%的140KHz 步长 它等于7.14ns 的步长。 ePWM1A 可以正常工作(占空比增加)、但 ePWM1B 不变。

然后我尝试增加到0.2%。 在本例中、ePWM1A 和1B 均有效。 由于0.2%等于14.28ns (>时基 周期为10ns)、因此在我看来、ePWM1B 不支持 HR。

你能在这里讲一讲吗?

此致、

Kien Nguyen

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

    尊敬的 Kien:

    EPWMA 和 EPWMB 通道都支持 HRPWM 功能。

    为了澄清、您是否说您是从我们具有 HR 占空比控制(CMPAHR 和 CMPBHR)的 C2000Ware 示例开始、唯一的修改是添加了死区模块配置? 您是否尝试同时实施 DBREDHR/DBFEDHR 和 CMPAHR/CMPBHR?

    您能否突出显示您在尝试实现此功能时正在使用的信号路径? 只是想了解通过死区的预期输出、以便我可以更好地提供建议。

    此致、

    Allison Nguyen

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

    您好、Allison、

    感谢您的答复。

    我没有使用原始代码示例、但使用它们作为参考来创建我之前分享的自己的代码。

    我正在尝试实现 DBREDHR/DBFEDHR 和 CMPAHR。 我认为不需要 CMPBHR、因为我应用了 CMPA/CMPAHR 来生成 ePWM1A、而 ePWM1B 由死区子模块生成来实现互补输出。
    我的信号路径图如下所示:

    此致、

    Kien Nguyen

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

    尊敬的 Kien:

    一些初始项目需要检查:

    • 如果您使用 CMPxHR 值、即使您只使用 EPWMA (并通过使用死区模块从 EPWMA 获取 EPWMB)、也必须同时配置 CMPAHR 和 CMPBHR、否则会产生不良输出。
    • 请确保您使用的是半周期时钟模式。
    • 请确保自动转换已启用
    • 还要检查是否处于向上/向下计数模式、并在 CTR = 0  PRD 上加载参数

    请告诉我您是否未遵守上述任何规定、或者您看到的行为是否发生了变化。 您是否使用我们的 SysConfig GUI 进行开发?  

    此致、

    Allison

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

    Allison

    我想知道第一条建议背后的原因是什么吗? 实际上、我只是更改 CMPAHR 值。

    [报价 userid="568270" url="~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1402608/tms320f28379s-high-resolution-pwm-doesn-t-work-on-the-epwm1b-output/5371736 #5371736"]如果您使用的是 CMPxHR 值、则必须同时配置 CMPAHR 和 CMPBHR、即使您只使用 EPWMA (以及通过使用死区模块从 EPWMA 获取 EPWMB)、否则这将产生不良输出。[/QUOT]

    我在 TRM 中搜索、但找不到任何关于此问题的陈述。

    此致、

    Kien Nguyen

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

    尊敬的 Kien:

    感谢您的答复和后续问题。 我会在本周努力回复您、但请注意、我在接下来的几天内不在办公室。

    此致、

    Allison

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

    尊敬的 Kien:

    感谢您在我外出时的耐心等待。 我首先希望重新了解一下、您的通道 B 输出是否仍有问题? 您是否尝试过与 CMPBHR 相同地配置通道 B? 有几条 SysConfig 警告指示了这一点 、但正在确认 TRM 中是否应有注释。

    此致、

    Allison

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

    Allison

    我跟着你的第一个建议,它是有效的。 我没有使用 SysConfig、但仍想知道背后的原因。

    此致、

    Kien Nguyen

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

    尊敬的 Kien:

    很高兴听到它得到了解决! 我认为这可能是 HRPWM 设计实现的性质、但让我来仔细核实一下生成 SysConfig 指示的人。

    此致、

    Allison

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

    尊敬的 Kien:

    若要进行跟进、 如果您想要两个信道上都有 HR 功能、则必须配置 CMPAHR 和 CMPBHR。 这是因为 CMPAHR 应用于通道 A、而 CMPBHR 应用于通道 B (请注意、这些"A"和"B"与常规 CMPA 和 CMPB 值的含义不同)。

    因此、即使您不使用配置的 EPWMB 通道在 B 上生成实际输出(而是在互补模式下使用 EPWMA 来生成输出 B)、硬件也将寻找并利用 CMPBHR、从而需要 CMPBHR 来生成预期输出。 希望这有道理!

    此致、

    Allison