PID控制知识
学长给的资料,不知是不是转载,原作者看到后麻烦联系我改成转载。
首先引用一个例子来说明PID控制中的比例、积分、微分的作用。
1、比例控制:有经验的操作人员手动控制电加热炉的炉温,可以获得非常好的控制品质,PID控制与人工控制的控制策略有很多相似的地方。
下面介绍操作人员怎样用比例控制的思想来手动控制电加热炉的炉温。假设用热电偶检测炉温,用数字仪表显示温度值。在控制过程中,操作人员用眼睛读取炉温,并与炉温给定值比较,得到温度的误差值。然后用手操作电位器,调节加热的电流,使炉温保持在给定值附近。操作人员知道炉温稳定在给定值时电位器的大致位置(我们将它称为位置L),并根据当时的温度误差值调整控制加热电流的电位器的转角。炉温小于给定值时,误差为正,在位置L的基础上顺时针增大电位器的转角,以增大加热的电流。炉温大于给定值时,误差为负,在位置L的基础上反时针减小电位器的转角,并令转角与位置L的差值与误差成正比。上述控制策略就是比例控制,即PID控制器输出中的比例部分与误差成正比。闭环中存在着各种各样的延迟作用。例如调节电位器转角后,到温度上升到新的转角对应的稳态值时有较大的时间延迟。由于延迟因素的存在,调节电位器转角后不能马上看到调节的效果,因此闭环控制系统调节困难的主要原因是系统中的延迟作用。比例控制的比例系数如果太小,即调节后的电位器转角与位置L的差值太小,调节的力度不够,使系统输出量变化缓慢,调节所需的总时间过长。比例系数如果过大,即调节后电位器转角与位置L的差值过大,调节力度太强,将造成调节过头,甚至使温度忽高忽低,来回震荡。增大比例系数使系统反应灵敏,调节速度加快,并且可以减小稳态误差。但是比例系数过大会使超调量增大,振荡次数增加,调节时间加长,动态性能变坏,比例系数太大甚至会使闭环系统不稳定。单纯的比例控制很难保证调节得恰到好处,完全消除误差。
2、积分控制:手动调节温度时,积分控制相当于根据当时的误差值,周期性地微调电位器的角度,每次调节的角度增量值与当时的误差值成正比。温度低于设定值时误差为正,积分项增大,使加热电流逐渐增大,反之积分项减小。因此只要误差不为零,控制器的输出就会因为积分作用而不断变化。积分调节的“大方向”是正确的,积分项有减小误差的作用。一直要到系统处于稳定状态,这时误差恒为零,比例部分和微分部分均为零,积分部分才不再变化,并且刚好等于稳态时需要的控制器的输出值,对应于上述温度控制系统中电位器转角的位置L。因此积分部分的作用是消除稳态误差,提高控制精度,积分作用一般是必须的。PID控制器输出中的积分部分与误差的积分成正比。因为积分时间TI在积分项的分母中,TI越小,积分项变化的速度越快,积分作用越强。
3、微分控制:有经验的操作人员在温度上升过快,但是尚未达到设定值时,根据温度变化的趋势,预感到温度将会超过设定值,出现超调。于是调节电位器的转角,提前减小加热的电流。这相当于士兵射击远方的移动目标时,考虑到子弹运动的时间,需要一定的提前量一样。闭环控制系统的振荡甚至不稳定的根本原因在于有较大的滞后因素。因为微分项能预测误差变化的趋势,这种“超前”的作用可以抵消滞后因素的影响。适当的微分控制作用可以使超调量减小,增加系统的稳定性。对于有较大的滞后特性的被控对象,如果PI控制的效果不理想,可以考虑增加微分控制,以改善系统在调节过程中的动态特性。如果将微分时间设置为0,微分部分将不起作用。微分时间与微分作用的强弱成正比,微分时间越大,微分作用越强。如果微分时间太大,在误差快速变化时,响应曲线上可能会出现“毛刺”。微分控制的缺点是对干扰噪声敏感,使系统抑制干扰的能力降低。为此可在微分部分增加惯性滤波环节。
针对PID,我们首先讲解位置式PID,位置式PID公式如下
u(t)=kp[e(t)+1/TI∫e(t)dt+TD*de(t)/dt]
在讲解这个公式之前,我们先了解一下闭环系统,从概念上来说,闭环控制系统是由信号正向通路和反馈通路构成闭合回路的自动控制系统,又称反馈控制系统。在一个闭环系统中,信号流向有正向,也就是从输入端到输出端,也有反馈,也就是从输出端引出回到输出端,并且与输入信号做差值(负反馈)或做和(正反馈)。根据信号的流向,大家可以对比如下的系统方框图(信控自动化专业的同学会在自动控制原理这门课学到)
大家可以看到,上面的大方框对应的是正向通路,下面的方框对应的是反馈回路。
下面说到PID公式中一个很重要的量e(t),也就是上图比较器那里的输入量与反馈回路做的差值。输入量也就是我们期望系统达到的一个目标值,反馈回路得到的是我们系统目前的实际值,通过比较器做一个差值,这个差值也就代表着系统距离我们的目标值还有多远。根据这个差值的多少,我们的PID控制算法开始起作用,要让系统实际值接近我们的目标值。具体起的作用请参照前文的例子。然后根据一个程序,大家去理解一下如何用c语言去实现PID控制中的pi控制算法。
float target; //目标量
float feedback; //反馈量
float Kp;//比例系数
float Ki;//积分系数
float Kd;//微分系数
float eSum;//积分处会用到,思考为什么这样做
float e0;//差值
float e_kp;//比例部分控制量
float e_ki;//积分部分控制量
float e_kd;//微分部分控制量
float out;//最后输出值
void pid_control()
{
//计算当前误差
e0 = target -feedback;
//误差比例控制
e_kp=e0*Kp;
//误差积分
eSum +=e0*Ki;
e_ki= eSum;
out =e_kp+e_ki;
}