智能车制作——速度环PID

  做了智能车写这个做个记录,各位大佬勿喷。

PID控制器

  PID 控制器(比例-积分-微分控制器)是一种通过控制系统的偏差来调整输入信号的线性反馈控制算法。通俗的说,它可以给出使执行器(电机)快速准确到达目标的“指导方案”。

反馈

  反馈是指将系统输出量通过恰当的检测装置,返回到输入端,与输入量进行比较,并以某种方式改变输入,进而影响系统功能的过程。

开环与闭环

  在智能车控制中开环意味着电机的PWM是我们自己随便给的一个固定值:而闭环系统的电机PWM是PID控制器的输出。

PID组成

  PID 实际上是一个作用于闭环系统的控制算法,由三个部分组成,分别是 P 比例环节,I 积分环节,D 微分环节。

比例环节

  PID 比例控制器实际上就是个放大倍数可调的放大器,即△P=Kp×e,式中Kp为比例增益,即Kp可大于1,也可小于1;e为控制器的输入,也就是测量值与给定值之差,又称为偏差。   PID 比例控制有个缺点,就是会产生余差,要克服余差就必须引入积分作用。

积分环节

  控制器的积分作用就是为了消除自控系统的余差而设置的。所谓积分,就是随时间进行累积的意思,即当有偏差输入e存在时,积分控制器就要将偏差随时间不断累积起来,也就是积分累积的快慢与偏差e的大小和积分速度成正比。只要有偏差e存在,积分控制器的输出就要改变,也就是说积分总是起作用的,只有偏差不存在时,积分才会停止。

微分环节

  微分项主要是用来加快系统反应的,但如果微分作用过强,则可能由于变化太快二引起自身震荡。

PID代码理解

{ 本次误差 = 目标值-实际值 P输出 =Kp 本次误差 I输出 += Ki本次误差 D输出 =Kd *(本次误差-上次误差) ID输出 = P输出+I输出+D输出 上次误差 = 本次误差 }   注意要进行 积分限幅,即将积分项做一个最大最小限制

位置式与增量式

  上面的PID理解也就是位置式PID,下面是增量式PID的理解 { 本次误差 = 目标值-实际值 P输出 =Kp (本次误差-上次误差) I输出 = Ki本次误差 D输出 =Kd (本次误差-2上次误差+上上次误差) ID输出 += P输出+I输出+D输出 上上次误差=上次误差 上次误差 = 本次误差 } 即:

void Left_Speed_Control()
{
          
   
  float Left_Speed_Erro = 0.0 ;       //左电机误差
  Left_Speed_Erro     = Speed_Goal - Left_Encoder ;   //Left_Encoder :编码器反馈值
  Left_Speed_PID.OUT += (Left_Speed_PID.P * (Left_Speed_Erro - Left_Speed_Lasterro)  +
		  	  	  	  	 Left_Speed_PID.I * Left_Speed_Erro +
						 Left_Speed_PID.D * (Left_Speed_Erro - 2 * Left_Speed_Lasterro + Left_Speed_Preverro));
  Left_Speed_OUT      =  Range_protect((int)Left_Speed_PID.OUT,-9000,9000);   //输出限幅
  Left_Speed_Preverro = Left_Speed_Lasterro ;
  Left_Speed_Lasterro = Left_Speed_Erro ;
}

  增量式与位置式主要区别:     1、位置式PID的积分项是以前所有的误差和,容易产生大的累积误差,而增量式仅与最近几次有关,影响小     2、位置式PID需要进行积分限幅和输出限幅,而增量式PID只需要输出限幅。

速度环位置式与增量式调参

  在调位置式速度环时我们先加大Kp值,同时令Ki、Kd为0,查看编码器值和目标值的差值,当反馈回来的编码器值在目标值上下震荡时加入Ki值即可。   通过上面的代码理解我们可以知道增量式的I就是位置式的P,因此对于增量式我们先加I,再加P,实际现象中当我们的i给很小时电机都能达到目标值。

  我们通过调参要达到的效果是:可以明显看到波形趋于平滑且编码器上下震荡范围小,当我们突然改变目标速度时,编码器值能很快且平滑到达改变后的目标值。

经验分享 程序员 微信小程序 职场和发展