首先,增量式PID的實現公式:
式中 Δe(k)=e(k)-e(k-1)
進一步可以改寫成
式中 、
、
為了便於理解,也可寫成:
式中e(k)為第k次采樣時的設定值與實際值的差,e(k-1)為上一次采樣時的設定值與實際值的差值,e(k-2)一樣類推。
所以增量式PID 輸出的是控制量的增量,無積分作用,因此該方法適用於執行機構帶積分部件的對象,如步進電機等,而位置式PID適用於執行機構不帶積分部件的對象,如電液伺服閥。
而且,由於增量式PID輸出的是控制量增量,如果計算機出現故障,誤動作影響較小,而執行機構本身有記憶功能,可仍保持原位,不會嚴重影響系統的工作,而位置式的輸出直接對應對象的輸出,
因此對系統影響較大。
下面是用Matlab 對增量式PID的仿真。
1 %執行機構需要的是控制量的增量,例如驅動不僅電機的時候,采用增量式PID控制, 2 %增量式PID控制算法中不需要累加,控制增量u(k)僅與最近k次的采樣有關,所以誤動作影響小。 3 %設一被控對象G(s)=50/(0.125s^2+7s), 4 %用增量式PID控制算法編寫仿真程序 5 %(輸入分別為單位階躍、正弦信號,采樣時間為1ms,控制器輸出限幅:[-5,5], 6 % 仿真曲線包括系統輸出及誤差曲線,並加上注釋、圖例)。 7 8 clc; 9 clear ; 10 ts=0.001; %采樣時間 11 %sys=tf(50,[0.125,7, 0]); %tf是傳遞函數,用來實現G(s); 在自動控制領域經常用到, 12 sys=tf(400,[1,50,0]); 13 dsys=c2d(sys,ts,'z'); %把控制函數離散化,轉化為拆分方程 14 [num,den]=tfdata(dsys,'v'); % 離散化后提取分子、分母 ,提取拆分方程系數 15 u_1=0.0; 16 u_2=0.0; 17 y_1=0.0; 18 y_2=0.0; 19 x=[0,0,0]'; 20 error_1=0; 21 error_2=0; 22 for k=1:1:3000 23 time(k)=k*ts; %采樣次數 24 25 S=4; %選擇需要跟蹤的函數 26 if S==1 27 % kp=10;ki=0.1;kd=15; %初始化PID 28 kp=8;ki=0.1;kd=10; 29 rin(k)=1; %Step Signal ,階躍信號 30 end 31 if S==2 32 kp=10;ki=0.1;kd=15; 33 rin(k)=0.5*sin(2*pi*k*ts); %Sine Signal 正弦信號 34 end 35 if S==3 %三角波信號 36 kp=10;ki=0.1;kd=15; 37 if mod(time(k),2)<1 38 rin(k)=mod(time(k),1); 39 else 40 rin(k)=1-mod(time(k),1); 41 end 42 rin(k)=rin(k)-0.5; 43 end 44 if S==4 %鋸齒波信號 45 kp=8;ki=0.05;kd=4; %測試得合適參數,如果輸出過沖,可將kd調小。 46 rin(k)=mod(time(k),1); 47 end 48 49 du(k)=kp*x(1)+kd*x(2)+ki*x(3); %PID Controller 控制系數 50 u(k)=u_1+du(k); 51 52 if u(k)>=10 %Restricting the output of controller,輸出限幅 53 u(k)=10; 54 end 55 if u(k)<=-10 56 u(k)=-10; 57 end 58 59 %Linear model 60 yout(k)=-den(2)*y_1-den(3)*y_2+num(2)*u_1+num(3)*u_2; %實際輸出 61 error(k)=rin(k)-yout(k); %Return of parameters 誤差 62 u_2=u_1; %保存上上次輸入 為下次計算 63 u_1=u(k); %保存上一次控制系數 為下次計算 64 y_2=y_1; %保存上上次次輸出 為下次計算 65 y_1=yout(k); %保存上一次輸出 為下次計算 66 67 x(1)=error(k)-error_1; %Calculating P 68 x(2)=error(k)-2*error_1+error_2; %Calculating D 69 x(3)=error(k); %Calculating I 70 71 error_2=error_1; 72 error_1=error(k); 73 end 74 75 figure(1); 76 plot(time,rin,'b',time,yout,'r'); %輸入 和實際控制輸出 77 xlabel('time(s)'),ylabel('rin,yout'); 78 % figure(2); 79 % plot(time,error,'r') %輸入與輸出誤差輸出曲線 80 % xlabel('time(s)');ylabel('error');
對鋸齒信號的追蹤圖形: