打印
[电机应用]

AC7811--电机不同驱动极性的PWM配置

[复制链接]
1362|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 wangjj19950516 于 2020-11-11 09:09 编辑

做电机控制的工程师都知道,电机驱动的PWM极性根据硬件会有不同,有些选择预驱芯片,有些选择自己搭建驱动电路,但总共有4种模式:
1.上桥高有效,下桥高有效
2.上桥低有效,下桥低有效
3.上桥高有效,下桥低有效
4.上桥低有效,下桥高有效
根据硬件的设计,必须配置相应的PWM极性,确保不会导致MOS管上下桥直通。

这里使用AC7811配置PWM,生成用于FOC控制算法的中央对齐的6路PWM,且PWM的初始时刻触发ADC电流采样。
使用7811的PWM组合输出模式,可以将ch0~ch5分为3对PWM,其中ch(n)和ch(n+1)为一对(n=0,2,4)
ch(n)的初始电平由ELSR1:ELSR0决定:
当ELSR1:ELSR0 = 1:0时候,当计数器计数到CHnVR时候,Channel(n)的输出变高,当计数器计数到CH(n+1)VR时,Channel(n)的输出变低。
当ELSR1:ELSR0 = X:1时候,当计数器计数到CHnVR时候,Channel(n)的输出变低,当计数器计数到CH(n+1)VR时,Channel(n)的输出变高。
PWM的频率由MCVR决定,Duty占空比由CH(n+1)VR – CH(n)VR决定。如下图
互补模式下,通道chn和chn+1输出电平相反,不使能互补,则电平相同。
由于7811的组合模式只能使用向上计数模式,这里要生成中央对齐的PWM波,可以设置CH(n)VR和CH(n+1)VR基于周期中心对称。例如,最大计数值MCVR为2000,需要生成波形占空比为20%,需要设置的高电平计数值为2000*0.2=400,那么设置CHnVR为周期中心值减去一半的高电平计数值:CH(n)VR=1000-200 = (2000-2000*0.2)/2 .同理,CH(n+1)VR = 1000+200 = (2000+2000*0.2)/2.这样就可以生成中心对齐的PWM波了。

下面以7811的PWM2为例,生成各个模式的6路PWM。
端口选择:
         GPIO_SetFunc(GPIO_PB15, 1); //PWM2-CH0
         GPIO_SetFunc(GPIO_PC0, 1);  //PWM2_CH1
         GPIO_SetFunc(GPIO_PB11, 2);//PWM2-CH2
         GPIO_SetFunc(GPIO_PB12, 2);//PWM2-CH3
         GPIO_SetFunc(GPIO_PB13, 2);//PWM2-CH4
         GPIO_SetFunc(GPIO_PB14, 2);//PWM2-CH5
         GPIO_SetFunc(GPIO_PB9,0);
         GPIO_SetDir(GPIO_PB9,1);//PB9配置为输出GPIO口,用于指示PWM的初始时刻,也即ADC触发采样时刻。

一、上桥高有效,下桥高有效
这种模式的PWM,需要配置PWM组合模式,且使能互补输出,使上下桥电平相反,即上桥打开时,下桥关闭。
void PWM_HIGH_HIGH(void)
{
         CKGEN_Enable(CLK_PWM2_APB, 1);   
         CKGEN_Enable(CLK_PWM2_TIMER,1);
         CKGEN_SoftReset(SRST_PWM2_APB, 1);  
         CKGEN_SoftReset(SRST_PWM2_TIMER, 1);  //首先打开PWM时钟

         PWM2->INIT |= (1<<3);//时钟选择系统时钟,向上计数模式
         PWM2->CNT = 0;
         PWM2->MCVR = PWM_FRE; //这里设定最大计数值,根据PWM频率计算,系统时钟为48MHZ,PWM频率为30K,PWM_FRE = 48000000/30000=1600
         PWM2->CNTIN =0;//初始计数值为0

         PWM2->CHANNELS[0].CHSCR |= (2<<2); //配置ELSR1:ELSR0为10,高有效脉冲
         PWM2->CHANNELS[2].CHSCR |= (2<<2); //配置ELSR1:ELSR0为10,高有效脉冲
         PWM2->CHANNELS[4].CHSCR |= (2<<2); //配置ELSR1:ELSR0为10,高有效脉冲
         //这里只需要配置CH0,CH2,CH4的有效脉冲,组合模式下CH1,CH3,CH5的配置不会生效。
         PWM2->MODESEL |= (1<<22)|(1<<20)|(1<<16);//CH4和CH5组合,死区使能,故障控制使能
         PWM2->MODESEL |= (1<<14)|(1<<12)|(1<<8);//CH2和CH3组合,死区使能,故障控制使能
         PWM2->MODESEL |= (1<<6)|(1<<4)|(1<<0);//CH0和CH1组合,死区使能,故障控制使能
         PWM2->MODESEL |= (1<<17)|(1<<9)|(1<<1);//3对组合PWM互补输出使能
         //设定每个通道的占空比,CH(n)VR和CH(n+1)的值关于中心值对称
        PWM2->CHANNELS[0].CHV = (PWM_FRE - 200)>>1;
         PWM2->CHANNELS[1].CHV = (PWM_FRE + 200)>>1;

         PWM2->CHANNELS[2].CHV = (PWM_FRE - 200)>>1;
         PWM2->CHANNELS[3].CHV = (PWM_FRE + 200)>>1;

         PWM2->CHANNELS[4].CHV = (PWM_FRE - 200)>>1;
         PWM2->CHANNELS[5].CHV = (PWM_FRE + 200)>>1;

         PWM2->FUNCSEL |= (1<<7)|(2<<5);//所有通道支持故障控制,手动清除

         PWM2->DTSET |= (2<<6)|(12<<0); // 死区配置,时钟4分频,死区计数值为12,Deadtime = 4*12/48000000 = 1us

         PWM2->CHOPOLCR =0x0000;//CH0~CH5的极性,这里上下桥都为高电平有效
        //关于故障控制的功能,若不需要可屏蔽
         PWM2->FFAFER = 0X0044;//故障输入使能,滤波器使能
         PWM2->FLTPOL =0X0004;//故障输入烦人极性为低电平有效

   PWM2->INIT |= 1<<6;//使能溢出中断
   PWM_SetCallback(PWM2, FOC_PWM_FaultCallback);
   NVIC_EnableIRQ(PWM2_IRQn);

}
这里需要注意的是:
1.PWM2->CHANNELS[0].CHSCR |= (2<<2); //配置ELSR1:ELSR0为10,高有效脉冲。这种配置,CH0的初始电平为低电平,CH1的初始电平为高电平,在PWM初始时刻触发ADC采样,即在下桥打开时刻采样,是正确的。
2.PWM2->CHOPOLCR =0x0000;//CH0~CH5的极性,这里上下桥都为高电平有效。通道极性若配置不对,则死区插入的边沿不对。
该模式下生成的波形如下图
图中,黄色为CH0上桥,绿色为CH1下桥,蓝色为PWM初始时刻电平翻转。可以看出ADC采样在下桥打开时刻,且死区1us插入正确。
若将通道极性配置为全部低有效,则生成波形的死区插入边沿相反,即在下降沿插入,会导致下桥还没关闭,上桥就打开了。

二、上桥低有效,下桥低有效
该模式下,需要修改组合模式下的有效脉冲选择,以及通道极性
         PWM2->CHANNELS[0].CHSCR |= (1<<2); //低有效脉冲
         PWM2->CHANNELS[2].CHSCR |= (1<<2); //低有效脉冲
         PWM2->CHANNELS[4].CHSCR |= (1<<2); //低有效脉冲

         PWM2->CHOPOLCR =0x003f;//CH0~CH5极性,全部为低电平有效
其他配置不用修改,即可生成波形。
可以看出,CH0初始时刻的电平变为高电平了,CH1的初始电平变为低电平,符合ADC采样时刻。
需要注意的是,由于极性翻转,写入相同的CH(n)VR和CH(n+1)VR,生成波形的占空比也发生了翻转,可根据需要修改写入的CH(n)VR和CH(n+1)VR。

三、上桥高有效,下桥低有效
此模式下生成的PWM应该上下桥电平一致,才能保证不会直通。
配置时需要注意:
         PWM2->CHANNELS[0].CHSCR |= (2<<2); //高有效脉冲
         PWM2->CHANNELS[2].CHSCR |= (2<<2); //高有效脉冲
         PWM2->CHANNELS[4].CHSCR |= (2<<2); //高有效脉冲
高有效脉冲,PWM初始电平为低电平,上下桥电平一致,下桥也为低电平,低电平有效,为有效的ADC采样时刻。
       // PWM2->MODESEL |= (1<<17)|(1<<9)|(1<<1);//3对组合PWM互补输出使能
该模式不能再互补输出了,所以一定要确保互补输出不使能。
        PWM2->CHOPOLCR =0x002A;//CH0~CH5极性,CH0/CH2/CH4为高电平有效,CH1/CH3/CH5为低电平有效
输出波形如下:

四、上桥低有效,下桥高有效
该模式的配置不同也不能互补输出,且通道极性为CH0/CH2/CH4为低电平有效,CH1/CH3/CH5为高电平有效。
         PWM2->CHANNELS[0].CHSCR |= (1<<2); //低脉冲有效
         PWM2->CHANNELS[2].CHSCR |= (1<<2); //低脉冲有效
         PWM2->CHANNELS[4].CHSCR |= (1<<2); //低脉冲有效
低脉冲有效,确保PWM初始电平为高电平,确保ADC采样在下桥打开时刻。
       // PWM2->MODESEL |= (1<<17)|(1<<9)|(1<<1);//3对组合PWM互补输出使能
该模式不能再互补输出了,所以一定要确保互补输出不使能。
       PWM2->CHOPOLCR =0x0015;//CH0~CH5极性
生成波形如下图:

附上工程代码 PWM_motor.rar (1.37 MB)



使用特权

评论回复

相关帖子

沙发
zeshoufx| | 2020-11-5 14:01 | 只看该作者
谢谢分享【电机不同驱动极性的PWM配置】

使用特权

评论回复
板凳
Jobs的梨子| | 2020-11-5 23:20 | 只看该作者
您开头那四个模式总结的还简洁易懂的

使用特权

评论回复
地板
x史可法| | 2020-11-5 23:32 | 只看该作者
刚好最近学校项目要用上电机 配置不对真的很容易出问题

使用特权

评论回复
5
BettyBerry| | 2020-11-6 22:51 | 只看该作者
总结的挺好 可以教课的水平 收藏了

使用特权

评论回复
6
索尼法| | 2020-11-6 22:58 | 只看该作者
如果上下管直通会发生什么情况

使用特权

评论回复
评论
wangjj19950516 2020-11-9 11:12 回复TA
上西管直通,直接电源跟地短路了,MOS管烧坏 
7
函数不想导| | 2020-11-6 23:04 | 只看该作者
回头拿我加ac板子试一下电机啊

使用特权

评论回复
8
尼罗河L| | 2020-11-7 22:30 | 只看该作者
收藏一份 刚好能用得上电机

使用特权

评论回复
9
伊桑黑| | 2020-11-7 23:16 | 只看该作者
为什么极性会跟着变化啊 (不知带有没有理解错)

使用特权

评论回复
评论
wangjj19950516 2020-11-9 11:18 回复TA
这里改变极性是因为会影响死区插入的边沿,比如上桥高有效,下桥低有效的情况下,配置CH0/CH2/CH4为高电平有效,那么死区插入在通道的上升沿,即延迟电平变为高电平,可以确保在下桥关闭后才打开上桥。同样,配置CH1/CH3/CH5为低电平有效,死区插入在通道的下降沿,即上桥关闭后,经过死区时间,下桥才打开。如果极性配置相反,插入死区的边沿就会相反。 
10
marginer| | 2020-11-10 20:36 | 只看该作者
质量很高, 教学水平,建议编辑推荐@21ic小喇叭

使用特权

评论回复
11
feiying20044002| | 2023-3-21 10:32 | 只看该作者
学习了,感谢分享!

使用特权

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

本版积分规则

24

主题

86

帖子

2

粉丝