不完全微分pid的matlab实现

一、背景

不完全微分pid的matlab实现_第1张图片

从PID控制的基本原理我们知道,微分信号的引入可改善系统的动态特性,但也存在一个问题,那就是容易引进高频干扰,在偏差扰动突变时尤其显出微分项的不足。为了解决这个问题人们引入低通滤波方式来解决这一问题。


二、解决办法

不完全微分pid的matlab实现_第2张图片

上面两种形式都可以,下面将对第一种形式进行m语言仿真和simuink仿真。


三、仿真

被控对象为:…
采样时间20s
滤波器为:1/(180s+1)
% 程序中m用来选择是否用不完全篇pid
% m=1:用不完全篇pid
% m=2:不用不完全篇pid,用普通pid

clear all;
close all;

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

%获取滤波器离散化模型
sys1=tf([1],[180,1]); %滤波器模型
dsys1 = c2d(sys1,ts,'tucsin');%模型离散化
[num1,den1]=tfdata(dsys1,'v');
 d_filter_out_1=0;
 y_noise_1=0;


%设置pid参数
k_p=0.3;
k_i=0.0055;
k_d=42;

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


%噪声信号
for j=1:1:100
    noise(j)=0.01*rands(1); %信号里面的高频噪声
end


y = zeros(1,100);%初始化输出信号
y_noise=zeros(1,100);
y_feed=zeros(1,100);%反馈回来的信号,y_feed=y
d_out = 0;%微分器的输出
d_out_1 = 0;%微分器的上一时刻输出
d_filter_out=zeros(1,100);%微分器的输出经过滤波器后的输出
erro = zeros(1,100);%信号差值
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用来选择是否用不完全篇pid
% m=1:用不完全篇pid
% m=2:不用不完全篇pid
M=input('input the m:');

if  M==1
    for k=1:1:100
    time(k)=k*ts;  %存储时间,用于后面画图
 
    y(k) = -den(2)*y_1+num(2)*pi_out_5 ;%控制对象
    y_noise(k)= y(k)+noise(k);
    y_feed(k)=y_noise(k);
    %y_filter_out(k) = -den1(2)*y_filter_out_1+num1(1)*y_noise(k)+num1(2)*y_noise_1;
   
    
    erro(k) =y_d(k) -  y_feed(k) ;
    erro_total = erro_total +erro(k) ;
    d_out= k_d*(erro(k)-erro_1)/ts;
    d_filter_out=-den1(2)*d_filter_out_1+num1(1)* d_out+num1(2)*d_out_1;
    
    pi_out = k_p*erro(k) +k_i*erro_total*ts+d_filter_out;
       
   %更新系统输出状态
   y_1=y(k);
   erro_1= erro(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;
   
   %更新滤波器的状态
   d_filter_out_1=d_filter_out;
   
   %更新微分器的状态
   d_out_1 = d_out;
    
   end

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

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

if  M==2
    for k=1:1:100
    time(k)=k*ts;  %存储时间,用于后面画图
 
    y(k) = -den(2)*y_1+num(2)*pi_out_5 ;%控制对象
    y_noise(k)= y(k)+noise(k);
    %y_filter_out(k) = -den1(2)*y_filter_out_1+num1(1)*y_noise(k)+num1(2)*y_noise_1;
    y_feed(k)=y_noise(k);
    
    erro(k) =y_d(k) -  y_feed(k) ;
    erro_total = erro_total +erro(k) ;
    
    pi_out = k_p*erro(k) +k_i*erro_total*ts+k_d*(erro(k)-erro_1)/ts;
       
   %更新系统输出状态
   y_1=y(k);
   erro_1= erro(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;
    
   end

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

结果:

不完全微分pid的matlab实现_第3张图片

不完全微分pid的matlab实现_第4张图片

可以看出引入不完全微分后能有效克服不足。

simulink:
不完全微分pid的matlab实现_第5张图片

不完全微分pid的matlab实现_第6张图片

不完全微分pid的matlab实现_第7张图片

你可能感兴趣的:(matlab)