Main Content

looptune を使用したフィードバック ループの調整

この例では、looptune コマンドを使用してフィードバック ループを調整する基本的なワークフローを示します。looptunesystune に似ており、ループ整形の設計を容易にするために、調整要件が自動的に生成されるようになっています。

エンジン速度の制御

この例では、次の図に示すシンプルなエンジン速度制御アプリケーションを使用します。この制御システムは、PID ループ 1 つで構成されており、PID コントローラーのゲインを調整することで、望ましいスピードがステップ変化した場合に適切に応答できるようにしなければなりません。具体的には、応答を 5 秒未満に、オーバーシュートなし (あるいはほとんどなし) で整定させるのが目標です。

次に示すエンジン ダイナミクスの 4 次モデルを使用します。

load rctExamples Engine
bode(Engine)
grid

調整可能な要素の指定

目的の性能を達成するには、4 つの PID ゲインを調整する必要があります。tunablePID オブジェクトを使用して PID コントローラーをパラメーター化します。

PID0 = tunablePID('SpeedController','pid')
Tunable continuous-time PID controller "SpeedController" with formula:

             1            s    
  Kp + Ki * --- + Kd * --------
             s          Tf*s+1 

and tunable parameters Kp, Ki, Kd, Tf.

Type "pid(PID0)" to see the current value.

フィードバック ループの調整可能なモデルの作成

looptune で、次の図に示される一般的な SISO または MIMO フィードバック ループを調整します。このフィードバック ループは、プラントとコントローラーの間の相互作用をモデル化したものです。これは "正" のフィードバック相互接続であることに注意してください。

スピード制御ループにおいて、プラント G はエンジン モデルであり、コントローラー C は PID コントローラーとプレフィルター F で構成されます。

looptune を使用するために、G および C のモデルを作成します。各モデルの入力と出力に名前を割り当てて、プラントとコントローラーの間のフィードバック パスを指定します。コントローラー C には、基準速度 r と測定速度 speed の 2 つの入力があることに注意してください。

F = tf(10,[1 10]);  % prefilter

G = Engine;
G.InputName = 'throttle';
G.OutputName = 'speed';

C0 = PID0 * [F , -1];
C0.InputName = {'r','speed'};
C0.OutputName = 'throttle';

ここで、C0 は、調整可能な PID ブロック PID0 に依存する一般化状態空間モデル (genss) です。

コントローラー パラメーターの調整

これで、looptune を使用して、単純な制御帯域幅要件に従って PID ゲインを調整できます。整定時間 5 秒を達成するには、開ループ応答のゲイン交差周波数が約 1 rad/s でなければなりません。この基本的な要件に対し、looptune は開ループ応答を自動的に整形して、積分動作、高周波数ロールオフ、および適切な安定余裕を提供します。追加の要件を指定して設計をさらに制約できることに注意してください。例については、蒸留塔の分離コントローラーを参照してください。

wc = 1;  % target gain crossover frequency 

[~,C,~,Info] = looptune(G,C0,wc);
Final: Peak gain = 0.928, Iterations = 7
Achieved target gain value TargetGain=1.

最終値が 1 未満であり、目的の帯域幅が達成され、ロールオフと安定余裕も適切であることがわかります。looptune から調整後のコントローラー C が返されます。PID ブロックの調整後の値を取得するには、getBlockValue を使用します。

PIDT = getBlockValue(C,'SpeedController')
PIDT =
 
             1            s    
  Kp + Ki * --- + Kd * --------
             s          Tf*s+1 

  with Kp = 0.000855, Ki = 0.00269, Kd = -7.83e-05, Tf = 0.877
 
Name: SpeedController
Continuous-time PIDF controller in parallel form.

結果の検証

loopview を使用して、設計を検証し、looptune によって暗黙的に適用されたループ整形要件を可視化します。

clf
loopview(G,C,Info)

次に、エンジン速度のステップ コマンドまでの閉ループ応答をプロットします。調整後の応答は要件を満たしています。

T = connect(G,C,'r','speed');  % closed-loop transfer function from r to speed
clf
step(T)

参考

関連するトピック