增量式数字pid的matlab实现

前言:之前写过一个c++的增量式数字pid,其原理参考之前的博客,这里只是用matlab实现一下

https://blog.csdn.net/zouxu634866/article/details/79798477


clear all;
close all;

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

%设置pid参数
k_p=8;
k_i=0.1;
k_d=10;

%设置输入信号形式
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_2 = 0;%上上一时刻信号差值
y_1=0;%上一时刻的输出
y_2=0;%上一上一时刻的输出

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

pi_out = 0; %初始的pid控制输出值
delta_pi_out = 0; %初始的pid控制输出增量值

for k=1:1:500
    time(k)=k*ts;  %存储时间,用于后面画图
    erro=y_d(k)-y_feed;
    delta_pi_out = k_p*(erro - erro_1)+k_i*erro +k_d*(erro -2*erro_1+erro_2);
    pi_out =pi_out+delta_pi_out ;
    
    
    %对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+num(2)* pi_out_1+num(3)*pi_out_2;%控制对象
    y_feed= y(k);
    
    %更新系统输出状态
    y_2=y_1;
    y_1=y(k);
    
    %更新pid输出状态
    pi_out_2=pi_out_1;
    pi_out_1=pi_out;
    
    %更新信号差值状态
    erro_2=erro_1;
    erro_1=erro;
    
end



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

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值