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.

[参考译文] TMS320F28379D:在多相可变频率操作中扩展的 PWM 占空比

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

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1416039/tms320f28379d-pwm-duty-extending-in-multi-phase-variable-frequency-operation

器件型号:TMS320F28379D
Thread 中讨论的其他器件:C2000WARE

工具与软件:

大家好、我正在从事一项采用逆变器模式的三相3级飞跨电容图腾柱升压 PFC 工作。 我们运行在三角传导模式(iTCM)下、在这个模式下、每个桥臂的开关频率和占空比也会发生变化。 由于我们需要在每个 ISR 间隔期间正确更新 PWM、因此我已经使用全局加载模式锁存 TBPRD、CMPA、CMPB 和 TBPHS 寄存器。 在 A 相、我使用 EPWM1 (内部开关)和 EPWM2 (外部开关)。 我面临一个问题、如果 TBPHS 大于 EPWM2的 CMPA、它会使 EPWM2A 持续更长时间。 我在下面连接了相同的波形。 请帮助我解决该问题。

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

    您好 Pranav、

    如果我理解了这个问题、则由于相移跳过了动作限定器事件、您缺少了动作限定器。 如果是这种情况、请参阅此相关主题、并告诉我这是否适用/可以帮助解决您的问题:  

    https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1312604/tms320f28379d-tms320f28379d-phase-shift-pwm-missing-pulse 

    此致、

    Allison

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

    您好、Allison:

    我在一次性配置中使用全局加载模式、因为我的应用也是可变频率。 该解决方案是否适合这种情况?

    此致、

    Pranav

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

    Pranav、您好!  

    负载方案不会影响此解决方案、因为该解决方案 在同步脉冲上实现单独的动作限定符(T1/T2)、以执行在某些条件下错过的操作(例如、当 TBPHS > CMPA 时、导致 TBCTR 在同步脉冲时跳过动作限定器事件)。

    为了澄清、扩展脉冲是否会在具有同步脉冲时发生? (如果您不了解或好奇、实际上可以使用输出 XBAR 模块检查 ePWM 同步脉冲"EXTSYNCOUT"、这在调试时非常有用)。 在我链接的主题中、您可以阅读我对该问题的描述、并评估这是否适用于您的情况。

    此致、

    Allison

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

    您好 Allison、您能在我的代码中验证这个逻辑吗? 我想我错过了一些东西

    if(new_phase > new_cmp)
    {
        cmp = new_phase + 1;
        EPwm2Regs.AQTSRCSEL.bit.T1SEL = 7;              // EPWMxSYNCI chosen as T1 Event Source
        EPwm2Regs.AQCTLA.bit.CAU = AQ_SET;              
    }
    else
    {
        cmp = news_cmp;
        EPwm2Regs.AQTSRCSEL.bit.T1SEL = 0;              // Default source selected
        EPwm2Regs.AQCTLA.bit.CAU = AQ_CLEAR;
    }
    
    EPwm2Regs.CMPA.bit.CMPA = cmp;
    
    EPwm2Regs.TBPHS.bit.TBPHS = new_phase;
    
    EPwm1Regs.GLDCTL2.bit.OSHTLD = 1;        

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

    Pranav、您好!  

    感谢您的跟进。 请允许我再过一天来看看并提供进一步的指导。  

    此致、

    Allison

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

    Pranav、您好!  

    您能否向我发送您的 ePWM 初始化、以便我可以查看基础设置(Time Base、Counter Compare Values、Action Qualifiers 等)?  

    此致、

    Allison

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

        // PWM initialization
        
        EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP; // Count up
        EPwm1Regs.TBPRD = PWM_PERIOD;       // Set timer period
        EPwm1Regs.TBCTR = PWM_PERIOD/2;                 // Set time base counter to half period counts
        EPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE;    // Disable phase loading
        EPwm1Regs.TBCTL.bit.SYNCOSEL = 0x1;
        EPwm1Regs.TBPHS.bit.TBPHS = 0x0000;        // Phase is 0
    
        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;
        EPwm1Regs.TBCTL.bit.HSPCLKDIV = 0;   // Clock ratio to SYSCLKOUT
        EPwm1Regs.TBCTL.bit.CLKDIV = 0;
    
        EPwm1Regs.AQCTLA.bit.ZRO = AQ_SET;            // Set PWM1A on Zero
        EPwm1Regs.AQCTLA.bit.CAU = AQ_CLEAR;          // Clear PWM1A on event A,
        EPwm1Regs.DBCTL.bit.OUT_MODE = 0x3;
        EPwm1Regs.DBCTL.bit.POLSEL = 0x2;
        EPwm1Regs.DBFED.bit.DBFED = DT;
        EPwm1Regs.DBRED.bit.DBRED = DT;
    
        EPwm2Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP; // Count up
        EPwm2Regs.TBPRD = PWM_PERIOD;       // Set timer period
        EPwm2Regs.TBCTR = PWM_PERIOD/2;           // Set time base counter to half period counts
        EPwm2Regs.TBCTL.bit.PHSEN = TB_ENABLE;    // Enable phase loading
        EPwm2Regs.TBCTL.bit.SYNCOSEL = 0x0;
        EPwm2Regs.TBPHS.bit.TBPHS= PWM_HALF_PERIOD;       // Phase is 180deg
    
        EPwm2Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;
        EPwm2Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;
        EPwm2Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;
        EPwm2Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;
        EPwm2Regs.TBCTL.bit.HSPCLKDIV = 0;   // Clock ratio to SYSCLKOUT
        EPwm2Regs.TBCTL.bit.CLKDIV = 0;
    
        EPwm2Regs.AQCTLA.bit.ZRO = AQ_SET;            // SET PWM2A on ZERO
        EPwm2Regs.AQCTLA.bit.CAU = AQ_CLEAR;              // CLEAR PWM2A on event A,
                                                        // up count
        EPwm2Regs.DBCTL.bit.OUT_MODE = 0x3;
        EPwm2Regs.DBCTL.bit.POLSEL = 0x2;
        EPwm2Regs.DBFED.bit.DBFED = DT;
        EPwm2Regs.DBRED.bit.DBRED = DT;
        
        EPwm1Regs.GLDCFG.bit.TBPRD_TBPRDHR = 1;
        EPwm1Regs.GLDCFG.bit.CMPA_CMPAHR = 1;
        EPwm1Regs.GLDCFG.bit.CMPB_CMPBHR = 1;
        EPwm1Regs.GLDCTL.bit.GLDMODE = 0;      // Global load on counter = 0
        EPwm1Regs.GLDCTL.bit.OSHTMODE = 1;     // One shot mode is active
        EPwm1Regs.GLDCTL.bit.GLD = 1;          // All shadow to active events are defined by GLDMODE
    
        EPwm2Regs.GLDCFG.bit.TBPRD_TBPRDHR = 1;
        EPwm2Regs.GLDCFG.bit.CMPA_CMPAHR = 1;
        EPwm2Regs.GLDCFG.bit.CMPB_CMPBHR = 1;
        EPwm2Regs.GLDCTL.bit.GLDMODE = 3;      // Global load on sync pulse
        EPwm2Regs.GLDCTL.bit.OSHTMODE = 1;     // One shot mode is active
        EPwm2Regs.GLDCTL.bit.GLD = 1;          // All shadow to active events are defined by GLDMODE
    
        EPwm2Regs.EPWMXLINK.bit.GLDCTL2LINK = 0;   // EPWM2 linked for global load to EPWM1
        EPwm2Regs.EPWMXLINK.bit.TBPRDLINK = 0;     // TBPRD write for EPWM1 simultaneously writes to EPWM2
        
    // In ISR
    
        EPwm1Regs.TBPRD = prd;
        EPwm1Regs.CMPA.bit.CMPA = new_cmp;              // Set PWM duty cycle
        
        EPwm2Regs.TBPRD = prd;
        
        if(new_phase > new_cmp)
        {
            cmp = new_phase + 1;
            EPwm2Regs.AQTSRCSEL.bit.T1SEL = 7;              // EPWMxSYNCI chosen as T1 Event Source
            EPwm2Regs.AQCTLA.bit.CAU = AQ_SET;              
        }
        else
        {
            cmp = news_cmp;
            EPwm2Regs.AQTSRCSEL.bit.T1SEL = 0;              // Default source selected
            EPwm2Regs.AQCTLA.bit.CAU = AQ_CLEAR;
        }
    
        EPwm2Regs.CMPA.bit.CMPA = cmp;
    
        EPwm2Regs.TBPHS.bit.TBPHS = new_phase;
    
        EPwm1Regs.GLDCTL2.bit.OSHTLD = 1;   

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

    谢谢! 让我复查并尝试运行几个测试用例。 之后我会跟进。

    此致、

    Allison

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

    Pranav、您好!

    我已将 EPWM 设置精简为隔离问题、并展示了一种简单的方法、可以使用 T1事件来满足缺失的动作限定符要求。 随附的.c 取自我们的 DriverLib 同步示例({C2000Ware}\driverlib\f2837xd\examples\cpu1\epwm\epwm_ex3_synchronization)、并进行了修改以执行此操作。 我把评论留在顶部解释。 如果这对您有帮助、或者您在实施时仍然遇到问题、请告诉我!

    e2e.ti.com/.../epwm_5F00_ex3_5F00_synchronization_5F00_MODIFIED.c

    此致、

    Allison

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

    您好、Allison:

    这有助于我解决问题。 感谢您发送编修。