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.

[参考译文] TMS320F28388D:当 EPWMxSYNCO 源设置为 CTR = 0时如何避免抖动。

Guru**** 2612405 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1000552/tms320f28388d-how-to-avoid-the-jitter-when-epwmxsynco-source-is-set-to-ctr-0

器件型号:TMS320F28388D

您好!

技术参考手册中提到“当启用高分辨率周期模式时,

EPWMxSYNC 脉冲将向 PWM 引入+/- 1 - 2周期抖动。 因此、

EPWMxSYNCO 源不应设置为 CTR = 0或 CTR = CMPB。 否则,抖动将随同步脉冲在每个 PWM 周期发生。”

根据这一解释,您能回答以下问题吗?

1) 1)是否有方法可以避免抖动? 如果需要将 EPWMxSYNCO 源设置为 CTR = 0以在实验中的每个 PWM 周期更新参数、

2) 2)如果高分辨率周期模式被禁用、当 EPWMxSYNCO 设置为 CTR = 0时、抖动是否会发生。

谢谢你。

此致、

文京

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="475330" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1000552/tms320f28388d-how-to-avoid-the-jitter-when-epwmxsynco-source-is-set-to-ctr-0 "]

    1) 1)是否有方法可以避免抖动? 如果需要将 EPWMxSYNCO 源设置为 CTR = 0以在实验中的每个 PWM 周期更新参数、

    2) 2)如果高分辨率周期模式被禁用、当 EPWMxSYNCO 设置为 CTR = 0时、抖动是否会发生。

    [/报价]

    1) 1)如果启用了 HR 模式、则在每个 SYNCIN 上都会出现抖动。 您必须发送同步脉冲一次、然后继续操作所有内容。 它将保持完美同步。 一旦由于系统要求的相移或变化而完全必要、您可以发送另一个 SYNCIN 脉冲。

    2) 2)如果没有 HR、您最好尽可能同步!

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

    你好、Nima

    感谢你的答复。

    1) 1)我会尝试它。

    2) 2)如果没有 HR、您最好尽可能同步!

    我在…中测试了 HRPWM_ex4_Deadband SFO_v8.c 的示例 device_support\f2838x\examples\cpu1\HRPWM”中添加了以下更改。

    因此、发生了2个 PWM 周期抖动。 请参阅图片和随附的 C 源代码。

    #define HR_ENABLED         0  //禁用 HR 行为

     (* ePWM2]).TBPHS.bit.TBPHS = 0x00;//在中断函数中

     

    您能告诉我是什么导致了抖动的。

    谢谢。

     e2e.ti.com/.../hrpwm_5F00_ex4_5F00_deadband_5F00_sfo_5F00_v8.c

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

    这是预期的。 这不是抖动、而是芯片内部的逻辑延迟。 请启用相移负载并补偿 TBPHS 值中的延迟周期。

    NIMA

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

    感谢您的回答。
    但我不清楚跟进。

    是否意味着逻辑延迟始终存在?
    2.使用同步功能时、从 PWM 模块中是否出现来自更成熟 PWM 模块的逻辑延迟?
    逻辑延迟是否恒定为2个周期? 或者延迟的数量取决于微控制器的类型。

    非常感谢您的帮助。

    文京

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

    是的、始终存在逻辑延迟。

    如果您有 PHSEN、则需要设置 TBPHS 值来补偿逻辑延迟。 它非常简单。 延迟位于同步接收器中。

    延迟是恒定的。

    NIMA

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

    感谢你的答复。

    是的、我使用您刚才提到的方法来设置 TBPHS 来补偿延迟。 它也运行良好。

    在我的实验中、逻辑延迟为2个周期。

    您回答了延迟是恒定的。 我能否理解、对于 F28388、F28379、F28335等 C2000系列、常量始终为2个周期 ?

    是否有任何文档用于解释此问题?

    文京

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

    是的、在我的代码中、我还有值2、这意味着延迟实际上是3! 0-1-2

    NIMA

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

    很抱歉,我没有得到你的意见。 请说明一下。

    请正式就此问题提供任何详细解释为荷。

    因为这个问题对我们来说非常重要。

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

    有 2个周期延迟! 因此、您必须将 TBPHS 值设置为1。 (请记住、计数器变为零、然后变为一个!)

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

    谢谢你。 我明白了。

    我相信您有一份有关逻辑延迟的官方描述手册。

    请分享。

     

    文京

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

    文京

    以下是无延迟完美同步的代码。

    NIMA

    //#############################################################################
    //
    // FILE:   epwm_ex14_zero_phase.c
    //
    // TITLE:  ePWM Using The Synch Chain and Phase Shift.
    //
    //! \addtogroup driver_example_list
    //! <h1>ePWM Synchronization</h1>
    //!
    //! This example configures ePWM1, ePWM2 as follows
    //!  - ePWM1 without phase shift as master
    //!  - ePWM2 with phase shift of 0 TBCLKs
    //!
    //! \b External \b Connections \n
    //! - GPIO0 EPWM1A
    //! - GPIO1 EPWM1B
    //! - GPIO2 EPWM2A
    //! - GPIO3 EPWM2B
    //!
    //! \b Watch \b Variables \n
    //! - None.
    //
    //#############################################################################
    // $TI Release: $
    // $Release Date: $
    // $Copyright: $
    //#############################################################################
    
    //
    // Included Files
    //
    #include "driverlib.h"
    #include "device.h"
    #include "board.h"
    
    #define USE_UPDOWN_COUNT    1
    
    #define EPWM_TIMER_TBPRD    2000
    
    //
    // Function Prototypes
    //
    void initEPWM(uint32_t base);
    
    __interrupt void epwm1ISR(void);
    __interrupt void epwm2ISR(void);
    
    //
    // Main
    //
    void main(void)
    {
        //
        // Initialize device clock and peripherals
        //
        Device_init();
    
        //
        // Disable pin locks and enable internal pull ups.
        //
        Device_initGPIO();
    
        //
        // Initialize PIE and clear PIE registers. Disables CPU interrupts.
        //
        Interrupt_initModule();
    
        //
        // Initialize the PIE vector table with pointers to the shell Interrupt
        // Service Routines (ISR).
        //
        Interrupt_initVectorTable();
    
        //
        // Assign the interrupt service routines to ePWM interrupts
        //
        Interrupt_register(INT_EPWM1, &epwm1ISR);
        Interrupt_register(INT_EPWM2, &epwm2ISR);
    
        //
        // Configure GPIO0/1 , GPIO2/3 and GPIO4/5 and GPIO6/7 as
        // ePWM1A/1B, ePWM2A/2B, ePWM3A/3B, ePWM4A/4B pins respectively
        //
        Board_init();
    
        // Disable sync(Freeze clock to PWM as well). GTBCLKSYNC is applicable
        // only for multiple core devices. Uncomment the below statement if
        // applicable.
        //
        // SysCtl_disablePeripheral(SYSCTL_PERIPH_CLK_GTBCLKSYNC);
        SysCtl_disablePeripheral(SYSCTL_PERIPH_CLK_TBCLKSYNC);
    
        //
        // Initialize PWM1 without phase shift as master
        //
        initEPWM(myEPWM1_BASE);
    
        //
        // Initialize PWM2 with phase shift of 300 TBCLKs
        //
        initEPWM(myEPWM2_BASE);
        EPWM_selectPeriodLoadEvent(myEPWM2_BASE, EPWM_SHADOW_LOAD_MODE_SYNC);
    #if USE_UPDOWN_COUNT == 0
        EPWM_setPhaseShift(myEPWM2_BASE, 1);
    #else
        EPWM_setPhaseShift(myEPWM2_BASE, 1);
        EPWM_setCountModeAfterSync(myEPWM2_BASE, EPWM_COUNT_MODE_UP_AFTER_SYNC);
    #endif
        EPWM_setTimeBaseCounter(myEPWM2_BASE, 0);
    
    
        //
        // ePWM1 SYNCO is generated on CTR=0
        //
        EPWM_setSyncOutPulseMode(EPWM1_BASE, EPWM_SYNC_OUT_PULSE_ON_COUNTER_ZERO);
    
        //
        // ePWM2 uses the ePWM 1 SYNCO as its SYNCIN.
        // ePWM2 SYNCO is generated from its SYNCIN, which is ePWM1 SYNCO
        //
        EPWM_setSyncOutPulseMode(myEPWM2_BASE, EPWM_SYNC_OUT_PULSE_ON_EPWMxSYNCIN);
    
        //
        // Enable all phase shifts.
        //
        EPWM_enablePhaseShiftLoad(myEPWM2_BASE);
    
        //
        // Enable sync and clock to PWM
        //
        SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_TBCLKSYNC);
    
        //
        // Enable ePWM interrupts
        //
        Interrupt_enable(INT_EPWM1);
        Interrupt_enable(INT_EPWM2);
    
        //
        // Enable Global Interrupt (INTM) and realtime interrupt (DBGM)
        //
        EINT;
        ERTM;
    
        //
        // IDLE loop. Just sit and loop forever (optional):
        //
        for(;;)
        {
    
        }
    }
    
    //
    // epwm1ISR - ePWM 1 ISR
    //
    __interrupt void epwm1ISR(void)
    {
        //
        // Clear INT flag for this timer
        //
        EPWM_clearEventTriggerInterruptFlag(myEPWM1_BASE);
    
        //
        // Acknowledge interrupt group
        //
        Interrupt_clearACKGroup(INTERRUPT_ACK_GROUP3);
    }
    
    //
    // epwm2ISR - ePWM 2 ISR
    //
    __interrupt void epwm2ISR(void)
    {
        //
        // Clear INT flag for this timer
        //
        EPWM_clearEventTriggerInterruptFlag(myEPWM2_BASE);
    
        //
        // Acknowledge interrupt group
        //
        Interrupt_clearACKGroup(INTERRUPT_ACK_GROUP3);
    }
    
    void initEPWM(uint32_t base)
    {
        //
        // Set-up TBCLK
        //
        EPWM_setTimeBasePeriod(base, EPWM_TIMER_TBPRD);
        EPWM_setPhaseShift(base, 0U);
        EPWM_setTimeBaseCounter(base, 0U);
    
        //
        // Set Compare values
        //
        EPWM_setCounterCompareValue(base,
                                    EPWM_COUNTER_COMPARE_A,
                                    EPWM_TIMER_TBPRD/2);
        EPWM_setCounterCompareValue(base,
                                    EPWM_COUNTER_COMPARE_B,
                                    EPWM_TIMER_TBPRD/4);
    
        //
        // Set up counter mode
        //
    #if USE_UPDOWN_COUNT == 0
        EPWM_setTimeBaseCounterMode(base, EPWM_COUNTER_MODE_UP);
    #else
        EPWM_setTimeBaseCounterMode(base, EPWM_COUNTER_MODE_UP_DOWN);
    #endif
    
        EPWM_disablePhaseShiftLoad(base);
        EPWM_setClockPrescaler(base,
                               EPWM_CLOCK_DIVIDER_8,
                               EPWM_HSCLOCK_DIVIDER_1);
    
        //
        // Set up shadowing
        //
        EPWM_setCounterCompareShadowLoadMode(base,
                                             EPWM_COUNTER_COMPARE_A,
                                             EPWM_COMP_LOAD_ON_CNTR_ZERO);
        EPWM_setCounterCompareShadowLoadMode(base,
                                             EPWM_COUNTER_COMPARE_B,
                                             EPWM_COMP_LOAD_ON_CNTR_ZERO);
    
        //
        // Set actions
        //
        EPWM_setActionQualifierAction(base,
                                      EPWM_AQ_OUTPUT_A,
                                      EPWM_AQ_OUTPUT_HIGH,
                                      EPWM_AQ_OUTPUT_ON_TIMEBASE_ZERO);
        EPWM_setActionQualifierAction(base,
                                      EPWM_AQ_OUTPUT_B,
                                      EPWM_AQ_OUTPUT_HIGH,
                                      EPWM_AQ_OUTPUT_ON_TIMEBASE_ZERO);
        EPWM_setActionQualifierAction(base,
                                      EPWM_AQ_OUTPUT_A,
                                      EPWM_AQ_OUTPUT_LOW,
                                      EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPA);
        EPWM_setActionQualifierAction(base,
                                      EPWM_AQ_OUTPUT_B,
                                      EPWM_AQ_OUTPUT_LOW,
                                      EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPB);
    
    
        //
        // Interrupt where we will change the Compare Values
        // Select INT on Time base counter zero event,
        // Enable INT, generate INT on 1rd event
        //
        EPWM_setInterruptSource(base, EPWM_INT_TBCTR_ZERO);
        EPWM_enableInterrupt(base);
        EPWM_setInterruptEventCount(base, 1U);
    }

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

    对于向上计数和向上向下计数、这些值是不同的

    我将把它添加到 TRM 中。

    向上计数结果

    向上/向下计数结果

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

    您需要将 PHS 设置为0x1。 和向上向下计数。

    抱歉、我刚才测试了获取这些值。 我将更新 TRM 以反映这些值、因为我在文档中找不到这些值。

    逻辑延迟为2。 因此 PHS 值必须为0x1。

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

    你好、Nima

     

    感谢您的支持。

     

    您的测试结果是将向上计数和向上向下计数的 PHS 设置为0x1。

    但是,我在“…”中测试了 HRPWM_ex4_Deadband SFO_v8.c 的示例 device_support\f2838x\examples\cpu1\HRPWM”

    并进行以下更改。

    #define HR_ENABLED         0  //禁用 HR 行为

     (* ePWM2]).TBPHS.bit.TBPHS = 0x02;//在中断函数中

    因此、我需要将 PHS 设置为0x2以进行向上-向下计数。

    它的结果也与我的实验中的上数和上数-下数将 PHS 设置为0x2相同。

    您能否仔细检查该示例并让我知道您的测试结果?

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

    您正在使用 F28388器件?

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

    是的、我使用  的是 F28388D。

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

    很抱歉造成混淆。 是的、您的实验是正确的。 对于 F2837xD、F2837xS 和 F28004x 器件、EPWM1和 EPWM2之间的延迟为2周期延迟、因此写入的值为0x1。

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

    你好、Nima

    感谢您的确认。

    我还有2个问题。

    1) 1) HRPWM_ex4_Deadband _SFO_v8.c 的示例、它显示了 epwm1和 epwm2之间的2个周期延迟、

     它将通过写入 PHS = 0x2得到完美补偿。 请参阅波形。

    这是否意味着对于2周期延迟而不是3周期、PHS = 0x2?

    2) 2) 无论 F28388的具体情况如何、它是否是固定的延迟量?

    文京

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

    请让我解释一下2)。

    我们需要有关延迟量的产品规格(官方规格)。

    因为如果 F28388D#(S/N xxxx1)和 F28388D#(S/N xxxx2)之间存在差异,这对我们来说是一个问题。

    如果延迟是恒定值、我们将应用该设置。 但是、如果不是、我们需要其他解决方案来同步 PWM。

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

    否、所有 F28388D 器件上的延迟都是相同的。 器件系列内无变化。

    正确的做法是、对于 F28388D 器件、它将始终为 PHS=0x1。

    对于 F28004x、F2837xD、F2837xS、在 EPWM1和 EPWM2之间、PHS=0x1。