stm32 互补PWM波形组合方法

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位前先清零,再根据情况写入。这就导致一个现象:当下桥需要开启的电平跟上桥相反时,这时候会出来一个陡峭的高脉冲。如图:

LYJ博客

从波形看,因为上桥低电平已经处于关闭状态,所以这里尖脉冲也无所谓,但是总是不爽。

解决方法就是学我修改库函数,把所有寄存器的操作放到临时变量,然后一次性写入寄存器。

本文为3YL原创,转载无需联系,但请注明来自labisart.com。

原创文章不易,如果觉得有帮助,可打赏或点击右侧广告支持:

查看打赏记录

发表评论请遵守党国法律!后台审核后方可显示!
  • 最新评论
  • 总共0条评论
  • Blog v1.1© 2024 labisart.com 版权所有 | 联系:labartwork@163.com