前言:这是针对数字离散系统的pid控制,采用m语言编写。重点掌握里面的数字式pid书写方法以及系统离散化的方法。

clear all;
close all;

%获取离散化模型
ts = 0.001;  %采样时间
sys = tf([523500],[1,87.35,10470,0]);
dsys = c2d(sys,ts,'z');
[num,den]=tfdata(dsys,'v');

%设置pid参数
k_p=0.5;
k_i=0.001;
k_d=0.001;

%设置输入信号形式
%y_d = ones(1,500);   输入信号为阶跃信号    
%y_d = [ones(1,250) zeros(1,250)]; 输入信号为阶跃信号
for k=1:1:500%输入信号为正弦信号
y_d(k) = 0.5*sin(4*pi*k*ts); 
end

y = zeros(1,500);%初始化输出信号
y_feed=0;%反馈回来的信号,y_feed=y
erro = 0;%信号差值
erro_1 = 0;%上一时刻信号差值
erro_total = 0;%信号差值累计值
y_1=0;%上一时刻的输出
y_2=0;%上一上一时刻的输出
y_3=0;%上一上一上一时刻的输出

pi_out=0;  %pid控制器的输出,注意不是系统输出
pi_out_1=0;%上一时刻pid控制器的输出,注意不是系统输出
pi_out_2=0;%上一上一时刻pid控制器的输出,注意不是系统输出
pi_out_3=0;%上一上一上一时刻pid控制器的输出,注意不是系统输出



for k=1:1:500
    time(k)=k*ts;  %存储时间,用于后面画图
    erro=y_d(k)-y_feed;
    erro_total = erro_total + erro;
    pi_out = erro*k_p+k_d*(erro-erro_1)/ts + k_i*erro_total*ts;
    
    
    %对pid的输出进行限幅
    if  pi_out>=10
        pi_out =10;
    end
    if  pi_out<=-10
        pi_out =-10;
    end
    
    y(k) = -den(2)*y_1-den(3)*y_2-den(4)*y_3+num(2)* pi_out_1+num(3)*pi_out_2+num(4)*pi_out_3;%控制对象
    y_feed= y(k);
    
    %更新系统输出状态
    y_3=y_2;
    y_2=y_1;
    y_1=y(k);
    
     %更新pid输出状态
    pi_out_3=pi_out_2;
    pi_out_2=pi_out_1;
    pi_out_1=pi_out;
    
    %更新信号差值状态
    erro_1=erro;
 end

%画图
plot(time,y_d,'r',time,y,'k:','linewidth',2);
xlabel('time');
ylabel('y and y_d');
legend('yd','y');

相应的仿真结果如图:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述