智能平衡车项目总结

19年秋季学期做过智能平衡车项目,是由一个团队一起完成的,起初信心满满,最终却有很多功能并没有实现。只实现了一些基础的功能,也算是完成了。在学校,每个项目经验都很重要,对于出去实习而言。在此,进行一些总结,并会不断更新。以下大部分是个人自己的理解,如有错误,请批评指正。
本文参考了以下链接:
https://blog.csdn.net/a568713197/article/details/82845959?depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-1&utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-1
https://blog.csdn.net/ReCclay/article/details/84789455?depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-4&utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-4
MPU6050
MPU6050模块是六轴姿态传感器,3轴加速度传感器、3轴陀螺仪传感器。也成为加速度陀螺仪传感器。模块引脚连接如下:
智能平衡车项目总结_第1张图片
其中SCL、SDA引脚连接开发板IIC总线的时钟线SCL、数据线SDA,如图所示,只需将模块的4个引脚与开发板进行连接,便可以让模块进行工作。
原理
两轮小车在静止状态下,由于重力的作用,是会倾倒的。平衡车是如何实现不倒的呢?在给小车一个外力,这时有一个倾角,通过陀螺仪和加速度传感器测量这个倾角和倾角速度控制小车车轮的加速度来消除这个倾角,从而保持平衡。这里有一个重点,之前不是很明白。六轴姿态传感器怎么控制小车车轮加速度。MPU6050将采集的角度、角速度通过串口传到主控板。通过主控板的PID算法计算出PWM,将PWM输出至电机驱动,从而控制小车倾角。周期性读取小车倾角,改变经过受力分析,可以计算出加速度a=kgsinθcosθ,而加速度可以由传感器测得,可以以此得到小车倾角。k为加速度传感器灵敏度系数。再对角度进行微分,可以得到角速度。看了一些文献,小车倾角是有误差的,由陀螺仪测到的角速度积分得到的角度和重力加速度得到的角度是有误差的,可以通过卡尔曼滤波算法进行数据融合处理。陀螺仪和加速度传感器在此项目中是个重要的模块。加速度传感器可以测量物体由地球引力或运动时所产生的加速度,陀螺仪用来测量物体运动时的旋转角速度。在平衡车项目中,我们用了MPU6050六轴传感器模块,这个模块同时集成了陀螺仪和加速度传感器两个模块,来实现小车平衡。给小车一个向前的作用力,它会向前倾,此时小车有一个向前的加速度,从而抵消向前的那个倾角。反之,向后也是一样的。

对项目我们需要进行直立控制、速度控制、方向控制、三个环节。都使用了比例微分控制(PD),从控制系统来看,两轮自平衡小车是个三闭环控制系统。


第二次更新
以上只能说是小车平衡的原理,接下来直接上干货,项目代码、PID算法是不可缺少的。之前说过平衡小车是个三环控制系统。实现小车的平衡,至少需要直立环(PD)和速度环(PI)。
一.机械中值的确定
不管调节那个环,小车物理人为的短时直立,这个必须做到,不然调试任何参数都没有意义。机械中值的确定方法,通过OLED上显示的陀螺仪倾角确定,存在某一角度是前倾和后仰的临界点,这个点对应的角度就是zhongzhi。
二.直立控制(PD算法)
先开始调试直立环,需要先关闭速度环和转向环。单独的直立环不足以让小车直立,最基本的环=直立环+速度环。平衡车是个闭环控制系统,要保持直立静止需要两级PID,直立环PD调节器IMU(MPU6050)的数据来控制小车的运动状态,速度环PI调节器依据编码器的数据来调节车轮的转速以及运动状态,使两轮趋向静止的状态。直立代码如下:

/**************************************************************************
函数功能:直立PD控制
入口参数:角度、角速度
返回  值:直立控制PWM
**************************************************************************/
int balance(float Angle,float Gyro)
{  
   float Bias,kp=410,kd=1.4;
	 int balance;
	 Bias=Angle-ZHONGZHI;       //===求出平衡的角度中值 和机械相关
	 balance=kp*Bias+Gyro*kd;   //===计算平衡控制的电机PWM  PD控制   kp是P系数 kd是D系数 
	 return balance;
}

该函数入口参数为角度以及角速度,机械中值为小车不上电平衡时的角度,在调节直立环时,先将速度环的参数都置零使直立环独立工作。
直立环的Kp范围确定
MinBalance_PWM_Init(7199,0);可以知道7200对应的占空比是100%。再由PID的基本代码可知,假如设定kp=720,那么在+10°左右,电机即可实现满转。我们根据,小车直立时的摆幅,差不多就要<=10°,避免小车摆幅过大。因此kp范围>=720。
直立环kp大小确定:试参数,从小到大,响应慢慢加快,直到出现大幅度的低频抖动,选定此时的kp,接下来进行直立环的kd来减轻震荡。注意是在抖动的kp基础上,调试kd大小。依旧是从小到大实验,一直到小车出现高频的剧烈抖动。此时kp,kd同时乘上0.6,就是一组合适的直立参数,可以发现不会抖了,但是小车并不能保持直立,还需要配合速度环。
三、速度环(PI)
直立小车速度环是一种对直立环的干扰,所以我们依旧让直立环处于主导地位,要对速度环进行适当的低通滤波处理。当角度环有偏差的时候,根据角度环的pid是可以给小车输出pwm波维持小车平衡的,但是小车以什么样的速度维持平衡角度环是做不到的,加上速度环目的就是就是在于此。速度环基础代码实现如下:

//输入左右轮电机编码器
int velocity(int encoder_left,int encoder_right)
{
	static float Velocity,Encoder_Least,Encoder;
	static float Encoder_Integral;
	
	float kp=80,ki=0.4;
	Encoder_Least =(Encoder_Left+Encoder_Right)-0;
	Encoder *= 0.7;
	Encoder += Encoder_Least*0.3;
	Encoder_Integral +=Encoder;
	Velocity=Encoder*kp+Encoder_Integral*ki;
	return Velocity;
}

速度环的kp范围确定
测速是通过STM32定时器编码器接口模式对编码器进行四倍频(软件实现,提高精度),并使用M法测速(每10ms的脉冲数)得到小车的速度。调节使两编码器和的值趋向于零
速度环的kp大小确定:
大小确定打开直立环。kp,ki同符合且有ki=kp/200的比例关系,所以我们只需要整定Kp即可,加入PD调节器,一同调节,kp,ki逐步增大,直到小车的响应迅速稳定,即是合适的PI参数。

我们项目代码如下
链接:https://pan.baidu.com/s/17_cxrY4POoddJ35klYZSMQ
提取码:xqjb
也可以通过qq联系本人,乐于解答相关问题。
qq:1050497845

你可能感兴趣的:(嵌入式)