平衡车直立PID调节总结

    苦战一周,终于使平衡小车站了起来,PID无疑是我从学习板子至今遇到最困难的东西了,并不是说它原理有多么复杂,只是想让小车的效果更佳,调参的过程无疑是漫长而艰难的。

    连续调了俩天的参数后,今天我的小车终于可以稳稳立起来,所以也就程序编写以及参数的整定来做一个小的总结。

    平衡车是一个闭环控制系统,要保持直立静止需要两级PID,直立环PD调节器依据IMU(惯性测量单元我使用的是MPU6050)的数据来控制小车的运动状态,速度环PI调节器依据编码器的数据来调节车轮的转速以及运动状态,使俩轮趋向静止的状态哦。若要控制方向还需要一个转向环,这个以后再做介绍。

    对于平衡车来说, 直立环是最为重要的,而PID的调节也是一级一级的来调节,所以我们从直立PD环开始调节。

    直立PD环代码如下

/**************************************************************************
函数功能:直立PD控制
入口参数:角度、角速度
返回  值:直立控制PWM
**************************************************************************/
int balance(float Angle,float Gyro)
{  
   float Bias,kp=410,kd=1.4;
	 int balance;
	 Bias=Angle-ZHONGZHI;       //===求出平衡的角度中值 和机械相关
	 balance=kp*Bias+Gyro*kd;   //===计算平衡控制的电机PWM  PD控制   kp是P系数 kd是D系数 
	 return balance;
}

    该函数入口参数为角度以及加速度,机械中值为小车不上电平衡时的角度,在调节直立环时,先将速度环的参数都置零使直立环单独工作,参数整定要做的俩件事是判断参数极性和判断参数的大小,首先我们判断Kp、Kd的极性,当倾角增大时PWM占空比应增大,所以显然它们都应该为正值,然后我们先确定Kp再确定Kd,Kp我们逐渐增大直至小车有明显低频震荡,注意,Kp的值越大,系统的反应越快,但是平衡曲线的震荡就较大,我们需要引入Kd参数来减缓震荡,定住Kd后从零逐渐增大Kd,直至小车对对角度变化十分敏感,且几乎没有震荡时,这时PD调节器的参数整定就完成了。

    我们将整定后的PD调节器的参数乘0.6得到最终的PD调节器参数,接下来我们就继续调节速度PI调节器。

    速度PI环代码如下

/**************************************************************************
函数功能:速度PI控制 修改前进后退速度,请修Target_Velocity,比如,改成60就比较慢了
入口参数:左轮编码器、右轮编码器
返回  值:速度控制PWM
**************************************************************************/
int velocity(int encoder_left,int encoder_right)
{  
    static float Velocity,Encoder_Least,Encoder,Movement;
	  static float Encoder_Integral;
	  float kp=-100,ki=-0.5;
	  //=============速度PI控制器=======================//	
		Encoder_Least =(Encoder_Left+Encoder_Right)-0;                    //===获取最新速度偏差==测量速度(左右编码器之和)-目标速度(此处为零) 
		Encoder *= 0.8;		                                                //===一阶低通滤波器       
		Encoder += Encoder_Least*0.2;	                                    //===一阶低通滤波器    
		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;                          //===速度控制	
		return Velocity;
}

    调节要使俩编码器和的值趋向于零,首先确定Kp、Ki参数的极性,先将直立环参数都置为零,当俩参数都为正时(Kp=50,Ki=0.2),转动一个电机另一个电机会向反方向转动,这样的结果是不正确的,小车将无法静止,我们要让小车停下来,小车需要行驶更快的速度去追小车,小车运动的速度越快,追的速度也越快,这是正反馈的效果。我们将参数改为负数时(Kp=-50,Ki=-0.2),转动一个车轮,俩车轮都开始转动,速度逐渐达到最大值,这样的结果是正确的,是典型的正反馈效果。

      在平衡车中Ki参数的大小为Kp的1/200,所以我们只需整定Kp即可,加入PD调节器,一同调节,找到使小车状态最好的参数即可。

      以上就是平衡车直立及速度环参数整定的一些经验,平衡车是我接触的第一个使用PID调节的项目,感觉还是很有难度的,但是看着参数改变而带来的显著改进以及随着优化效果逐渐优化带来的喜悦也是令人振奋的,在电赛控制类中,PID是极其重要的部分,以后我也会做更多的项目来练习编写程序以及整定参数的能力。

你可能感兴趣的:(PID)