一、总体设计
此系统用到的功能模块都是集成好的,这里只设计了一个底板来连接各个硬件模块(硬件模块可以自己做也可以网上买);资料见附录。
图1:总体思维导图
二、电路设计篇
框图中调试下载接口是采用SWD方式;OLED(128*64)模块,驱动IC为SSD1306,使用IIC通信方式;蓝牙模块(HC-06)使用K60的串口0;电源部分(MP1584模块)将锂电池的12V电压转化5V和3.3V为整个系统供电;编码器传感器有电机自带,只需要设计接口就可;MPU6050模块也是IIC通信方式。
图2:硬件设计框图
底板用于连接各个模块,下面是底板原理图和PCB图,底板的PCB采用2层Layout。硬件设计使用Aitium Designer,可以同时进行原理图和PCB设计。
图3:底板原理图
图:4:底板PCB
三、软件设计
开发环境使用Keil5 MDK
1、软件主要分为以下几个模块:
(1)MPU6050的DMP算法及驱动库移植,用于姿态解算求出欧拉角。
(2)编码器模块程序设计,对电机的转速测量。
(3)串级PID控制器设计,控制的核心算法。
(4)蓝牙模块程序设计,用来接收上位机发来的指令。
(5)OLED模块程序设计,实时显示小车的状态信息。
2、PID控制器参数:
(1)比例环节P:成比例地反映控制系统的偏差信号,只要有偏差,控制器就会产生控制量。
(2)积分环节I:主要用于消除稳态误差使小车速度尽可能接近零,起到一种延迟控制的作用,提高系统的无差度(车轮速度反映)。
(3)微分环节D:反映偏差信号的变化趋势(角速度反映),并能在偏差变得太大之前,在系统中引入一个提前控制的信号,从而抑制超调量。
3、在中断程序中,需要调用PID控制器来计算输出值,三个控制器直立环、速度环、转向环分别负责小车的直立速度和转向,是本项目的核心所在。
设计PID控制器需要进行离散化处理,对于传感器检测到的数据只需要读取某个时刻的数据,在中断控制函数中每间隔10ms(Δt)进行一次数据读取和运算,用累加代替积分,用离散的差分方程代替连续的微分方程。
四、实物测试
由于PID调参以及一些其他因素,车身能够直立,但是系统比较不稳定,通过手机蓝牙串口助手可以发送指令控制前进后退转弯。
注意事项:1、有时候刚开机时车轮会一直加速(还得改进)。
2、开机后静待几秒当OLED能够显示角度是就可以放开手。
图5:实物测试
五、改进和展望
1、通过优化算法能够达到一定的载重,而且在前进转向时保持车身稳定。
2、对于两轮自平衡车的起摆算法,可以参考倒立摆系统的研究方法建立一阶倒立摆动力学方程,建立微分方程,之后由拉式变换求出倒立摆系统传递函数。通过分析原系统的根轨迹显然是个不稳定系统,通过要求的参数求出PID控制传递函数并且用simulink进行设计。
六、附录
由于实物并不完美,内容仅供参考。
演示视频在以下链接中。
链接:https://pan.baidu.com/s/1_8ey5boJv6GEpkjvt1l1Tw
提取码:8888
图6:编码器示意图
图7:实物图1
图8:实物图2
图9:实物图3