注意:
注释代码是基于采样周期ts=20s形式… ;频域到时域变化请参考 MATLAB编程测试传递函数的响应曲线(系统辨识第一篇)。
https://blog.csdn.net/weixin_37928884/article/details/127799637

% 传递函数:一阶惯性加滞后
%                   1
%   exp(-80*s) * --------
%                60 s + 1

clear;close all;clc;
% 采样周期ts与tdelay有关、修改ts观察tdelay变化
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;
% 设定初值u,由于滞后,故y的输出在刚开始有输入的滞后时间内为零
tdelay = dsys.InputDelay + 1;
for m=1:tdelay
    u_(m)=0;
end

%-----------------计算PID使用-----------------%
y_1=0;
y_2=0;
y_3=0;
error_1=0;
error_2=0;
%-----------------计算PID使用-----------------%
ei=0;

for k=1:1:2000/ts
    time(k)=k*ts;
    rin(k)=1.0;%Step Signal
%     yout(k)=-den(2)*y_1+num(2)*u_5;
    yout(k)=-den(2)*y_1+num(2)*u_(tdelay);
    error(k)=rin(k)-yout(k);
    
    kp=0.45;
    kd=12;
    ki=0.0048;   
    
    ei=ei+(error(k)+error_1)/2*ts;

    u(k)=kp*error(k)+kd*(error(k)-error_1)/ts+ki*ei;
    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);

    for m=2:tdelay
        u_(m)=u_(m-1);
    end
    u_(1)=u(k);
    
%-----------------计算PID使用-----------------%
    y_3=y_2;
    y_2=y_1;
    y_1=yout(k);
    
    error_2=error_1;
    error_1=error(k);
%-----------------计算PID使用-----------------%
end
figure(1);
plot(time,rin,'b',time,yout,'r');
xlabel('time(s)');ylabel('rin,yout');

pid参数自整定用到Simulink,这里给出调节PID方法:
第一种:经验法 参考pid调试经验,观察现象调试参数
https://download.csdn.net/download/weixin_37928884/86764992
第二种:自整定法
第一步:选择Discrete-time;
第二步:Sample time(-1 for inherited)20;
第三步:去掉Use filtered derivative;
第四步:点击Tune…按钮,弹出自整定界面;
第五步:点击Update Block,将自整定pid参数返回PID(Z)块配置中。

在这里插入图片描述

在这里插入图片描述

MATLAB的m文件代码采用Simulink中整定pid参数,运行结果如下:

在这里插入图片描述

综上所述,以上方法可行…

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐