这种算法可以避免控制量长时间停留在饱和区。
仿真2设被控对象为
,采样周期1ms。
输入r(k)=30,
仿真方法:
仿真程序:
ex10.m。
M=1时采用抗积分饱和算法,M=2时采用普通PID算法。
%PIDControlerwithintergrationsturation
clearall;
closeall;
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;
rin=30;%StepSignal
%M=1抗积分饱和,M=2普通PID
disp('M=1--Usingintergrationsturation,M=2--Notusingiintergrationsturation')
M=input('whetherornotuseintegrationseparationmethod:
')
fork=1:
1:
800
time(k)=k*ts;
u(k)=kp*x
(1)+kd*x
(2)+ki*x(3);%PIDController
ifu(k)>=um
u(k)=um;
end
ifu(k)<=-um
u(k)=-um;
end
%Linearmodel
yout(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)=rin-yout(k);
ifM==1%Usingintergrationsturation
ifu(k)>=um
iferror(k)>0
alpha=0;
else
alpha=1;
end
elseifu(k)<=-um
iferror(k)>0
alpha=1;
else
alpha=0;
end
else
alpha=1;
end
elseifM==2%Notusingintergrationsturation
alpha=1;
end
%ReturnofPIDparameters
u_3=u_2;u_2=u_1;u_1=u(k);
y_3=y_2;y_2=y_1;y_1=yout(k);
error_1=error(k);
x
(1)=error(k);%计算比例项
x
(2)=(error(k)-error_1)/ts;%计算微分项
x(3)=x(3)+alpha*error(k)*ts;%计算积分项
xi(k)=x(3);
end
figure
(1);
subplot(311);
plot(time,rin,'b',time,yout,'r');
xlabel('time(s)');ylabel('Positiontracking');
subplot(312);
plot(time,u,'r');
xlabel('time(s)');ylabel('Controlleroutput');
subplot(313);
plot(time,xi,'r');
xlabel('time(s)');ylabel('Integration');
将仿真获得结果的截图附于如下空白处:
当M=1时采用抗积分饱和算法,如图1-5所示;当M=2时采用普通PID算法,如图1-6所示。
图1-5M=1时采用抗积分饱和算法
图1-6M=2时采用普通PID算法
仿真结果分析:
由图1-5,图1-6对比可得,加上抗积分饱和后超调量明显减小,而且系统能较快的达到稳定值,系统的稳定性和精确性得到改善。
3、不完全微分PID控制算法
在PID控制中,微分信号的引入可改善系统的动态特性,但也易引入高频干扰,在误差扰动突变时尤其显出微分项的不足。
若在控制算法中加入低通滤波器,则可使系统性能得到改善。
具体做法就是在PID算法中加入一个一阶惯性环节(低通滤波器)
Tf为滤波器系数。
可得此时的微分项输出为
,其中
,
,Ts为采样时间,TD为微分时间常数。
仿真3被控对象为时滞系统传递函数
,在对象的输出端加幅值为0.01的随机信号。
采样周期为20ms。
采用不完全微分算法,
。
所加的低通滤波器为
仿真方法:
仿真程序:
ex11.m。
M=1时采用不完全微分,M=2时采用普通PID算法
%PIDControlerwithPartialdifferential
clearall;
closeall;
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;%控制信号初值
ud_1=0;%uD(k-1)初值
y_1=0;y_2=0;y_3=0;%输出信号初值
error_1=0;
ei=0;
%M=1选择不完全微分,M=2选择普通PID
disp('M=1—UsingPartialdifferentialPID,M=2--UsingPIDControlerwithoutPartialdifferential')
M=input('whetherornotusePartialdifferentialPID:
')
fork=1:
1:
100
time(k)=k*ts;
rin(k)=1.0;
yout(k)=-den
(2)*y_1+num
(2)*u_5;%输出信号差分方程
D(k)=0.01*rands
(1);%干扰信号
yout(k)=yout(k)+D(k);%加入干扰后的输出信号
error(k)=rin(k)-yout(k);
ei=ei+error(k)*ts;%矩形面积求和计算的积分项输出
kp=0.30;
ki=0.0055;
TD=140;
kd=kp*TD/ts;
Tf=180;%Q的滤波器系数
Q=tf([1],[Tf,1]);%低通滤波器
ifM==1%M=1时用不完全微分
alfa=Tf/(ts+Tf);
ud(k)=kd*(1-alfa)*(error(k)-error_1)+alfa*ud_1;
u(k)=kp*error(k)+ud(k)+ki*ei;
ud_1=ud(k);
elseifM==2%M=2时用普通PID
u(k)=kp*error(k)+kd*(error(k)-error_1)+ki*ei;
end
%输出限幅
ifu(k)>=10
u(k)=10;
end
ifu(k)<=-10
u(k)=-10;
end
%更新采样值
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=yout(k);
error_1=error(k);
end
figure
(1);
plot(time,rin,'b',time,yout,'r');
xlabel('time(s)');ylabel('rin,yout');
figure
(2);
plot(time,u,'r');
xlabel('time(s)');ylabel('u');
figure(3);
plot(time,rin-yout,'r');
xlabel('time(s)');ylabel('error');
figure(4);
bode(Q,'r');
dcgain(Q);
将仿真获得结果的截图附于如下空白处:
当M=1时采用不完全微分法,如图1-7(a)(b)(c)(d)所示;当M=2时采用普通PID算法,如图1-8(a)(b)(c)(d)所示。
图1-7(a)M=1时采用不完全微分法
图1-8(a)M=2时采用普通PID算法
图1-7(b)M=1时采用不完全微分法
图1-8(b)M=2时采用普通PID算法
图1-7(c)M=1时采用不完全微分法
图1-8(c)M=2时采用普通PID算法
图1-7(d)M=1时采用不完全微分法
图1-8(d)M=2时采用普通PID算法
仿真结果分析:
由上图两两对比可得,采用不完全微分法能够抑制高频干扰,数字控制器输出的微分作用能在各个采样周期按照误差变化的趋势均匀地输出,有效地改善了系统法性能,提高了系统的控制精度。
4、微分前行PID控制算法
微分线性的PID控制结构如图3-2所示,其特点是只对输出量y(k)进行微分,而对给定值r(k)不进行微分。
这样,在改变给定值时,输出不会改变,而被控量的变化通常是比较缓和的,它适用于给定值r(k)频繁升降的场合,可以避免给定值升降时引起的系统振荡,从而改善系统的动态特性。
图3-2微分先行PID控制结构图
令微分部分的传递函数为
,式中
相当于低通滤波器。
则有
由差分得:
整理得微分部分的输出:
其中
比例积分部分的传递函数为:
,其中TI为积分时间常数。
离散控制算式为
。
仿真4设被控对象为一个延迟对象
,采样周期为20s。
输入信号为带有高频干扰的方波信号:
。
普通PID控制中
。
微分先行PID中
=0.5。
仿真方法:
仿真程序:
ex12.m。
M=1时使用微分先行PID算法,M=2使用普通PID算法
%PIDControlerwithdifferentialinadvance
clearall;
closeall;
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;
ud_1=0;
y_1=0;y_2=0;y_3=0;
error_1=0;error_2=0;
ei=0;
%M=1使用微分先行PID,M=2使用普通PID
disp('M=1¡ªUsingPIDControlerwithdifferentialinadvance,M=2--UsingcommonPIDControler')
M=input('whetherornotusePIDControlerwithdifferentialinadvance:
');
fork=1:
1:
400
time(k)=k*ts;
%Linearmodel
yout(k)=-den
(2)*y_1+num
(2)*u_5;
kp=0.36;kd=14;ki=0.0021;
rin(k)=1.0*sign(sin(0.00025*2*pi*k*ts));
rin(k)=rin(k)+0.05*sin(0.03*pi*k*ts);
error(k)=rin(k)-yout(k);
ei=ei+error(k)*ts;
gama=0.50;
Td=kd/kp;
c1=gama*Td/(gama*Td+ts);
c2=(Td+ts)/(gama*Td+ts);
c3=Td/(gama*Td+ts);
ifM==1%PIDControlwithdifferentialinadvance
ud(k)=c1*ud_1+c2*yout(k)-c3*y_1;
u(k)=kp*error(k)+ud(k)+ki*ei;
elseifM==2%SimplePIDControl
u(k)=kp*error(k)+kd*(error(k)-error_1)/ts+ki*ei;
end
ifu(k)>=110
u(k)=110;
end
ifu(k)<=-110
u(k)=-110;
end
%Updateparameters
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=yout(k);
error_2=error_1;
error_1=error(k);
end
figure
(1);
plot(time,rin,'r',time,yout,'b');
xlabel('time(s)');ylabel('rin,yout');
figure
(2);
plot(time,u,'r');
xlabel('time(s)');ylabel('u');
将仿真获得结果的截图附于如下空白处:
当M=1时使用普通PID算法,如图1-9所示;当M=1时使用微分先行PID算法,如图1-10所示。
当M=2时使用普通PID算法,如图1-11所示;当M=2时使用微分先行PID算法,如图1-12所示。
图1-9M=1时使用普通PID算法
图1-10M=1时使用微分先行PID算法
图1-11M=2时使用普通PID算法
图1-12M=2时使用微分先行PID算法
仿真结果分析:
通过比较微分先行与普通PID算法的输出可发现,当输入r(t)具有高频干扰信号时,采用微分先行PID算法,只对输出进行微分,可以避免给定值频繁升降引起的振荡,从而改善系统动态特性。
5、带死区的PID控制算法
某些系统为了避免控制作用过于频繁,消除由于频繁动作所引起的振荡,可采用带死区的PID控制算法,控制算法为:
,式中e(k)为位置跟踪偏差,B为可调的死区参数,具体可根据实际控制对象由试验确定。
若B太小,会使控制动作过于频繁,达不到稳定被控对象的目的;若B太大,则系统将产生较大的滞后。
仿真5设被控对象为
,采样周期为1ms,对象输出上有一个幅值为0.5的正态分布的随机干扰信号。
采用积分分离式PID控制算法进行阶跃响应,取
=0.2,死区参数B=0.1,采用低通滤波器对对象输出信号进行滤波,滤波器为
,设计代码对控制系统进行仿真。
仿真代码:
%PIDControlerwithdeadzone
clearall;
closeall;
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;u_2=0;u_3=0;u_4=0;u_5=0;
y_1=0;y_2=0;y_3=0;
yy_1=0;
error_1=0;error_2=0;ei=0;
sys1=tf([1],[0.04,1]);%LowFreqSignalFilter
dsys1=c2d(sys1,ts,'tucsin');
[num1,den1]=tfdata(dsys1,'v');
f_1=0;
%M=1选择普通积分分离式PID,M=2选择带死区的积分分离式PID算法
disp('M=1--UsingcommonintegrationseperationPIDControler,M=2--UsingintegrationseperationPIDControlerwithdeadzone')
M=input('whetherornotuseintegrationseperationPIDControlerwithdeadzone:
');
fork=1:
1:
2000
time(k)=k*ts;
rin(k)=1;%StepSignal
%Linearmodel
yout(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;
D(k)=0.50*rands
(1);%Disturbancesignal
yyout(k)=yout(k)+D(k);
%Lowfrequencyfilter
filty(k)=-den1
(2)*f_1+num1
(1)*(yyout(k)+yy_1);
error(k