一、位置式PID
按照模擬PID控制算法,以一系列採樣時刻點KT代替連續時間t,用矩形法數值積分代替積分,以一階向後差分代替微分。
1、一系列採樣時刻點KT代替連續時間t
2、用矩形法數值積分代替積分
3、以一階向後差分代替微分
最後可得離散化的PID表達式
式中T爲採樣時間(採樣週期)
%設一被控對象G(s)=523500/(s^3+87.35s^2+10470S)
%採樣時間爲1ms,採用z變換進行離散化
clc
clear
ts=0.001; %採樣時間
sys=tf(523500,[1 87.35 10470 0]); %tf是傳遞函數 即被控對象函數G();
dsys=c2d(sys,ts,'z'); %把控制函數離散化取Z變換n階定常離散系統差分方程
%在零初始條件下取Z變換:
%dsys即Y(z)/U(z)
[num,den]=tfdata(dsys,'v');% 離散化後提取分子、分母
u_1=0.0; u_2=0.0; u_3=0.0; %z變換之後的係數
y_1=0.0; y_2=0.0; y_3=0.0;
x=[0,0,0]'; %分別誤差e,誤差e的差分,誤差e的積分
error_1=0; %上一時刻誤差
time=zeros(1,1000); %預分配內存
yd=zeros(1,1000);
u=zeros(1,1000);
y=zeros(1,1000);
error=zeros(1,1000);
for k=1:1:1000
time(k)=k*ts;%離散化的時間代表連續時間
yd(k)=1.0;%目標量
kp=0.5;
ki=0.001;
kd=0.001;
u(k)=kp*x(1)+kd*x(2)+ki*x(3);%PID輸出
if u(k)>=10
u(k)=10;
end
if u(k)<=-10
u(k)=-10;
end
%Linear model 難點就是把傳遞函數轉化爲差分方程,以實現PID控制。
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;
%實際輸出 num爲dsys分子多項式係數,den爲dsys分母多項式係數,從n階定常離散系統差分方程變化來的。
error(k)=yd(k)-y(k); % 誤差=輸入-輸出
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); %KP的係數
x(2)=(error(k)-error_1)/ts; %KD的係數
x(3)=x(3)+error(k)*ts; %KI的係數
error_1=error(k);
end
figure(1);
plot(time,yd,'b',time,y,'r'); %輸入和實際控制輸出
xlabel('time(s)'),ylabel('y,yd');
title('輸入/輸出圖像對比')
figure(2);
plot(time,error,'r') %時間誤差輸出曲線
xlabel('time(s)');ylabel('error');
title('誤差變化')
二、增量式P
u(k+1)=u(k)+🔺u(k)
%設一被控對象G(s)=400/(s^2+50s)
%採樣時間爲1ms,採用z變換進行離散化
clc
clear
ts=0.001;%採樣時間
sys=tf(400,[1 50 0]);
dsys=c2d(sys,ts,'z');%採用z變換進行離散化
%把控制函數離散化取Z變換n階定常離散系統差分方程
%在零初始條件下取Z變換:
%dsys即Y(z)/U(z)
[num,den]=tfdata(dsys,'v');%強制tfdata直接將分子和分母作爲行向量而不是單元格數組返回
u1=0;u2=0;u3=0;%z變換之後的係數
y1=0;y2=0;y3=0;
x=[0 0 0]';%分別誤差e,誤差e的差分,誤差e的積分
error1=0;
error2=0;
time=zeros(3000,1);%與分配內存
yd=zeros(3000,1);
u=zeros(3000,1);
y=zeros(3000,1);
for k=1:1:3000
time(k)=k*ts;%離散化的時間代表連續時間
yd(k)=1.0;%目標量
kp=8;
ki=0.10;
kd=10;
u(k)=kp*x(1)+kd*x(2)+ki*x(3);%PID輸出
u(k)=u1+u(k);
if u(k)>=10
u(k)=10;
end
if u(k)<=-10
u(k)=-10;
end
%難點就是把傳遞函數轉化爲差分方程,以實現PID控制
y(k)=-den(2)*y1-den(3)*y2+num(2)*u1+num(3)*u2; %離散表達式輸出
%如果傳感器發生故障,u(k)發生大幅度變化,引起輸出的變化
error=yd(k)-y(k);%誤差=輸入-輸出
u1=u(k);u2=u1;u3=u2;
y1=y(k);y2=y1;y3=y2;
x(1)=error-error1;
x(2)=error-2*error1+error2;
x(3)=error;
error2=error1;
error1=error;
end
figure(1);
plot(time,yd,'r',time,y,'k','linewidth',2);
xlabel('time(s)');
ylabel('yd,y');
legend('Ideal Position value','tracking position value');