这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » DIY与开源设计 » 电子DIY » 爱上魔电 智能小车进程贴

共11条 2/2 1 2 跳转至
助工
2015-11-01 00:06:53     打赏
11楼

十一、小车直立静止

     前面的直立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;
}           

 


共11条 2/2 1 2 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]