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.

[参考译文] TMS320F28027F:使用 HRPWM 时不必要的频率变化

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

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1010369/tms320f28027f-unwanted-frequency-variation-when-using-hrpwm

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

大家好、

我使用 HRPWM 模块进行高分辨率周期控制。 初始化之后、当我对固定  频率和占空比的电阻器进行硬编码时、我注意到示波器上的频率不是恒定的。

例如、我将寄存器的值固定为187kHz。 我注意到、示波器上的频率变化200Hz (187.0kHz 至187.2kHz 之间)。 这种变化在较高的频率下进一步增大、对于375kHz、它大约为400Hz。

以下是 ePWM 和 HRPWM 模块的初始化:

uint16_t Time_counter=30000;
uint16_t frequency_ref_KHz=125; // Initializing PWM frequency

void InitEPwm1Example()
{
    EALLOW;

    TBPRD_Counter=Time_counter/frequency_ref_KHz; // Calculation
    EPwm1Regs.TBPRD = TBPRD_Counter;                 // Set timer period
    EPwm1Regs.TBPRDHR =0x0000;
    EPwm1Regs.TBPHS.half.TBPHS = 0x0000;            //  Used for Sync. of multiple PWM channels, we are using only one channel (2 output) , It os already disabled below
    EPwm1Regs.TBCTR = 0x0000;                       // Clear counter
    EPwm1Regs.TBCTL.bit.PRDLD = TB_SHADOW;             // set Shadow load so that TBPRD is safe this way

    // Setup TBCLK
    EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN; // Count updown
    EPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE;        // Disable  loading // To enable
    EPwm1Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;       // Clock ratio to SYSCLKOUT
    EPwm1Regs.TBCTL.bit.CLKDIV = TB_DIV1;          // Slow so we can observe on the scope
    EPwm1Regs.TBCTL.bit.SYNCOSEL = TB_CTR_ZERO;// Recommended for High Resolution : zero or Comp B

    /*
     The PWM Uses EPWM1A to create EPWM1B signal (It does not use EPWM1B)
     Refer to fig. 3.29
     The PWM is initialised to active high. The Deadband full enable allows Dead band on both rising edges
     */
    // Load registers every ZERO
    EPwm1Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW; // This allows shadowing of Duty cycle compare registers
    //EPwm1Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW; // This allows shadowing of Duty cycle compare registers
    EPwm1Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO; // The data will be transferred when counter is zero
    //EPwm1Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO; // The data will be transferred when counter is zero

    // Setup compare
    EPwm1Regs.CMPA.half.CMPA = TBPRD_Counter>>1;      // Duty cycle initialized to 50%
    EPwm1Regs.CMPA.half.CMPAHR = 0x00;       // initialize HRPWM extension for duty cycle 1<<8

    // Set actions
    //Channel B
    EPwm1Regs.AQCTLA.bit.CAU = AQ_SET;         // When Duty counter reaches the set value while incrementing : The PWM goes high
    EPwm1Regs.AQCTLA.bit.CAD = AQ_CLEAR;  // When Duty counter reaches the set value while decrementing : The PWM goes low

    // Active high complementary PWMs - Setup the band
    EPwm1Regs.DBCTL.bit.OUT_MODE = DB_FULL_ENABLE; // Fig:3.29 | S1 and S0 are 1 and 1 | Both of them come from delay ckt
    EPwm1Regs.DBCTL.bit.POLSEL = DB_ACTV_HIC;  // Fig:3.29 | It creates EPWM1B by inverting  and delaying EPWM1B
    EPwm1Regs.DBCTL.bit.IN_MODE = DBA_ALL;  // Fig:3.29 | It uses only EPWM1A as an input
    EPwm1Regs.DBRED = EPWM1_MAX_DB; // This initializes dead band for rising edge
    EPwm1Regs.DBFED = EPWM1_MAX_DB; // This initializes dead band for falling edge

    // Interrupt where we will change the deadband
    EPwm1Regs.ETSEL.bit.INTSEL = ET_CTR_ZERO;       // The interrupt ISR happens after counter reaches 0 after decrementing
    EPwm1Regs.ETSEL.bit.INTEN = 0;                  // Enable INT
    EPwm1Regs.ETPS.bit.INTPRD = ET_DISABLE;             // Generate INT on 3rd event ET_DISABLE

    // Settings for Enabling/Disabling PWM
    //EPwm1Regs.TZCLR.all = 0; // No Effect
    EPwm1Regs.TZCLR.bit.OST = 1; // Clears previous trip
    EPwm1Regs.TZSEL.bit.OSHT1 = 1;  // Initialize TZ1 for one-shot trip
    EPwm1Regs.TZCTL.bit.TZA = TZ_FORCE_LO; // EPWMxA will go low
    EPwm1Regs.TZEINT.bit.OST = 1; // allowing interrupt
    //EPwm1Regs.TZFRC.bit.OST= 1; // Disabling PWM, reset counter (TBCTR)  before allowing


    //HR Initialisation
    EPwm1Regs.HRCNFG.all = 0x0;
    EPwm1Regs.HRCNFG.bit.EDGMODE = HR_BEP;          // MEP control on both edges
    EPwm1Regs.HRCNFG.bit.CTLMODE = HR_CMP;          // CMPAHR and TBPRDHR HR control
    EPwm1Regs.HRCNFG.bit.HRLOAD  = HR_CTR_ZERO_PRD; // load on CTR = 0 and CTR = TBPRD
    EPwm1Regs.HRCNFG.bit.AUTOCONV = 1;  // Enable autoconversion for HR period then calculation for TBPRDHR using MEP steps is not needed

    EPwm1Regs.HRPCTL.bit.TBPHSHRLOADE = 1;  // Enable TBPHSHR sync (required for up-down count HR control even if phase control is not used)
    EPwm1Regs.HRPCTL.bit.HRPE = 1;    // Turn on high-resolution period or duty control.

    SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 1;  // Synchronizes TBCLK with the EPWM
    EPwm1Regs.TBCTL.bit.SWFSYNC = 1;      // This generates one time synchronization signal for EPWM

    EDIS;
}

之后、我修复寄存器的值。

 

         EPwm1Regs.TBPRD =160;
         EPwm1Regs.CMPA.half.CMPA = 80 ;

         EPwm1Regs.TBPRDHR = 100<<8;
         EPwm1Regs.CMPA.half.CMPAHR = 50<<8;

当我在调试模式中查看寄存器的值时;

我可以验证它们是否是恒定的(TBPRD、TBPRDHR 和 CMPA)。

我注意到、在运行期间、MEP_ScaleFactor 在115-116之间变化。 我认为这不应导致这个大误差。

这种不必要的频率变化抵消了使用 HRPWM 模块的优势。

我想知道(1)为什么会发生这种情况? (2)如何消除这种不必要的频率变化。

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

     小幅修正:

    对于 上面提供的调试模式屏幕截图:我已经用以下值初始化了 ePWM 寄存器  

    我可以验证它们是否是恒定的(TBPRD、TBPRDHR 和 CMPA)。

      EPwm1Regs.TBPRD =80;
      EPwm1Regs.CMPA.half.CMPA = 40 ;
    
      EPwm1Regs.TBPRDHR = 100<<8;
      EPwm1Regs.CMPA.half.CMPAHR = 50<<8;

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

    您是否使用 SFO? 如果不是、请实施并告知我结果。

    此致、
    Cody  

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

    您好、Cody、

    根据技术参考手册(TMS320F2802x、TMS320F2802xx Piccolo)中提到的说明、我正在使用 SFO。

    我可以观察到'MEP_ScaleFactor'和'HRMSTEP'已更新。

      for(;;)
       {
           int status;
           status = SFO_INCOMPLETE;
           while (status==SFO_INCOMPLETE) {
           status = SFO();
           }
           if(status!=SFO_ERROR) { // IF SFO() is complete with no errors
           EALLOW;
           EPwm1Regs.HRMSTEP=MEP_ScaleFactor;
           EDIS;
           }
       }

    我注意到:

    • 当 HRPWM 寄存器被一个非零常量值初始化时、频率的变化在75kHz PWM 时接近120Hz。

    EPwm1Regs.TBPRD =400; //75 kHz
    EPwm1Regs.CMPA.half.CMPA = 200 ;
    
    EPwm1Regs.TBPRDHR = 100<<8;
    EPwm1Regs.CMPA.half.CMPAHR = 50<<8;

    • 当 HRPWM 寄存器被一个零常量值初始化时、频率的变化在75kHz PWM 时接近10Hz。

                 EPwm1Regs.TBPRD =400;
                 EPwm1Regs.CMPA.half.CMPA = 200 ;
    
                 EPwm1Regs.TBPRDHR = 0;
                 EPwm1Regs.CMPA.half.CMPAHR = 0;

    • 当 HRPWM 功能被关闭时、 在75kHz PWM 时频率的变化接近10Hz

    进行初始化

    EPwm1Regs.HRPCTL.bit.HRPE = 0;    // Turn off high-resolution period or duty control.

                 EPwm1Regs.TBPRD =400;
                 EPwm1Regs.CMPA.half.CMPA = 200 ;
    
                 EPwm1Regs.TBPRDHR = 0;
                 EPwm1Regs.CMPA.half.CMPAHR = 0;

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

    我认为您不应该具有如此多的抖动。 向 HR 寄存器写入0通常会禁用 HR 增强功能、因此这会降至10Hz 这一事实表明抖动的其余部分可能来自 HR PWM。

    您是否定期运行 SFO? 该抖动是多少个 Ns?

    您能否运行以下示例并查看您是否仍然看到相同的变体?  "C:\ti\c2000Ware_3_04_00_00\device_support\f2802x\examples\structs\HRPWM_prdupdown_SFO_v6"  


    此致、
    Cody  

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

    您好、Cody、

    1.是的,我在 main()下定期运行 SFO,如'HRPWM_prdupdown_SFO_v6'所示

    抖动接近18nS

    3、我运行了示例、没有注意到抖动(2-3 nS 而不是18 nS)

    事实证明、这个特定的微控制器(在 PCB 上定制安装)是一个小问题。 该代码(示例以及我自己的代码)与 Launchpad 或具有   相同器件型号的其他微控制器(在其他3个 PCB 上进行自定义安装)完美搭配。

    您是否知道导致此行为的原因? 微控制器正在正确执行所有其他任务(中断、PWM、ADC 转换)。