一、位置式PID
按照模拟PID控制算法,以一系列采样时刻点KT代替连续时间t,用矩形法数值积分代替积分,以一阶向后差分代替微分。
1、一系列采样时刻点KT代替连续时间t
2、用矩形法数值积分代替积分
3、以一阶向后差分代替微分
最后可得离散化的PID表达式
式中T为采样时间(采样周期)
%设一被控对象G(s)=523500/(s^3+87.35s^2+10470S)
%采样时间为1ms,采用z变换进行离散化
clc
clear
ts=0.001; %采样时间
sys=tf(523500,[1 87.35 10470 0]); %tf是传递函数 即被控对象函数G();
dsys=c2d(sys,ts,'z'); %把控制函数离散化取Z变换n阶定常离散系统差分方程
%在零初始条件下取Z变换:
%dsys即Y(z)/U(z)
[num,den]=tfdata(dsys,'v');% 离散化后提取分子、分母
u_1=0.0; u_2=0.0; u_3=0.0; %z变换之后的系数
y_1=0.0; y_2=0.0; y_3=0.0;
x=[0,0,0]'; %分别误差e,误差e的差分,误差e的积分
error_1=0; %上一时刻误差
time=zeros(1,1000); %预分配内存
yd=zeros(1,1000);
u=zeros(1,1000);
y=zeros(1,1000);
error=zeros(1,1000);
for k=1:1:1000
time(k)=k*ts;%离散化的时间代表连续时间
yd(k)=1.0;%目标量
kp=0.5;
ki=0.001;
kd=0.001;
u(k)=kp*x(1)+kd*x(2)+ki*x(3);%PID输出
if u(k)>=10
u(k)=10;
end
if u(k)<=-10
u(k)=-10;
end
%Linear model 难点就是把传递函数转化为差分方程,以实现PID控制。
y(k)=-den(2)*y_1-den(3)*y_2-den(4)*y_3+num(2)*u_1+num(3)*u_2+num(4)*u_3;
%实际输出 num为dsys分子多项式系数,den为dsys分母多项式系数,从n阶定常离散系统差分方程变化来的。
error(k)=yd(k)-y(k); % 误差=输入-输出
u_3=u_2;
u_2=u_1; %保存上上次输入 为下次计算
u_1=u(k); %保存上一次控制系数 为下次计算
y_3=y_2;
y_2=y_1; %保存上上次次输出 为下次计算
y_1=y(k); %保存上一次输出 为下次计算
x(1)=error(k); %KP的系数
x(2)=(error(k)-error_1)/ts; %KD的系数
x(3)=x(3)+error(k)*ts; %KI的系数
error_1=error(k);
end
figure(1);
plot(time,yd,'b',time,y,'r'); %输入和实际控制输出
xlabel('time(s)'),ylabel('y,yd');
title('输入/输出图像对比')
figure(2);
plot(time,error,'r') %时间误差输出曲线
xlabel('time(s)');ylabel('error');
title('误差变化')
二、增量式P
u(k+1)=u(k)+🔺u(k)
%设一被控对象G(s)=400/(s^2+50s)
%采样时间为1ms,采用z变换进行离散化
clc
clear
ts=0.001;%采样时间
sys=tf(400,[1 50 0]);
dsys=c2d(sys,ts,'z');%采用z变换进行离散化
%把控制函数离散化取Z变换n阶定常离散系统差分方程
%在零初始条件下取Z变换:
%dsys即Y(z)/U(z)
[num,den]=tfdata(dsys,'v');%强制tfdata直接将分子和分母作为行向量而不是单元格数组返回
u1=0;u2=0;u3=0;%z变换之后的系数
y1=0;y2=0;y3=0;
x=[0 0 0]';%分别误差e,误差e的差分,误差e的积分
error1=0;
error2=0;
time=zeros(3000,1);%与分配内存
yd=zeros(3000,1);
u=zeros(3000,1);
y=zeros(3000,1);
for k=1:1:3000
time(k)=k*ts;%离散化的时间代表连续时间
yd(k)=1.0;%目标量
kp=8;
ki=0.10;
kd=10;
u(k)=kp*x(1)+kd*x(2)+ki*x(3);%PID输出
u(k)=u1+u(k);
if u(k)>=10
u(k)=10;
end
if u(k)<=-10
u(k)=-10;
end
%难点就是把传递函数转化为差分方程,以实现PID控制
y(k)=-den(2)*y1-den(3)*y2+num(2)*u1+num(3)*u2; %离散表达式输出
%如果传感器发生故障,u(k)发生大幅度变化,引起输出的变化
error=yd(k)-y(k);%误差=输入-输出
u1=u(k);u2=u1;u3=u2;
y1=y(k);y2=y1;y3=y2;
x(1)=error-error1;
x(2)=error-2*error1+error2;
x(3)=error;
error2=error1;
error1=error;
end
figure(1);
plot(time,yd,'r',time,y,'k','linewidth',2);
xlabel('time(s)');
ylabel('yd,y');
legend('Ideal Position value','tracking position value');