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.

[参考译文] TMS320F28P659DK-Q1:PWM 输出覆盖功能

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

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1582365/tms320f28p659dk-q1-pwm-outputs-overriding-function

器件型号:TMS320F28P659DK-Q1
主题:SysConfig 中讨论的其他器件

尊敬的德克萨斯团队:

我目前正在测试一个三相逆变器。

我的输出可以正常工作、但我正在努力找到正确的方法来覆盖 PWM 输出 使用了 跳闸区 。 具体来说、我需要三个具有互补输出的 PWM、可以根据软件控制同时强制这些 PWM 为零(或释放)。

除了这一点、三个 PWM 的配置方式相同 PWM_A 生成同步输出信号、而 PWM_B PWM_C 将其用作同步输入信号。 它们按预期运行、但当我调用函数PwmRunModeOffPwmRunModeOn控制覆盖时、代码有时仅关闭一个或两个输出、而不是全部关闭。

下面附上了相关代码:

void PwmRunModeOff(void) {
    uint16_t i;

    // Optional: freeze TBCLK if you want simultaneity across modules
    // SysCtl_disablePeripheral(SYSCTL_PERIPH_CLK_TBCLKSYNC);

    for (i = 0; i < sizeof(kPwmBases) / sizeof(kPwmBases[0]); ++i) {
        const uint32_t base = kPwmBases[i];

        EALLOW;
        // Ensure trip actions will force final outputs LOW
        EPWM_setTripZoneAction(base, EPWM_TZ_ACTION_EVENT_TZA, EPWM_TZ_ACTION_LOW);
        EPWM_setTripZoneAction(base, EPWM_TZ_ACTION_EVENT_TZB, EPWM_TZ_ACTION_LOW);

        // Prevent a TZ ISR from clearing OST while we hold
        EPWM_disableTripZoneInterrupt(base, EPWM_TZ_INTERRUPT_OST | EPWM_TZ_INTERRUPT_CBC);

        // Make sure AQ continuous SW forces are not active
        EPWM_setActionQualifierContSWForceAction(base, EPWM_AQ_OUTPUT_A, EPWM_AQ_SW_DISABLED);
        EPWM_setActionQualifierContSWForceAction(base, EPWM_AQ_OUTPUT_B, EPWM_AQ_SW_DISABLED);

        // Clear stale latches so our new OST is the only one observed
        EPWM_clearTripZoneFlag(base,
                               EPWM_TZ_INTERRUPT_OST | EPWM_TZ_INTERRUPT_CBC |
                               EPWM_TZ_FLAG_DCAEVT1 | EPWM_TZ_FLAG_DCAEVT2 |
                               EPWM_TZ_FLAG_DCBEVT1 | EPWM_TZ_FLAG_DCBEVT2);

        // Latch OST (post-deadband outputs go LOW)
        EPWM_forceTripZoneEvent(base, EPWM_TZ_FORCE_EVENT_OST);
        EDIS;
    }

    // Verify latch once
    for (i = 0; i < sizeof(kPwmBases) / sizeof(kPwmBases[0]); ++i) {
        const uint32_t base = kPwmBases[i];

        if ((EPWM_getTripZoneFlagStatus(base) & EPWM_TZ_FLAG_OST) == 0U) {
            EALLOW;
            EPWM_forceTripZoneEvent(base, EPWM_TZ_FORCE_EVENT_OST);
            EDIS;
        }
    }

    // SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_TBCLKSYNC);

    turn_off_drivers();
}

void PwmRunModeOn(void) {
    uint16_t i;

    // Optional: align release to TBCTR==0 on your master for a clean first edge
    // while (EPWM_getTimeBaseCounter(PWM_A_BASE) != 0U) {}

    for (i = 0; i < sizeof(kPwmBases) / sizeof(kPwmBases[0]); ++i) {
        const uint32_t base = kPwmBases[i];

        EALLOW;
        // Clear OST/CBC & DC flags so PWM resumes
        EPWM_clearTripZoneFlag(base,
                               EPWM_TZ_INTERRUPT_OST | EPWM_TZ_INTERRUPT_CBC |
                               EPWM_TZ_FLAG_DCAEVT1 | EPWM_TZ_FLAG_DCAEVT2 |
                               EPWM_TZ_FLAG_DCBEVT1 | EPWM_TZ_FLAG_DCBEVT2);

        // Ensure no AQ SW force
        EPWM_setActionQualifierContSWForceAction(base, EPWM_AQ_OUTPUT_A, EPWM_AQ_SW_DISABLED);
        EPWM_setActionQualifierContSWForceAction(base, EPWM_AQ_OUTPUT_B, EPWM_AQ_SW_DISABLED);

        // Unmask TZ interrupts again if you use them elsewhere
        EPWM_enableTripZoneInterrupt(base, EPWM_TZ_INTERRUPT_OST | EPWM_TZ_INTERRUPT_CBC);
        EDIS;
    }

    turn_on_drivers();
}

您能否建议使用跳闸区实现此同步 PWM 覆盖的正确或建议方法?

提前感谢您、

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

    ...

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

    该图展示了 PWM 覆盖功能是如何发生故障的

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

    您好、

    请参阅下面的勘误表

    谢谢

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

    您好 Prathan Bhatt:

    这绝对是问题所在。

    我发现的问题是我当时使用的时钟分频器与默认时钟分频器不同、因为我在 SysConfig 工具的时钟树中对其进行了更改。

    我意识到这是不正确的、因为我没有添加“器件支持“、时钟树设置未生效、时钟保持在默认设置。

    不管怎样,我尝试使用设备支持,但我的程序停止工作。 使用“空工程模板“中提供的配置、但添加此行解决了问题:

    SysCtl_setEPWMClockDivider(SYSCTL_EPWMCLK_DIV_1);


    现在、跳闸区按预期工作。