PID控制改进算法的MATLAB仿真.docx
- 文档编号:3362276
- 上传时间:2022-11-22
- 格式:DOCX
- 页数:31
- 大小:390.14KB
PID控制改进算法的MATLAB仿真.docx
《PID控制改进算法的MATLAB仿真.docx》由会员分享,可在线阅读,更多相关《PID控制改进算法的MATLAB仿真.docx(31页珍藏版)》请在冰豆网上搜索。
PID控制改进算法的MATLAB仿真
PID控制改进算法的MATLAB仿真
江苏科技大学
电子信息学院
实验报告
评定成绩
指导教师
宋英磊
实验课程:
计算机控制技术
实验名称:
PID控制改进算法的MATLAB仿真
学号:
**********姓名:
胡文千班级:
********
完成日期:
2015年11月16日
一、实验目的
(1)对PID数字控制的改进算法用MATLAB进行仿真。
二、实验内容
1、积分分离PID控制算法
在普通PID控制中,积分的目的是为了消除误差提高精度,但在过程的启动、结束或大幅度增减设定是,短时间内系统输出有很大偏差,会造成PID运算的积分积累,致使控制量超过执行机构可能允许的最大动作范围对应的极限控制量,引起系统较大的超调,甚至引起系统较大的振荡,这在生产中是绝对不允许的。
积分分离控制基本思路是,当被控量与设定值偏差较大时,取消积分作用,以免由于积分作用使系统稳定性降低,超调量增大;当被控量接近给定值时,引入积分控制,以便消除静差,提高控制精度。
其具体实现步骤是:
1)根据实际情况,人为设定阈值ε>0;
2)当
时,采用PD控制,可避免产生过大的超调,又使系统有较快的响应;
3)当
时,采用PID控制,以保证系统的控制精度。
积分分离算法可表示为:
式中,T为采样时间,β为积分项的开关系数,
仿真1设备控对象为一个延迟对象
,采样周期为20s,延迟时间为4个采样周期,即80s。
输入信号r(k)=40,控制器输出限制在[-110,110]。
被控对象离散化为
仿真方法:
仿真程序:
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&abs(error(k))<=30
beta=0.6;
elseifabs(error(k))>=10&abs(error(k))<=20
beta=0.9;
else
beta=1.0;
end
elseifM==2
beta=1.0;
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;
end
ifu(k)<=-110
u(k)=-110;
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_2=error_1;
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');
将仿真获得结果的截图附于如下空白处:
当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) 这种算法可以避免控制量长时间停留在饱和区。 仿真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
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- PID 控制 改进 算法 MATLAB 仿真
![提示](https://static.bdocx.com/images/bang_tan.gif)