前言:这是针对数字离散系统的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');
相应的仿真结果如图:
评论(0)
您还未登录,请登录后发表或查看评论