工具/软件:
尊敬的专家:
我的客户 使用单相逆变器、一个电桥为50Hz、另一个为20kHz。 他们希望在检测到 AC (50Hz)零点时实现电平反向添加死区。 其当前的方法是在交流电达到零点时关闭上部和下部器件一个 PWM 周期(50us)、然后进行切换。 但是、交流波形会在零点引起抖动、客户想问是否有解决方案、在上下器件之间切换时是否可以自动添加死区? 由于频率为50Hz、TBPRD 寄存器将会溢出、因此它们可以使用 AQCSFRC 来实现 PWM。 我将代码和波形附加在此处。
#define EPWM_FREQ_VALUE (1000000000)// 100MHz
#define INV_EPWMP_FREQ (20e3)//单位:kHz
#define INV_EPWM_PRID_VALUE (uint16_t)(EPWM_FREQ_VALUE /(INV_EPWMP_FREQ * 2))
//初始化 EPWM1模块函数配置
void Init_EPWM1_handle (void)
{
EPwm1Regs.TBPRD = INV_EPWM_PRID_VALUE;// PWM 频率
EPwm1Regs.CMPA.bit.CMPA = INV_EPWM_PRID_VALUE - 20;//最初设置占空比200ns
EPwm1Regs.CMPA.bit.CMPAHR = 0x0000;//0x7F00;//初始化 HRPWM 扩展
EPwm1Regs.CMPB.bit.CMPB = 20;//初始值为200ns
EPwm1Regs.CMPB.bit.CMPBHR = 0x0000;//0x7F00;//初始化 HRPWM 扩展
EPwm1Regs.TBCTR = 0;
EPwm1Regs.TBPHS.bit.TBPHS = 0;
EPwm1Regs.TBCTL.ALL = 0;
EPwm1Regs.TBCTL.BIT.PRDLD = TB_SHADOW;
EPwm1Regs.TBCTL.BIT.CTRMODE = TB_COUNT_UPdown;
EPwm1Regs.TBCTL.BIT.HSPCLKDIV = TB_DIV1;
EPwm1Regs.TBCTL.BIT.CLKDIV = TB_DIV1;
EPwm1Regs.TBCTL.BIT.FREE_SOFT = mPWM_DEBUG_STOP;
EPwm1Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_DISABLE;
EPwm1Regs.TBCTL.BIT.SWFSYNC = 1;
EPwm1Regs.TBCTL.bit.PHSDIR = TB_UP;
EPwm1Regs.TBCTL.BIT.PHSEN = TB_DISABLE;
EPwm1Regs.CMPCTL.all = 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.AQCTLA.bit.cad = AQ_SET;
EPwm1Regs.AQCTLA.bit.CAU = AQCLEAR;
EPwm1Regs.AQCTLB.bit.CBU = AQ_SET;
EPwm1Regs.AQCTLB.bit.CBD = AQCLEAR;
EPwm1Regs.AQCSFRC.bit.CSFA = 1;
EPwm1Regs.AQCSFRC.bit.CSFB = 1;
EPwm1Regs.DBCTL.bit.IN_MODE = 1;
EPwm1Regs.DBCTL.BIT.DEDB_MODE = 0;
EPwm1Regs.DBCTL.BIT.POLSEL = 0;
EPwm1Regs.DBCTL.BIT.OUT_MODE =0;
EPwm1Regs.DBRED.bit.DBRED = 0;
EPwm1Regs.DBFED.bit.DBFED = 0;
EPwm1Regs.DBCTL.BIT.OUTSWAP =0;
//初始化 ISR()
EPwm1Regs.ETSEL.bit.INTSEL = ET_CTR_ZERO;
EPwm1Regs.ETPS.bit.INTPRD = ET_1st;
EPwm1Regs.ETCLR.bit.INT = 1;
EPwm1Regs.ETSEL.bit.intEn = 0;
}
//初始化 EPWM2模块函数配置
void Init_EPWM2_handle (void)
{
EPwm2Regs.TBPRD = INV_EPWM_PRID_VALUE;// PWM 频率
EPwm2Regs.CMPA.bit.CMPA = INV_EPWM_PRID_VALUE - 20;//最初设置200ns
EPwm2Regs.CMPA.bit.CMPAHR = 0x0000;//0x7F00;//初始化 HRPWM 扩展
EPwm2Regs.CMPB.bit.CMPB = 20;//初始设置200ns
EPwm2Regs.CMPB.bit.CMPBHR = 0x0000;//0x7F00;//初始化 HRPWM 扩展
EPwm2Regs.TBCTR = 0;
EPwm2Regs.TBPHS.bit.TBPHS = 0;
EPwm2Regs.TBCTL.ALL = 0;
EPwm2Regs.TBCTL.BIT.PRDLD = TB_SHADOW;//设置立即加载
EPwm2Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN;
EPwm2Regs.TBCTL.BIT.HSPCLKDIV = TB_DIV1;
EPwm2Regs.TBCTL.BIT.CLKDIV = TB_DIV1;
EPwm2Regs.TBCTL.bit.FREE_SOFT = mPWM_DEBUG_STOP;//contu
EPwm2Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_DISABLE;//TB_SYNC_DISABLE;
EPwm2Regs.TBCTL.bit.SWFSYNC = 1;//软件触发一次性 syncon
EPwm2Regs.TBCTL.bit.PHSDIR = TB_UP;同步后进行//con up
EPwm2Regs.TBCTL.BIT.PHSEN = TB_DISABLE;
EPwm2Regs.CMPCTL.all = 0;
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.AQCTLA.bit.CAU = AQ_SET;
EPwm2Regs.AQCTLA.bit.cad = AQCLEAR;
EPwm2Regs.AQCTLB.bit.CBU = AQCLEAR;
EPwm2Regs.AQCTLB.bit.CBD = AQ_SET;
EPwm2Regs.AQCSFRC.bit.CSFA = 1;
EPwm2Regs.AQCSFRC.bit.CSFB = 1;
EPwm2Regs.DBCTL.bit.IN_MODE = 1;
EPwm2Regs.DBCTL.BIT.DEDB_MODE = 0;
EPwm2Regs.DBCTL.BIT.POLSEL = 0;
EPwm2Regs.DBCTL.BIT.OUT_MODE =0;
EPwm2Regs.DBRED.bit.DBRED = 0;
EPwm2Regs.DBFED.bit.DBFED = 0;
EPwm2Regs.DBCTL.BITS.OUTSWAP =0;
}
void INV_SPWM_Handle (void)
{
开关(Phase_Sin)
{
情况0x10://ZeroCross = 0 Vac_Phase_Count
{
EPwm2Regs.CMPA.bit.CMPA = DCAControl_FOC.PFC_PERIOD - DCAControl_FOC.PFC_DUTY;
EPwm2Regs.CMPB.bit.CMPB = DCAControl_FOC.PFC_PERIOD - DCAControl_FOC.PFC_DUTY - DCAControl_FOC.PFC_DUTY_DT;
EPwm1Regs.AQCSFRC.bit.CSFA = eForceLow;//ePWM1_A 低电平
EPwm1Regs.AQCSFRC.bit.CSFB = eForceLow;//ePWM1_B 低电平
EPwm2Regs.AQCSFRC.bit.CSFA = eNoForce;//ePWM2释放
EPwm2Regs.AQCSFRC.bit.CSFB = eNoForce;//ePWM2释放
休息;
}
Case 0x11://USB Vac_Phase_Count = 0 ~ 200
{
EPwm2Regs.CMPA.bit.CMPA = DCAControl_FOC.PFC_PERIOD - DCAControl_FOC.PFC_DUTY;
EPwm2Regs.CMPB.bit.CMPB = DCAControl_FOC.PFC_PERIOD - DCAControl_FOC.PFC_DUTY - DCAControl_FOC.PFC_DUTY_DT;
EPwm1Regs.AQCSFRC.bit.CSFA = eForceLow;//ePWM1_A 低电平
EPwm1Regs.AQCSFRC.bit.CSFB = eForceHigh;//ePWM1_B 高电平
EPwm2Regs.AQCSFRC.bit.CSFA = eNoForce;//ePWM2释放
EPwm2Regs.AQCSFRC.bit.CSFB = eNoForce;//ePWM2释放
休息;
}
案例0x20://ZeroCross = 200 Vac_Phase_Count
{
EPwm2Regs.CMPA.bit.CMPA = DCAControl_FOC.PFC_DUTY + DCAControl_FOC.PFC_DUTY_DT;
EPwm2Regs.CMPB.bit.CMPB = DCAControl_FC.PFC_DUTY;
EPwm1Regs.AQCSFRC.bit.CSFA = eForceLow;//ePWM1_A 低电平
EPwm1Regs.AQCSFRC.bit.CSFB = eForceLow;//ePWM1_B 低电平
EPwm2Regs.AQCSFRC.bit.CSFA = eNoForce;//ePWM2释放
EPwm2Regs.AQCSFRC.bit.CSFB = eNoForce;//ePWM2释放
休息;
}
案例0x21 :// Vac_Phase_Count = 200 ~ 400
{
EPwm2Regs.CMPA.bit.CMPA = DCAControl_FOC.PFC_DUTY + DCAControl_FOC.PFC_DUTY_DT;
EPwm2Regs.CMPB.bit.CMPB = DCAControl_FC.PFC_DUTY;
EPwm1Regs.AQCSFRC.bit.CSFA = eForceHigh;//ePWM1_A 高电平
EPwm1Regs.AQCSFRC.bit.CSFB = eForceLow;//ePWM1_B 低电平
EPwm2Regs.AQCSFRC.bit.CSFA = eNoForce;//ePWM2释放
EPwm2Regs.AQCSFRC.bit.CSFB = eNoForce;//ePWM2释放
休息;
}
默认值:
{
EPwm1Regs.AQCSFRC.bit.CSFA = eForceLow;//1
EPwm1Regs.AQCSFRC.bit.CSFB = eForceLow;//1
EPwm2Regs.AQCSFRC.bit.CSFA = eForceLow;//1
EPwm2Regs.AQCSFRC.bit.CSFB = eForceLow;//1
休息;
}
}
}