%PID Controller clear all; close all; ts=0.001; %採樣時間=0.001s sys=tf(5.235e005,[1,87.35,1.047e004,0]); %創建被控對象傳遞函數 dsys=c2d(sys,ts,'z'); %把傳遞函數離散化 [num,den]=tfdata(dsys,'v'); % 離散化後提取分子、分母 u_1=0.0;u_2=0.0;u_3=0.0; %輸入向量 的初始狀態 y_1=0.0;y_2=0.0;y_3=0.0; %輸出的初始狀態 x=[0,0,0]'; %PID的3個參數Kp Ki Kd組成的數組 error_1=0; %初始偏差 for k=1:1:500 time(k)=k*ts; % 仿真時間500ms S=3; if S==1 kp=0.50;ki=0.001;kd=0.001; yd(k)=1; %Step Signal 指令爲階躍信號 elseif S==2 kp=0.50;ki=0.001;kd=0.001; yd(k)=sign(sin(2*2*pi*k*ts)); %Square Wave Signal 指令爲方波信號 elseif S==3 kp=1.5;ki=1.0;kd=0.01; %Sine Signal 指令爲正弦信號 yd(k)=0.5*sin(2*2*pi*k*ts); end u(k)=kp*x(1)+kd*x(2)+ki*x(3); %PID Controller %Restricting the output of controller %限制控制器的輸出 if u(k)>=10 u(k)=10; end if u(k)<=-10 u(k)=-10; end %Linear model y(k)=-den(2)*y_1-den(3)*y_2-den(4)*y_3+num(2)*u_1+num(3)*u_2+num(4)*u_3; error(k)=yd(k)-y(k); %Return of parameters %返回pid參數 u_3=u_2;u_2=u_1;u_1=u(k); y_3=y_2;y_2=y_1;y_1=y(k); x(1)=error(k); %Calculating P x(2)=(error(k)-error_1)/ts; %Calculating D x(3)=x(3)+error(k)*ts; %Calculating I error_1=error(k); end figure(1); plot(time,yd,'r',time,y,'k:','linewidth',2); xlabel('time(s)');ylabel('yd,y'); legend('Ideal position signal','Position tracking');
ts=0.001;採樣時間=0.001s
sys=tf(400,[1,50,0]);創建被控對象傳遞函數
dsys=c2d(sys,ts,'z');把傳遞函數離散化(問題1)
[num,den]=tfdata(dsys,'v');離散化後提取分子、分母 web
rin=1.0;輸入爲階躍信號
u_1=0.0; u_2=0.0; 什麼東西的初始狀態(問題2)
y_1=0.0; y_2=0.0; 是否是輸出的初始狀態
error_1=0;初始偏差
x=[0 0 0]';PID的3個參數Kp Ki Kd組成的數組
p=100;仿真時間100ms 數組
for k=1:1:p
r(k)=rin;
u(k)=kpidi(1)*x(1)+kpidi(2)*x(2)+kpidi(3)*x(3) 函數
if u(k)>=10
u(k)=10;
end spa
if u(k)<=-10
u(k)=-10;
end code
yout(k)=-den(2)*y_1-den(3)*y_2+num(2)*u_1+num(3)*u_2;(問題3)
error(k)=r(k)-yout(k); htm
%返回pid參數
u_2=u_1;u_1=u(k);
y_2=y_1;y_1=yout(k); 對象
x(1)=error(k);
x(2)=(error(k)-error_1)/ts;
x(3)=x(3)+error(k)*ts; blog
error_2=error_1;
error_1=error(k);
end
問題1:把傳遞函數離散化[SYSD,G]=C2D(SYSC,Ts,METHOD)這裏面的method有好多種,並且用的method不同得出的結果也不同,這些參數究竟有什麼區別?
問題2:這些是否是PID控制器輸出的初始狀態,「rin--①--PID控制器--②--被控對象--③---」是否是就是上面②的地方的信號值?
問題3(關鍵問題):這個式子是怎麼得出來的?從傳遞函數得出差分方程是個什麼步驟,要具體點的或者給本參考書。
又如:在《先進PID控制MATLAB仿真(第二版)》P146有 被控對象G(s)=133/(s^2+25s),採樣時間爲1ms,採用z變換進行離散化,通過z變換後的離散化對象爲yout(k)=-den(2)yout(k-1)—den(3)yout(k-2)十num(2)u(k-1)+num(3)u(k-2)(實在是搞不明白怎麼來的)
問題4:不是線性的對象可不能夠寫成差分方程的形式,好比G(s)=20e^(-0.02s)/(1.6s^2+4.4s+1)帶了個純延遲的該怎麼弄。或者換成個3階對象怎麼寫成差分方程
最佳答案
一、c2d:假設在輸入端有一個零階保持器,把連續時間的狀態空間模型轉到離散時間狀態空間模型。
[SYSD,G]=C2D(SYSC,Ts,METHOD)裏面的method包括:
zoh 零階保持, 假設控制輸入在採樣週期內爲常值,爲默認值。
foh 一階保持器,假設控制輸入在採樣週期內爲線性。 tustin 採用雙線性逼近。
matched 採用SISO系統的零極點匹配法
二、只有U_1是2處的初始狀態值,而U_2是用來傳遞U(k)的,因此U_2是U_1在下一個ts時間內的值
三、從差分方程獲取傳遞函數:
y(k)+a1y(k-1)+……+any(k-n)=b0x(k)+b1x(k-1)+……+bmx(k-m)在零初始條件下對,對方程兩邊進行Z變換,獲得該系統的脈衝傳遞函數G(Z)=Y(Z)/X(Z)=[b0z^m+b1z^(m-1)+……+bm]z^n/[z^n+a1z^(n-1)+……an]z^m 其中m《n
或等效形式G(Z)=Y(Z)/X(Z)=[b0+b1z^(-1)+……+bmz^(-m)]/[1+a1z^(-1)+……anz^(-n)] 其中m《n input
從脈衝傳遞函數到差分方程
G(Z)=Y(Z)/X(Z)=[b0+b1z^(-1)+……+bmz^(-m)]/[1+a1z^(-1)+……anz^(-n)] 其中m《n,交叉相乘得Y(Z)[1+a1z^(-1)+……anz^(-n)]=X(Z)[b0+b1z^(-1)+……+bmz^(-m)]對X(z)和Y(z)進行z逆變換獲得差分方程y(k)+a1y(k-1)+……+any(k-n)=b0x(k)+b1x(k-1)+……+bmx(k-m)
http://218.6.168.52/wlxt/ncourse/jsjkzjs/web/ppt/ch4.files/frame.htm
四、純延遲系統G(s)=20e^(-0.02s)/(1.6s^2+4.4s+1)
num=[20];
den=[1.6 4.4 1];
sys=tf(num,den,'inputdelay',0.02)it