0 前言

前几章介绍了PID常规的方法,主要是比例、积分和微分,本节主要涉及在实际工程中积分项的处理,也即是消除由于积分的引入而造成的影响。在实际应用中对于积分总是又爱又恨,爱的是它可以提高系统的控制精度,恨的是总是会引入这样和那样的问题,让人头疼不已。

1.积分的作用

在传统的PID控制中,引入积分项的目的主要是消除静差,提高控制精度

2. 积分的影响

1.以电机为例,在电机的启停或设定值大幅变化时,系统在较短时间内产生了很大的偏差。此时积分迅速积累,就会造成控制量输出远远大于电机的极限输入控制量,从而会引起很大的超调,甚至会产生震荡,在电机控制中这些坏的影响是不能容忍的。

2.积分饱和:当系统一直存在一个方向的偏差时,积分会不断增大,会造成控制量进入饱和区,一旦出现反向的偏差时,需要很长时间才能推出饱和区,而去响应反向偏差。也以电机为例,电机在积分饱和时,电机响应延时较大,会出现电机超出目标位置,需来回调整数次才能稳定。

3. 解决方案

3.1 积分分离

针对问题一,为了克服引入积分带来的系统超调和震荡的影响,引入积分分离的思想,其思想的实质是:当被控量与设定值偏差较大时,取消积分项;当被控量接近设定值时,引入积分项。

代码实现如下:

if(abs(pid.err)>Integraldead_zone) 
{ 
  index=0; 
}
else
{ index=1; 
  pid.integral+=pid.err; 
} 
pid.voltage=pid.Kp*pid.err+index*pid.Ki*pid.integral+pid.Kd*(pid. err-pid.err_last);  

注:其中值得注意的是在实际工程中,如何对积分死区(Integraldead_zone)进行取值。

本人则以电机稳定运行后,此时输入的误差大小作为积分死区,当然这是不严谨的,应该通过实际工程中可容忍的最大误差来计算出。

3.2 抗积分饱和

针对问题二,引入了抗积分饱和的方法,其基本思想是:判断上一时刻的输出量是否超出了极限范围[umax,umin],大于umax时,只增加负偏差;小于umin时,只增加正偏差

代码实现如下所示:

if(pid.Speed>pid.umax) //抗积分饱和的实现:只累加负偏差
{
   if(abs(pid.err)>200) //积分分离过程
   { 
      index=0;
    }
   else{ 
      index=1; 
      if(pid.err<0) 
     { 
        pid.integral+=pid.err; 
      } 
   } 
}else if(pid.Speed<pid.umin){  //抗积分饱和的实现:只累加正偏差

       if(abs(pid.err)>200) //积分分离过程 
       { 
         index=0; 
       }
       else{ 
         index=1; 
         if(pid.err>0) 
          { 
            pid.integral+=pid.err; 
          } 
} 
}else{ //抗积分饱和的实现 
   
    if(abs(pid.err)>200) //积分分离过程 
     { 
       index=0; 
     }
    else{ 
       index=1; 
       pid.integral+=pid.err; 
     } 
}

3.3 进一步优化

针对积分分离中积分项过渡不平滑,容易造成系统控制量的突变,而产生震荡的问题。进而提出了变速积分的思想,用一个线性函数进行过渡,逐步放开积分项,具体原理和实现已在《PID控制学习笔记之二增量PID》中介绍。