第一步思考:想让平衡小车站立起来首先要知道的是平衡的原理是什么?
实验立棍:平衡的原理就比如在你手掌上立辊,棍子要倒的时候,你的手掌应该要向倾斜的方向移动。你立的久了你就会发现倒的速度是因为重力的作用,倾斜角度越大,你的手应该要移动的越快,而棍子在中心的时候会出现小幅度的移动,需要你的手微调就可以了。
好了,我们在做上面的小实验之后是不是发现了我们的手的移动可以让小木棍保持平衡,我们知道这个原理之后引入一个概念叫“反馈控制”,我们看到了木棍要倒(反馈),然后经过大脑反应去对手操作(控制)。而在控制领域的算法适用于平衡小车项目的是PID 控制(比例-积分-微分控制),知道了有PID这个控制算法前,是不是应该要知道“反馈”,后面的问题我会提及反馈作为一个问题
但是现在我们应该先知道反馈到来时,我们对手的控制是怎么样的是吧。而我们对手的控制会发现,在倾斜角度很大时向反方向移动就很块,快要立起来平衡的时候手就移动的慢一些,如图
第一次反馈的时候反馈倾斜角很大,如何控制手向倾斜方向的速度也很大。
第二次反馈的时候反馈倾斜角比上次的小,所以控制手向倾斜方向的速度就比上一次的小。
所以在连续的手移动的动作当中,我们是不是应该把他模拟成以倾斜角为Y轴(误差),对于手的速度变化这段时间内手移动的距离为X轴。
在这里我们是不是对一段时间内误差的计算e(t),还有对误差的累积∫e(t)dt。而我们把累积的过程称为积分Integral(PID中的I),这里积分的目的是为了什么呢,是为了小车直立平衡(也就是倾斜角度为零)。
在倾斜调度比较大的时候是不是由于PID的P=Kp×e(t)比例控制来调整的反应的剧烈程度,然后我们把累积的误差加上,那么我们先看结论公式:
Out = P + I 输出是比例积分控制之和
下面公式为加入增益常数K和单位时间t
Out(t)=Kp×e(t)+Ki×∫e(t)dt
解释:Out(t),单位时间t内Out(t)该输出的值
Kp×e(t),Kp比例控制反应的剧烈程度
Kp×∫e(t)dt累积该时间内误差
解释一下Kp,Kp的作用,这是比例常数,也就是他们在out=P+I+D当中的对out的增益效果,
增大Kp增加系统的响应速度,过大的话由于小车的自身重量的惯性,就很可能导致过冲或震荡。
增大Ki可以消除稳态误差,如果它的增益太大,就会影响到整体的输出了,就会可能会引起系统不稳定,太小又不精确。
所以对小车来说仅仅以PI来调节控制而言,在倾斜角为零的直立状态来说时,没有对倾斜角的速度进行控制,PI调节会让小车过冲和震荡,极容易导致小车立不起来,即使调好P和I的增益参数让他不倒,那在直立点也会经过一段时间震荡,而且震荡的幅度比较大。为了解决这个问题所以才在PI调节中加入Derivative微分控制。
完整的PID公式就是PID三个参数之和,所以加入微分控制的目的就是控制小车不过冲和震荡剧烈的情况,通过控制速度使其直立,所以PD控制也称为直立环,而上面的PI控制称为速度环。
那解释了那么多我们要来了解一下微分是什么,他为什么能控制速度使其小车直立的。
那我们先去除对I积分的调节可以吧,这样可以更好的分析PD调节的原理。
微分作用:微分部分是根据“误差变化的速度”来调整输出。它预测系统的未来行为,并试图减少系统的震荡或过度响应。微分作用对于提高系统的稳定性和响应速度非常重要。当然他也有增益的常数Kd。
D = Kd × (d/dt) × e(t)
其中,(d/dt) 是误差的变化率,Kd是微分增益常数。
微分的优点:微分控制能够减少系统的过冲和振荡,帮助控制系统更平稳地接近目标。
微分控制是怎么实现的呢,根据公式看是不太容易的,通俗的理解就是在过冲前获取的速度,而这个速度是需要传感器(霍尔编码返回的计数值)反馈计算的,速度来经过一段时间D的减速或者叫阻尼后,速度变化率趋近于零,这样就可以平稳在某一倾斜角,为什么是某一倾斜角呢,因为没加入I积分的误差控制,而倾斜角的数据是由MPU6050反馈的。
微分的缺点:是对信号震荡很敏感,因为速度的计算是上一个周期时间开始到周期时间结束走过的路程除以周期时间,所以在数据信号采集时震荡导致的误差在时间周期越短时对小车当前速度计算就会出现很大的偏差。
怎么解决:解决采集的数据信号震荡导致的误差就要进行滤波,常见的是采用卡尔曼滤波算法,或者用MPU6050自带的DMP(运动数据处理器),要对这些数据处理是因为PID算法调节是建立在理想的线性模型。跑题:而卡尔曼滤波和DMP这两个数学模型都可以适用于平衡小车上面,在6050模块中已经提供了DMP的代码,实际项目中也运用了,但是还是要提及一下卡尔曼滤波,他是线性最小方差估计法,是线性动态系统模型,自回归滤波器,处理对数字信号过程噪声和测量噪声。有兴趣可以去了解。
好!!!你现在已经会使用PID调节控制算法了,小车已经可以立起来了!
第二步思考:我已经熟悉了小车平衡的理论,那么我该怎么实践他呢?
那么我们应该想实现直立的功能,以小车直立为目的来做项目。
-
选择元器件(直流电机),小车的电机是需要减速的直流电机,要减速电机的原因是扭矩大,功率高。试想一下用普通的马达,直接连接到轮子上,一点点的电流就可以让小车姿态不稳定,所以需要减速电机。推荐JBG37-520。
(买带编码器的),六针脚。!!!买带两层亚克力板和底座一起的!!! -
MPU6050,这是最关键的核心的元器件,小车能不能立起来就是通过这个元器件测量反馈的数据通过DMP转换给芯片计算。
-
STM32F103c8t6,主芯片,没有浮点运算单元,计算能力差,对于需要浮点运算单元的平衡小车来说性能不够用。当作为项目开发的合适度来说该芯片是目前最好的选择没有之一。
-
TB6612驱动模块,由于电机功率较大,所以对电源要求较高,电机需要12v的电压,其他模块用3.3v。而且JBG37电机带编码器(带编码器的)上的A和B(3和4针脚)的针脚发送编码信息(关于速度)给芯片,而引脚(1和6针脚)两端的两个引脚是用来对电机输出电流的,而控制该电流的是TB6612上连接芯片控制的PWMx和xIN1、xIN2。TB6612上有锂电池组输入进来12V的VM接口,还有内部逻辑供电5V的VCC来对其他模块供电。
-
降压模块:对继电器5V的电压降压为3.3V进行供电
-
锂电池组:12V的,优点是电压稳定,比用5号电池合适,5号用不一会电池的电压电流衰减严重,即不能充电,要以12V供电需要把块5号电池串联,并且体积重量太大。密集的锂电池组可以解决这些问题。
-
PCB板子:直接展示
-
其他拓展模块:SSD1306(4针脚0.96寸OLED)、超声波HC-SR04、蓝牙4.0(HC-05)
||然后主要复杂的接线如下
根据平衡车PCB:
驱动模块tb6612模块与两个电机JB37-520接线
电机1: M2 - AO1
M1 - AO2
A - PA1//与单片机连接
B - PA0
G - VCC
电机2: M2 - BO2
M1 - BO1
A - PB7
B - PB6
G - VCC
驱动模块tb6612模块与F103c8t6
PWMA - PA11
PWMB - PA8
AIN2 - PB12
AIN1 - PB13
BIN2 - PB14
BIN1 - PB15