赞
踩
目录
这个项目是我在入门嵌入式做的第一个项目,是在看完原子哥的视频后,为了巩固和连接起来这些知识点做的,做的不是很好。此次项目主要涉及到嵌入式方面的的基础知识,如PWM输出,IIC通信时序,uart串口通信,定时器。核心部分是用MPU6050和编码器来读取小车的姿态和速度信息,通过PID来处理得到的数据使小车实现自平衡。
PID控制:即为对偏差进行比例、积分和微分控制。由三个元素构成,分别是比例(P),积分(I),微分(D)。
工程中P必然存在,在P的基础上又有如PI控制(比例积分控制),PD控制(比例微分控制),PID控制(比例积分微分控制)。
小车往前倒,电机加速往前,从而达到平衡。反之亦然。
首先我们要知道,电机通过PWM控制转速,单片机PWM给到电机驱动,从而控制电机的转速和方向。
具体流程如下:
或者用方框图表示:
硬件占用的GPIO:
编码器2——PB6/PB7---TIM4
电机2——PB14/PB15
PWM2——PA11---TIM1_4
4、 MPU6050中断引脚——PB5
MPU6050所用IIC——PB3/PB4
硬件连接:
讲解:
这里以霍尔编码器为主介绍(光电编码器精度比霍尔高38倍)。霍尔编码器是有霍尔马盘和霍尔元件组成。霍尔马盘是在一定直径的圆板上等分的布置有不同的磁极。霍尔马盘与电动机同轴,电动机旋转时,霍尔元件检测输出若干脉冲信号,为判断转向,一般输出两组存在一定相位差的方波信号。示意图如下:
我用的电机是GM25-370直流减速电机(带霍尔编码器),其对应编码器引脚图如下:
通常有两种方式,第一种软件技术直接采用外部中断进行采集,根据AB相位差的不同可以判断正负。第二种硬件技术直接使用定时器的编码器模式,这里采用第二种。也是大家常说的四倍频,提高测量精度的方法。其实就是把AB相的上升沿和下降沿都采集而已,就是所有边沿都计数,AB两相有90度的相位差,可以判断出旋转方向和旋转速度,也可以提高精度,所以1变4。自己使用外部中断方式实现就比较占用资源了,这里建议使用定时器的编码器模式来测量脉冲变化值。
这里所说的电机也就是通过电机驱动控制电机,电机驱动我们使用的是tb6612,一定要用tb6612的芯片,国产做的兼容板子质量太差,钽电容很脆,一不注意就炸了,比如我当时就差点当场去世,前期调试不建议使用,虽然便宜一半,但是为了系统的稳定和安全,还是用tb6612吧,但是调试完成后可以换成兼容板。
电机驱动引脚定义:
可见,电机驱动最多可接两个电机,tb6612的稳定性是比L298N稳定的,如果感兴趣可以试试L298N。下面以一个电机的配置举例如下:
电源,地,STBY这里不做过多赘述。
输入端大致配置为:
Ain1=1,Ain2=0,电机正转
Ain1=0,Ain2=1,电机反转
输出端AO1 AO2接编码器的动力线部分
PWM信号输入端接单片机定时器的PWM输出
软件PWM的配置过程不再详解,具体可参考正点原子的用户手册,这里讲解一下代码中的Load(Moto1,Moto2)加载到电机的函数,加载的值实际是占空比CCRX的值,也就是通过控制占空比达到控制速度的效果。PID算法就是把需要的CCRX实时地算出来,然后控制电机,达到平衡。
讲解一下PWM周期的计算,具体公式如下:
72MHZ*T=(ARR+1)(PSC+1);
占空比:CCRX/ARR=高电平时间/T;
PWM时序图如下:重装载值是ARR,比较值是CCRX
这里再讲解一下PWM限幅,实际是限制CCRX的值,避免CCRX大于ARR的值。
再讲解一下低通滤波,期间需要低频滤波,我们是以直立环为主,速度环为辅,速度环相对于直立环来说是一个干扰,最终目的是直立。低频滤波作用是使得波形更加平滑,滤除高频干扰,防止速度过大影响直立环正常工作。
作用:检测倾斜角。
主要用到如下三个引脚:
MPU6050中断引脚——PB5
MPU6050所用I2C——PB8/PB9
中断引脚的定义为配置PB5为上拉输入,检测到数据后电平变低,则进入外部中断,整个控制周期都是再在中断中进行,这里我们的检测周期设为10ms,则我们读取的编码器的值/10ms就是速度值,因为时间是固定的,所以编码器的值即可理解为速度。
牢记如下知识点:
PID控制:即为对偏差进行比例、积分和微分控制。由三个元素构成,分别是比例(P),积分(I),微分(D)。
工程中P必然存在,在P的基础上又有如PI控制(比例积分控制),PD控制(比例微分控制),PID控制(比例积分微分控制)。
1.理论
小车往那边倒,车轮就往哪边开,既可以保持车子的平衡。
2.公式
a=b1*θ+b2*θ'; ——> 比例微分控制【PDout=Kp*Angle+Kd*( Angle-Angle_last)】
3.结构框图
直立环:让小车角度趋近0;
速度环:让电机速度趋近0;
速度环输入:1.给定速度。2.速度反馈。
输出:角度值(直立环的期望速度输入)
直立环输入:1.给定角度(速度环输出)。2.角度反馈
输出:PWM(直接控制小车)
Vertical_out=Kp1*( real_Angle- expect_Angle)+Kd*D( real_Angle- expect_Angle) //直立PD控制器
Velocity_out =Kp2*(Encoder_ real- Encoder_ expect)+Ki*S(Encoder_ real- Encoder_ expect) //速度PI控制器
(NOTE:(1)Velocity_out = expect_Angle.(2)Kp1:Vertical_Kp.(3)Kp2:Velocity_Kp.)
【中文】
直立环输出=Kp1*(真实角度-期望角度+机械中值)+Kd*角度偏差的微分 //角度偏差=真实角度-期望角度
速度环输出=Kp2*(反馈编码器值-期望编码器值)+Ki*编码器偏差的积分 //编码器偏差=反馈编码器值-期望编码器值
(NOTE:(1)速度环输出=直立环的期望角度。(2)Kp1:直立环Kp。(3)Kp2:速度环Kp。)
单摆的加速度和单摆的倾角成正比
只存在大小与角度偏差成正比的回复力
a=b1*θ; ——> 比例控制【Pout=Kp*Angle】
比例微分控制器
大小与角度成正比、方向与角速度成正比的回复力
大小与角速度成正比、方向与回复力成反比的阻尼力
a=b1*θ+b2*θ'; ——>比例微分控制【PDout=Kp*Angle+Kd*( Angle-Angle_last)】
控制函数写在外部中断服务函数里面。
10ms控制周期由MPU6050的INT引脚给定。
保证数据的采集和处理的同步性。
机械中值:把平衡小车放在地面上,从前向后以及从后向前绕电机轴旋转平衡小车,两次的向另一边倒下的角度的中值,就是机械中值。
Kp极性:
极性错误:小车往哪边倒,车轮就往反方向开,会使得小车加速倒下。
极性正确:小车往哪边倒,车轮就往哪边开,以保证小车有直立的趋势。
Kp大小:
Kp一直增加,直到出现大幅低频震荡。
Kd极性:
极性错误:拿起小车绕电机轴旋转,车轮反向转动,无跟随。
极性正确:拿起小车绕电机轴旋转,车轮同向转动,有跟随。
Kd大小:
Kd一直增加,直到出现高频震荡。
直立环调试完毕后,对所有确立的参数乘以0.6作为最终参数。
原因:之前得到的参数都是Kp、Kd最大值,根据工程经验平衡小车的理想参数为最大参数乘以0.6求得。
结果:乘以0.6后,小车的抖动消失,但同时直立效果也变差。待下面加入速度环就能得到更好的性能。
速度环参数调节前注意:
一、
在调试【速度环参数极性】时:需要去掉(注释掉)【直立环运算】
在调试【速度环参数大小】时:再次引入(取消注释)【直立环运算】
二、
【转向环运算】始终是去掉(注释)的一个状态。若转向环已提前将参数调试好,则未注释也影响不大。
Kp&Ki:
线性关系、Ki=(1/200)*Kp、仅调Kp即可。
Kp&Ki极性:
极性错误:手动转动其中一个车轮,另一车轮会以同样速度反向旋转——典型负反馈。
极性正确:手动转动其中一个车轮,两个车伦会同向加速,直至电机最大速度——典型正反馈。
Kp&Ki大小:
增加Kp&Ki,直至:小车保持平衡的同时,速度接近于零。且回位效果较好。
Kp极性:
极性错误:拿起小车,并将小车绕Z轴旋转,两车轮旋转的趋势与小车旋转趋势一致——典型正反馈。
极性正确:拿起小车,并将小车绕Z轴旋转,两车轮旋转的趋势与小车旋转趋势相反——典型负反馈。
Kp大小:
加大Kp,直至走直线效果较好,且无剧烈抖动。
代码资料均已打包,有需要的找我要即可。
B站:天下行走ㅍ_ㅍ (相关视频)
知乎:天下行走 (相关文章)
CSDN:技术创造无限可能
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。