买了这个车子好久了,拿到代码,一头雾水。 所谓的什么用户手册真的是,扯。 没考虑到初学者的感受。
但,问题总要解决,所以用这篇文章来分析一下平衡小车之家出的这个车子吧。
尽管有很多的库函数和宏,其实有很多都是厂商提供的,怎么实现的,大多每个代码段都提供了comment,英文好的话,理解应该不存在问题。
而我们做开发,首要关心的并不是每个模块如何实现,而是应该有几个模块,这些模块是怎么工作的,一个平衡小车能够安稳地在平面上静止与运动,都是通过晶振可以提供一定频率的中断,每一段时间都触发执行了中断服务程序,在此程序中可以获得此刻的欧拉角、温度以及对于平衡小车编码器的数据信息,并且通过PID控制来对小车的步进电机进行控制。 控制部分主要由MPU6050的INT引脚触发5ms定时中断,这个中断是由EXTI控制(具体如何配置要参考MPU6050的INT引脚的特性)。
本车的INT引脚挂载到PA12上,那么他相应的中断服务函数就应该是EXTI15_10_IRQHandler。接下来我们来分析一下它是如何来控制小车的。
Begining~
基本的平衡控制。 1、 读取编码器的值。
--------------------Encoder_Left=Read_Encoder(2); Encoder_Right=Read_Encoder(4);
PID(比例(proportion)、积分(integral)、微分(derivative))控制器 2、 获取欧拉角,即俯仰角,偏航角和横滚角。------------------Get_Angle(Way_Angle); 3、 平衡、速度PID控制。
Balance_Pwm =balance(Angle_Balance,Gyro_Balance); Velocity_Pwm=velocity(Encoder_Left,Encoder_Right);
4、 赋值给PWM寄存器。
Moto1=Balance_Pwm-Velocity_Pwm-Turn_Pwm; Moto2=Balance_Pwm-Velocity_Pwm+Turn_Pwm; Set_Pwm(Moto1,Moto2);
平衡+移动控制
刨去超声波,led灯,按键的读取,新增加了转向环的控制。 Turn_Pwm=turn(Encoder_Left,Encoder_Right,Gyro_Turn); 再剩下的就是对于小车拿起放下的电机控制了。
Pulse Width Modulation脉冲宽度调制,相应载荷的变化来调制晶 体管基极或 MOS管栅极的偏置