PID控制原理和算法
闭环控制是根据控制对象输出反馈来进行校正的控制方式,它是在测量出实际与计划发生偏差时,按定额或标准来进行纠正的。比如控制一个电机的转速,就得有一个测量转速的传感器,并将结果反馈到控制路线上。提到闭环控制算法,不得不提PID,它是闭环控制算法中最简单的一种。PID是比例 (Proportion) 积分 ,(Integral) 微分 ,(Differential coefficient) 的缩写,分别代表了三种控制算法。通过这三个算法的组合可有效地纠正被控制对象的偏差,从而使其达到一个稳定的状态。如下图所示为PID的流程。
其中r(t)表示给定输入值,c(t)表示实际输出值,e(t)表示信号偏差量,u(t)表示修正量。
1、比例(P)、积分(I)、微分(D)控制算法各有作用
1)、比例,反应系统的基本(当前)偏差e(t),系数大,可以加快调节,减小误差,但过大的比例使系统稳定性下降,甚至造成系统不稳定;比例控制的比例系数如果太小,即调节后的电位器转角与位置L的差值太小,调节的力度不够,使系统输出量变化缓慢,调节所需的总时间过长。比例系数如果过大,即调节后电位器转角与位置L的差值过大,调节力度太强,将造成调节过头,甚至使温度忽高忽低,来回震荡。增大比例系数使系统反应灵敏,调节速度加快,并且可以减小稳态误差。但是比例系数过大会使超调量增大,振荡次数增加,调节时间加长,动态性能变坏,比例系数太大甚至会使闭环系统不稳定。 单纯的比例控制很难保证调节得恰到好处,完全消除误差。如下图所示:
2)、积分,反应系统的累计偏差,使系统消除稳态误差,提高无差度,因为有误差,积分调节就进行,直至无误差;积分调节的“大方向”是正确的,积分项有减小误差的作用。一直要到系统处于稳定状态,这时误差恒为零,比例部分和微分部分均为零,积分部分才不再变化,并且刚好等于稳态时需要的控制器的输出值,对应于上述温度控制系统中电位器转角的位置L。因此积分部分的作用是消除稳态误差,提高控制精度,积分作用一般是必须的。 如下图所示:
3)、微分,反映系统偏差信号的变化率e(t)-e(t-1),具有预见性,能预见偏差变化的趋势,产生超前的控制作用,在偏差还没有形成之前,已被微分调节作用消除,因此可以改善系统的动态性能。但是分对噪声干扰有放大作用,加强微分对系统抗干扰不利。误差的微分就是误差的变化速率,误差变化越快,其微分绝对值越大。误差增大时,其微分为正;误差减小时,其微分为负。控制器输出量的微分部分与误差的微分成正比,反映了被控量变化的趋势。如下图所示:
闭环控制系统的振荡甚至不稳定的根本原因在于有较大的滞后因素。因为微分项能预测误差变化的趋势,这种“超前”的作用可以抵消滞后因素的影响。适当的微分控制作用可以使超调量减小,增加系统的稳定性。
对于有较大的滞后特性的被控对象,如果PI控制的效果不理想,可以考虑增加微分控制,以改善系统在调节过程中的动态特性。如果将微分时间设置为0,微分部分将不起作用。
微分时间与微分作用的强弱成正比,微分时间越大,微分作用越强。如果微分时间太大,在误差快速变化时,响应曲线上可能会出现“毛刺”。
微分控制的缺点是对干扰噪声敏感,使系统抑制干扰的能力降低。为此可在微分部分增加惯性滤波环节。
一种PID控制算法的流程图,如下所示:
2、PID参数调节
在整定PID控制器参数时,可以根据控制器的参数与系统动态性能和稳态性能之间的定性关系,用实验的方法来调节控制器的参数。有经验的调试人员一般可以较快地得到较为满意的调试结果。在调试中最重要的问题是在系统性能不能令人满意时,知道应该调节哪一个参数,该参数应该增大还是减小。
为了减少需要整定的参数,首先可以采用PI控制器。为了保证系统的安全,在调试开始时应设置比较保守的参数,例如比例系数不要太大,积分时间不要太小,以避免出现系统不稳定或超调量过大的异常情况。给出一个阶跃给定信号,根据被控量的输出波形可以获得系统性能的信息,例如超调量和调节时间。应根据PID参数与系统性能的关系,反复调节PID的参数。
如果阶跃响应的超调量太大,经过多次振荡才能稳定或者根本不稳定,应减小比例系数、增大积分时间。如果阶跃响应没有超调量,但是被控量上升过于缓慢,过渡过程时间太长,应按相反的方向调整参数。
如果消除误差的速度较慢,可以适当减小积分时间,增强积分作用。
反复调节比例系数和积分时间,如果超调量仍然较大,可以加入微分控制,微分时间从0逐渐增大,反复调节控制器的比例、积分和微分部分的参数。
总之,PID参数的调试是一个综合的、各参数互相影响的过程,实际调试过程中的多次尝试是非常重要的,也是必须的。
常用的控制方式:P,PI,PD,PID控制算法
注:以上原理部分内容参考自以下资料:
[2]. PID控制算法
3、代码实现
以对常数和函数控制为例,Maltab实现演示,代码如下:
1 clear all; 2 close all; 3 ts=0.001; 4 sys=tf(50,[0.125,7, 0]); 5 dsys=c2d(sys,ts,\'z\'); 6 [num,den]=tfdata(dsys,\'v\'); 7 u_1=0.0;u_2=0.0; 8 y_1=0.0;y_2=0.0; 9 x=[0,0,0]\'; 10 error_1=0; 11 error_2=0; 12 for k=1:1:2000 13 time(k)=k*ts; 14 S=2; 15 if S==1 16 kp=10;ki=0.1;kd=15; 17 rin(k)=5; %Step Signal 18 elseif S==2 19 %kp=20;ki=0.0;kd=0; %Sine Signal 20 kp=10;ki=0.1;kd=15; %Sine Signal 21 rin(k)=0.5*cos(2*pi*k*ts); 22 end 23 du(k)=kp*x(1)+kd*x(2)+ki*x(3); %PID Controller 24 u(k)=u_1+du(k); 25 %Restricting the output of controller 26 if u(k)>=5 27 u(k)=5; 28 end 29 if u(k)<=-5 30 u(k)=-5; 31 end 32 %Linear model 33 yout(k)=-den(2)*y_1-den(3)*y_2+num(2)*u_1+num(3)*u_2; 34 error(k)=rin(k)-yout(k); 35 %Return of parameters 36 u_2=u_1;u_1=u(k); 37 y_2=y_1;y_1=yout(k); 38 x(1)=error(k)-error_1; %Calculating P 39 x(2)=error(k)-2*error_1+error_2; %Calculating D 40 x(3)=error(k); %Calculating I 41 error_2=error_1; 42 error_1=error(k); 43 end 44 figure(1); 45 plot(time,rin,\'b\',time,yout,\'r\'); 46 xlabel(\'time(s)\'),ylabel(\'rin,yout\'); 47 title([\'kp=10,ki=0.1,kd=15\'],\'FontSize\',14,\'Color\',\'k\'); 48 saveas(1,\'pid\',\'png\'); 49 figure(2); 50 plot(time,error,\'r\') 51 title([\'误差变化\'],\'FontSize\',14,\'Color\',\'k\'); 52 xlabel(\'time(s)\');ylabel(\'error\'); 53 saveas(2,\'pid_err\',\'png\');
效果图
1)、常数y = 5纠正:
2)、曲线y = 0.5*cos(t)纠正:
代码工程下载:PID算法实现