几种常用的PID控制算法

位置式PID

  • 适用于被控对象不含积分环节。
  • 这种算法的实现也需要用到增量式PID的思想,不然求和项会随着控制时间的增大而大幅度增大,导致内存占用过多。
  • matlab仿真;
%-----------------位置式PID------------------%
e = [];
e(1) = 0; e(2) = 0; e(3) = 0;
u = []; u(1) = 0; u(2) = 0;
r = 1; y = []; y(1) = 0;
for i  = 0:0.01:10
    e(3) = r - y(end);
    deltau = 0.5*(e(3)-e(2))+0.5*e(3)+0.05*(e(3)-2*e(2)+e(1));
    u(2) = u(1) + deltau;
    y = [y,u(2)];
    e = [e(2:3),0];
    u = [u(2),0];
end
figure(1)
stairs(0:0.01:10,y(1:1001),'r-','LineWidth',1)
xlim([0,1])
ylim([0,1.5])
xlabel('t')
title('位置式PID')

在这里插入图片描述

增量式PID

  • 这种适用于被控对象含有积分环节,像步进电机这种。
  • matlab仿真:
%-----------------增量式PID------------------%
e = [];
e(1) = 0; e(2) = 0; e(3) = 0;
u = []; u(1) = 0; u(2) = 0;
r = 1; y = []; y(1) = 0;
for i  = 0:0.01:10
    e(3) = r - y(end);
    deltau = 0.4*(e(3)-e(2))+0.05*e(3)+0*(e(3)-2*e(2)+e(1));
    u(2) = deltau;
    y = [y,u(2)];
    e = [e(2:3),0];
    u = [u(2),0];
end
figure(2)
stairs(0:0.01:10,y(1:1001),'r-','LineWidth',1)
xlim([0,1])
ylim([0,1.5])
xlabel('t')
title('增量式PID')

在这里插入图片描述

积分分离的PID控制算法

  • 这种算法的出现是因为很多时候积分项在被控对象没有达到稳态的时候就达到很大的数值使控制器饱和,因此有必要在偏差很大的情况下抑制积分环节。
  • 示意图
    在这里插入图片描述
  • matlab仿真:
%-----------------积分分离PID------------------%
e = []; key = 0;                 
e(1) = 0; e(2) = 0; e(3) = 0;
u = []; u(1) = 0; u(2) = 0;
r = 1; y = []; y(1) = 0;
for i  = 0:0.01:10
    e(3) = r - y(end);            
    if abs(e(3)) < 0.7 key = 1; else key = 0; end         %赋值限制小了会有稳态误差
    deltau = 0.5*(e(3)-e(2))+0.5*key*e(3)+0.05*(e(3)-2*e(2)+e(1));
    u(2) = u(1) + deltau;
    y = [y,u(2)];
    e = [e(2:3),0];
    u = [u(2),0];
end
figure(4)
stairs(0:0.01:10,y(1:1001),'r-','LineWidth',1)
xlim([0,1])
ylim([0,1.5])
xlabel('t')
title('积分分离PID')

在这里插入图片描述

带死区的PID控制算法

  • 示意图:
    在这里插入图片描述
  • matlab仿真:
%-----------------死区PID------------------%
e = [];
e(1) = 0; e(2) = 0; e(3) = 0;
u = []; u(1) = 0; u(2) = 0;
r = 1; y = []; y(1) = 0;
for i  = 0:0.01:10 
    e(3) = r - y(end);
    if abs(e(3))<0.1       %死区增大稳态误差增大
        e(3) = 0;
    end
    deltau = 0.5*(e(3)-e(2))+0.5*e(3)+0.05*(e(3)-2*e(2)+e(1));
    u(2) = u(1) + deltau;
    y = [y,u(2)];
    e = [e(2:3),0];
    u = [u(2),0];
end
figure(5)
stairs(0:0.01:10,y(1:1001),'r-','LineWidth',1)
xlim([0,1])
ylim([0,1.5])
xlabel('t')
title('死区PID')

在这里插入图片描述

不完全微分PID控制算法

  • 示意图:
    在这里插入图片描述
    在这里插入图片描述
    抗干扰
  • matlab仿真:
%-----------------不完全微分PID------------------%
e = []; alpha = 0.5;
e(1) = 0; e(2) = 0; e(3) = 0;
u = []; u(1) = 0; u(2) = 0;  u1=[]; u1(1) = 0; u1(2) = 0;
r = 1; y = []; y(1) = 0;
for i  = 0:0.01:10
    e(3) = r - y(end);
    deltau = 0.5*(e(3)-e(2))+0.5*e(3)+0.05*(e(3)-2*e(2)+e(1));
    u(2) = u(1) + deltau;
    u1(2) = alpha*u1(1) + (1-alpha)*u(2);
    y = [y,u1(2)];
    e = [e(2:3),0];
    u = [u(2),0];
    u1 = [u1(2),0];
end
figure(3)
stairs(0:0.01:10,y(1:1001),'r-','LineWidth',1)
xlim([0,1])
ylim([0,1.5])
xlabel('t')
title('不完全微分PID')

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_43145941/article/details/105614360