PID控制改进算法的MATLAB仿真.docx

上传人:b****6 文档编号:3362276 上传时间:2022-11-22 格式:DOCX 页数:31 大小:390.14KB
下载 相关 举报
PID控制改进算法的MATLAB仿真.docx_第1页
第1页 / 共31页
PID控制改进算法的MATLAB仿真.docx_第2页
第2页 / 共31页
PID控制改进算法的MATLAB仿真.docx_第3页
第3页 / 共31页
PID控制改进算法的MATLAB仿真.docx_第4页
第4页 / 共31页
PID控制改进算法的MATLAB仿真.docx_第5页
第5页 / 共31页
点击查看更多>>
下载资源
资源描述

PID控制改进算法的MATLAB仿真.docx

《PID控制改进算法的MATLAB仿真.docx》由会员分享,可在线阅读,更多相关《PID控制改进算法的MATLAB仿真.docx(31页珍藏版)》请在冰豆网上搜索。

PID控制改进算法的MATLAB仿真.docx

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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 小学教育 > 语文

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1