1. 積分分離
爲了解決在大誤差情況下積分器積累的大控制量影響系統超調的情況,可以只在誤差較小的時候開啓積分項,以消除靜差;在誤差大的情況下取消積分項。
我們設定一個閾值,在這個閾值的範圍內開啓積分項,在誤差大的時候使用PD控制;在誤差小的時候使用PID控制,提高精度。
對閾值的選擇在這裏比較重要,首先可以獲得無積分情況的穩態誤差,閾值需要包含誤差帶。如果不能包含誤差帶,也就是說一直無法開啓積分消除靜差,積分起不到作用了。
具體方法1:先進行無積分的階躍信號下的仿真,獲得穩態誤差。閾值β爲誤差乘以一個略大於一的係數
下面的就是按照這種思路進行的。(程序輸入階躍信號最後必須接近穩定,否則參數不可用)
(方法2:對線性系統,通過計算得到無積分情況下的穩態誤差。比如使用終值定理。)
不加入積分分離:
自動確定閾值的積分分離:
可見通過積分分離減少了超調,並且穩態精度也很好。
上面的積分分離相對而言是一種比較粗糙的做法,如果把積分的突然分離換成一種漸變,效果則要好一些。
2. 抗積分飽和
受到各種實際系統的約束,控制器的輸出值只能在一個安全的範圍,積分值超出線性區後保持不變,這種特性在積分值飽和後,退出飽和狀態的時間較長,系統的動態特性變差。
防止積分飽和的方法之一就是抗積分飽和法,該方法的思路是在計算u(k)時,首先判斷上一時刻的控制量u(k-1)是否已經超出了極限範圍:如果u(k-1)大於umax,則只累加負偏差;如果 u(k-1)小於umin,則只累加正偏差。從而避免控制量長時間停留在飽和區。
不加入抗積分飽和:
加入抗積分飽和:
控制器輸出值最大設定爲6,可見由積分器造成的超調被減弱了。
3. 梯形積分
運用梯形公式,使用兩次採樣值計算每步的累加值。
將原來的積分運算:
替換爲:
感覺在採樣足夠的情況下效果差異不明顯,在採樣比較稀疏的情況下控制效果有較大提升。
在採樣足夠大情況下:
採樣較少使用普通積分的輸出響應:
採樣較少使用梯形積分後:
4. 變速積分
將上面的積分分離算法進一步優化,使得在偏差較小時開啓較大的積分系數,在偏差較小時使用較小的積分系數,減少積分項對系統動態調節過程的影響,同時又保證了偏差較快收斂。
其中積分項爲:
可見積分分離算法是變速積分的一種特例,即
變速積分系數
原系統:
使用變速積分:
5. 不完全微分
微分項的計算對噪聲敏感,若系統存在噪聲,可加入低通濾波器衰減噪聲。
濾波器可以加在微分上,也可以加在整個PID調節器上。
系統響應
控制器輸出
加入濾波器
系統響應
控制器輸出
6. 微分先行
當給定信號突變時,系統容易發生震盪,爲了避免這種情況,可以對微分項進行改進。
原系統跟蹤方波信號:
採用微分先行結構:
7. 帶死區
經常會出現這種情況,受到傳感器、執行器精度的限制,在給定值附近系統會頻繁動作,比如電機的輕微抖動,爲了消除這種現象,可以人爲的加入一段不靈敏區域,在這段區域內不進行調節。
8. 帶前饋補償
如果知道控制對象較爲精確的模型,加入前饋環節可以使得前饋環節與被控對象傳遞函數之積爲1。系統性能可以大大提高
9. 帶Kerman濾波器
%% 自動確定分離閾值的帶積分分離的PID控制器
% 閾值確定的思路:獲得無積分情況的穩態誤差,閾值β包含誤差帶。
% 具體方法1:先進行無積分的階躍信號下的仿真,獲得穩態誤差。閾值β爲誤差乘以一個略大於一的係數
% (具體方法2:對線性系統,通過計算得到無積分情況下的穩態誤差。)
% 程序輸入階躍信號最後必須接近穩定,否則參數不可用
%參考先進pid一書
clear all;
close all;
ts=0.0001;
tim=3;
kp=0.5;ki=2;kd=0.01;
kbeta=1.2;
%輸入信號類型 -1方波 0階躍 1三角波 2鋸齒波 3隨機
S=-1;
% 模型
sys=tf(5.235e005,[1,87.35,1.047e004,10000]);
dsys=c2d(sys,ts,'z');
[num,den]=tfdata(dsys,'v');
u_1=0.0;u_2=0.0;u_3=0.0;
yd_1=rand;
y_1=0;y_2=0;y_3=0;
x=[0,0,0]';
error_1=0;
for k=1:1:tim/ts
time(k)=k*ts;
yd(k)=1;
u(k)=kp*x(1)+kd*x(2); %PD 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);
yd_1=yd(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); %Calculating P
x(2)=(error(k)-error_1)/ts; %Calculating D
x(3)=x(3)+error(k)*ts; %Calculating I
xi(k)=x(3);
error_1=error(k);
D=0;
if D==1 %Dynamic Simulation Display
plot(time,yd,'b',time,y,'r');
pause(0.00000000000000000);
end
end
% 閾值
beta=kbeta*abs(x(1))
u_1=0.0;u_2=0.0;u_3=0.0;
yd_1=rand;
y_1=0;y_2=0;y_3=0;
x=[0,0,0]';
error_1=0;
for k=1:1:tim/ts
time(k)=k*ts;
if S==-1 %square Signal
if k<=tim/ts/3
yd(k)=1;
end
if k>tim/ts/3 && k<=2*tim/ts/3
yd(k)=0;
end
if k>2*tim/ts/3 && k<=3*tim/ts/3
yd(k)=1;
end
% yd(k)=1;
end
if S==0 %step Signal
yd(k)=1;
end
if S==1 %Triangle Signal
if mod(time(k),2)<1
yd(k)=mod(time(k),1);
else
yd(k)=1-mod(time(k),1);
end
yd(k)=yd(k)-0.5;
end
if S==2 %Sawtooth Signal
yd(k)=mod(time(k),1.0);
end
if S==3 %Random Signal
yd(k)=rand;
dyd(k)=(yd(k)-yd_1)/ts; %Max speed is 5.0
while abs(dyd(k))>=5.0
yd(k)=rand;
dyd(k)=abs((yd(k)-yd_1)/ts);
end
end
%積分分離
if abs(x(1))>beta
x(3)=0;
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);
yd_1=yd(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); %Calculating P
x(2)=(error(k)-error_1)/ts; %Calculating D
x(3)=x(3)+error(k)*ts; %Calculating I
xi(k)=x(3);
error_1=error(k);
if D==1 %Dynamic Simulation Display
plot(time,yd,'b',time,y,'r');
pause(0.00000000000000000);
end
end
figure(1);
plot(time,yd,'r',time,y,'k:',time,yd+ones(size(time))*beta,time,yd-ones(size(time))*beta,'linewidth',2);
xlabel('time(s)');ylabel('yd,y');
legend('Ideal position signal','Position tracking');
figure(2);
plot(time,yd-y,'linewidth',2);
xlabel('time(s)');ylabel('yd-y');
legend('error');
%抗積分飽和
%PID Controler with intergration sturation
clear all;
close all;
ts=0.001;
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;y_2=0;y_3=0;
x=[0,0,0]';
error_1=0;
um=6;
kp=0.85;ki=9.0;kd=0.0;
for k=1:1:800
time(k)=k*ts;
yd(k)=30; %Step Signal
u(k)=kp*x(1)+kd*x(2)+ki*x(3); % PID Controller
if u(k)>=um
u(k)=um;
end
if u(k)<=-um
u(k)=-um;
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);
M=1;
if M==1 %Using intergration sturation
if u(k)>=um
if error(k)>0
alpha=0;
else
alpha=1;
end
elseif u(k)<=-um
if error(k)>0
alpha=1;
else
alpha=0;
end
else
alpha=1;
end
elseif M==2 %Not using intergration sturation
alpha=1;
end
%Return of PID parameters
u_3=u_2;u_2=u_1;u_1=u(k);
y_3=y_2;y_2=y_1;y_1=y(k);
error_1=error(k);
x(1)=error(k); % Calculating P
x(2)=(error(k)-error_1)/ts; % Calculating D
x(3)=x(3)+alpha*error(k)*ts; % Calculating I
xi(k)=x(3);
end
figure(1);
subplot(311);
plot(time,yd,'r',time,y,'k:','linewidth',2);
xlabel('time(s)');ylabel('yd,y');
legend('Ideal position signal','Position tracking');
subplot(312);
plot(time,u,'r','linewidth',2);
xlabel('time(s)');ylabel('Control input');
subplot(313);
plot(time,xi,'r','linewidth',2);
xlabel('time(s)');ylabel('Integration');
%PID Controller with changing integration rate
clear all;
close all;
%Big time delay Plant
ts=20;
sys=tf([1],[60,1],'inputdelay',80);
dsys=c2d(sys,ts,'zoh');
[num,den]=tfdata(dsys,'v');
u_1=0;u_2=0;u_3=0;u_4=0;u_5=0;
y_1=0;y_2=0;y_3=0;
error_1=0;error_2=0;
ei=0;
for k=1:1:200
time(k)=k*ts;
yd(k)=1.0; %Step Signal
%Linear model
y(k)=-den(2)*y_1+num(2)*u_5;
error(k)=yd(k)-y(k);
kp=0.45;kd=12;ki=0.0048;
A=0.4;B=0.6;
%T type integration
ei=ei+(error(k)+error_1)/2*ts;
M=1;
if M==1 %Changing integration rate
if abs(error(k))<=B
f(k)=1;
elseif abs(error(k))>B&abs(error(k))<=A+B
f(k)=(A-abs(error(k))+B)/A;
else
f(k)=0;
end
elseif M==2 %Not changing integration rate
f(k)=1;
end
u(k)=kp*error(k)+kd*(error(k)-error_1)/ts+ki*f(k)*ei;
if u(k)>=10
u(k)=10;
end
if u(k)<=-10
u(k)=-10;
end
%Return of PID parameters
u_5=u_4;u_4=u_3;u_3=u_2;u_2=u_1;u_1=u(k);
y_3=y_2;y_2=y_1;y_1=y(k);
error_2=error_1;
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');
figure(2);
plot(time,f,'r','linewidth',2);
xlabel('time(s)');ylabel('Integration rate f');