前言:之前写过一个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');