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; //计算直立 PWM
return 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; //===积分出位移 积分时间:10ms
Encoder_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; 转向遥控叠加在转向控制里面。