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.

[参考译文] TMS320F28377D:ePWM PWM PWM 斩波器(PC)不考虑死区限制

Guru**** 2538930 points
Other Parts Discussed in Thread: C2000WARE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1213649/tms320f28377d-epwm-pwm-chopper-pc-not-respecting-deadband-restrictions

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

我正在使用具有互补信号和死区要求的 ePWM 模块来驱动一些 FET。 需要设置死区以防止电流击穿。  

我们希望在首次启用系统时缓慢增大驱动强度。 我发现 PWM 斩波器通过允许我以较小的占空比调制有功信号、在这方面做得很好。 除了斩波器的单次触发功能外、它的工作效果非常出色。 没有办法禁用单次触发功能、并且它有时会在死区期间激活。

是否可以通过任何方法禁用斩波器单触发信号(OSHTWTH 的最小值为0000b、哪个电芯库至少达到 EPWMCLK/8 s)? 或者使其在死区时间内不触发? DBRED 和 DBFED 设置为0xF、DBCTL 设置为0xB。

谢谢。

杰伊

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

    您好、Jay、

    您的 EPWMCLK 是什么?

    很抱歉、如果我误解了您的问题、但您能否向我展示您希望通过图表实现的目标? 在下图中、您需要移除 OSHTWTH 脉冲宽度。 您是否需要这样的方案:斩波器从无脉冲宽度开始、立即开始持续脉冲?

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

    您好、Ryan、

    感谢您的答复。 是的、您的抽奖就是我想要达到的目标。 但我看到的真正问题是、在使用 PWM 斩波器功能时、死区设置将被忽略。 我看到 OSHT 在我定义的死区内启动。 只是 OSHT 发生的问题没有发生 时那么严重

    我将在可以的时候发布一张示波器截图。

    杰伊  

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

    您好、Jay、

    您能给我发送一份示波器捕获吗? 我想看看我能否重现您的问题、看看我们如何解决这个问题。

    此致!

    Ryan Ma

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

    我收集了一些证明我看到的问题的数据。

    这是我的标称波形。 两个具有125ns 死区的互补高电平有效 PWM 信号。 一个信号为黄色、另一个信号为蓝色:

    当我启用 PWM 斩波器时、我会在指定的125ns 死区内看到空洞(不管怎样、斩波信号本身是完美的)。

    CHPDUTY 100b.

    CHPFREQ 100b.

    OSHTWTH 0000b

    通道编号1b

    更改 OSHTWTH 值不会纠正死区入侵:

    OSWTWH=0x0 (低于、有高电平有效重叠)

    OSWTWH=0x1 (低于、有高电平有效重叠)

    如果不是单稳态信号、则死区会很好。

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

    您好、Jay、

    感谢您提供这些清晰的示波器图片、您是否对动作限定符、DBRED、DBFED 等使用影子模式?  

    OSHT 脉冲应该只能在 ePWMx 的第一个上升沿(黄色信号)产生、如所示。  

    在您发送到下方图片中黄色信号的下降沿、死区似乎保持为125ns、蓝色信号存在 OSHT 脉冲、并对其应用斩波器。

    此致!

    Ryan Ma

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

    谢谢 Ryan。 它是随机的。 有时还可以,有时不是。 在所有这些捕获期间、我没有更改 PWM 寄存器的占空比或频率。 我同意你的观察,但 我看到同样违反蓝色信号.

    下面是初始化代码。 主要参考来自 C2000Ware 示例:

    //
    // InitGateDrive - Initialize Gate Driver PWM signals (with Deadband)
    //
    void InitGateDrive(void)
    {
        //
        // Setup TBCLK
        //
        EPWM_setTimeBaseCounterMode(GATEDRIVE_PWM_MODULE, EPWM_COUNTER_MODE_UP);
        EPWM_setTimeBasePeriod(GATEDRIVE_PWM_MODULE, GATEDRIVE_PWM_TBPRD);
        EPWM_disablePhaseShiftLoad(GATEDRIVE_PWM_MODULE);
        EPWM_setPhaseShift(GATEDRIVE_PWM_MODULE, 0U);
        EPWM_setTimeBaseCounter(GATEDRIVE_PWM_MODULE, 0U);
    
        //
        // Set ePWM clock pre-scaler
        //
        EPWM_setClockPrescaler(GATEDRIVE_PWM_MODULE,
                               EPWM_CLOCK_DIVIDER_1,
                               EPWM_HSCLOCK_DIVIDER_1);
    
        //
        // Setup shadow register load on ZERO
        //
        EPWM_setCounterCompareShadowLoadMode(GATEDRIVE_PWM_MODULE,
                                             EPWM_COUNTER_COMPARE_A,
                                             EPWM_COMP_LOAD_ON_CNTR_ZERO);
    
        //
        // Set Compare values
        //
        EPWM_setCounterCompareValue(GATEDRIVE_PWM_MODULE, EPWM_COUNTER_COMPARE_A,
                                    GATEDRIVE_PWM_CMPA);
    
        //
        // Set actions for ePWM1A & ePWM1B
        //
        // Set PWM1A on Zero
        EPWM_setActionQualifierAction(GATEDRIVE_PWM_MODULE,
                                      EPWM_AQ_OUTPUT_A,
                                      EPWM_AQ_OUTPUT_HIGH,
                                      EPWM_AQ_OUTPUT_ON_TIMEBASE_ZERO);
        // Clear PWM1A on event A, up count
        EPWM_setActionQualifierAction(GATEDRIVE_PWM_MODULE,
                                      EPWM_AQ_OUTPUT_A,
                                      EPWM_AQ_OUTPUT_LOW,
                                      EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPA);
        // Set PWM1B on Zero
    
        EPWM_setActionQualifierAction(GATEDRIVE_PWM_MODULE,
                                      EPWM_AQ_OUTPUT_B,
                                      EPWM_AQ_OUTPUT_LOW,
                                      EPWM_AQ_OUTPUT_ON_TIMEBASE_ZERO);
        // Clear PWM1B on event A, up count
        EPWM_setActionQualifierAction(GATEDRIVE_PWM_MODULE,
                                      EPWM_AQ_OUTPUT_B,
                                      EPWM_AQ_OUTPUT_HIGH,
                                      EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPA);
    
        // Setup Dead Band
        setupEPWMActiveHighComplementary(GATEDRIVE_PWM_MODULE);
    
        // Disable after init
        GateDriveDisable();
    
        GateDriveSetupTrip();
        // Clear XBAR -> EPWM trip zones
        GateDriveClearTrip();
    }
    
    static void setupEPWMActiveHighComplementary(uint32_t base)
    {
        //
        // Use EPWMA as the input for both RED and FED
        //
        EPWM_setRisingEdgeDeadBandDelayInput(base, EPWM_DB_INPUT_EPWMA);
        EPWM_setFallingEdgeDeadBandDelayInput(base, EPWM_DB_INPUT_EPWMA);
    
        //
        // Set the RED and FED values
        //
        EPWM_setFallingEdgeDelayCount(base, GATEDRIVE_PWM_DEADBAND);
        EPWM_setRisingEdgeDelayCount(base, GATEDRIVE_PWM_DEADBAND);
    
        //
        // Invert only the Falling Edge delayed output (AHC)
        //
        EPWM_setDeadBandDelayPolarity(base, EPWM_DB_RED, EPWM_DB_POLARITY_ACTIVE_HIGH);
        EPWM_setDeadBandDelayPolarity(base, EPWM_DB_FED, EPWM_DB_POLARITY_ACTIVE_LOW);
    
        //
        // Use the delayed signals instead of the original signals
        //
        EPWM_setDeadBandDelayMode(base, EPWM_DB_RED, true);
        EPWM_setDeadBandDelayMode(base, EPWM_DB_FED, true);
    
        //
        // DO NOT Switch Output A with Output B
        //
        EPWM_setDeadBandOutputSwapMode(base, EPWM_DB_OUTPUT_A, false);
        EPWM_setDeadBandOutputSwapMode(base, EPWM_DB_OUTPUT_B, false);
    
    }
    

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

    您是否更改了死区的任何操作限定符或延迟值?

    在您的配置下、死区 FED 和红色值默认为立即模式。 我会尝试添加这个 driverlib 函数、看看这是否有所帮助。 以及设置动作限定器影子加载模式。 这将确保当 TBCTR 等于某个事件时、对操作限定符或延迟值的任何写入都将更新。

    EPWM_setActionQualifierShadowLoadMode();

    ePWM_setRisingEdgeDelayCountShadowLoadMode ()

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

    好的 、我将添加这些后重试。 在这些测试期间、我不会更改行动限定符。 频率和占空比是一致的值。  

    我正在为 比较计数器使用影子加载。  

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

    我将这些影子调用添加到了我的初始化序列中、仍然看到同样的问题。 我在操作过程中不会更改这些。 INIT 后唯一更改的属性是频率(因此也是比较值)、但在这些测试期间、我将其设置为对应于100kHz 的值。 在 INIT 之后、125ns 的死区值永远不会改变。

    我认为这可能只是 ePWM 结构的赝像。 PWM 斩波器块位于死区模块之后。 PWM 斩波器不得将死区的输出用作其基准信号。 但我不明白为什么会出现这种情况。

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

    您好、Jay、

    我将尝试复制您在我结束时看到的内容、并在明天向您通报最新情况。 如果我能够复制这些内容、我将要求设计团队看看基准信号是否发生了变化。  

    此致!

    Ryan Ma

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

    谢谢、Ryan。 init 应包含重现所需的大部分信息。 唯一剩下的就是我设置了周期和占空比。

        // set period
        EPWM_setTimeBasePeriod(GATEDRIVE_PWM_MODULE, pwmCounts);
        // always set 50% duty cycle
        EPWM_setCounterCompareValue(GATEDRIVE_PWM_MODULE, EPWM_COUNTER_COMPARE_A, pwmCounts>>1);
     

    如果有其他必要的信息或问题、请告诉我。

    杰伊

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

    您好、Jay、

    我已经尝试并遵循了您的相同配置。 这是我的设置和示波器图形。 我的 TBCLK 是100Mhz。

    我有85KHz 信号、其中相同的高电平有效互补死区和 PWM 斩波器已启用。 我没有看到与输出相同的重叠。 您能否尝试此 ePWM 初始化? 您是在 LaunchPad 还是 controlCARD 上对其进行调试?  

    void EPWM_init(){
        EPWM_setClockPrescaler(myEPWM1_BASE, EPWM_CLOCK_DIVIDER_1, EPWM_HSCLOCK_DIVIDER_1);	
        EPWM_setTimeBasePeriod(myEPWM1_BASE, 1164);	
        EPWM_setTimeBaseCounter(myEPWM1_BASE, 0);	
        EPWM_setTimeBaseCounterMode(myEPWM1_BASE, EPWM_COUNTER_MODE_UP);	
        EPWM_disablePhaseShiftLoad(myEPWM1_BASE);	
        EPWM_setPhaseShift(myEPWM1_BASE, 0);	
        EPWM_setCounterCompareValue(myEPWM1_BASE, EPWM_COUNTER_COMPARE_A, 582);	
        EPWM_setCounterCompareShadowLoadMode(myEPWM1_BASE, EPWM_COUNTER_COMPARE_A, EPWM_COMP_LOAD_ON_CNTR_ZERO);	
        EPWM_setCounterCompareValue(myEPWM1_BASE, EPWM_COUNTER_COMPARE_B, 0);	
        EPWM_setCounterCompareShadowLoadMode(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_LOW, 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_HIGH, 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_POLARITY_ACTIVE_LOW);	
        EPWM_setDeadBandDelayMode(myEPWM1_BASE, EPWM_DB_RED, true);	
        EPWM_setRisingEdgeDelayCount(myEPWM1_BASE, 125);	
        EPWM_setDeadBandDelayMode(myEPWM1_BASE, EPWM_DB_FED, true);	
        EPWM_setFallingEdgeDelayCount(myEPWM1_BASE, 125);	
        EPWM_setRisingEdgeDelayCountShadowLoadMode(myEPWM1_BASE, EPWM_RED_LOAD_ON_CNTR_ZERO);	
        EPWM_disableRisingEdgeDelayCountShadowLoadMode(myEPWM1_BASE);	
        EPWM_setFallingEdgeDelayCountShadowLoadMode(myEPWM1_BASE, EPWM_FED_LOAD_ON_CNTR_ZERO);	
        EPWM_disableFallingEdgeDelayCountShadowLoadMode(myEPWM1_BASE);	
        EPWM_enableChopper(myEPWM1_BASE);	
        EPWM_setChopperDutyCycle(myEPWM1_BASE, 4);	
        EPWM_setChopperFreq(myEPWM1_BASE, 4);	
    }

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

    哇哦。 很好。 我将尝试这一点、看看我的做法有何不同。

    我使用的是 controlCARD。

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

    好的、我还将 controlCARD 与集线站配合使用。  

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

    您好、Ryan、

    我复制了您的代码。 区别在于我的死区时间要低得多。 我需要125ns 死区、而您尝试的示例代码有1.25us 死区时间。 在较长的死区时间内、斩波器可以正常工作。 如果使用所提供的相同示例并将死区时间降低至~125ns (0xF)、您应该会看到重叠。 同样、如果我使用当前代码并增加 DBRED 和 DBFED 值、则可以消除冲突(并根据新值获得预期的死区时间)。 您可以尝试再现吗?

    在我的设计中、我需要125ns 或更低的死区时间。

    谢谢!

    杰伊

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

    您好、Jay、

    是的、我现在看到重叠了、我需要看看使用 PWM 斩波器时是否存在所需的最低死区。 请允许我仔细检查一下。

    此致!

    Ryan Ma

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

    您好、Jay、

    我一直在玩斩波器占空比、并将其设置在第一幅图中的1/8占空比。

    第二张图片是2/8占空比、

    第三张图片是3/8 Duty:

    第四张图片是4/8占空比(违反死区)。

    您是否对 PWM 斩波器占空比有要求? 看来,占空比越低,死区越低,不违反死区时间。 这是一个变通办法吗?

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

    在1/8占空比时、我仍然发现不常见违规情况。

    我还注意到、在7/8占空比时、斩波器看起来会完全消除信号:

    我以前看到过这个,但认为使用1/8到3/4足够满足我的需要。 但现在、我认为在成功使用 PWM 斩波器方面存在一些限制或我不明白的地方。 我很想听到你能找到什么。 感谢您的帮助。

    杰伊

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

    您好、Jay、

    让我来询问 设计、看看可能是什么原因造成的、并会在一天结束或明天最后一天结束时给您回复。

    此致!

    Ryan Ma

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

    您好、Jay、

    我已经重新运行了我发送给您的原始代码、现在由于某种原因、我无法再重复重叠。 此外、我已切换回原始示波器、并且看不到这一重叠。 我测量了几个信号以看到它们的死区、有些信号大约为100ns-150ns。

    我还以1/8占空比运行、这就是我得到的结果、我无法从信号中复制零位。  

    我担心可能还有另一个问题导致了这种情况、我对此不确定。  您的设置上是否存在生成脉冲的噪声?  

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

    这似乎不太可能。 我使用 controlCARD 和坞站进行这些测试。 即使我取出代码的所有其他函数并刚运行 PWM、我也看到了重叠。 我稍后会再次尝试以进行验证、但我不明白它为什么会发生变化。

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

    我发送的捕获确实显示了100ns 的死区、但当它设置为125ns 时这是一个违例。 如果死区的这种精度不是25ns 的精度、那么这就会是另一个问题。 同样在较高的斩波占空比下、死区时间会下降到更差的水平。

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

    我同意这两种方式都会引起担忧、我已就此联系设计团队了解可能会出现什么问题。 我将在收到回复后向您提供最新信息。

    此致!

    Ryan Ma

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

    非常好。 谢谢你。

    我相信在使用 PWM 斩波器期间、可以通过开启死区时间来解决这个问题。 我想将斩波器用于启动、在该应用中、低效率的死区时间不是首要问题(只要动态死区变化不会导致其他问题)。

    无论如何、最好能理解我的限制条件。

    杰伊

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

    您好、Jay、  

    根据设计、斩波输出将与插入的死区 PWM 进行与运算、因此不应该有重叠。 我将在结束时再次测试它、并尝试为您找到解决方案。

    此致!

    Ryan Ma

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

    您好、Jay、

    我已再次尝试此设置、但仍然看不到这种重叠、这是您的示波器设置或探头出现的问题吗?

    我添加了死区、它的误差似乎在~50ns - 150ns 之间变化。 您对死区使用了什么值? 但是、当我尝试找到两个输出同时变为高电平时的情况时、没有重叠。  

    此致!

    Ryan Ma

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

    您好、Jay、

    我在这方面有了 bitfield 与 driverlib 项目。

    使用位域:

    这是死区= 0的正常高电平有效互补信号。 我只是想看看上升沿和下降沿的时序是否对齐了、它们是否对齐了。

    转到仅启用 PWM 斩波且仍具有死区= 0的情况、我发现了一些有趣的事情。 PWM 斩波器为 PWM1B 添加了50ns、并在50ns 结束时向 PWM1B 的上升沿添加了延迟。 创建一个目标配置。

    在此屏幕截图中、PWM 斩波器看起来与我发送的第一个屏幕截图完全相同、但没有额外的延迟、也没有在 PWM1B 输出的任一侧添加50ns

    因此、似乎当您为信号启用 PWM 斩波器时、它可能会额外增加或导致任一侧几乎50ns 的死区。

    我有两条建议供您调试这个问题、一条建议是尝试我在 bitfield 中执行的操作、另一条建议是在 driverlib 中执行的操作。

    使用 Driverlib 的选项1:

    您是否能够配置一个输出 XBar、以便在 TBCTR = 0时发生 EXTSYNCOUT。 您可以复制此代码并将此 GPIO 引脚(GPIO58)用作示波器

    这是我使用该方法获得的输出、以看到该额外的50ns 延迟、但我添加了值为15的死区。 不过、我没有看到任何重叠。

    选项2:

    您能否从以下位置导入位域工程: C:\ti\c2000\c2000\C2000Ware_4_03_00_00\device_support\f2837xd\examples\cpu1\ePWM_up_AQ

    将其粘贴到 epwm_up_aQ_cpu01.c 中、然后使用 bitfield 进行测试。 我在应用150ns 的死区时间内得到非常一致的结果。

     

    //###########################################################################
    //
    // FILE:   epwm_up_aq_cpu01.c
    //
    // TITLE:  Action Qualifier Module - Using up count.
    //
    //! \addtogroup cpu01_example_list
    //! <h1> EPWM Action Qualifier (epwm_up_aq)</h1>
    //!
    //! This example configures ePWM1, ePWM2, ePWM3 to produce an
    //! waveform with independent modulation on EPWMxA and
    //! EPWMxB.
    //!
    //! The compare values CMPA and CMPB are modified within the ePWM's ISR.
    //!
    //! The TB counter is in up count mode for this example.
    //!
    //! View the EPWM1A/B(PA0_GPIO0 & PA1_GPIO1), EPWM2A/B(PA2_GPIO2 & PA3_GPIO3)
    //! and EPWM3A/B(PA4_GPIO4 & PA5_GPIO5) waveforms via an oscilloscope.
    //!
    //
    //###########################################################################
    //
    // $Release Date: $
    // $Copyright:
    // Copyright (C) 2013-2023 Texas Instruments Incorporated - http://www.ti.com/
    //
    // Redistribution and use in source and binary forms, with or without 
    // modification, are permitted provided that the following conditions 
    // are met:
    // 
    //   Redistributions of source code must retain the above copyright 
    //   notice, this list of conditions and the following disclaimer.
    // 
    //   Redistributions in binary form must reproduce the above copyright
    //   notice, this list of conditions and the following disclaimer in the 
    //   documentation and/or other materials provided with the   
    //   distribution.
    // 
    //   Neither the name of Texas Instruments Incorporated nor the names of
    //   its contributors may be used to endorse or promote products derived
    //   from this software without specific prior written permission.
    // 
    // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 
    // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 
    // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
    // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 
    // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 
    // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 
    // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
    // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
    // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 
    // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 
    // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
    // $
    //###########################################################################
    
    //
    // Included Files
    //
    #include "F28x_Project.h"
    
    //
    // Defines
    //
    #define EPWM1_TIMER_TBPRD  1164  // Period register
    #define EPWM1_CMPA     582
    
    
    #define EPWM_CMP_UP           1
    #define EPWM_CMP_DOWN         0
    
    //
    // Globals
    //
    typedef struct
    {
        volatile struct EPWM_REGS *EPwmRegHandle;
        Uint16 EPwm_CMPA_Direction;
        Uint16 EPwm_CMPB_Direction;
        Uint16 EPwmTimerIntCount;
        Uint16 EPwmMaxCMPA;
        Uint16 EPwmMinCMPA;
        Uint16 EPwmMaxCMPB;
        Uint16 EPwmMinCMPB;
    }EPWM_INFO;
    
    EPWM_INFO epwm1_info;
    
    
    //
    //  Function Prototypes
    //
    void InitEPwm1Example(void);
    
    
    //
    // Main
    //
    void main(void)
    {
    //
    // Step 1. Initialize System Control:
    // PLL, WatchDog, enable Peripheral Clocks
    // This example function is found in the F2837xD_SysCtrl.c file.
    //
        InitSysCtrl();
    
    //
    // Step 2. Initialize GPIO:
    // This example function is found in the F2837xD_Gpio.c file and
    // illustrates how to set the GPIO to it's default state.
    //
    //    InitGpio();
    
    //
    // Enable PWM1, PWM2 and PWM3
    //
        CpuSysRegs.PCLKCR2.bit.EPWM1=1;
    
    
    //
    // For this case just init GPIO pins for ePWM1, ePWM2, ePWM3
    // These functions are in the F2837xD_EPwm.c file
    //
        InitEPwm1Gpio();
    
    
    //
    // Step 3. Clear all interrupts and initialize PIE vector table:
    // Disable CPU interrupts
    //
        DINT;
    
    //
    // Initialize the PIE control registers to their default state.
    // The default state is all PIE interrupts disabled and flags
    // are cleared.
    // This function is found in the F2837xD_PieCtrl.c file.
    //
        InitPieCtrl();
    
    //
    // Disable CPU interrupts and clear all CPU interrupt flags:
    //
        IER = 0x0000;
        IFR = 0x0000;
    
    //
    // Initialize the PIE vector table with pointers to the shell Interrupt
    // Service Routines (ISR).
    // This will populate the entire table, even if the interrupt
    // is not used in this example.  This is useful for debug purposes.
    // The shell ISR routines are found in F2837xD_DefaultIsr.c.
    // This function is found in F2837xD_PieVect.c.
    //
        InitPieVectTable();
    
    
    //
    // For this example, only initialize the ePWM
    //
        EALLOW;
        CpuSysRegs.PCLKCR0.bit.TBCLKSYNC = 0;
        EDIS;
    
        InitEPwm1Example();
    
        EALLOW;
        CpuSysRegs.PCLKCR0.bit.TBCLKSYNC = 1;
        EDIS;
    
    
    
    
    //
    // Enable global Interrupts and higher priority real-time debug events:
    //
        EINT;  // Enable Global interrupt INTM
        ERTM;  // Enable Global realtime interrupt DBGM
    
    //
    // Step 5. IDLE loop. Just sit and loop forever (optional):
    //
        for(;;)
        {
            asm ("  NOP");
        }
    }
    
    
    //
    // InitEPwm1Example - Initialize EPWM1 values
    //
    void InitEPwm1Example()
    {
       //
       // Setup TBCLK
       //
       EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP; // Count up
       EPwm1Regs.TBPRD = EPWM1_TIMER_TBPRD;       // Set timer period
       EPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE;    // Disable phase loading
       EPwm1Regs.TBPHS.bit.TBPHS = 0x0000;        // Phase is 0
       EPwm1Regs.TBCTR = 0x0000;                  // Clear counter
       EPwm1Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;   // Clock ratio to SYSCLKOUT
       EPwm1Regs.TBCTL.bit.CLKDIV = TB_DIV1;
    
       //
       // Setup shadow register load on ZERO
       //
       EPwm1Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;
       EPwm1Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;
       EPwm1Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;
       EPwm1Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;
    
       //
       // Set Compare values
       //
       EPwm1Regs.CMPA.bit.CMPA = EPWM1_CMPA;     // Set compare A value
    //   EPwm1Regs.CMPB.bit.CMPB = EPWM1_MIN_CMPB;     // Set Compare B value
    
       //
       // Set actions
       //
       EPwm1Regs.AQCTLA.bit.ZRO = AQ_SET;            // Set PWM1A on Zero
       EPwm1Regs.AQCTLA.bit.CAU = AQ_CLEAR;          // Clear PWM1A on event A,
                                                     // up count
    
       EPwm1Regs.AQCTLB.bit.ZRO = AQ_CLEAR;            // Set PWM1B on Zero
       EPwm1Regs.AQCTLB.bit.CAU = AQ_SET;          // Clear PWM1B on event B,
                                                     // up count
       EPwm1Regs.DBCTL.bit.IN_MODE = 0x00;
       EPwm1Regs.DBCTL.bit.DEDB_MODE = 0x00;
       EPwm1Regs.DBCTL.bit.SHDWDBFEDMODE = 0x1;
       EPwm1Regs.DBCTL.bit.SHDWDBREDMODE = 0x1;
       EPwm1Regs.DBCTL.bit.LOADFEDMODE = 0xF; // You can play with this value
       EPwm1Regs.DBCTL.bit.LOADREDMODE = 0xF; // to see the delays
       EPwm1Regs.DBRED.bit.DBRED = 0x0;
       EPwm1Regs.DBFED.bit.DBFED = 0x0;
       EPwm1Regs.DBCTL.bit.POLSEL = 0x2;
       EPwm1Regs.DBCTL.bit.OUT_MODE = 0x3;
    
       EPwm1Regs.PCCTL.bit.CHPEN = 0x1; // try commenting out these lines to see
       EPwm1Regs.PCCTL.bit.OSHTWTH = 0x0; // what is happening w/o chopper
       EPwm1Regs.PCCTL.bit.CHPFREQ = 0x0;
       EPwm1Regs.PCCTL.bit.CHPDUTY = 0x3;
    }
    
    
    //
    // End of file
    //
    

    我希望这对您有所帮助、我也会将这些信息转发给设计部门、以查看是否应该将其记录在我们的 TRM 中。

    此致!

    Ryan Ma

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

    我在仅特定的占空比下发现了重叠。 我怀疑它与示波器捕获相关。 它是罕见的,但它根本不可能发生。 我更频繁地看到子目标死区违例。  

    考虑为什么从一开始就需要死区、需要考虑不同的死区。 您看到的这种变化是否符合预期? 这种变化是否为器件/设计的限制?

    我的目标死区最小为125ns、这对应于我的系统中的设置25 (PWM 时钟分频器为0)。 较长的死区时间将简单地转换为系统性能的低效率、但可能影响最小。 这是不可取的。

    ePWM 模块是否有差异? 这似乎不太可能,但问。

    我将尝试找到显示重叠的确切斩波器设置。 我最近将 PWM 时钟分频器切换为一分频、所以可能已对其进行了更改、但仍然会出现时序违规。 如果您要导出示例项目、我们可以使用完全相同的配置。

    杰伊

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

    我以各种斩波占空比和频率仔细检查并收集了数据。 我找到了会导致死区冲突和重叠的配置、并具有范围捕获。 在我的测试中、随着占空比和频率的增加、时序越来越差。 重叠违例在直流= 100b 且 FREQ = 101b 时以100kHz 波形开始。

    我将尝试上面提供的代码、并根据需要添加死区、然后重新测试。

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

    您好、Jay、

    您能否向我展示您收集的数据? 然后、我可以将其与设计团队分享。 您扫描的频率范围是多少、我假设您从占空比1/8 -> 7/8以及所有斩波频率进行扫描?

    此致!

    Ryan Ma

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

    e2e.ti.com/.../epwm_5F00_waveforms.zip

    附件是我在各种 CHPDUTY 和 CHPFREQ 设置下收集的波形 zip。 还包括空洞情况下的 ePWM 寄存器转储以及第一次检测到重叠。

    此时、我很想找到另一种不依赖于 PWM 斩波器的解决方案。 感谢您的观看。

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

    您好、Jay、

    感谢您的提问。

    此致!

    Ryan Ma