PID控制算法及MATLAB仿真分析

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

题目:以PID控制进行系统仿真学院自动化学院
专业班级工业自动化111班学生姓名黄熙晴
目录
1 引言 (1)
1.1本论文研究内容 (1)
2 PID控制算法 (1)
2.1模拟PID控制算法 (1)
2.2数字式PID控制算法 (3)
2.3PID控制算法的改进 (5)
2.3.1微分项的改进 (5)
2.3.2积分项的改进 (9)
2.4模糊PID控制算法 (11)
2.4.1模糊推理的系统结构 (12)
2.4.2 PID参数在线整定原则 (12)
2.5PID控制器研究面临的主要问题 .................................. 错误!未定义书签。

3 MATLAB编程和仿真 (13)
3.1PID控制算法分析 (13)
3.2MATLAB仿真 (15)
4结语 (20)
参考文献...................................................................................... 错误!未定义书签。

1 引言
PID控制器以其结构简单、稳定性好、工作可靠、调整方便而成为工业控制的主要技术之一。

光学表面等离子共振生物传感技术受温度影响很大,因此设计高精度的温度控制器对于生物分析仪十分重要。

研究PID的控制算法是PID控制器整定参数优化和设定的关键技术之一。

在工业过程控制中,目前采用最多的控制方式依然是PID方式。

它具有容易实现、控制效果好、鲁棒性强等特点,同时它原理简单,参数物理意义明确,理论分析体系完整,并为工程界所熟悉,因而在工业过程控制中得到了广泛应用。

在实际的应用中,许多被控过程机理复杂,具有高度非线性、时变不确定性和纯滞后等特点,特别是在噪声、负载扰动等因素的影响下,参数复杂烦琐的整定过程一直困扰着工程技术人员。

为了减少参数整定的工作量,克服因环境变化或扰动作用造成系统性能的降低,就要提出一种PID控制参数的自动整定。

1.2本论文研究内容
本文在介绍传统的PID控制算法,并对传统算法改进后,在学习的基础上提出一种模糊参数自整定方法,这种模糊控制的PID算法必须精确地确定对象模型。

它在常规PID基础上,以输出反馈值与目标值的误差e和误差变化率ec作为输入,用模糊推理的方法对PID参数kp,ki,kd进行在线自整定,以满足不同e和ec对控制器参数的不同要求。

2 PID控制算法
2. 1模拟PID 控制算法
模拟PID控制系统结构如图2-1所示。

它主要由PID 控制器和被控对象所组成。

而PID 控制器则由比例、积分、微分三个环节组成。

它的数学描述为:
()p D 1e(t)dt 1de(t)u(t)=K [e(t)+++T ] T !!dt
r n r -⎰ (2-1)
P s+56780
G (s)=
s3 +87.65s2 +1234s+123
(2-2)
式中,K p 为比例系数T I
;为积分时间常数;T D 为微分时间常数.
PID 控制器各校正环节的主要控制作用如下:
(l)比例环节及时成比例地反映控制系统的偏差信号e(t),偏差一旦产生,控制器立即产生控制作用,以减少偏差。

比例系数k P 的作用在于加快系统的响应速度,提高系统调节精度。

k P 越大,系统的响应速度越快,系统的调节精度越高,也就是对偏差的分辨率(重视程度)越高,但将产生超调,甚至导致系统不稳定。

k P 取值过小,则会降低调节精度,尤其是使响应速度缓慢,从而延长调节时间,使系统静态、动态特性变坏。

(2)积分环节主要用于消除静差,提高系统的无差度。

积分作用的强弱取决于积分时间常数τ,τ越大,积分作用越弱,反之则越强。

积分作用系数越大,系统静态误差消除越大,但积分作用过大,在响应过程的初期会产生积分饱和现象,从而引起响应过程的较大超调。

若积分作用系数过小,将使系统静差难以消除,影响系统的调节精度。

(3)微分环节能反映偏差信号的变化趋势(变化速率),并能在偏差信号值变得太大之前,在系统中引入一个有效的早期修正信号,从而加快系统的动作速度,
减少调节时间。

2.2数字式 PID 控制算法
在计算机控制系统中,使用的是数字PID 控制器,数字PID 控制算法通常又分为位置式HD 控制算法和增量式PID 控制算法。

(1)位置式PID 控制算法 由于计算机控制是一种采样控制,它只能根据采样时刻的偏差值计算控制量,故对式(2-1)中的积分和微分项不能直接使用,需要进行离散化处理。

按模拟PID 控制算法的算式(2-1),现以一系列的采样时刻点kT 代表连续时间t ,以和式代替积分,以增量代替微分,则可以作如下的近似变换:
000t=kT(k=0,1,2)()()()()e(kT)-e(k-1)T e(k)-e(k-1)t k k j j e t dt e jT T e j de t dt T T ==⎛⎫

⎪ ⎪
⎪≈= ⎪
⎪ ⎪≈= ⎪⎝

∑∑⎰ (2-3) 显然,上述离散化过程中,采样周期T 必须足够短,才能保证有足够的精度。

为了书写方便,将e(kT)简化表示成e(k)等,即省去T 。

将式(2-3)代入式(2-1),可以得到离散的PID 表达式为:
0(){()()[()(1)}1k D
p j T T u k K e k e j e k e k T T ==++--∑ (2-4)
中式:
k — 采样序列号;
u(k)— 第k 次采样时刻的计算机输出值; e(k)—第k 次采样时刻输入的偏差值; e(k-1)— 第k-1次采样时刻输入的偏差值;
K I — 积分系数,K I =K P T/T I K D —微分系数,K D T D
/T。

我们常称式(2-4)为位置式PID 控制算法。

对于位置式PID 控制算法来说,位置式PID 控制算法示意图如图2-2所示,由于全量输出,所以每次输出均与过去的状态有关,计算时要对误差进行累加,所以运算工作量大。

而且如果执行器(计算机)出现故障,则会引起执行机构位置的大幅度变化,而这种情况在生产场合不允许的,因而产生了增量式PID 控制算法。

(2)增量式PID 控制算法
所谓增量式PID 是指数字控制器的输出只是控制量的增量Δ(k)。

增量式PID 控制系统框图如图2-3所示。

当执行机构需要的是控制量的增量时,可以由式(2-4)导出提供增量的PID 控制算式。

根据递推原理可得:
k-1
p I d j=0
u(k-1)=K e(k-1)+K e(j) +K [e(k-1)-e(k-2)] (2-4)
用式(2-3)减去式(2-4),可得:
p I D u(k)=u(k-1)+ K [e(k)-e(k-1)]+K e(k)+K [e(k)-2e(k-1)+e(k-2)] (2-5)
式(2-5)称为增量式PID 控制算法。

增量式控制算法的优点是误动作小,便于实现无扰动切换。

当计算机出现故障时,可以保持原值,比较容易通过加权处理获得比较好的控制效果。

但是由于
其积分截断效应大,有静态误差,溢出影响大。

所以在选择时不可一概而论。

2.3 PID 控制算法的改进
针对常规PID 控制存在的问题,将PID 控制器与其他的算法相结合,对PID 控制器进行改进,得到了多种改进型PID 控制器。

2.3.1微分项的改进 1)不完全微分PID 控制算法
在PID 控制中,微分信号的引入可改善系统的动态特性,但也易引起高频干扰。

在误差扰动突变时尤其显出微分项的不足。

若在控制算法中加入低通滤波器,则可使系统性能得到改善。

1.不完全微分型PID 算法传递函数为式(2-6),传递函数框图如图2-4所示:

⎪⎪

⎭⎫
⎝⎛++⎪⎪⎭⎫ ⎝⎛+=1111)(S K T
S T S T K S G D D D I P C (2-6)
图2-4 不完全微分型PID 算法传递函数框图
2.完全微分和不完全微分作用的区别

2-5 完全微分和不完全微分作用的区别
3、不完全微分型PID 算法的差分方程
[][]
)1()()1()()1()(--++
--++
-=n u n e T K T T n e n e T K T T n u n u D D
D
D
D
D D D (2-7)
[])1()()()(--+=∆n u n u K n u T T
K n u D D P D I
P
(2-8)
4.仿真分析:设被控对象的传递函数为:
-80s
e G(s)=
60s+1
在对象的输出端加幅值为0.01的随机信号。

采样时间为20ms 。

低通滤波器为:
1
Q(s)=180s+1
仿真程序:
%PID Controler 不完全微分 clear all; close all; 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; ei=0;
for k=1:1:100 time(k)=k*ts; rin(k)=1.0;
%Linear model
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);
%PID Controller with partly differential ei=ei+error(k)*ts; kc=0.30; ki=0.0055; TD=140;
kd=kc*TD/ts; Tf=180;
Q=tf([1],[Tf,1]); %Low Freq Signal Filter
M=2; %M=1不完全微分,
%M=2普通Pid 控制!!
if M==1
%Using PID with Partial differential
alfa=Tf/(ts+Tf);
ud(k)=kd*(1-alfa)*(error(k)-error_1)+alf a*ud_1;
u(k)=kc*error(k)+ud(k)+ki*ei;
ud_1=ud(k);
elseif M==2 %Using Simple PID
u(k)=kc*error(k)+kd*(error(k)-error_1)+ ki*ei;
end
%Restricting the output of controller
if u(k)>=10
u(k)=10; end
if u(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');
由仿真结果可以看出,采用不完全微分型PID算法,引入不完全微分后能有效克服普通PID的不足,尽管不完全微分算法比普通PID控制算法要复杂的多,但由于其良好的控制特性,近年来越来越广泛的应用。

图(2-6)不完全微分型(r输入,b输出,下同)图(2-7)普通PID控制
2)微分先行和输入滤波PID 控制算法
微分先行PID控制算法的特点是只对输出量进行微分,而对给定值不进行微分。

这样,在改变给定值时,输出不会改变,而且由于被控量一般不会突变,即使给定值已发生改变,被控量也是缓慢变化的,从而不致引起微分项的突变。

微分先行PID控制算式为:
d
p p 1I
T T u(k)=k [e(k)-e(k-1)]+ kp
[e(k)-2c(k-1)+c(k-2)]- k [c(k)-c(k-1)]T T ∆ (2-9) 输入滤波,输入滤波就是在计算微分项时,不是直接应用当前时刻的误差e(n),而是采用滤波值e(n),即用过去和当前四个采样时刻的误差的平均值,再通过加权求和形式近似构成微分项
[])3()2(3)1(3)(6)(-----+=
n e n e n e n e T T K n u D
P D (2-10)
[])4()3(2)2(6)1(2)(6)(-+-+---+=
∆n e n e n e n e n e T T K n u D
P D (2-11)
仿真分析:设被控对象的传递函数为:
-80s
e G(s)=
60s+1
仿真程序:
%PID Controler 微分先行 clear all; close all; 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; for k=1:1:400 time(k)=k*ts;
%Linear model
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; Ti=0.5;
c1=gama*Td/(gama*Td+ts); c2=(Td+ts)/(gama*Td+ts); c3=Td/(gama*Td+ts);
M=1; % M=1微分先行算法方
%波响应M=2普通算法
if M==1 %PID Control with dif ferential in advance ud(k)=c1*ud_1+c2*yout(k)-c3*y_1;
u(k)=kp*error(k)+ud(k)+ki*ei;
elseif M==2 %Simple PID Control
u(k)=kp*error(k)+kd*(error(k)-error_1)/t s+ki*ei;
end
if u(k)>=110
u(k)=110;
end
if u(k)<=-110
u(k)=-110;
end
%Update 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=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');
从仿真结果可以看出,该算法适用于给定值频繁升降的场合,可以避免系统振荡,从而明显地改善系统的动态特性。

图(2-8)微分先行算法方波响应图(2-9)普通算法方波响应
2.3.2积分项的改进
抗积分饱和,积分作用虽能消除控制系统的静差,但它也有一个副作用,即会引起积分饱和。

在偏差始终存在的情况下,造成积分过量。

当偏差方向改变后,需经过一段时间后,输出u(n)才脱离饱和区。

这样就造成调节滞后,使系统出现明显的超调,恶化调节品质。

这种由积分项引起的过积分作用称为积分饱和现象。

以下为几种克服积分饱和的方法。

1)积分限幅法
积分限幅法的基本思想是当积分项输出达到输出限幅值时,即停止积分项的计算,这时积分项的输出取上一时刻的积分值。

其算法流程如图2-10所示。

2)积分分离PID控制算法
在普通PID控制中,引入积分环节的目的主要是为了消除静差,提高控制精度。

但在过程控制的启动、结束或大幅度增减设定时,短时间内系统输出有很大的偏差,会造成PID运算的积分积累,致使控制量超过执行机构可能允许的最大动作范围对应的极限控制量,引起系统较大的超调,甚至引起系统较大的振荡,这在生产中是绝对不允许的。

算法流程如图2-11所示:
积分分离控制基本思路是:当被控量与设定值偏差较大时,取消积分作用,以免由于积分作用使系统稳定性降低,超调量增大;当被控量接近给定值时,引入积分控制,以便消除静差,提高控制精度。

其具体实现步骤如下: 根据实际情况,人为设定阈值ε>0。

(l)当|e (k)|>ε时,采用PD控制,可避免产生过大的超调,又使系有较快的响应。

(2)当|e (k)|<ε时,采用PID控制,以保证系统的控制精度。

采用积分分离方法,控制效果有很大的改善。

该算的优点是:当偏差值较小时,采用PID控制,可保证系统的控制精度;当差值较大时,采用PD控制,可使超调量大幅度降低。

图2-10积分限幅法算法流程 图2-11积分分离算法流程 3)遇限消弱积分PID 控制算法
该算法的基本思想是:当控制进入饱和区以后,便不再进行积分项的累加,而只执行削弱积分的运算计算,先判断u(k-1)是否超出限制值,若超出,则只累加负偏差,否则,累加正偏差。

采用遇限消弱积分PID 算法,可以避免控制长时间停留在饱和区,防止系统产生超调。

2.4模糊PID 控制算法
模糊控制是以模糊集合论、模糊语言变量及模糊推理为基础的计算机智能控制,基本概念是美国加利福尼亚大学著名教授查德(L.A.Zadeh )首先提出的,经过二十多年的发展,在模糊控制理论和应用研究方面都取得了重大的成功。

模糊控制器的基本组成框图如图2-12所示,模糊控制器实际上是依靠微机或单片机构成的,它的绝大部分功能是由计算机程序来完成,随着专用模糊芯片的研究
和开发,也可以由硬件逐步取代各组成单元的软件功能。

2.4.1模糊推理的系统结构
参数自整定模糊PID控制系统结构如图2-13所示。

在常规PID基础上,以温度反馈值与目标值的误差e和误差变化率ec作为输入,用模糊推理的方法对PID参数kp,ki,kd进行在线自整定,以满足不同e和ec对控制器参数的不同要求,从而使受控对象具有良好的动、静态性能。

2.4.2 PID参数在线整定原则
PID控制中K P、K I、K D各参数的作用不再赘述。

根据系统在受控过程中对应不同的|e|和|ec|,将PID参数的整定原则归纳如下:
(1) 当|e|较大时,取较大的K P与较小的K D,K I=0,以使系统有较好的跟踪性能,同时由于对积分作用进行了限制,可避免出现较大的超调。

(2)当|e|为中等大小时,K P取较小值,以降低响应超调量。

K D的取值对系统响应影响较大,K I的取值也要适当。

(3)当|e|较小时,K P与K I均取较大值,以提高系统的稳定性,此时K D值的选择应根据|ec|的大小,|ec|较大时,K D取较小值,|ec|较小时,K D值取大一些,以避免系统在设定值附近出现振荡。

3 MATLAB编程和仿真
3.1 PID控制算法分析
设计模糊控制器,本文采用的是两输入(e,ec)三输出(Kp,Ki,Kd)的形式,模糊集均为{负大,负中,负小,零,正小,正中,正大},简记为{NB,NM,NS,ZO,PS,PM,PB},其中e,ec的论域为[-3,-2,-1,0,1,2,3], Kp,Ki,Kd的论域为[-6,-4,-2,0,2,4,6],由工程设计人员的技术和实际操作经验,建立了合适的模糊规则,在这里直接引用:
(1)Kp的模糊规则表
表3.1Kp的模糊规则表(行为ec,列为e,内容为ΔKd,下同)
NB NM NS ZO PS PM PB
NB PB PB PM PM PS ZO ZO
NM PB PB PM PS PS ZO NS
NS PM PM PM PS ZO NS NS
ZO PM PM PS ZO NS NM NM
PS PS PS ZO NS NS NM NM
PM PS ZO NS NM NM NM NB
PB ZO ZO NM NM NM NB NB (2)Ki的模糊规则表
表3.2 Ki的模糊规则表
NB NM NS ZO PS PM PB
NB NB NB NM NM NS ZO ZO
NM NB NB NM NS NS ZO ZO
NS NM NM NS NS ZO PS PS
ZO NM NM NS ZO PS PM PM
PS NS NS ZO PS PS PM PB
PM ZO ZO PS PS PM PB PB
PB ZO ZO PS PM PM PB PB (3)Kd的模糊规则表
表3.3 Kd的模糊规则
NB NM NS ZO PS PM PB
NB PS NS NB NB NB NM PS
NM PS NS NB NM NM NS ZO
NS ZO NS NM NM NS NS ZO
ZO ZO NS NS NS NS NS ZO
PS ZO ZO ZO ZO ZO ZO ZO
PM PB NS PS PS PS PS PB
PB PB PM PM PM PS PS PB
Kp,Ki,Kd的模糊规则表建立好后,可根据以下方法进行Kp,Ki,Kd 的自适应校正。

设e,ec和Kp,Ki,Kd均服从正态分布,可得到各模糊子集的隶属度,应用模糊合成推理设计PID参数的模糊矩阵表,查出修正参数代入下式计算:
Kp=Kp’+{ei,eci}P; Ki=Ki’+{ei,eci}i; Kd=Kd’+{ei,eci}d(3-1) 控制系统通过对模糊逻辑规则的结果处理、查表和运算。

完成对PID参数在线自动校正,工作流程如图3-1所示。

3.2 MATLAB 仿真
设被控对象为:
P s+56780
G (s)=
s3 +87.65s2 +1234s+123
(3-2)
采样时间为0.5ms ,采用模糊Pid 控制进行阶跃响应,在第400个采样时间(0.2s )时控制器输出加2.5的干扰,相应的结果如图3-2~3-7 。

图3-2模糊PID 控制阶跃响应 图3-3模糊PID 控制误差响应
图3-4控制器输出U 图3-5 kp 的自适应调整
图3-6 ki 的自适应调整 图3-7 kd 的自适应调整
图3-8 抗积分饱和的Pid 控制 模糊控制仿真程序[1]:
%Fuzzy Tunning PID Control clear all; close all;
a=newfis('fuzzpid');
a=addvar(a,'input','e',[-3,3]); %Parameter e
a=addmf(a,'input',1,'NB','zmf',[-3,-1]); a=addmf(a,'input',1,'NM','trimf',[-3,-2,0]); a=addmf(a,'input',1,'NS','trimf',[-3,-1,1]); a=addmf(a,'input',1,'Z','trimf',[-2,0,2]); a=addmf(a,'input',1,'PS','trimf',[-1,1,3]); a=addmf(a,'input',1,'PM','trimf',[0,2,3]); a=addmf(a,'input',1,'PB','smf',[1,3]);
a=addvar(a,'input','ec',[-3,3]);
%Parameter ec
a=addmf(a,'input',2,'NB','zmf',[-3,-1]); a=addmf(a,'input',2,'NM','trimf',[-3,-2,0]); a=addmf(a,'input',2,'NS','trimf',[-3,-1,1]); a=addmf(a,'input',2,'Z','trimf',[-2,0,2]); a=addmf(a,'input',2,'PS','trimf',[-1,1,3]); a=addmf(a,'input',2,'PM','trimf',[0,2,3]); a=addmf(a,'input',2,'PB','smf',[1,3]);
a=addvar(a,'output','kp',[-0.3,0.3]); %Parameter kp
a=addmf(a,'output',1,'NB','zmf',[-0.3,-0.1]); a=addmf(a,'output',1,'NM','trimf',[-0.3,-0.2,0]); a=addmf(a,'output',1,'NS','trimf',[-0.3,-0.1,0.1]); a=addmf(a,'output',1,'Z','trimf',[-0.2,0,0.2]); a=addmf(a,'output',1,'PS','trimf',[-0.1,0.1,0.3]); a=addmf(a,'output',1,'PM','trimf',[0,0.2,0.3]);
a=addmf(a,'output',1,'PB','smf',[0.1,0.3]);
a=addvar(a,'output','ki',[-0.06,0.06]);
%Parameter ki
a=addmf(a,'output',2,'NB','zmf',[-0.06,-0.02]); a=addmf(a,'o utput',2,'N M','t rimf',[-0.06,-0.04,0]);
a=addmf(a,'output',2,'NS','trimf',[-0.06,-0.02,0.02]); a=addmf(a,'output',2,'Z','trimf',[-0.04,0,0.04]);
a=addmf(a,'output',2,'PS','trimf',[-0.02,0.02,0.06]); a=addmf(a,'output',2,'PM','trimf',[0,0.04,0.06]);
a=addmf(a,'output',2,'PB','smf',[0.02,0.06]);
a=addvar(a,'output','kd',[-3,3]); % Parameter kp
a=addmf(a,'output',3,'NB','zmf',[-3,-1]);
a=addmf(a,'output',3,'NM','trimf',[-3,-2,0]);
a=addmf(a,'output',3,'NS','trimf',[-3,-1,1]);
a=addmf(a,'output',3,'Z','trimf',[-2,0,2]);
a=addmf(a,'output',3,'PS','trimf',[-1,1,3]);
a=addmf(a,'output',3,'PM','trimf',[0,2,3]);
a=addmf(a,'output',3,'PB','smf',[1,3]);
rulelist=[1 1 7 1 5 1 1;
1 2 7 1 3 1 1;
1 3 6
2 1 1 1;
1 4 6
2 1 1 1;
1 5 5 3 1 1 1;
1 6 4 4
2 1 1;
1 7 4 4 5 1 1;
2 1 7 1 5 1 1;
2 2 7 1
3 1 1;
2 3 6 2 1 1 1;
2 4 5
3 2 1 1;
2 5 5
3 2 1 1;
2 6 4 4
3 1 1;
2 7
3
4 4 1 1;
3 1 6 1
4 1 1;
3 2 6 2 3 1 1;
3 3 6 3 2 1 1;
3 4 5 3 2 1 1;
3 5
4 4 3 1 1;
3 6 3 5 3 1 1;
3 7 3 5
4 1 1;
4 1 6 2 4 1 1;
4 2 6 2 3 1 1;
4 3
5 3 3 1 1;
4 4 4 4 3 1 1;
4 5 3 5 3 1 1;
4 6 2 6 3 1 1;
4 7 2 6 4 1 1;
5 1 5 2 4 1 1;
5 2 5 3 4 1 1;
5 3 4 4 4 1 1;
5 4 3 5 4 1 1;
5 5 3 5 4 1 1;
5 6 2 6 4 1 1;
5 7 2 7 4 1 1;
6 1 5 4
7 1 1;
6 2 4 4 5 1 1;
6 3 3 5 5 1 1;
6 4 2 5 5 1 1;
6 5 2 6 5 1 1;
6 6 2
7 5 1 1;
6 7 1 7 7 1 1;
7 1 4 4 7 1 1;
7 2 4 4 6 1 1;
7 3 2 5 6 1 1;
7 4 2 6 6 1 1;
7 5 2 6 5 1 1;
7 6 1 7 5 1 1;
7 7 1 7 7 1 1];
a=addrule(a,rulelist);
a=setfis(a,'DefuzzMethod','centroid'); writefis(a,'fuzzpid');
a=readfis('fuzzpid');
%PID Controller
ts=0.0005;
sys=tf([1,5.678e005],[1,87.65,1.234e00 4,123]);
dsys=c2d(sys,ts,'tustin');
[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]';
e_1=0;
e_1=0.0;
ec_1=0.0;
kp0=0.40;
kd0=1.0;
ki0=0.0;
for k=1:1:750
time(k)=k*ts;
r(k)=1;
%Using fuzzy inference to tunning PID k_pid=evalfis([e_1,ec_1],a);
kp(k)=kp0+k_pid(1);
ki(k)=ki0+k_pid(2);
kd(k)=kd0+k_pid(3);
u(k)=kp(k)*x(1)+kd(k)*x(2)+ki(k)*x(3); if k==400
%Adding disturbance(2.5at time0.2s) u(k)=u(k)+2.5;
end
if u(k)>=10
u(k)=10;
end
if u(k)<=-10
u(k)=-10;
end y(k)=-den(2)*y_1-den(3)*y_2-den(4)*y _3+num(1)*u(k)+num(2)*u_1+num(3)* u_2+num(4)*u_3;
e(k)=r(k)-y(k);
%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);
x(1)=e(k); % Calculating P
x(2)=e(k)-e_1; % Calculating D
x(3)=x(3)+e(k); % Calculating I
e_1=x(1);
ec_1=x(2);
e_2=e_1;
e_1=e(k);
end
showrule(a)
figure(1);plot(time,r,'b',time,y,'r'); xlabel('time(s)');ylabel('r,y');
figure(2);plot(time,e,'r');
xlabel('time(s)');ylabel('e');
figure(3);plot(time,u,'r');
xlabel('time(s)');ylabel('u');
figure(4);plot(time,kp,'r');
xlabel('time(s)');ylabel('kp');
figure(5);plot(time,ki,'r');
xlabel('time(s)');ylabel('ki');
figure(6);plot(time,kd,'r');
xlabel('time(s)');ylabel('kd');
plotfis(a);
fuzzy fuzzpid
抗积分饱和PID控制仿真程序:
%PID Controler with intergration sturation
clear all; close all; ts=0.0005;
sys=tf([1,5.678e005],[1,87.65,1.234e00 4,123]);
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]';
e_1=0;
um=6;
kp=0.85;ki=9.0;kd=0.0;
r=30; %Step Signal
for k=1:1:800
time(k)=k*ts;
u(k)=kp*x(1)+kd*x(2)+ki*x(3);
% PID Controller
if k==400
%Adding disturbance(2.5v at time 0.2s) u(k)=u(k)+2.5;
end
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+nu m(2)*u_1+num(3)*u_2+num(4)*u_3;
e(k)=r-y(k);
M=2;
if M==1 %Using intergration sturation if u(k)>=um
if e(k)>0
alpha=0;
else
alpha=1;
end
elseif u(k)<=-um
if e(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);
e_1=e(k);
x(1)=e(k); % Calculating P
x(2)=(e(k)-e_1)/ts; % Calculating D x(3)=x(3)+alpha*e(k)*ts; %Calculating I xi(k)=x(3);
end
figure(1);
subplot(311);
plot(time,r,'b',time,y,'r');
xlabel('time(s)');ylabel('Position tracking');
subplot(312);
plot(time,u,'r');
xlabel('time(s)');ylabel('Controller output');
subplot(313);
plot(time,xi,'r');
xlabel('time(s)');ylabel('Integration');
从仿真结果来看,采用模糊控制的PID算法,系统输出的超调量比一般的PID控制(如抗饱和积分控制)要小,调节时间也更快,也迅速地达到稳定时间。

不论是从速度还是稳定性都要比一般PID控制要好,在工业用途上能满足各类精度和稳定性能控制的需求。

4结语
在整个设计过程中,使我对所学知识进行了一个比较大的综合巩固,让我学会了各种查阅资料以及整理所需材料的能力,通过这次的课题设计,也让我学习到了不少新知识,因为我不仅学到了一些新的专业知识还锻炼了自己解决问题的能力,这是不可多得的。

但是,在设计过程中我也遇到了不少困难,感觉自己对所学专业知识的欠缺,让自己增加了紧迫感,要抓紧弥补自己的欠缺,学无止境,这也让我体会到了不管以后走上什么样的工作岗位,都不要抛弃自己的学习,不进则退,别人的进步自己的停滞不前终将导致自己的被淘汰,这是我在整个课题设计过程中最大的体会。

相关文档
最新文档