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

共13条 2/2 1 2 跳转至
助工
2015-10-26 00:56:14     打赏
11楼

九、传感器驱动实验

   我们这个实验利用串口调试助手来观察实验现象。我们先来介绍一下mpu-6000.6050,MPU-60X0 是全球首例9 轴运动处理传感器。它集成了3 轴MEMS 陀螺仪,3 轴MEMS
加速度计,以及一个可扩展的数字运动处理器DMP(Digital Motion Processor),可用I2C
接口连接一个第三方的数字传感器,比如磁力计。扩展之后就可以通过其I2C 或SPI 接口
输出一个9 轴的信号(SPI 接口仅在MPU-6000 可用)。MPU-60X0 也可以通过其I2C 接口
连接非惯性的数字传感器,比如压力传感器。
MPU-60X0 对陀螺仪和加速度计分别用了三个16 位的ADC,将其测量的模拟量转化
为可输出的数字量。为了精确跟踪快速和慢速的运动,传感器的测量范围都是用户可控的,
陀螺仪可测范围为±250,±500,±1000,±2000°/秒(dps),加速度计可测范围为±2,±4,
±8,±16g。

    
   从它的中文资料中知道,它是处在三维空间中的,我们就可以使用欧拉角。欧拉角有三个角:yaw(航向角),
roll(横滚角),pitch(俯仰角)。欧拉角的旋转矩阵等表示我就不介绍了。感兴趣的就可以去百度。

  下面我们看看要修改的函数。

    

   上面是我们要修改的源程序,下面是我们修改后的程序。

    

   修改后的程序中包含了很多的计算欧拉角的算法。我们还要在主函数中增加点内容,让串口去读取数据。看下面的程序

     

    我们现在用串口去看看读取的数据吧!

    



助工
2015-10-26 02:14:43     打赏
12楼

十、PID调试

我们小车中的pid调试有直立、速度、转向三个pid调试,我们就看看直立的调试吧!首先pid调试我们要明白一些重要的概念和pid的一些算法。我们要知道输入偏差、设定值、变化率。我们看看pid的算法吧!


我们进行的是直立的pid调试,我们就先看看直pid调试的方法吧


这就是pid直立的调试方法,有个《直立行车参考设计方案(经典)》的PDF文档写的很好,上面介绍了小车的设计到调试,只是安装和我们的这个小车不同,其中PID调试在调试篇中写的很详细,感兴趣的可以去看看,我这里就不多介绍了。下面我问来进行PID调试。

PID调试我们就进行直立调试,因为下面的实验是PID调试中的另为两个,我的比例系数是120,微分参数是0.08。

                                             这是调试好的效果。


助工
2015-11-01 00:06:53     打赏
13楼

十一、小车直立静止

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

 


共13条 2/2 1 2 跳转至

回复

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