%//==========================================================//
%ljk,revised 2010-7-4 wuxi pid
%Matlab仿真程序如下: %//
%==========================================================//
close all;clc;clear;
ts=0.001; %sampling periods of system//
%===================================//
sys=tf(200,[1,40,0]); % 200
% ----------
% s^2 + 40 s
%==================================//
dsys=c2d(sys,ts,'z');
%Transfer function:
% 9.868e-005 z + 9.737e-005
%-------------------------
% z^2 - 1.961 z + 0.9608
% Sampling time: 0.001
%=================================//
[num,den]=tfdata(dsys,'v');
%num:1.0e-004 * 0 0.9868 0.9737
%den: 1.0000 -1.9608 0.9608
u_1=0.0;u_2=0.0;u_3=0.0;
y_1=0.0;y_2=0.0;y_3=0.0;
x=[0,0,0]';
error_1=0; %
error_2=0; %
for k=1:1:1000;
time(k)=k*ts;
rin(k)=1.0; % reference input for PID ontrollor//
kp=5; %
ki=0.10;
kd=10;
%//
%//du(k)=kp[e(k)-e(k-1)]+ki*e(k)+...
%//kd*(e(k)-2e(k-1)+e(k-2)) %//
du(k)=kp*x(1)+kd*x(2)+ki*x(3);
u(k)=u_1+du(k); %//u(k)=u(k-1)+du(k) %//
%=========================//
if (u(k)>10)
u(k)=10;
end;
if (u(k)<-10)
u(k)=-10;
end;
%==========================//
%//y(n)=1.961y(n-1)-0.9608y(n-2)+9.868x(n-1)
%//+9.737x(n-2);
yout(k)=-den(2)*y_1-den(3)*y_2+num(2)*u_1+num(3)*u_2;
error=rin(k)-yout(k); %caculat the current error PID//
u_3=u_2;
u_2=u_1;
u_1=u(k); %//u_1 save the last control varible %
y_3=y_2;
y_2=y_1;
y_1=yout(k);
x(1)=error-error_1; %//x(1)=e(k)-e(k-1)//
%//x(2)=e(k)-2e(k-1)+e(k-2)
x(2)=error-2*error_1+error_2;
x(3)=error; %//x(3)=e(k); %//
error_2=error_1;
error_1=error;
end;
%//==============================================================//
plot(time,rin,'b',time,yout,'r');
%//plot reference value & pid result.///////
xlabel('time(s)');ylabel('rin,yout');
%//=============================================================//
评论0