MATLAB-離散系統的數字PID控制仿真


%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)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM