本帖最后由 AutochipsMCU 于 2019-9-4 17:37 编辑
本帖主要解决客户针对死区配置的一些疑问,供参考。
电机控制输出的PWM波形有两种:同相输出和互补输出。都需要带死区配置。
组合模式+互补输出:
void BLDC_PWM_Init(void)
{
///Init PWM Channel
//如果上半桥高有效,则PWM需设为PWM_PWM_HIGHTRUEPULSE,如果上半桥低有效,则PWM需设为PWM_PWM_LOWTRUEPULSE
PWM_PWMInit(PWM2, PWM_PWMMODE_COMBINE, PWM_PWM_HIGHTRUEPULSE);
PWM_SetModValue(PWM2, BLDC_PWM_PERIOD);
/*
PWM禁止输出时,单独配置上下桥臂极性。0:高电平有效,1:低电平有效。
在接电机前,先check默认时,PWM输出电平是否会让MOS管导通,如果会则需要check配置是否与硬件不符。
*/
//CH0,CH2,CH4为上桥臂,CH1,CH3,CH5为下桥臂。极性值设为0表示高有效,设为1表示低有效。
PWM_OutputPolaritySet(PWM2, PWM_CHANNEL_CHANNEL0, 0);//High Bridge Active level: High
PWM_OutputPolaritySet(PWM2, PWM_CHANNEL_CHANNEL2, 0);
PWM_OutputPolaritySet(PWM2, PWM_CHANNEL_CHANNEL4, 0);
PWM_OutputPolaritySet(PWM2, PWM_CHANNEL_CHANNEL1, 0); //Low Bridge Active Level: High
PWM_OutputPolaritySet(PWM2, PWM_CHANNEL_CHANNEL3, 0);
PWM_OutputPolaritySet(PWM2, PWM_CHANNEL_CHANNEL5, 0);
/*
设置死区插入时间
设置死区时间=prescalerValue对应寄存器的分频值*deadtimeValue/BUS_CLK
注意prescalerValue设置的寄存器DTSET[TPSC]值,需转成分频值。
对应分频值:0b0x为1分频;0b10为4分频,0b11为16分频
deadtimeValue值范围为0-63
*/
PWM_PWMDeadtimeSet(PWM2, 2, 12);// Deadtime = 4*12/48000000 = 1us
//打开组合通道互补模式(可不设置,默认为打开)
PWM_ComplementaryModeConfig(PWM2, 1);
//配置FALUT相关
PWM_SetFaultPirority(PWM2, PWM_EXTERNAL_FAULT2,0); //故障输入极性为高电平有效
PWM_FaultEnable(PWM2, PWM_EXTERNAL_FAULT2);//使能FAULT2
PWM_FaultIntEnable(PWM2);
PWM_FaultModeSel(PWM2, PWM_FAULT_MANUAL_CLEAR); //手动清除故障
PWM_SetCallback(PWM2, BLDC_PWM_FaultCallback);
NVIC_EnableIRQ(PWM2_IRQn);
//使能初始化触发器,当PWM计数器等于CNTIN寄存器时,允许产生触发。
PWM_SetExternalTrigger(PWM2, 1 << 6); //set PWM2 Init Trigger Source
///PWM Start
PWM_ClockSet(PWM2, PWM_CLOCK_SYSTEMCLOCK, 0);
组合模式+同相输出void BLDC_PWM_Init(void)
{
///Init PWM Channel
//如果上半桥高有效,则PWM需设为PWM_PWM_HIGHTRUEPULSE,如果上半桥低有效,则PWM需设为PWM_PWM_LOWTRUEPULSE
PWM_PWMInit(PWM2, PWM_PWMMODE_COMBINE, PWM_PWM_HIGHTRUEPULSE);
PWM_SetModValue(PWM2, BLDC_PWM_PERIOD);
/*
PWM禁止输出时,单独配置上下桥臂极性。0:高电平有效,1:低电平有效。
在接电机前,先check默认时,PWM输出电平是否会让MOS管导通,如果会则需要check配置是否与硬件不符。
*/
//CH0,CH2,CH4为上桥臂,CH1,CH3,CH5为下桥臂。极性值设为0表示高有效,设为1表示低有效。
PWM_OutputPolaritySet(PWM2, PWM_CHANNEL_CHANNEL0, 0);//High Bridge Active level: High
PWM_OutputPolaritySet(PWM2, PWM_CHANNEL_CHANNEL2, 0);
PWM_OutputPolaritySet(PWM2, PWM_CHANNEL_CHANNEL4, 0);
PWM_OutputPolaritySet(PWM2, PWM_CHANNEL_CHANNEL1, 1); //Low Bridge Active Level: Low
PWM_OutputPolaritySet(PWM2, PWM_CHANNEL_CHANNEL3, 1);
PWM_OutputPolaritySet(PWM2, PWM_CHANNEL_CHANNEL5, 1);
/*
设置死区插入时间
设置死区时间=prescalerValue对应寄存器的分频值*deadtimeValue/BUS_CLK
注意prescalerValue设置的寄存器DTSET[TPSC]值,需转成分频值。
对应分频值:0b0x为1分频;0b10为4分频,0b11为16分频
deadtimeValue值范围为0-63
*/
PWM_PWMDeadtimeSet(PWM2, 2, 12);// Deadtime = 4*12/48000000 = 1us
//关闭组合通道互补模式(默认为打开)
PWM_ComplementaryModeConfig(PWM2, 0);
//配置FALUT相关
PWM_SetFaultPirority(PWM2, PWM_EXTERNAL_FAULT2,0); //故障输入极性为高电平有效
PWM_FaultEnable(PWM2, PWM_EXTERNAL_FAULT2);//使能FAULT2
PWM_FaultIntEnable(PWM2);
PWM_FaultModeSel(PWM2, PWM_FAULT_MANUAL_CLEAR); //手动清除故障
PWM_SetCallback(PWM2, BLDC_PWM_FaultCallback);
NVIC_EnableIRQ(PWM2_IRQn);
//使能初始化触发器,当PWM计数器等于CNTIN寄存器时,允许产生触发。
PWM_SetExternalTrigger(PWM2, 1 << 6); //set PWM2 Init Trigger Source
///PWM Start
PWM_ClockSet(PWM2, PWM_CLOCK_SYSTEMCLOCK, 0);
}
划重点:
在配置PWM时,PWM互补输出和极性需要同时进行配置。
如果是互补输出,上下桥MOS管有效极性是相同的(都是高有效或低有效)。
如果是同相输出,上下桥MOS管有效极性是相反的(上桥臂高有效,则下桥臂是低有效。反之)。
如果PWM同相输出,有效极性也配成相同,是不带死区的,配置了死区也不会生效。
|