[电机应用]

PWM死区配置方法

[复制链接]
1588|2
手机看帖
扫描二维码
随时随地手机跟帖
AutochipsMCU|  楼主 | 2019-9-4 17:32 | 显示全部楼层 |阅读模式
本帖最后由 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同相输出,有效极性也配成相同,是不带死区的,配置了死区也不会生效。


使用特权

评论回复

相关帖子

AutochipsMCU|  楼主 | 2019-9-4 17:41 | 显示全部楼层
本帖最后由 AutochipsMCU 于 2019-9-4 17:42 编辑

代码里面居然不能高亮。
再贴一下关键配置:
互补输出:
//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);
PWM_PWMDeadtimeSet(PWM2, 2, 12);// Deadtime = 4*12/48000000 = 1us
//打开组合通道互补模式(可不设置,默认为打开)
PWM_ComplementaryModeConfig(PWM2, 1);

同相输出:
//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);
PWM_PWMDeadtimeSet(PWM2, 2, 12);// Deadtime = 4*12/48000000 = 1us
//关闭组合通道互补模式(默认为打开)
PWM_ComplementaryModeConfig(PWM2, 0);

使用特权

评论回复
zlmin| | 2019-10-3 10:25 | 显示全部楼层
谢谢分享!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

认证:合肥杰发科技有限公司
简介:四维图新全资子公司 全球多地布局;专注于汽车电子芯片及相关系统的研发与设计 车规级芯片覆盖整车;客户遍及海内外 全球超过8000万辆车搭载杰发科技芯片。

59

主题

268

帖子

7

粉丝