模糊自适应整定PID控制
- 一、实验要求
- 二、实验过程
- 2.1 条件
- 2.2 实验流程
- 2.3 总结
- 代码
一、实验要求
被控对象:
采样时间为1ms,位置指令为幅值为1.0的阶跃信号。设计模糊自适应PI控制器。
二、实验过程
2.1 条件
2.2 实验流程
因为采样时间为1ms,所以需要对被控对象进行离散化。位置指令为幅值为1.0的阶跃信号,所以输入为幅值为1.0的阶跃信号。仿真时,先运行模糊推理系统设计程序,实现模糊推理系统d=fuzzypid.fis,并将此模糊推理系统调入内存中,然后运行模糊控制程序。
根据自适应模糊PID的控制结构设计模糊控制器。
根据要求建立如下图所示的模糊控制系统:
模糊控制系统的实现流程:
- 确定模糊控制器的结构
控制器的输入为e(误差),ec(误差变化率)。控制器的输出为kp,ki。 - 定义输入、输出的模糊集
ec定义为3个模糊集:N、Z、P;
e定义为3个模糊集:N、Z、P;
kp定义为3个模糊集:N、Z、P;
ki定义为3个模糊集:N、Z、P; - 定义隶属函数
e和ec模糊集相同,采用相同的隶属函数。 - 建立模糊控制规则
- 建立模糊控制集
- 模糊推理
- 仿真实例
误差e的隶属度函数
误差变化率ec的隶属度函数
控制器参数Kp的隶属度函数
控制器参数Ki的隶属度函数
模糊自适应PID的控制系统结构图
可视化模糊控制规则图 取kp=0,ki=0,控制效果较好,模糊自适应PID整定效果如下图所示::
阶跃响应曲线
控制器参数调整曲线
输入曲线 取kp=0,ki=-1,系统存在稳定误差,模糊自适应PID整定效果如下图所示:
取kp=10,ki=10,存在超调和震荡,模糊自适应PID整定效果如下图所示:
2.3 总结
比例系数Kp的作用是加快系统的响应速度,提高系统的调节精度,Kp加大,将使系统响应速度加快,Kp偏大时,系统振荡次数增多,调节时间加长;Kp太小又会使系统的响应速度缓慢。
积分系数Ti的作用是消除系统的稳态误差,Ti越大,系统的稳态误差消除越快,但是当Ti过大时,会引起响应过程的较大超调;若Ti过小,将使系统的稳态误差难以消除,影响系统的调节精度。
代码
模糊控制器生成代码,自然是用于生成模糊控制器。
clear all;
close all;
a = newfis('FuzzyAdaptivePID');
a = addvar(a,'input','e',[-1,1]);
a = addmf(a,'input',1,'N','zmf',[-1,-1/3]);
a = addmf(a,'input',1,'Z','trimf',[-2/3,0,2/3]);
a = addmf(a,'input',1,'P','smf',[1/3,1]);
a = addvar(a,'input','ec',[-1,1]);
a = addmf(a,'input',2,'N','zmf',[-1,-1/3]);
a = addmf(a,'input',2,'Z','trimf',[-2/3,0,2/3]);
a = addmf(a,'input',2,'P','smf',[1/3,1]);
a = addvar(a,'output','kp',[-10/3,10/3]);
a = addmf(a,'output',1,'N','zmf',[-10/3,-1]);
a = addmf(a,'output',1,'Z','trimf',[-5/3,0,5/3]);
a = addmf(a,'output',1,'P','smf',[1,10/3]);
a = addvar(a,'output','ki',[-1/10,1/10]);
a = addmf(a,'output',2,'N','zmf',[-1/10,-1/30]);
a = addmf(a,'output',2,'Z','trimf',[-2/30,0,2/30]);
a = addmf(a,'output',2,'P','smf',[1/30,1/10]);
rulelist= [1 1 1 2 1 1;
1 2 1 2 1 1;
1 3 1 2 1 1;
2 1 1 3 1 1;
2 2 3 3 1 1;
2 3 3 3 1 1;
3 1 3 2 1 1;
3 2 3 2 1 1;
3 3 3 2 1 1];
a = addrule(a,rulelist);
a1=setfis(a,'DefuzzMethod','centroid');
writefis(a1,'FuzzyAdaptivePID');
a2=readfis('FuzzyAdaptivePID');
figure(1);
plotmf(a,'input',1);
figure(2);
plotmf(a,'input',2);
figure(3);
plotmf(a,'output',1);
figure(4);
plotmf(a,'output',2);
figure(5);
plotfis(a);
fuzzy FuzzyAdaptivePID;%定义该模糊系统的名称。
ruleview FuzzyAdaptivePID;
PID整定过程代码,自然是用于整定PID。PS:需先运行上述代码生成模糊控制器,才能整定PID
clear all;
close all;
warning off;
a = readfis('FuzzyAdaptivePID');
ts = 0.001;
sys = tf(133,[1,25,0]);
dsys = c2d(sys,ts,'z');%z变换进行离散化
[num,den] = tfdata(dsys,'v');
u_1 = 0;
u_2 = 0;
y_1 = 0;
y_2 = 0;
e_1 = 0;
ec_1 = 0;
ei = 0;
kp0 = 0; % 设置初始的p
ki0 = -1; % 设置初始的i
for k = 1:1:1000
time(k) = k *ts;
r(k) = 1;
k_pid = evalfis([e_1,ec_1],a);%模糊化e_1,ec_1得到?kp,?ki
kp(k) = kp0 + k_pid(1);%修正kp,计算kp
ki(k) = ki0 + k_pid(2);%修正ki,计算ki
u(k) = kp(k)*e_1 + ki(k)*ei;
y(k) = -den(2)*y_1-den(3)*y_2+ num(2)*u_1 + num(3)* u_2;
e(k) = r(k) - y(k);
u_2 = u_1;
u_1 = u(k);
y_2 = y_1;
y_1 = y(k);
ei = ei + e(k) *ts;
ec(k) = e(k) - e_1;
e_1 = e(k);
ec_1 = ec(k);
end
figure(1);
plot(time,r,'r',time,y,'b:','linewidth',2);
xlabel('time(s)');
ylabel('r,y');
legend('Ideal position','Practical position');
figure(2);
subplot(211);
plot(time,kp,'r','linewidth',2);
xlabel('time(s)');
ylabel('kp');
subplot(212);
plot(time,ki,'r','linewidth',2);
xlabel('time(s)');
ylabel('ki');
figure(3);
plot(time,u,'r','linewidth',2);
xlabel('time(s)');
ylabel('Control input');
PPS:如果复制到matlab中发现注释乱码,可以先复制到记事本中,再复制记事本中代码到matlab