Main Content

ハード ディスク ドライブのデジタル サーボ制御

この例では、Control System Toolbox™ を使用してディスク ドライブの読み取り/書き込みヘッドのデジタル サーボ コントローラーを設計する方法を示します。

システムとモデルの詳細は、Franklin、Powell、Workman による『Digital Control of Dynamic Systems』の第 14 章を参照してください。

ディスク ドライブ モデル

モデル化するシステムの図を以下に示します。

ヘッド ディスク アセンブリ (HDA) およびアクチュエータは、2 つの剛体モードと 4 つの共振点がある 10 次の伝達関数によってモデル化されています。

モデルの入力は、ボイス コイル モーターを駆動する電流 ic、出力は、位置誤差信号 (PES、トラック幅の比 (%)) です。また、モデルには、わずかな遅延も含まれています。

ディスク ドライブ モデル:

$$ G(s) = G_r(s)G_f(s) $$

$$ G_r(s) = e^{-1e-5s}\frac{1e6}{s(s+12.5)} $$

$$ G_f(s) = \sum_{i=1}^{4} \frac{\omega_i(a_is+b_i\omega_i)}{s^2+2\zeta_i\omega_is+\omega_i^2} $$

主要な柔軟モードの結合係数、減衰、および固有振動数 (Hz 単位) は、以下に示されています。

モデル データ:

$$ (a_1,b_1,\zeta_1,\omega_1) = (.0000115,-.00575,.05,70) $$

$$ (a_2,b_2,\zeta_2,\omega_2) = (0,.0230,.005,2200) $$

$$ (a_3,b_3,\zeta_3,\omega_3) = (0,.8185,.05,4000) $$

$$ (a_4,b_4,\zeta_4,\omega_4) = (.0273,.1642,.005,9000) $$

このデータを基に、ヘッド アセンブリのノミナル モデルを作成します。

load diskdemo
Gr = tf(1e6,[1 12.5 0],'outputdelay',1e-5);
Gf1 = tf(w1*[a1 b1*w1],[1 2*z1*w1 w1^2]); % first  resonance
Gf2 = tf(w2*[a2 b2*w2],[1 2*z2*w2 w2^2]); % second resonance
Gf3 = tf(w3*[a3 b3*w3],[1 2*z3*w3 w3^2]); % third  resonance
Gf4 = tf(w4*[a4 b4*w4],[1 2*z4*w4 w4^2]); % fourth resonance
G = Gr * (ss(Gf1) + Gf2 + Gf3 + Gf4);     % convert to state space for accuracy

ヘッド アセンブリ モデルのボード応答を以下のようにプロットします。

cla reset
G.InputName = 'ic';
G.OutputName = 'PES';
h = bodeplot(G);
title('Bode diagram of the head assembly model');
setoptions(h,'Frequnits','Hz','XLimMode','manual','XLim', {[1 1e5]});

サーボ コントローラー

サーボ制御は、読み書きヘッドを「トラック上」に維持するために使用されます。サーボ コントローラー C(z) は、デジタルです。また、PES (トラックの中心からのオフセット) をゼロ近辺に維持するために設計されています。

ここで考慮されている外乱は、入力電流 ic 内のステップ変化 d です。この作業の目的は、適切な外乱の抑制性能のあるデジタル補償器 C(z) を設計することです。

デジタル サーボのサンプル時間は、Ts = 7e-5 sec (14.2 kHz) です。

現実的な設計仕様を以下に示します。

設計仕様:

  • 開ループ ゲイン > 20dB (100 Hz において)

  • 帯域幅 > 800 Hz

  • ゲイン余裕 > 10 dB

  • 位相余裕 > 45 度

  • ピーク閉ループ ゲイン < 4 dB

モデルの離散化

サーボ コントローラーはデジタルであるため、離散領域内に設計できます。このためには、C2D およびゼロ次ホールド (ZOH) 手法を使用して HDA モデルを離散化します。

cla reset
Ts = 7e-5;
Gd = c2d(G,Ts);
h = bodeplot(G,'b',Gd,'r'); % compare with the continuous-time model
title('Continuous (blue) and discretized (red) HDA models');
setoptions(h,'Frequnits','Hz','XLimMode','manual','XLim', {[1 1e5]});

コントローラー設計

ここでは、補償器の設計を行います。純積分器 1/(z-1) から開始し、ゼロ定常状態誤差の確保、開ループ モデル Gd*C の根軌跡のプロット、および [ツール] メニューの [ズームイン] オプションを使用したズームの z=1 付近でのズームを行います。

C = tf(1,[1 -1],Ts);
h = rlocusplot(Gd*C);
setoptions(h,'Grid','on','XLimMode','Manual','XLim',{[-1.5,1.5]},...
    'YLimMode','Manual','YLim',{[-1,1]});

z=1 での 2 つの極のため、サーボ ループは、すべての正のゲインに対して不安定になります。フィードバック ループを安定化するには、まず、z=1 近辺に 2 つのゼロ点を追加します。

C = C * zpk([.963,.963],-0.706,1,Ts);
h = rlocusplot(Gd*C);
setoptions(h,'Grid','on','XLimMode','Manual','XLim',{[-1.25,1.25]},...
    'YLimMode','Manual','YLim',{[-1.2,1.2]});

次に、軌跡をクリックし、黒い四角形を単位円内にドラッグしてループ ゲインを調整します。ループ ゲインが、データ マーカーに表示されます。約 50 のゲインによってループが安定化します (C1 = 50*C に設定)。

C1 = 50 * C;

ここで、電流のステップ外乱への閉ループの応答をシミュレートします。外乱は、スムーズに除外されますが、PES が大きすぎます (ヘッドがトラック中心から、トラック幅の 45% ずれています)。

cl_step = feedback(Gd,C1);
h = stepplot(cl_step);
title('Rejection of a step disturbance (PES = position error)')
setoptions(h,'Xlimmode','auto','Ylimmode','auto','Grid','off');

次に、開ループのボード応答と安定余裕を見てください。100 Hz でのゲインは、15 dB のみであり (仕様では 20 dB)、ゲイン余裕は 7dB のみです。このため、ループ ゲインの増加はできません。

margin(Gd*C1)

diskdemo_aux1(1);

さらに大きな低周波ゲインのための余裕を作成するには、ノッチ フィルターを 4000 Hz 共振点近辺に追加します。

w0 = 4e3 * 2*pi;                                 % notch frequency in rad/sec
notch = tf([1 2*0.06*w0 w0^2],[1 2*w0 w0^2]);    % continuous-time notch
notchd = c2d(notch,Ts,'matched');                % discrete-time notch
C2 = C1 * notchd;

h = bodeplot(notchd);
title('Discrete-time notch filter');
setoptions(h,'FreqUnits','Hz','Grid','on');

これで、ループ ゲインを安全に 2 倍にできます。結果として得られる 100 Hz での安定余裕およびゲインは、仕様に準拠しています。

C2 = 2 * C2;
margin(Gd * C2)

diskdemo_aux1(2);

ステップ外乱の抑制は、大幅に改善されました。PES は、現時点でトラック幅の 20% 以下に収まっています。

cl_step1 = feedback(Gd,C1);
cl_step2 = feedback(Gd,C2);
stepplot(cl_step1,'r--',cl_step2,'b')
title('2nd-order compensator C1 (red) vs. 4th-order compensator C2 (blue)')

T = Gd*C/(1+Gd*C) (閉ループ感度) 上で3dB のピーク ゲイン仕様が満足されているかどうかを確認します。

Gd = c2d(G,Ts);
Ts = 7e-5;

T = feedback(Gd*C2,1);
h = bodeplot(T);
title('Peak response of closed-loop sensitivity T(s)')

setoptions(h,'PhaseVisible','off','FreqUnits','Hz','Grid','on', ...
            'XLimMode','Manual','XLim',{[1e2 1e4]});

ピーク値を表示するには、軸を右クリックし、[特性] メニューの [ピーク応答] オプションを選択してから、マウスを青いマーカー上に置いたままにするか、クリックします。

ロバスト性解析

最後に、2 番目と 3 番目の柔軟モードの減衰と固有振動数での変化に対するロバスト性を解析します。

パラメーターの変動は以下になります。

$$ \omega_2 = 2200 \pm 10\% $$

$$ \omega_3 = 4000 \pm 20\% $$

$$ \zeta_2 = 0.005 \pm 50\% $$

$$ \zeta_3 = 0.05 \pm 50\% $$

極値 z2、w2、z3、w3 のすべての組み合わせに対応する 16 モデルの配列を生成します。

[z2,w2,z3,w3] = ndgrid([.5*z2,1.5*z2],[.9*w2,1.1*w2],[.5*z3,1.5*z3],[.8*w3,1.2*w3]);
for j = 1:16,
    Gf21(:,:,j) = tf(w2(j)*[a2 b2*w2(j)] , [1 2*z2(j)*w2(j) w2(j)^2]);
    Gf31(:,:,j) = tf(w3(j)*[a3 b3*w3(j)] , [1 2*z3(j)*w3(j) w3(j)^2]);
end
G1 = Gr * (ss(Gf1) + Gf21 + Gf31 + Gf4);

これらの 16 モデルを一度に離散化し、開ループ応答にパラメーターの変動がどのように影響を及ぼすかを確認します。メモ: 基礎となるモデルを識別するために任意の曲線をクリックします。

Gd = c2d(G1,Ts);
h = bodeplot(Gd*C2);

title('Open-loop response - Monte Carlo analysis')
setoptions(h,'XLimMode','manual','XLim',{[8e2 8e3]},'YLimMode','auto',...
    'FreqUnits','Hz','MagUnits','dB','PhaseUnits','deg','Grid','on');

これらの 16 モデルでのステップ外乱の抑制性能をプロットします。

stepplot(feedback(Gd,C2))
title('Step disturbance rejection - Monte Carlo analysis')

16 の応答のすべてがほとんど同じになります。このサーボ設計はロバストです。