基於狀態空間模型的PID控制器用M語言實現
前面講到如何將狀態空間量建模,現在用PID控制方法並通過m語言來實現:
搞清楚這兩個問題,加深對PID控制器的理解:
u = Kp * (x_last - x(i)) +
Ki * (x_last - 2 * x(i - 1) + x(i - 2)) +
Kd * x_last
u為控制量,x_last為目標值。x(i)為當前值(公式具體怎麽寫忘記了,但形式應該是對的)
1 比例調節無法令實際值調整到目標值!
原因:我們只看比例部分,u = Kp * (x_last - x(i)),當實際值趨近於目標值,等號右邊趨近0,u也就趨近於0,如果再考慮實際系統中的摩擦,空氣阻力等,這類現象就更加明顯;
2 為什麽積分環節可以控制實際值到目標值!
原因:Ki * (x_last - 2 * x(i - 1) + x(i - 2)),當實際值趨近目標值時,積分內容趨近於0,而一個常數的導數為0,因此積分部分最後算出來就是一個定值,恰好彌補了比例調節的不足;
3 系統可能由於受到物理極限的限制而無法達到想要的目標值,如令汽車速度穩定在500m/s,實際生活中目前是的汽車是不可能達到;
舉個例子討論階數的問題:
已知:A= [-2 -1;1 0] , B = [1 ; 0],現用P控制器來控制這個系統(搞清楚P控制,積分微分內容也是如法炮制)
matlab腳本如下:
A = [-2 -1;1 0];
B = [1;0];
C = [0 0];%C的值應該是與AB的階數有關
D = 0;
sys = ss(A,B,C,D);%組成空間量
sys1 = c2d(sys,0.1);%轉為離散,采樣時間0.1s
x = [1;0];%系統初始狀態
x_last = [0;0];%我們期望的最終目標
Kp = [0.001 0.001];%系數不能太大,下面會說明為什麽是2*1的
%Ki
%Kd
%下面開始進行P調節
for i = 1:100
u = Kp * (x_last - x(:,i));%u控制器算出的控制量
x(:,i+1) = sys1(1,1).A * x(:,i) + sys1(1,1).B * u;%為了保證矩陣維度一致,u必須是1*1的,所以Kp需要是1*2的
end
到此程序結束,在這要註意幾點:
1 一定要註意矩陣維度問題,維度很容易出錯;
2 循環時要保證每個狀態都能被循環到;
基於狀態空間模型的PID控制器用M語言實現