本帖最后由 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极性 生成波形如下图:
|