Main Content

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

SYSTUNE を使用したベクトル コントローラーの調整

この例では、systune コマンドを使用して、周波数応答推定 (FRE) の結果に基づき永久磁石同期機 (PMSM) のベクトル制御 (FOC) を調整する方法を説明します。

ベクトル制御

この例では、永久磁石同期機 (PMSM) のベクトル制御 (FOC) を、Simscape™ Electrical™ コンポーネントを使用して Simulink® でモデル化します。

mdl = 'scdfocmotorSystune';
open_system(mdl)
SignalEditorPath = [mdl,'/System_Inputs/Reference_System_Inputs'];

ベクトル制御は三相固定子電流をベクトルとして制御します。FOC は、時間および速度に依存する三相システムを 2 つの時不変座標系に変換する投影に基づいています。これらの変換は、Clarke 変換、Park 変換、およびそのそれぞれの逆変換です。これらの変換は Controller_Algorithm サブシステム内のブロックとして実装されます。

AC モーターの制御に FOC を使用する利点には次が含まれます。

  • トルクと磁束を個別に直接制御

  • 過渡状態および定常状態を正確に管理

  • DC モーターと比べて同様の性能

Controller_Algorithm サブシステムは 3 つすべての PI コントローラーを含みます。外側のループの PI コントローラーはモーターの速度を調整します。内側のループの PI コントローラー 2 つは d 軸と q 軸の電流を個別に制御します。外側のループの PI コントローラーからのコマンドは、q 軸に直接送られてトルクを制御します。このタイプの AC モーターでは回転子の磁束が永久磁石で固定されているため、d 軸のコマンドは PMSM ではゼロになります。

コントローラーを調整する前に、元のコントローラーでの速度応答を確認し、シミュレーション結果を MAT ファイル SystunedSpeed.mat に保存します。既存の速度の PI コントローラーのゲインは P = 0.08655 および I = 0.1997 です。電流の PI コントローラーのゲインはどちらも P = 1 および I = 200 です。

scdfocmotorSystuneOriginalResponse

元のコントローラーでの速度応答をプロットします。プロットは定常偏差を示し、過渡動作が比較的遅いことがわかります。コントローラーを調整して性能を向上できます。

figure
plot(logsout_original_oneside{2}.Values);
hold on
plot(logsout_original_oneside{1}.Values);
legend('Original Controller','Speed Reference','Location','southeast');
grid on
hold off

figure
plot(logsout_original_twoside{2}.Values);
hold on
plot(logsout_original_twoside{1}.Values);
legend('Original Controller','Speed Reference','Location','northeast');
grid on
hold off

周波数応答データの収集

周波数応答データを収集するには、150 ラジアン/秒の速度での操作点を見つけ、線形解析ポイントを指定し、入力信号を定義して、周波数応答を推定します。

元のコントローラーを切断し、VD コマンドと VQ コマンドで開ループ システム モデルをシミュレートします。操作点に到達するために、ctrlIniValues 構造体を使用して初期の電圧を VD では -0.1 V、VQ では 3.465 V に指定します。定電圧コマンド ブロックは switchIniValue 構造体でスイッチ信号を設定することにより接続されます。

switchIniValue.openLoopD = 1;
switchIniValue.openLoopQ = 1;
ctrlIniValues.voltageD = -0.1;
ctrlIniValues.voltageQ = 3.465;

3 秒でのシミュレーションのスナップショットを周波数応答推定のための操作点として取得します。

set_param(SignalEditorPath,'ActiveScenario',...
    'Test_Case_150_rad_sec_Steady_state');
op = findop(mdl,3);

シミュレーションのスナップショットの操作点をモデルの初期条件として使用します。ctrlIniValues 構造体内のモデルの初期値を、この定常状態になるよう変更します。d 軸の電流コントローラーでは電流 ID が 0 A です。q 軸の電流コントローラーでは電流 IQ が 0.1 A です。外側のループの速度コントローラーでは指令電流が 0.122 A、速度が 150 rad/s です。PMSM プラントで、pmsm 構造体の回転子速度を 150 rad/s に設定します。

set_param(mdl,'LoadInitialState','on');
set_param(mdl,'InitialState','getstatestruct(op)');
ctrlIniValues.currentDIC = 0;
ctrlIniValues.currentQIC = 0.1;
ctrlIniValues.speedIC = 150;
ctrlIniValues.speedCurrent = 0.122;
pmsm.RotorVelocityInit = 150;

周波数応答推定のための線形解析ポイントをモデルに追加します。開ループの入力ポイントを VD と VQ に追加します。開ループの出力ポイントを ID、IQ、および速度に追加します。さらに、ループの中断の解析ポイントを速度測定に追加します。

io = getlinio(mdl);

固定サンプル時間 4e-6 秒、つまり電流制御ループ sampleTime.CurrentControl のサンプル時間で、10 から 10,000 rad/s までの入力 sinestream 信号を定義します。sinestream 信号の振幅は 0.25 V です。この振幅により、プラントは飽和制限内で確実に正しく励起されます。励起の振幅が大きすぎたり小さすぎたりすると、周波数応答の推定結果が不正確になります。

in = frest.createFixedTsSinestream(sampleTime.CurrentControl,{10,1e4});
in.Amplitude = 0.5;

io の線形解析ポイントおよび in の入力信号を使用して、指定された定常状態操作点 op での周波数応答を推定します。周波数応答の推定を終了した後、結果のモデルで入出力チャネル名を変更し、周波数応答をプロットします。

estsys = frestimate(mdl,op,io,in);
estsys.InputName = {'Vd','Vq'};
estsys.OutputName = {'Id','Iq','speed'};
figure
bode(estsys,'.')

systune を使用した制御システムの調整

周波数応答推定の結果から状態空間の線形システム モデルを取得します。関数 ssest のオプション セットを使用して、この反復パラメーター推定に使用される数値探索法をレーベンバーグ・マルカート法の最小二乗探索に設定します。4 つの状態と 4e-6 秒の周期をもつ状態空間モデルを推定します。この手順には System Identification Toolbox™ ソフトウェアが必要です。

optssest = ssestOptions('SearchMethod','lm');
optssest.Regularization.Lambda = 0.1;
sys_singletune = ssest(estsys,4,'Ts',sampleTime.CurrentControl,optssest);

PMSM FOC モデルの 3 つすべての PI コントローラーを調整するには、次のブロック線図に示すような制御システムを作成します。

3 つの調整可能な離散時間 PID ブロックと、d 軸電流制御、q 軸電流制御、および速度制御のための I/O を定義します。これらの離散時間 PID コントローラーのサンプル時間は一貫していなければならず、電流制御ループのサンプル時間と同じでなければなりません。高速なコントローラーの近似の精度が元の低速なコントローラーと比較して確実に高くなるように、各 PID コントローラーの離散積分器の式を 'Trapezoidal' に設定します。

Cd = tunablePID('Cd','pi',sampleTime.CurrentControl);
Cd.IFormula = 'Trapezoidal';
Cd.u = 'Id_e';
Cd.y = 'Vd';

Cq = tunablePID('Cq','pi',sampleTime.CurrentControl);
Cq.IFormula = 'Trapezoidal';
Cq.u = 'Iq_e';
Cq.y = 'Vq';

Cspeed = tunablePID('Cspeed','pi',sampleTime.CurrentControl);
Cspeed.IFormula = 'Trapezoidal';
Cspeed.u = 'speed_e';
Cspeed.y = 'Iq_ref';

内側と外側のフィードバック ループのために 3 つの加算結合を作成します。

sum_speed = sumblk('speed_e = speed_ref - speed');
sum_id = sumblk('Id_e = Id_ref - Id');
sum_iq = sumblk('Iq_e = Iq_ref - Iq');

コントローラーを調整するための入力、出力、および解析ポイントを定義します。

input = {'Id_ref','speed_ref'};
output = {'Id','Iq','speed'};
APs = {'Iq_ref','Vd','Vq','Id','Iq','speed'};

最後に、これらのコンポーネントを使用して完全な制御システム ST0 を組み立てます。

ST0 = connect(sys_singletune,Cd,Cq,Cspeed,sum_speed,sum_id,sum_iq,input,output,APs);

コマンドの追従を確実にするための追従目標とループ整形目標や、飽和を回避するためのゲイン目標を含む、調整目標を定義します。速度コントローラーでは、追従帯域幅を 150 rad/s に設定します。この帯域幅は追従目標とループ整形目標の両方で使用されます。さらに、DC 誤差を 0.001 に設定して、最大定常状態誤差の 0.1% を反映させます。ピーク偏差は 10 に設定します。d 軸の電流コントローラーでは、追従帯域幅を 2500 rad/s に設定します。これは外側のループの速度コントローラーよりもずっと高速です。コントローラーの飽和を防ぐため、3 つすべてのコントローラーのゲインを制約する目標を指定します。

TR1 = TuningGoal.Tracking('speed_ref','speed',2/150,0.001,10);
TR2 = TuningGoal.Tracking('Id_ref','Id',2/2500);
LS1 = TuningGoal.LoopShape('Id',2500);
LS2 = TuningGoal.LoopShape('speed',150);
MG1 = TuningGoal.Gain('speed_ref','Iq_ref',2);
MG2 = TuningGoal.Gain('speed_ref','Vq',50);
MG3 = TuningGoal.Gain('Id_ref','Vd',20);

作成したモデル ST0 を基にすべての調整目標を指定し、systune を使用して 3 つすべての PI コントローラーを調整します。すべての設計要件を満たすパラメーター値の検出確率を高めるため、ランダムに生成された 5 つのパラメーター値で開始する追加の最適化を 5 つ実行するように systune のオプションを設定します。

opt = systuneOptions('RandomStart',5);
rng(2)
[ST1,fSoft] = systune(ST0,[TR1,TR2,LS1,LS2,MG1,MG2,MG3],opt);
Final: Soft = 1.01, Hard = -Inf, Iterations = 62
Final: Soft = 497, Hard = -Inf, Iterations = 71
       Some closed-loop poles are marginally stable (decay rate near 1e-07)
Final: Soft = 1.01, Hard = -Inf, Iterations = 55
       Some closed-loop poles are marginally stable (decay rate near 1e-07)
Final: Soft = 1.01, Hard = -Inf, Iterations = 54
Final: Soft = 1.01, Hard = -Inf, Iterations = 51
Final: Soft = 1.01, Hard = -Inf, Iterations = 47

systune を使用して解を見つけた後、調整されたモデル ST1 でどのように調整目標が満たされているかを確認します。追従、ループ整形、およびゲイン調整の目標を別々に表示します。次の図では、破線が調整目標を表し、実線は調整されたコントローラーの結果です。

figure
viewGoal([TR1,TR2],ST1)
figure
viewGoal([LS1,LS2],ST1)
figure
viewGoal([MG1,MG2,MG3],ST1)

調整目標を確認した後、調整されたモデル ST1 からコントローラー パラメーターを抽出します。調整された PI コントローラー パラメーターを使用して、PI コントローラー ブロックのワークスペース パラメーターを更新します。

Cd = getBlockValue(ST1,'Cd');
Cq = getBlockValue(ST1,'Cq');
Cspeed = getBlockValue(ST1,'Cspeed');

d 軸の電流の PI コントローラーの調整されたゲインは次のようになります。

paramCurrentControlPD = Cd.Kp
paramCurrentControlID = Cd.Ki
paramCurrentControlPD =

    2.5952


paramCurrentControlID =

   2.4166e+03

q 軸の電流の PI コントローラーの調整されたゲインは次のようになります。

paramCurrentControlPQ = Cq.Kp
paramCurrentControlIQ = Cq.Ki
paramCurrentControlPQ =

    5.5948


paramCurrentControlIQ =

  707.6873

速度の PI コントローラーの調整されたゲインは次のようになります。

paramVelocityControlTuneP = Cspeed.Kp
paramVelocityControlTuneI = Cspeed.Ki
paramVelocityControlTuneP =

    0.3643


paramVelocityControlTuneI =

    0.4932

systune を使用して 3 つすべてのコントローラーを一緒に調整した後、コントローラーのゲインが元の値と大きく異なっています。速度制御ループの PID コントローラーはサンプル時間が異なり、0.001 秒です。調整された結果では異なるサンプル時間 4e-6 秒を使用していますが、コントローラーのゲインは同じです。異なるサンプル時間でコントローラーの性能が同一になることを確認するために、この例では PID コントローラーの離散積分器の形式を '台形則' にしています。

調整されたコントローラーの検証

調整されたコントローラー ゲインを使用して性能を調べます。最初に、ctrlIniValues を使用して、モデルをそのゼロ初期条件に初期化します。switchIniValue のスイッチ信号を設定して PID コントローラー ブロックを接続し、適切な初期条件を PMSM プラント モデルに設定します。

switchIniValue.openLoopQ = 0;
switchIniValue.openLoopD = 0;
ctrlIniValues.currentDIC = 0;
ctrlIniValues.voltageD = 0;
ctrlIniValues.currentQIC = 0;
ctrlIniValues.voltageQ = 0;
ctrlIniValues.speedIC = 0;
ctrlIniValues.speedCurrent = 0;
pmsm.RotorVelocityInit = 0;
set_param(mdl,'LoadInitialState','off')

片側速度コマンド信号を使用するようにモデルを設定し、モデルをシミュレートします。0.05 秒時点で 0 rad/s から 150 rad/s に上昇し、その後 0.8 秒時点で 200 rad/s へと上昇する片側速度コマンドに対する、モデルの速度応答を表示します。シミュレーション結果を MAT ファイル SystunedSpeed.matlogsout_tuned_oneside に保存します。

set_param(SignalEditorPath,'ActiveScenario','Test_Case_150_rad_sec_No_load');
sim(mdl);
logsout_tuned_oneside = logsout;
save('SystunedSpeed','logsout_tuned_oneside','-append')

両側速度コマンド信号を使用するようにモデルを設定し、モデルをシミュレートします。0.05 秒時点で 0 rad/s から 150 rad/s に上昇し、0.5 秒時点で方向を反転して 0.8 秒時点で 0 rad/s に戻る両側速度コマンドに対する、モデルの速度応答を表示します。シミュレーション結果を MAT ファイル SystunedSpeed.matlogsout_tuned_twoside に保存します。

set_param(SignalEditorPath,'ActiveScenario','Test_Case_1_150_rad_sec_No_load');
sim(mdl);
logsout_tuned_twoside = logsout;
save('SystunedSpeed','logsout_tuned_twoside','-append')

既存のコントローラー ゲインと調整された結果の間でモーター速度応答を比較します。1 秒のシミュレーションにわたる速度応答が並んで表示されています。速度応答はステップ コマンドにさらによく従っています。定常状態誤差も、PI コントローラーが systune で調整された後に減少しています。

scdfocmotorSystunePlotSpeed

コントローラーを調整した後、両方のタイプの速度コマンドについて、モーターの応答は過渡応答がより高速になり、定常状態誤差がより小さくなります。

bdclose(mdl)

参考

関連するトピック