PID控制改进算法的MATLAB仿真Word下载.docx
《PID控制改进算法的MATLAB仿真Word下载.docx》由会员分享,可在线阅读,更多相关《PID控制改进算法的MATLAB仿真Word下载.docx(31页珍藏版)》请在冰豆网上搜索。
被控对象离散化为
仿真方法:
仿真程序:
ex9_1.m。
当M=1时采用分段积分分离法,M=2时采用普通PID控制。
%IntegrationSeparationPIDController
clearall;
closeall;
ts=20;
%Delayplant
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;
%M=1分段积分分离,M=2普通PID
disp('
M=1--Usingintegrationseparation,M=2--Notusingintegrationseparation'
)
M=input('
whetherornotuseintegrationseparationmethod:
'
fork=1:
1:
200
time(k)=k*ts;
%输出信号
yout(k)=-den
(2)*y_1+num
(2)*u_5;
rin(k)=40;
error(k)=rin(k)-yout(k);
ei=ei+error(k)*ts;
%积分项输出
ifM==1%使用分段积分分离
ifabs(error(k))>
=30&
abs(error(k))<
=40
beta=0.3;
elseifabs(error(k))>
=20&
=30
beta=0.6;
=10&
=20
beta=0.9;
else
beta=1.0;
end
elseifM==2
end
kp=0.80;
ki=0.005;
kd=3.0;
u(k)=kp*error(k)+kd*(error(k)-error_1)/ts+beta*ki*ei;
ifu(k)>
=110%控制信号限幅
u(k)=110;
ifu(k)<
=-110
u(k)=-110;
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);
figure
(1);
plot(time,rin,'
b'
time,yout,'
r'
xlabel('
time(s)'
ylabel('
rin,yout'
figure
(2);
plot(time,u,'
u'
将仿真获得结果的截图附于如下空白处:
当M=1时采用分段积分分离法,如图1-1所示;
当M=1时采用普通PID控制,如图1-2所示。
当M=2时采用分段积分分离法,如图1-3所示;
当M=2时采用普通PID控制,如图1-4所示。
图1-1M=1时采用分段积分分离法
图1-2M=1时采用普通PID控制
图1-3M=2时采用分段积分分离法
图1-4M=2时采用普通PID控制
仿真结果分析:
采用分段积分分离法的控制效果如图1-1,图1-3所示,分别与图1-2,图1-4对比可见采用分段积分分离法的控制系统的性能有了较大的改善。
因此,通过仿真可得出:
采用积分分离法,可以在系统误差较大时,取消积分作用,在误差减小到某一值之后,再接上积分作用,这样可以既减小超调量,改善系统动态特性,又保持了积分作用。
2、抗积分饱和PID控制算法
所谓积分饱和是指若系统存在一个方向的偏差,PID控制器的输出由于积分作用的不断累加而加大,从而导致执行机构达到极限位置Xmax,若控制器输出u(k)继续增大,阀门开度不可能在增大,此时就称计算机输出控制超出正常运行范围而进入了饱和区。
一旦系统出现反向偏差,u(k)逐渐从饱和区推出。
进入饱和区越深,则退出饱和区所需时间越长。
在这段时间内,执行机构仍停留在极限位置而不能随偏差反向立即作出相应的改变,这时系统就像失去控制一样,造成控制性能恶化。
这种现象称为积分饱和现象或积分失控现象。
抗积分饱和的思路是,在计算u(k)时,首先判断上一时刻的控制量u(k-1)是否已超出限制范围。
若u(k-1)>
umax,则只累加负偏差;
若u(k-1)<
umin,则只累加正偏差。
这种算法可以避免控制量长时间停留在饱和区。
仿真2设被控对象为
,采样周期1ms。
输入r(k)=30,
ex10.m。
M=1时采用抗积分饱和算法,M=2时采用普通PID算法。
%PIDControlerwithintergrationsturation
ts=0.001;
sys=tf(5.235e005,[1,87.35,1.047e004,0]);
z'
u_1=0.0;
u_2=0.0;
u_3=0.0;
x=[0,0,0]'
;
um=6;
%控制信号限幅值
kp=0.85;
ki=9.0;
kd=0.0;
rin=30;
%StepSignal
%M=1抗积分饱和,M=2普通PID
M=1--Usingintergrationsturation,M=2--Notusingiintergrationsturation'
)
800
u(k)=kp*x
(1)+kd*x
(2)+ki*x(3);
%PIDController
=um
u(k)=um;
=-um
u(k)=-um;
%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
iferror(k)>
alpha=0;
else
alpha=1;
elseifu(k)<
else
elseifM==2%Notusingintergrationsturation
%ReturnofPIDparameters
x
(1)=error(k);
%计算比例项
x
(2)=(error(k)-error_1)/ts;
%计算微分项
x(3)=x(3)+alpha*error(k)*ts;
%计算积分项
xi(k)=x(3);
subplot(311);
Positiontracking'
subplot(312);
Controlleroutput'
subplot(313);
plot(time,xi,'
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
%控制信号初值
ud_1=0;
%uD(k-1)初值
%输出信号初值
%M=1选择不完全微分,M=2选择普通PID
M=1—UsingPartialdifferentialPID,M=2--UsingPIDControlerwithoutPartialdifferential'
whetherornotusePartialdifferentialPID:
100
rin(k)=1.0;
%输出信号差分方程
D(k)=0.01*rands
(1);
%干扰信号
yout(k)=yout(k)+D(k);
%加入干扰后的输出信号
%矩形面积求和计算的积分项输出
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;
%输出限幅
=10
u(k)=10;
=-10
u(k)=-10;
%更新采样值
figure(3);
plot(time,rin-yout,'
error'
figure(4);
bode(Q,'
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
%M=1使用微分先行PID,M=2使用普通PID
M=1¡
ª
UsingPIDControlerwithdifferentialinadvance,M=2--UsingcommonPIDControler'
whetherornotusePIDControlerwithdifferentialinadvance:
400
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);
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;
elseifM==2%SimplePIDControl
u(k)=kp*error(k)+kd*(error(k)-error_1)/ts+ki*ei;
=110
%Updateparameters
当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
yy_1=0;
sys1=tf([1],[0.04,1]);
%LowFreqSignalFilter
dsys1=c2d(sys1,ts,'
tucsin'
[num1,den1]=tfdata(dsys1,'
f_1=0;
%M=1选择普通积分分离式PID,M=2选择带死区的积分分离式PID算法
M=1--UsingcommonintegrationseperationPIDControler,M=2--UsingintegrationseperationPIDControlerwithdeadzone'
whetherornotuseintegrationseperationPIDControlerwithdeadzone:
2000
rin(k)=1;
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