リニア電動アクチュエータの制御
この例では、slTuner と systune を使用して、飽和制限によりリニア電動アクチュエータの電流ループと速度ループを調整する方法を説明します。
リニア電動アクチュエータ モデル
リニア電動アクチュエータの Simulink® モデルを開きます。
open_system('rct_linact')

電気系コンポーネントと機械系コンポーネントは Simscape™ Electrical™ を使用してモデル化されています。制御システムは、DC モーターの駆動電流と角速度を制御する 2 つのカスケード フィードバック ループで構成されています。


図 1: 電流コントローラーと速度コントローラー。
内側のループ (電流) コントローラーは比例ゲインですが、外側のループ (速度) コントローラーには比例および積分動作があることに注意してください。両方のコントローラーの出力は +/- 5 に制限されます。
設計仕様
オーバーシュートを最小限に抑えた状態で、2000 rpm 速度要求に約 0.1 秒で応じるためには、比例ゲインおよび積分ゲインを調整する必要があります。モデルの初期ゲイン設定は P=50 および PI(s)=0.2+0.1/s で、対応する応答は図 2 に示されています。この応答は非常に低速で、負荷外乱に対して影響を受けすぎています。

図 2: 調整されていない応答。
制御システムの調整
systune を使用して両方のフィードバック ループを一緒に調整できます。設計を準備するには、調整ブロックのリストを使用して slTuner インターフェイスのインスタンスを作成します。すべてのブロックと信号はモデル内のそれらの名前で指定されます。モデルは t=0.5 で線形化され、t=0 での一部の導関数の不連続性を回避します。
TunedBlocks = {'Current PID','Speed PID'};
tLinearize = 0.5; % linearize at t=0.5
% Create tuning interface
ST0 = slTuner('rct_linact',TunedBlocks,tLinearize);
addPoint(ST0,{'Current PID','Speed PID'})
データ構造体 ST0 には、制御システムとその調整可能な要素の説明が含まれます。次に、DC モーターが 0.1 秒で 2000 rpm の速度要求に従うことを指定します。
TR = TuningGoal.Tracking('Speed Demand (rpm)','rpm',0.1);
これで、systune で比例ゲインおよび積分ゲインを調整できます。
ST1 = systune(ST0,TR);
Final: Soft = 1.03, Hard = -Inf, Iterations = 124
これにより、調整後のゲイン値を含む更新された説明 ST1 が返されます。この設計を検証するには、次のように速度要求から速度への閉ループ応答をプロットします。
T1 = getIOTransfer(ST1,'Speed Demand (rpm)',{'rpm','i'}); figure step(T1,0.5)

応答は線形領域で良好に見えるため、調整されたゲイン値を Simulink にプッシュし、非線形モデルで設計をさらに検証します。
writeBlockValue(ST1)
非線形シミュレーションの結果が図 3 に表示されています。非線形の動作は線形近似よりも大幅に悪くなります。図 4 は、内側の (電流) ループにおける飽和と発振を示しています。

図 3: 調整コントローラーの非線形シミュレーション。

図 4: 電流コントローラーの出力。
飽和の回避
ここまでは、外側 (速度) ループの目的の応答時間のみを指定しました。これにより、systune は内側のループと外側のループ間で制御操作を自由に割り当てることができます。内側のループの飽和は、比例ゲインが高すぎることおよび再分配が必要であることを示します。可能な修復方法の 1 つは、スピード コマンドから "現在の PID" 出力へのゲインを明示的に制限することです。速度指令が 2000 rpm で飽和制限が +/- 5 の場合、平均のゲインは 5/2000 = 0.0025 を超えません。標準的にするには、速度指令から "現在の PID" へのゲインを 0.001 未満で維持するようにします。これを行うには、ゲインの制約を追加し、両方の要件に対応するようコントローラーのゲインを再調整します。
% Mark the "Current PID" output as a point of interest addPoint(ST0,'Current PID') % Limit gain from speed demand to "Current PID" output to avoid saturation MG = TuningGoal.Gain('Speed Demand (rpm)','Current PID',0.001); % Retune with this additional goal ST2 = systune(ST0,[TR,MG]);
Final: Soft = 1.39, Hard = -Inf, Iterations = 52
最終的なゲイン 1.39 は、要件がほぼ満たされているが完全には満たされていないことを示します (すべての要件は、最終的なゲインが 1 未満の場合に満たされます)。viewGoal を使用して、各目標に対して調整コントローラーがどのようにふるまうかを検査します。
figure('Position',[100,100,560,550])
viewGoal([TR,MG],ST2)

次に、線形領域で 2 つの設計を比較します。
T2 = getIOTransfer(ST2,'Speed Demand (rpm)',{'rpm','i'}); figure step(T1,'b',T2,'g--',0.4) legend('Initial tuning','Tuning with Gain Constraint')

2 番目の設計はアグレッシブさが低くなりますが、応答時間の要件は満たしています。調整された PID ゲインの比較では、電流ループにおける比例ゲインが 18 から約 2 に減少したことを示しています。
showTunable(ST1) % initial tuning
Block 1: rct_linact/Current Controller/Current PID =
Kp = 18.4
Name: Current_PID
P-only controller.
-----------------------------------
Block 2: rct_linact/Speed Controller/Speed PID =
1
Kp + Ki * ---
s
with Kp = 0.402, Ki = 0.677
Name: Speed_PID
Continuous-time PI controller in parallel form.
showTunable(ST2) % retuning
Block 1: rct_linact/Current Controller/Current PID =
Kp = 2.44
Name: Current_PID
P-only controller.
-----------------------------------
Block 2: rct_linact/Speed Controller/Speed PID =
1
Kp + Ki * ---
s
with Kp = 0.426, Ki = 4.42
Name: Speed_PID
Continuous-time PI controller in parallel form.
この新しい設計を検証するには、新規の調整ゲイン値を Simulink モデルにプッシュし、2000 rpm の速度要求と 500 N の負荷外乱への応答をシミュレートします。シミュレーション結果を図 5 に示し、電流コントローラーの出力を図 6 に示します。
writeBlockValue(ST2)

図 5: ゲイン制約による調整の非線形応答。

図 6: 電流コントローラーの出力。
非線形応答は満たされて、電流ループは飽和しなくなります。追加されたゲインの制約によって、内側のループと外側のループ間の制御操作が適切に再平衡化されています。
参考
systune (slTuner) | slTuner | writeBlockValue | TuningGoal.Tracking | TuningGoal.Gain