stm32 互补PWM波形组合方法。就是说输出互补后怎么使用。网上都很少啦。
互补怎么配置我就不说了,说一下怎么根据电机的状态来输出不同的波形组合,以方波为例:
1、同一时刻1相进,1相出,另一相堵住不管。
2、进的一相上桥PWM开启,下桥关闭(或者互补输出,最好关闭),出的一相上桥PWM 关闭,下桥直接导通(无需PWM)。
3、有关OCx,OCref的关系参考:http://blog.sina.com.cn/s/blog_3ba262a10101esd1.html
4、上代码:
case Mode_1: /* A->C */ TIM_CCxCmd(timer, MOTO_PHASE_B, TIM_CCx_Disable); TIM_CCxNCmd(timer, MOTO_PHASE_B, TIM_CCxN_Disable); TIM_SelectOCxM(timer, MOTO_PHASE_A, PWM_MODE); //PWM TIM_CCxCmd(timer, MOTO_PHASE_A, TIM_CCx_Enable); TIM_CCxNCmd(timer, MOTO_PHASE_A, TIM_CCxN_Enable); TIM_SelectOCxM(timer, MOTO_PHASE_C, TIM_ForcedAction_InActive); /* 强制ocxref=0。保持下桥打开,上桥来pwm */ //TIM_ForcedOC3Config(timer,TIM_ForcedAction_InActive); TIM_CCxCmd2(timer, MOTO_PHASE_C, TIM_CCx_Enable); // 必须enable,否则pwm-n无效? TIM_CCxNCmd2(timer, MOTO_PHASE_C, TIM_CCxN_Enable); break; case Mode_2: /* B->C */ TIM_CCxCmd(timer, MOTO_PHASE_A, TIM_CCx_Disable); TIM_CCxNCmd(timer, MOTO_PHASE_A, TIM_CCxN_Disable); TIM_SelectOCxM(timer, MOTO_PHASE_B, PWM_MODE); //PWM TIM_CCxCmd(timer, MOTO_PHASE_B, TIM_CCx_Enable); TIM_CCxNCmd(timer, MOTO_PHASE_B, TIM_CCxN_Enable); TIM_SelectOCxM(timer, MOTO_PHASE_C, TIM_ForcedAction_InActive); // 强制无效为低电平 //TIM_ForcedOC3Config(timer,TIM_ForcedAction_InActive); TIM_CCxCmd2(timer, MOTO_PHASE_C, TIM_CCx_Enable); TIM_CCxNCmd2(timer, MOTO_PHASE_C, TIM_CCxN_Enable); break;
5、但是你别高兴太早,TIM_CCxCmd2和TIM_CCxNCmd2都是我修改过的,库函数在清除CCER.CCxE位前先清零,再根据情况写入。这就导致一个现象:当下桥需要开启的电平跟上桥相反时,这时候会出来一个陡峭的高脉冲。如图:
从波形看,因为上桥低电平已经处于关闭状态,所以这里尖脉冲也无所谓,但是总是不爽。
解决方法就是学我修改库函数,把所有寄存器的操作放到临时变量,然后一次性写入寄存器。