【STM32平衡小车】平衡小车的PID环体会心得

编程入门 行业动态 更新时间:2024-10-28 03:25:41

【STM32平衡<a href=https://www.elefans.com/category/jswz/34/1766934.html style=小车】平衡小车的PID环体会心得"/>

【STM32平衡小车】平衡小车的PID环体会心得


2018年12月11日17:47:56更新:

平衡环:
P可增加响应速度
P过小,响应太慢,不能达到直立。
P过大,会出现大幅度的低频抖动。

D可消除P大了之后产生的大幅低频抖动。
D过大,会出现高频抖动。

速度环:
P可增加速度的响应,I和P有比例关系I=P/200.
P过小,响应慢,出现的现象是加速减速慢,迟钝。
P过大,会出现低频抖动。

转向环
P过下,转弯不及时
P过大,大幅度抖动


两个东西待解决

1、左右轮编码器之和数值输出的范围确定
2、小车转向的gyro范围确定


一、机械中值的确定

不管是那个环,小车物理人为的短时直立,这个必须要做到,不然调试任何参数,任何环都是扯。

机械中值的确定方法,通过OLED上显示的陀螺仪倾角确定,存在某一个角度是前倾和后仰的临界点,这个点对应的角度就是ZHONGZHI.

二、直立环(PD)

  • 开始调试直立环时,需要先关闭速度环和转向环。
  • 单独的直立环不足以让小车直立,最基本的环=直立环+速度环
  • 直立环代码实现

//直立环的最基本代码实现
//Angle-小车倾角 Gyro-Y 轴陀螺仪(前进方向是 MPU6050 的 X 轴的正方向,电机轴与 Y 轴平行。)
int balance(float Angle,float Gyro)
{float Bias,kp=300,kd=1;int balance;Bias=Angle-0; //计算直立偏差balance=kp*Bias+Gyro*kd; //计算直立 PWMreturn balance; //返回直立 PWM
}
  • 直立环的Kp范围确定

    • MiniBalance_PWM_Init(7199,0);可以知道,7200对应的占空比是100%
    • 再由PID的基本代码可知,假如设定kp=720,那么在±10°左右,电机即可实现满转。
    • 我们根据电机直立的摆幅,差不多就要≤10°,不然就抖的太厉害了。所以我们设定kp的可选范围也就限制在了≤720
  • 直立环的kp极性确定

    • 这个可以直接给kp正负值,然后放在地上观察现象, 正常出现的现象是一个负反馈,而不是出现往哪边倒就往另一边加速,致使它快速倒下,而是往要倒的方向去追(跟后面的速度环kp极性确定大同小异)。
  • 直立环的kp大下确定

    • 试参数,从小到大,响应慢慢加快, 直到出现大幅度的低频抖动选定此时的Kp,接下来进行速度环的kd确定。
  • 直立环的kd极性确定

    • kp置为0,然后给Kd正负值分别实验,当拿起小车旋转时,小车轮子没有实现跟随,这个时候说明极性是反的!
  • 直立环的kd大小确定

    • 注意,是在抖动的kp基础上,调试kd大小。依旧是从小到大实验,一直到小车出现高频的剧烈抖动

此时kp,kd同时乘上0.6,就是一组合适的直立参数,可以发现不会抖了,但是小车也仍旧不能一直保持直立,原因是单独的直立环不足以实现小车直立,还需要配合速度环。

三、速度环(PI)

  • 积分控制和比例控制的极性是相同的,且有一定的比例关系。(这里确定为200)

  • 直立小车,速度环是一种对直立环的干扰,所以我们还依旧要让直立环处于主导地位,要对速度环进行适当的低通滤波处理。

  • 直立环的基础代码实现

//输入左右轮电机编码器
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 的脉冲数)得到小车的速度。
    • 通过实验,实际串口输出,小车满速旋转时左右轮编码器相加可达160,假设速度偏差达到50%时满转。,160/2=80,7200/80=90,也就说kp最大为90(注意这里只是在假设50%的前提下).
  • 速度环的kp极性确定

    • 极性判断,需要先关闭直立环和转向环。
    • 要想达到直立,速度环这里正反馈,意思就是假如向前倒,那么小车就要以更快的速度向前冲,保持直立。
    • Encoder_Least =(Encoder_Left+Encoder_Right)-0;Encoder_Least -是速度偏差,(Encoder_Left+Encoder_Right)是当前速度值,0-是目标速度值,可知,当旋转其中一个轮子,两个轮子往相同方向旋转,到速度最大值。
  • 速度环的kp大小确定

    • 大小确定打开直立环。
    • kp,ki同符合且有ki=kp/200的比例关系
    • kp,ki逐步增大,直到使得小车的响应迅速稳定,即是合适的PI参数。

遥控的加入

int velocity(int encoder_left,int encoder_right)
{static float Velocity,Encoder_Least,Encoder,Movement;static float Encoder_Integral;float kp=80,ki=0.4;if(1==Flag_Qian) Movement=-90; //===如果前进标志位置 1 位移为负else if(1==Flag_Hou) Movement=90; //===如果后退标志位置 1 位移为正else Movement=0;Encoder_Least =(Encoder_Left+Encoder_Right)-0; //获取最新速度偏差==测量速度(左右编码器之和)-目标速度(此处为零)Encoder *= 0.7; //===一阶低通滤波器Encoder += Encoder_Least*0.3; //===一阶低通滤波器Encoder_Integral +=Encoder; //===积分出位移 积分时间:10msEncoder_Integral=Encoder_Integral-Movement; //接收遥控器数据,控制前进后退if(Encoder_Integral>10000) Encoder_Integral=10000; //积分限幅if(Encoder_Integral<-10000) Encoder_Integral=-10000; //限制遥控最大速度Velocity=Encoder*kp+Encoder_Integral*ki; //===速度控制if(Turn_Off(Angle_Balance,Voltage)==1) Encoder_Integral=0; //电机关闭后清除积分return Velocity;
}//其中Encoder_Integral=Encoder_Integral-Movement; 遥控的速度通过积分融入
速度控制器,减缓了速度突变对直立控制的影响。
//积分限幅中的最大赋值决定了小车的最大前进速度,而 Movement 值决定了小车的给定速度。

四、转向环§

  • 基本原理
    • 使用 Z 轴陀螺仪的数据作为转向速度偏差进行 P 控制,目标是保持转向速度为设定值。
  • 基本代码实现
//gyro是陀螺仪的y轴,电机方向.
int turn(int encoder_left,int encoder_right,float gyro)
{float Turn,Kp=1,Bias;Bias=gyro-0;Turn=-Bias*Kp;return Turn;
}
  • 直立环kp的极性判断

    • 调试小车转向环,需要关闭直立环和速度环
    • 实际通过串口观察gyro的值,我们发现它最大不过4位,根据 7200 代表占空比 100%,所以我们估算 kp 值应该在 0~2 之间。
    • 取合适的正负值实验,正常是我们把小车按在地上,旋转小车,小车会有抵抗,阻止旋转。
  • 直立环kp的大小确定

    • 逐步增加kp值,直到有走直线效果良好。

遥控功能加入

int turn(int encoder_left,int encoder_right,float gyro)
{float Turn,Kp=1,Bias;if(1==Flag_Left) Turn_Amplitude=1100;else if(1==Flag_Right) Turn_Amplitude=-1100;else Turn_Amplitude=0;Bias=gyro-0;Turn=-Bias*Kp;Turn+=Amplitude;return Turn;
}//其中Turn+=Amplitude; 转向遥控叠加在转向控制里面。

更多推荐

【STM32平衡小车】平衡小车的PID环体会心得

本文发布于:2024-03-08 00:49:20,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1719399.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:小车   心得   PID

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!