PID控制器的整定——基于响应曲线法的PID整定

关键字:Matalb;PID;响应曲线;参数整定

系列文章目录

PID控制器的整定——基于临界比例度法的PID整定



前言

  基于已知被控对象的传递函数设计PID控制器,最重要的就是得到合适的PID参数,本文将介绍基于响应曲线法的PID整定。


本文对一些复杂的流程与概念进行了简化与省略,如果想详细了解的小伙伴可以参考刘金琨老师的《先进PID控制MATLAB仿真 -第4版》的第2章(需要电子版请私戳)

一、应用PID控制的SISO系统

  在应用PID控制的SISO(单输入单输出)系统如图1.1:
Alt

图1.1 应用PID控制器的单输入单输出系统结构图

其中 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 τ可以通过如下示意图提取:
Alt

图2.1 传递函数的阶跃响应

需要注意的是并不是所有的一阶纯滞后传递函数都可以,必须是满足传递函数的阶跃响应为如图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)+Ti10te(t)dt+Tddtde(t)](1)其中 δ \delta δ T i T_i Ti T d T_d Td分别表示比例度、积分时间和微分时间。该三个参数由 ϵ \epsilon ϵ τ \tau τ确认:
Alt

图2.2 不同控制器的公式
# 三、实现代码
% 响应曲线法整定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');

  运行上述代码得到不同控制器的结果:
Alt

图3.1 具有P控制器的离散系统输出

Alt

图3.2 具有PI控制器的离散系统输出

Alt

图3.3 具有PID控制器的离散系统输出

总结

  本文基于MATALB简单介绍了基于响应曲线法的PID参数整定,该方法可以针对未知的被控传递函数进行PID整定,但是该被控对象必须满足阶跃响应为S型曲线的条件,这也限制了该方法的只能在特定情况下适用。

  • 10
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hvp

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值