1. 程式人生 > >基於狀態空間模型的PID控制器用M語言實現

基於狀態空間模型的PID控制器用M語言實現

公式 可能 不足 什麽是 摩擦 生活 pid bsp 時間

前面講到如何將狀態空間量建模,現在用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語言實現