一般的に使用されるいくつかの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