%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');離散化后提取分子、分母
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
if u(k)<=-10
u(k)=-10;
end
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);
%返回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;
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階對象怎么寫成差分方程
最佳答案
1、c2d:假設在輸入端有一個零階保持器,把連續時間的狀態空間模型轉到離散時間狀態空間模型。
[SYSD,G]=C2D(SYSC,Ts,METHOD)里面的method包括:
zoh 零階保持, 假設控制輸入在采樣周期內為常值,為默認值。
foh 一階保持器,假設控制輸入在采樣周期內為線性。 tustin 采用雙線性逼近。
matched 采用SISO系統的零極點匹配法
2、只有U_1是2處的初始狀態值,而U_2是用來傳遞U(k)的,所以U_2是U_1在下一個ts時間內的值
3、從差分方程獲取傳遞函數:
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
從脈沖傳遞函數到差分方程
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
4、純延遲系統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)