Main Content

システム同定を使用したモデル コンポーネントの線形化の指定

以下の例では、うまく線形化されないモデル コンポーネントの線形化を、System Identification Toolbox™ を使用して同定された線形モデルを使って指定する方法を説明します。この例には Simscape™ Electrical™ ソフトウェアが必要です。

ハード ドライブ モデルの線形化

ハード ドライブ用の Simulink® モデルを開きます。

model = 'scdpwmharddrive';
open_system(model)

このモデルでは、ハード ドライブ プラントは電流源で駆動されています。電流源は、出力がデューティ比で調整できるようパルス幅変調 (PWM) 信号で駆動される回路で実装されています。ハード ドライブ モデルの詳細については、ハード ディスク ドライブのデジタル サーボ制御を参照してください。

PWM 駆動の回路には通常、このモデル内の MOSFET トランジスタなどのように、平均的動作が十分に定義されていない高周波数スイッチング コンポーネントがあります。したがって、このタイプの回路の正確な線形化を求めるには問題があります。モデルをデューティ比入力から位置誤差へ線形化すると、その結果はゼロになります。

このモデルの Simscape ソルバーはローカル ソルバー モードで実行するように設定されています。モデルを線形化するときは、まずローカル ソルバーをオフにします。

SimscapeSolver = [model '/PWM driven converter/Solver Configuration'];
set_param(SimscapeSolver,'UseLocalSolver','off')

モデルを線形化します。

io(1) = linio('scdpwmharddrive/Duty cycle',1,'input');
io(2) = linio('scdpwmharddrive/Hard Disk Model',1,'output');
sys = linearize(model,io)
sys =
 
  D = 
                 Duty cycle
   position err           0
 
Static gain.

予想どおり、PWM コンポーネントが原因でシステムはゼロに線形化します。

シミュレーション用にローカル ソルバーを再びオンにします。

set_param(SimscapeSolver,'UseLocalSolver','on')

PWM コンポーネントの線形モデルの発見

PWM 駆動の電流源の周波数応答を推定し、その結果を線形モデルの同定に使用できます。

電流の信号は 1e-7 の離散サンプル時間をもちます。したがって、サンプル時間が固定された sinestream 信号を推定の入力信号として使用する必要があります。2,000 ~ 200,000 rad/s の周波数をもつ信号を作成します。

idinput = frest.createFixedTsSinestream(Ts,{2000,200000});
idinput.Amplitude = 0.1;

PWM 駆動回路の入力および出力ポイントを定義し、sinestream の入力信号を使用して周波数応答の推定を実行します。

pwm_io(1) = linio('scdpwmharddrive/Duty cycle',1,'input');
pwm_io(2) = linio('scdpwmharddrive/PWM driven converter',1,'openoutput');
sysfrd = frestimate(model,pwm_io,idinput);

周波数応答データを使って 2 次モデルを同定するために、System Identification Toolbox の関数 tfest を使用します。

sysid = ss(tfest(idfrd(sysfrd),2));

特定したモデルを元の周波数応答データと比較します。

bode(sysid,sysfrd,'r*')

周波数応答の推定には、2,000 ~ 200,000 rad/s の周波数を使用しました。同定されたモデルは、2,000 rad/s 未満の周波数に対して平坦な振幅応答を見せます。しかし、これらの周波数は前の推定に含まれませんでした。

周波数応答が低周波数で平坦であるかどうかを検証するため、20 ~ 200 rad/s の周波数をもつ sinestream の入力信号を使用して応答を推定します。

lowfreq = [20 200];
inputlow = frest.createFixedTsSinestream(Ts,lowfreq)
 
The sinestream input signal:
 
      Frequency           : [20 200] (rad/s)
      Amplitude           : 1e-05
      SamplesPerPeriod    : [3141593 314159]
      NumPeriods          : 4
      RampPeriods         : 0
      FreqUnits (rad/s,Hz): rad/s
      SettlingPeriods     : 1
      ApplyFilteringInFRESTIMATE (on/off)    : on
      SimulationOrder (Sequential/OneAtATime): Sequential
 

1e-7 秒の高速なサンプル時間 (10 MHz のサンプリング周波数) と低い周波数の組み合わせによって、入力信号に対して高い SamplesPerPeriod 値が生成されます。この場合、各周波数が 4 周期あることを考慮すると、周波数応答推定は約 1400 万サンプルの出力データを記録することになります。

20 rad/s と 200 rad/s の周波数の解析にそのような高いサンプリング レートは不要なため、サンプル時間を 1e-4 に伸ばすことによってメモリの問題を回避できます。

Tslow = 1e-4;
wslow = 2*pi/Tslow;
inputlow = frest.createFixedTsSinestream(Tslow,wslow./round(wslow./lowfreq));
inputlow.Amplitude = 0.1;

モデルを小さいサンプル時間に対応させるには、以下の修正モデルのように、レート変換ブロックを使用して出力データ ポイントをリサンプリングします。

modellow = 'scdpwmharddrive_lowfreq';
open_system(modellow)

次のコマンドを使用して低周波数の周波数応答を推定できます。

sysfrdlow = frestimate(modellow,getlinio(modellow),inputlow);

周波数応答の推定には数分かかります。この例では、推定結果を読み込みます。

load scdpwmharddrive_lowfreqresults

同定されたモデルの低周波数応答を検証するため、推定結果を同定されたモデルと比較します。

bode(sysid,sysfrdlow,'r*')

低周波数モデルを閉じます。

bdclose(modellow)

PWM コンポーネントの線形化の指定

同定された検証済みのモデルを使用して PWM 駆動コンポーネントの線形化を指定するには、PWM 駆動コンバーター サブシステムの線形化を指定します。

これを行うには、最初にコンバーター ブロックに対してブロックの線形化の指定を有効にします。

pwmblock = 'scdpwmharddrive/PWM driven converter';
set_param(pwmblock,'SCDEnableBlockLinearizationSpecification','on');

MATLAB® 式を使用して、ブロックの線形化として sysid を指定します。

rep = struct('Specification','sysid',...
             'Type','Expression',...
             'ParameterNames','',...
             'ParameterValues','');
set_param(pwmblock,'SCDBlockLinearizationSpecification',rep);

デューティ比基準信号のサンプル時間をプラントのサンプル時間に設定します。

set_param('scdpwmharddrive/Duty cycle','SampleTime','Ts_plant');

モデルを線形化します。

set_param(SimscapeSolver,'UseLocalSolver','off')
sys = linearize(model,io);
set_param(SimscapeSolver,'UseLocalSolver','on')

以下のコマンドで、周波数応答を推定して線形化結果全体を検証できます。

valinput = frest.Sinestream(sys);
valinput = fselect(valinput,3e3,1e5);
valinput.Amplitude = 0.1;
sysval = frestimate(model,io,valinput);

周波数応答の推定には数分かかります。この例では、推定結果を読み込みます。

load scdpwmharddrive_valfreqresults
bodemag(sys,sysval,'r*')

線形化の結果は正確であり、すべての共振がモデルの実際のダイナミクスに存在します。

モデルを閉じます。

bdclose('scdpwmharddrive')

参考

| (System Identification Toolbox)

関連するトピック