TMS320F280049: 280049 三相LLC EPWM配置问题

Part Number: TMS320F280049


使用280049配置 三相LLC EWPM程序,调试发现频率有较大变化时波形不对,参考的是

“在 C2000 4 类 PWM 上实现三相交错型 LLC”文档,以下是EPWM配置,帮忙看一下。或者有参考程序吗?

void bsp_epwm1_init()
{
//=============默认300k==================
    EPwm1Regs.TBPRD = 333;            //周期值
    EPwm1Regs.TBPHS.bit.TBPHS = 0x0000;        //不移相
    EPwm1Regs.TBCTR = 0x0000;                //计数值清零
//===============上下计数模式=======================
    EPwm1Regs.TBCTL.bit.CTRMODE     = TB_COUNT_UP;  //向上计数模式
    EPwm1Regs.TBCTL.bit.PHSEN         = TB_DISABLE;            //
//===========输出同步信号选择(pwm1同步信号给到pwm2)==================
    EPwm1Regs.TBCTL.bit.SYNCOSEL     = TB_SYNCO_DISABLE;//TB_CTR_ZERO;        //计数到0时发出同步信号
    EPwm1Regs.TBCTL.bit.HSPCLKDIV     = TB_DIV1;            //不分频
    EPwm1Regs.TBCTL.bit.CLKDIV         = TB_DIV1;            //TBCLK=SYSCKOUT/(HSPCLKDIV*CLKDIV)=100MHz/(1*1)=100MHz
                                                        //ePWM频率=TBCLK/(2*TBPRD)=100M/(2*333)=150kHz
    EPwm1Regs.CMPCTL.bit.SHDWAMODE     = CC_SHADOW;           // 使用影子寄存器
    EPwm1Regs.CMPCTL.bit.SHDWBMODE     = CC_SHADOW;        // 使用影子寄存器
    EPwm1Regs.CMPCTL.bit.LOADAMODE     = CC_CTR_ZERO;        // 计数到0更新CMPA
    EPwm1Regs.CMPCTL.bit.LOADBMODE     = CC_CTR_ZERO;        // 计数到0更新CMPB

    EPwm1Regs.CMPA.bit.CMPA = EPwm1Regs.TBPRD * 0.5;                        //初始化 CMP A= TBPRD/2 50%占空比
// PWMA 和 PWMB 配置一样,只是 PWMB后面会进行翻转,形成与PWMA互补的PWM
    EPwm1Regs.AQCTLA.bit.ZRO = AQ_SET;                  //PWM A 计数至0 时输出 高H
    EPwm1Regs.AQCTLA.bit.PRD = AQ_SET;                  //PWM A 计数至0 时输出 高H
#if 0
    EPwm1Regs.AQCTLA.bit.CAU = AQ_SET;                    //PWM A 向上计数至CMP A 时输出 高H
#else
    EPwm1Regs.AQCTLA.bit.CAU = AQ_CLEAR;                  //PWM A 向上计数至CMP A 时输出 L
#endif
    EPwm1Regs.AQCTLB.bit.ZRO = AQ_SET;                  //PWM A 计数至0 时输出 高H
    EPwm1Regs.AQCTLB.bit.CAU = AQ_CLEAR;                    //PWM B 向上计数至CMP A 时输出 高H

    #ifdef CloseSwitchAQCSFRC//必须223
        EPwm1Regs.DBCTL.bit.IN_MODE = 2;            //A上升沿延时输入源,B下降沿延时输入源
        EPwm1Regs.DBCTL.bit.POLSEL = 2;                //A不翻转,B翻转
        EPwm1Regs.DBCTL.bit.OUT_MODE = 3;            //使能双边沿延时
    #endif
    EPwm1Regs.DBRED.bit.DBRED = DeadZone;            //40*1/100M=0.4us=400ns死区
    EPwm1Regs.DBFED.bit.DBFED = DeadZone;            // 死区
}

void bsp_epwm2_init()
{
//=============默认300k==================
    EPwm2Regs.TBPRD = 333;//
    //EPwm2Regs.TBPHS.bit.TBPHS = 2.0*EPwm2Regs.TBPRD*0.333;//不使用移相寄存器,使用CMP值移相
    EPwm2Regs.TBCTR = 0x0000;
    EPwm2Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP;

    EPwm2Regs.TBCTL.bit.PHSEN = TB_DISABLE;

    EPwm2Regs.TBCTL.bit.SYNCOSEL = TB_SYNCO_DISABLE;//TB_CTR_ZERO;
    EPwm2Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;
    EPwm2Regs.TBCTL.bit.CLKDIV = TB_DIV1; //TBCLK=SYSCKOUT/(HSPCLKDIV*CLKDIV)=100MHz/(1*1)=100MHz
#if 0
//================20260102新增:==========================
        EPwm2Regs.TBCTL2.bit.PRDLDSYNC = 0x01;//当同步信号来时 或者epwm2计数值等于0时 更新TBPRD
        //===========输出同步信号选择(pwm2同步信号给到pwm3)==================
        EPwm2Regs.TBCTL2.bit.OSHTSYNCMODE = 0x01;     //单次模式
        EPwm2Regs.TBCTL2.bit.OSHTSYNC = 0;
        EPwm2Regs.TBCTL2.bit.SYNCOSELX = 0;
//================20260102新增END:==========================
#endif
//===============使能影子寄存器(不立即更新,计数到0时更新)=======================
    EPwm2Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;
    EPwm2Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;
    EPwm2Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;//计数到0时更新CMPA
    EPwm2Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;//计数到0时更新CMPA
//============新增单次加载模式========================
    // 单次加载模式:仅在SYNC或CTR=0时加载周期寄存器
    EPwm2Regs.TBCTL2.bit.PRDLDSYNC = 0x01;
    EPwm2Regs.TBCTL2.bit.OSHTSYNCMODE = 0x01;     // 单次同步模式(控制环路完成后触发)
//=================新增 END============================
    EPwm2Regs.CMPA.bit.CMPA = EPwm2Regs.TBPRD * 0.8333f;
    EPwm2Regs.CMPB.bit.CMPB = EPwm2Regs.TBPRD * 0.3333f;

    //6.限定动作 互补输出==========
//计数到cmpa 输出L cmpb输出H
    EPwm2Regs.AQCTLA.bit.CAU = AQ_CLEAR;
    EPwm2Regs.AQCTLA.bit.CBU = AQ_SET;
//计数到cmpa 输出L cmpb输出H
    EPwm2Regs.AQCTLB.bit.CAU = AQ_CLEAR;
    EPwm2Regs.AQCTLB.bit.CBU = AQ_SET;

  //7.死区设置
    EPwm2Regs.DBCTL.bit.OUT_MODE = 3;   //使能双边沿延时
    EPwm2Regs.DBCTL.bit.POLSEL = 2;   //A不翻转,B翻转
    EPwm2Regs.DBCTL.bit.IN_MODE = 2;   //A上升沿延时输入源,B下降沿延时输入源
    EPwm2Regs.DBRED.bit.DBRED = DeadZone;
    EPwm2Regs.DBFED.bit.DBFED = DeadZone;

}

void bsp_epwm3_init()
{//EPWMXLINK
//=============默认300k==================
    EPwm3Regs.TBPRD = 333;//
    EPwm3Regs.TBCTR = 0x0000;

    EPwm3Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP;//TB_COUNT_UPDOWN;
    EPwm3Regs.TBCTL.bit.PHSEN = TB_DISABLE;//TB_ENABLE;
    //3.同步配置:接收EPWM2的SYNCI,不输出同步信号
    EPwm3Regs.TBCTL.bit.SYNCOSEL = TB_SYNCO_DISABLE;        //不输出同步时钟
    EPwm3Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;
    EPwm3Regs.TBCTL.bit.CLKDIV = TB_DIV1; //TBCLK=SYSCKOUT/(HSPCLKDIV*CLKDIV)=100MHz/(1*1)=100MHz

    EPwm3Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;   // Load registers every ZERO
    EPwm3Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;
    EPwm3Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;
    EPwm3Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;

    //========2/3 PRD==============
    EPwm3Regs.CMPA.bit.CMPA = EPwm3Regs.TBPRD * 0.6666f;
    //========1/6 PRD==============
    EPwm3Regs.CMPB.bit.CMPB = EPwm3Regs.TBPRD * 0.1667f;

    EPwm3Regs.AQCTLA.bit.CAU = AQ_SET;
    EPwm3Regs.AQCTLA.bit.CBU = AQ_CLEAR;

    EPwm3Regs.AQCTLB.bit.CAU = AQ_SET;
    EPwm3Regs.AQCTLB.bit.CBU = AQ_CLEAR;

    EPwm3Regs.DBCTL.bit.OUT_MODE = 3;   //使能双边沿延时
    EPwm3Regs.DBCTL.bit.POLSEL = 2;   //A不翻转,B翻转
    EPwm3Regs.DBCTL.bit.IN_MODE = 2;   //A上升沿延时输入源,B下降沿延时输入源

    EPwm3Regs.DBRED.bit.DBRED = DeadZone;
    EPwm3Regs.DBFED.bit.DBFED = DeadZone;
}