关键字:Matalb;PID;响应曲线;参数整定
系列文章目录
前言
基于已知被控对象的传递函数设计PID控制器,最重要的就是得到合适的PID参数,本文将介绍基于响应曲线法的PID整定。
本文对一些复杂的流程与概念进行了简化与省略,如果想详细了解的小伙伴可以参考刘金琨老师的《先进PID控制MATLAB仿真 -第4版》的第2章(需要电子版请私戳)
一、应用PID控制的SISO系统
在应用PID控制的SISO(单输入单输出)系统如图1.1:
其中 K p K_p Kp、 K i K_i Ki和 K d K_d Kd分别是比例系数、积分系数和微分系数。
二、基本原理
响应曲线适用于一阶纯滞后的未知被控传递函数:
G
(
s
)
=
K
T
s
+
1
e
−
τ
s
(1)
G\left( s \right)=\frac{K}{Ts+1}e^{-\tau s} \tag{1}
G(s)=Ts+1Ke−τs(1)其中的参数
K
K
K、
T
T
T和
τ
\tau
τ可以通过如下示意图提取:
需要注意的是并不是所有的一阶纯滞后传递函数都可以,必须是满足传递函数的阶跃响应为如图2.1的S型曲线。
PID控制器设计为:
u
(
t
)
=
1
δ
[
e
(
t
)
+
1
T
i
∫
0
t
e
(
t
)
d
t
+
T
d
d
e
(
t
)
d
t
]
(1)
u(t)=\frac{1}{\delta} \left[ e\left( t \right)+ \frac{1}{T_i}\int_{0}^{t} e\left( t \right)\, dt+ T_d\frac{de\left( t \right)}{dt} \right] \tag{1}
u(t)=δ1[e(t)+Ti1∫0te(t)dt+Tddtde(t)](1)其中
δ
\delta
δ、
T
i
T_i
Ti和
T
d
T_d
Td分别表示比例度、积分时间和微分时间。该三个参数由
ϵ
\epsilon
ϵ和
τ
\tau
τ确认:
% 响应曲线法整定PID参数
% 参数初始化
clc;
clear;
close all;
Ts=20; % 采样时间
t=0:1:500; % 设定计算长度
[~,N]=size(t); % 数组长度
time=zeros(1,N); % 时间序列
r=1*ones(1,N); % 阶跃输入
u=zeros(1,N); % 控制器输出
e=zeros(1,N); % 系统误差
de=zeros(1,N); % 系统误差的微分
c_d=zeros(1,N); % 离散系统输出
num_c=1; % 被控对象分子
den_c=[60 1]; % 被控对象分母
tol=80; % 纯滞后环节系数
u_1=0.0;u_2=0.0;u_3=0.0;u_4=0.0;u_5=0.0; % u_1=u(k-1)、u_2=u(k-2)、u_3=u(k-3)、u_4=u(k-4)、u_5=u(k-5)
e_1=0; % e_1=e(k-1)
ei=0; % 系统误差的积分
c_d_1=0.0; % c_d_1=c_d(k-1)
%%
% 寻找拐点
sys_c=tf(num_c,den_c,'inputdelay',tol); % 连续系统
c_c=lsim(sys_c,r,t); % 连续系统的阶跃输入
dc_c_1=diff(c_c,1); % 连续系统阶跃输出的一阶导数
dc_c_2=diff(c_c,2); % 连续系统阶跃输出的二阶导数
for n=1:1:N-2
% 如果二阶导的第n个值与第n+1个值异号
% 说明拐点就在两值之间,这里取第n个
if(n<N-2)
if(dc_c_2(n)*dc_c_2(n+1)<0)
c_c_TruningPoint=n;
break;
end
end
% 如果二阶导的第n个值与第n+2个值异号且第n+1个值等于零
% 说明拐点就在n
if(n<N-3)
if(dc_c_2(n)*dc_c_2(n+2)<0&&dc_c_2(n+1)==0)
c_c_TruningPoint=n+1;
break;
end
end
if(n==N-2)
c_c_TruningPoint=1;
end
end
%%
% 计算τ与ε
c_c_max=max(c_c); % 连续系统阶跃响应的最大值
c_c_min=min(c_c); % 连续系统阶跃响应的最小值
c_c_static=c_c(N); % 连续系统阶跃响应的终值
c_c_0=c_c(1); % 连续系统阶跃响应的初始值
delta_c=c_c_static-c_c_0; % Δc_c
u_max=max(r); % 控制器输出的最大值
u_min=0; % 控制器输出的最小值
u_static=r(N); % 控制器输出的终值
u_0=c_c(1); % 控制器输出的初始值
delta_u=u_static-u_0; % Δu
k=dc_c_1(c_c_TruningPoint+1); % 拐点斜率
y0=c_c(c_c_TruningPoint+2); % 拐点的y值
x0=t(c_c_TruningPoint+2); % 拐点的x值
b=y0-k*x0; % 拐点切线与纵轴交点
tau=-b/k; % τ
T=(c_c_static-b)/k-tau; % T
K=(c_c_static/(c_c_max-c_c_min))/(u_static/(u_max-u_min)); % K
epsilon=K/T; % ε
%%
% 系统离散化
sys_d=c2d(sys_c,Ts,'zoh');
[num_d,den_d]=tfdata(sys_d,'v');
%%
% PID控制迭代
for k=1:1:N
time(k)=k*Ts; % 时间序列
c_d(k)=-den_d(2)*c_d_1+num_d(2)*u_5; % 具有控制器的离散系统输出
e(k)=r(k)-c_d(k); % 具有控制器的离散系统误差
de(k)=(e(k)-e_1)/Ts; % 具有控制器的离散系统误差微分
ei=ei+Ts*e(k); % 具有控制器的离散系统误差积分
M=3;
% P控制器
if M==1
delta=epsilon*tau;
u(k)=1/delta*(e(k));
% PI控制器
elseif M==2
delta=1.1*epsilon*tau;
Ti=3.3*tau;
u(k)=1/delta*(e(k)+1/Ti*ei);
% PID控制器
elseif M==3
delta=0.85*epsilon*tau;
Ti=2*tau;
Td=0.5*tau;
u(k)=1/delta*(e(k)+1/Ti*ei+Td*de(k));
end
% 更新参数
e_1=e(k);
u_5=u_4;u_4=u_3;u_3=u_2;u_2=u_1;u_1=u(k);
c_d_1=c_d(k);
end
%%
% 画图
plot(time,r,'r-',time,c_d,'k:','linewidth',2);
xlabel('time(s)');ylabel('Position tracking');
legend('Ideal position signal','PID controller position tracking','loaction','NorthEast');
运行上述代码得到不同控制器的结果:
总结
本文基于MATALB简单介绍了基于响应曲线法的PID参数整定,该方法可以针对未知的被控传递函数进行PID整定,但是该被控对象必须满足阶跃响应为S型曲线的条件,这也限制了该方法的只能在特定情况下适用。