几种常用的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')

在这里插入图片描述

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

iπ弟弟

如果可以的话,请杯咖啡吧!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值