十一、小车直立静止
前面的直立PID已经可以使小车处于直立静止的状态了,现在我们进行PID调试的另外两个,总的来说第一次进行PID调试还是比较难的,我进行了几天的调试终于调出来一组比较优的参数。看看程序吧!
速度PI调试的技巧:
在调整时,由于是进行静态调整,故此先将速度控制闭环的速度设定值置为0。然后开始后面的比例和微分参数的调整。具体的调试过程可以首先逐步比例参数,车模能够在一定平衡点附近来回运动。然后在逐步增加微分参数,车模就会很快停留在平衡点出。使用外力冲击车模,车模能够很快趋于静止。然后再逐步增加比例和微分控制参数,使得车模抵抗外部干扰冲击的能力逐步增强。
转向调试PD调试:
先增加比例系数,再增加微分系数。调出一组最优的数据。
/*************************************************************************
直立PD
**************************************************************************/
int balance(float Angle,float Gyro)
{
float Bias;
int balance;
Bias=Angle+0; //===求出平衡的角度中值
balance=102*Bias+Gyro*0.08;//===计算平衡控制的电机PWM PD控制
return balance;
}
/**************************************************************************
速度PI
**************************************************************************/
int velocity(int encoder_left,int encoder_right)
{
static int Velocity,Encoder_Least,Encoder,Movement;
static int Encoder_Integral;
//=============遥控前进后退部分=======================//
if(1==Flag_Qian) Movement=-700; //===如果前进标志位置1 位移为负
else if(1==Flag_Hou) Movement=700; //===如果后退标志位置1 位移为正
else Movement=0;
//=============速度PI控制器======================//
Encoder_Least =Encoder_Left+Encoder_Right; //===获取最新速度偏差
Encoder *= 0.8; //===一阶低低通滤波器
Encoder += Encoder_Least*0.2; //===一阶低通滤波器
if(Turn_Off(Angle_Balance,Voltage)==0) // {
Encoder_Integral +=Encoder; //===积分出位移 积分时间:5MS
Encoder_Integral=Encoder_Integral-Movement; //===接受遥控器数据,控制前进后退
}
if(Encoder_Integral>360000) Encoder_Integral=360000; //===积分限幅
if(Encoder_Integral<-360000) Encoder_Integral=-360000; //===积分限幅
Velocity=Encoder*4+Encoder_Integral/95; //===速度PI控制器
if(Turn_Off(Angle_Balance,Voltage)==1) Encoder_Integral=0; //===电机关闭后清除积分
return Velocity;
}
/**************************************************************************
转向PD控制
**************************************************************************/
int turn(int encoder_left,int encoder_right,float gyro)//转向控制
{
static int Turn_Target,Turn,Encoder_temp,Turn_Convert=3,Turn_Count;
int Turn_Bias,Turn_Amplitude=1500/Way_Angle+800; //===Way_Angle为滤波方法
static long Turn_Bias_Integral;
//=============遥控左右旋转部分=======================//
if(1==Flag_Left||1==Flag_Right) //这部分主要是根据旋转前的速度调整速度的起始速度,增加小车的适应性
{
if(++Turn_Count==1)
Encoder_temp=myabs(encoder_left+encoder_right);
Turn_Convert=2000/Encoder_temp;
if(Turn_Convert<3)Turn_Convert=3;
if(Turn_Convert>10)Turn_Convert=10;
}
else
{
Turn_Convert=3;
Turn_Count=0;
Encoder_temp=0;
}
if(1==Flag_Left) Turn_Target+=Turn_Convert; //左转
else if(1==Flag_Right) Turn_Target-=Turn_Convert; //右转
else Turn_Target=0; //停止
if(Turn_Target>Turn_Amplitude) Turn_Target=Turn_Amplitude; //===转向速度限幅
if(Turn_Target<-Turn_Amplitude) Turn_Target=-Turn_Amplitude;
//=============转向PD控制器=======================//
Turn_Bias=Encoder_Left-Encoder_Right; //===计算转向速度偏差
if(Turn_Off(Angle_Balance,Voltage)==0)
{
Turn_Bias_Integral+=Turn_Bias; //转向速度偏差积分得到转向偏差
Turn_Bias_Integral-=Turn_Target; //获取遥控器数据
}
if(Turn_Bias_Integral>1800) Turn_Bias_Integral=1800; //===积分限幅
if(Turn_Bias_Integral<-1800) Turn_Bias_Integral=-1800; //===积分限幅
Turn=Turn_Bias_Integral*2+gyro/12; //===结合z轴陀螺仪进行PD控制
return Turn;
}