閉環控制是根據控制對象輸出反饋來進行校正的控制方式,它是在測量出實際與計划發生偏差時,按定額或標准來進行糾正的。比如控制一個電機的轉速,就得有一個測量轉速的傳感器,並將結果反饋到控制路線上。提到閉環控制算法,不得不提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算法實現