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》中介绍。
评论(0)
您还未登录,请登录后发表或查看评论