基于PID算法的舵机转向小车(二)电机驱动程序与避坑攻略

驱动方案

小车的驱动芯片采用A4950T,需要2路PWM信号控制1路电机。如图1所示,

M2_IN1输入一定占空比的PWM信号,M2_IN2输入低电平,电机正转;

M2_IN2输入一定占空比的PWM信号,M2_IN1输入低电平,电机反转;

M2_IN1和M2_IN2同时为低或者同时为高,电机停止。

图1A4050驱动电路

驱动程序

2路电机需要4路PWM波驱动,采用STM32C8T6主控芯片的高级定时器T1的CH1~CH4输出PWM信号。TIM1的初始化程序如下:

voidMotorInit(){RCC-APB2ENR|=111;//TIM1时钟使能RCC-APB2ENR|=12;//PORTA时钟使能GPIOA-CRH=0XFFFF0000;//PORTA8、9、10、11初始化为复用推挽GPIOA-CRH|=0X0000BBBB;TIM1-ARR=9999;//TIM1-PSC=71;//PWM周期为10msTIM1-CCMR1|=64;//CH1PWM1模式TIM1-CCMR1|=612;//CH2TIM1-CCMR2|=64;//CH3TIM1-CCMR2|=612;//CH4TIM1-CCMR1|=13;//CH1预装载寄存器使能TIM1-CCMR1|=111;//CH2预装载寄存器使能TIM1-CCMR2|=13;//CH3预装载寄存器使能TIM1-CCMR2|=111;//CH4预装载寄存器使能TIM1-CCER|=10;//CH1输出使能TIM1-CCER|=14;//CH2TIM1-CCER|=18;//CH3TIM1-CCER|=112;//CH4TIM1-BDTR|=115;//设置模式TIM1-CR1=0x80;//ARPE使能TIM1-CR1|=0x01;//定时器使能}
寄存器or库函数?

许多新手会纠结于用寄存器还是固件库入门?其实固件库只是为了方便给寄存器赋值,做了一层封装。写程序的时候,是方便,但是调试的时候往往要跳转好几次,才能看到操作的是那个寄存器,就很不方便了。新手还是从寄存器入手,使用stm32cubemx也便捷。

另外ST公司的固件库也有bug,是人做出来的东西都有可能出错,要学会调试技巧,定位问题,解决问题。

调试技巧

对于此类程序如果出了问题,一用示波器观察波形,二利用IDE的调试功能。

发布于 2025-04-27
196
目录

    推荐阅读