基于RT-Thread的两轮平衡小车设计

1、前言html

  最近参加了RT-Thread官方发起的RT-Robot Car DIY活动,借此机会想总结一些本身本科四年的所学的部分知识。git

  也能够帮助到那些须要的小伙伴(能够参考个人代码中对RT-Thread的can设备驱动的使用方法,对IIC驱动的使用方法,mpu6050+hmc5883的初始化和数据读取的方法,RT-Thread硬件定时器的使用方法,滑动窗口滤波的链表实现,pid结构的代码参考,pid参数调试方法等)github

 

2、演示算法

  github连接(包括整个keil工程的代码,原理图和PCB,机械图纸和一些参考资料):https://github.com/iamluoyijie/funny_car多线程

  小车实物:app

 

  两个演示视频连接:https://v.youku.com/v_show/id_XNDMzNzExODMyMA==.html框架

           https://v.youku.com/v_show/id_XNDMzNzExODMxNg==.html编码

 

 

 

 

3、详细步骤线程

  硬件上,MCU选用stm32f407zgt6,imu选用gy-86(mpu6050+hmc5883+ms5611)。电机为大疆无刷电机m2006,电机驱动为电调c610,因此选用6s航模锂电池,因此须要设计24V转5v,5v转3.3v稳压电路,分别使用lm2576-5.0和asm1117-3.3稳压芯片,因为电调使用can总线通讯,因此须要单片机外接can芯片,选用TJA1050,除此以外就是MCU的一些接口电路,包括led,key,sw下载接口、多路串口、PWM和IO。总得来讲比较简单(须要注意一点是:电池24v输出到电调24v输入,是在pcb上走线,单路额定电流10A,线宽须要注意,最好双面都布线)。这是AD18的PCB工程连接,。这是pcb的3d图:设计

  

  机械上,须要根据电机尺寸单独设计电机支架和小车底板,三视图以下所示:

     

  软件上,我是使用的这个目录下的bsp:https://github.com/RT-Thread/rt-thread/tree/v4.0.0/bsp/stm32f4xx-HAL,须要的功能能够在rtconfig.h文件中开启对应的宏。 

  1. 用rtt的can设备驱动框架,完成了对电机电调的读写控制,具体见keil工程目录下的can_app.c文件,实现了对两个电机的正反转控制,读取电机转速,转矩等数据。
  2. 因为can读取的电机转速值数据的波动不稳定,再一个由于转速更新频率为1k,速度环控制周期是2ms,因此用滑动窗口滤波算法对数据作了平滑处理,最后pid调参的效果所以好了不少。
  3. 用rtt的IIC驱动完成了对gy-86传感器(mpu6050+hmc5883+ms5611)的初始化和数据读取,具体见gy-86.c文件,完成了对角速度,加速度,和磁力计数据的读取。
  4. 而后用Mahony算法(这算法是开源的)把读到的数据解算成欧拉角,见imu.c文件,须要注意的是sampleFreq要根据本身的控制周期来设置,角速度须要归一化。最后解算的pitch和roll角比较稳定,yaw角有一点漂移。
  5. 而后用rtt的软件定时器,将pid内环速度环控制周期设置为2ms,外环角度环控制周期设置为5ms, 见timer_app.c文件。
  6. pid参数整定是经过山外调试助手显示波形,经过rtt的FinSH组件在线去修改参数,极大的提升了效率,见timer_app.c文件,。
  7. pid控制框图以下图所示,其中的PID计算就是最简单的比例+积分+微分的结构,再加上了适当的限幅。
  8. 平衡车直立就是将下图指望角度设置为0,前进后退则是将指望角度设置为一个合适的正负的角度值,转弯就是在左右轮的指望速度上,加减一个合适的速度值,这角度值和速度值经过PS2摇杆的模拟量给定,就能完成遥控对平衡小车的控制。
  9. 利用rtt的多线程技术,完成了ps2遥控线程(ps2代码参考的这位朋友的,很好用,在此表示感谢),LED状态显示线程,电机电流保护线程,按键线程,很大程度上简化了程序的设计。

4、不足分析与接下来继续要作的工做。

  一、速度内环的pid效果不太理想,500的电机目标转速,实际转速波动有正负50。角度外环0度的指望角度,有正负0.5度的波动,小车运动过程当中,速度过快就会倒。我感受最重要的缘由就是电池过重,致使小车重心偏高,其次就角度更新频率太慢,电机转速值不许,pid参数也不是最优。

  二、代码上,使用了太多全局变量。led的状态显示没好好弄,ps2的好多按键没利用上。

  三、接下里的工做就是,使用RT-Thread的IPC机制,尽可能减小全局变量的使用。 经过yaw角度或电机编码器,实现转向环 速度 的闭环控制。增长 前进 和 转向 的位置控制。(前面的都是速度控制),也就是说还要增长3组pid控制。

  四、可能会从新设计电机支架,把电池放到电机下面,下降平衡车重心。会增长树莓派,用opencv实现简单的目标跟踪等工做。

相关文章
相关标签/搜索