使用280049配置 三相LLC EWPM程序,调试发现频率有较大变化时波形不对,参考的是
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;
}