积分分离式数字pid的matlab实现

积分分离的基本思想:当被控量与设定值偏差较大时,取消积分作用,以免由于积分作用使得系统稳定性降低,超调量增大;当被控量接近给定值时,引入积分控制,用于消除静差,提高控制精度。

clear all;
close all;

%获取离散化模型
ts = 20;  %采样时间
sys = tf([1],[60,1],'inputdelay',80);
dsys = c2d(sys,ts,'z');
[num,den]=tfdata(dsys,'v');

%设置pid参数
k_p=0.8;
k_i=0.005;
k_d=3;

%设置输入信号形式
y_d = 40*ones(1,200);   %输入信号为阶跃信号    
%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,200);%初始化输出信号
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控制器的输出,注意不是系统输出
pi_out_4=0;%上一上一上一上一时刻pid控制器的输出,注意不是系统输出
pi_out_5=0;%上一上一上一上一上一时刻pid控制器的输出,注意不是系统输出

M=0; %m用来选择是用普通pid还是积分分离式pid

beta = 0;%开关系数,用于控制是否有积分项

for k=1:1:200
    time(k)=k*ts;  %存储时间,用于后面画图
    erro=y_d(k)-y_feed;
    erro_total = erro_total + erro;
    
    if M==0 %采用积分分离
        if (abs(erro))>=30
            beta = 0;
        end
        if (abs(erro))<30 & (abs(erro))>=20
            beta = 0.6;
        end
        if (abs(erro))<20 & (abs(erro))>=10
            beta = 0.9;
        end
        if (abs(erro))<10 
            beta = 1;
        end    
    end
    
    if M==1 %不采用积分分离
        beta=1;
    end

        pi_out = erro*k_p+k_d*(erro-erro_1)/ts + k_i*beta*erro_total*ts;
    
        %对pid的输出进行限幅
        if  pi_out>=110
            pi_out =110;
        end
        if  pi_out<=-110
            pi_out =-110;
        end
    
        y(k) = -den(2)*y_1+num(2)* pi_out_5;%控制对象
        y_feed= y(k);
    
        %更新系统输出状态
        y_1=y(k);
    
     %更新pid输出状态
        pi_out_5=pi_out_4;
        pi_out_4=pi_out_3;
        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');

采用了积分分离的结果:
积分分离式数字pid的matlab实现_第1张图片

没有采用积分分离的结果:

积分分离式数字pid的matlab实现_第2张图片

说明:

  • 可以看出,引入了积分分离后确实减少了超调
  • 从程序中我们可以看出,并不是当erro小于阈值时就完全引入积分环节,而是设定了多个阈值,不同的阈值对应不同的积分环节参与度,当erro越小,积分环节参与度越大,此时beta系数的值越趋于1.当erro越大,积分环节参与度越小,此时beta系数的值越趋于0

你可能感兴趣的:(matlab)