降圧型DC-DCコンバータ(バックコンバータ)の理論と設計

モバイルバッテリーは 5 V を出しますが、中のリチウムイオンセルは 3.7 V です。ノートPCのACアダプタは 19 V を送ってくるのに、CPU が食べているのは 1 V 前後です。人工衛星のバスは 28 V で電力を配りますが、そこにぶら下がる無線機やセンサは 3.3 V や 1.8 V で動きます。この「入力電圧を、もっと低い電圧に変えて渡す」という地味な仕事を、95 % を超える効率でこなしているのが降圧型 DC-DC コンバータ(バックコンバータ)です。

抵抗で分圧しても電圧は下げられます。しかし 12 V から 5 V を 2 A で取り出すとき、抵抗分圧やリニアレギュレータでは差分の 7 V × 2 A = 14 W がまるごと熱になり、効率は 5/12 = 41.7 % で頭打ちになります。バックコンバータは「電圧を捨てる」のではなく「スイッチを高速に開閉して、時間平均で電圧を作る」ことで、この 14 W の大半を回収します。

この仕組みを理解すると、次のような場面で設計判断ができるようになります。

  • 電源 IC の選定と外付け部品の決定 — データシートに並ぶ「推奨インダクタ 22 µH」「出力コンデンサ 100 µF」がどこから来た数字なのか、自分で計算して検証できるようになります。
  • 効率と発熱の見積り — スイッチング周波数を上げると小型化できるが効率が落ちる、というトレードオフを定量的に扱えます。衛星やドローンのように「熱を捨てにくい」システムでは、この見積りが設計を左右します。
  • フィードバックループの安定化 — 出力コンデンサをセラミックに変えた瞬間に発振する、という現象の理由(ESR ゼロの消失)を、ボード線図の上で説明できるようになります。

本記事の内容

  • スイッチングで電圧を下げる仕組みの直感的な理解
  • ボルト秒平衡から $V_{out} = D V_{in}$ を導出する
  • リプル電流・出力リプル電圧・コンデンサ容量の設計式の導出
  • 連続導通モード(CCM)と不連続導通モード(DCM)の境界と、DCM の変換比の導出
  • 導通損とスイッチング損への分解と、最適スイッチング周波数の存在証明
  • 状態平均化による小信号モデルと、Type-II / Type-III 補償器の設計
  • 以上すべてを Python で数値的に検証する

前提知識

この記事を読む前に、以下の記事を読んでおくと理解が深まります。

インダクタの $v = L\,di/dt$、コンデンサの $i = C\,dv/dt$、そして一次遅れ系のボード線図が読めれば、この記事の内容はすべて追えます。

降圧コンバータとは — 「平均電圧」を作る回路

まず全体像を見てしまいましょう。次の図は、この記事で扱う降圧コンバータの回路そのものと、1 周期のあいだに行き来する 2 つの状態です。

降圧コンバータの回路構成とオン期間・オフ期間の電流経路

登場人物は 5 つだけです。ハイサイドのスイッチ $S_1$、還流ダイオード、インダクタ $L$、出力コンデンサ $C$、負荷 $R$。上段(オン期間)では $S_1$ が閉じて、電源からインダクタを通って負荷へ電流が流れ、同時にインダクタの電圧が正になるので電流が増えていきます。下段(オフ期間)では $S_1$ が開き、行き場を失ったインダクタ電流がダイオードを通って還流します。赤く太い線が「そのとき電流が流れている経路」、灰色が「電流が流れていない経路」です。この 2 枚を交互に高速で切り替えているだけ、というのがバックコンバータの正体です。

なぜこの構成になるのかを、身近な例から追ってみましょう。蛇口を全開と全閉の間で素早く切り替えることを想像してください。全開のときは毎秒 12 リットル出る蛇口を、1 秒のうち 0.42 秒だけ開けて残りを閉じれば、バケツには平均して毎秒 5 リットルたまります。蛇口の「開度」を絞ったわけではなく、開いている時間の割合だけで平均流量を決めているのがポイントです。

バックコンバータがやっているのはこれと同じことです。入力 12 V をスイッチで「つなぐ/切る」だけを繰り返し、つないでいる時間の割合を $D$(デューティ比)とすれば、スイッチの出口には平均 $D \times 12$ V のパルス列が現れます。あとはこの矩形波から高周波成分だけを取り除けば、なめらかな直流 5 V が残ります。

リニアレギュレータとスイッチングレギュレータの電力の行方の比較

左の図は 12 V から 5 V / 2 A を取り出すときの電力の行方です。リニアレギュレータは 24 W を入力して 10 W しか出せず、差の 14 W をまるごと熱として捨てます。同じ仕事をバックコンバータでやると入力は 10.37 W で済み、捨てる熱は 0.37 W。右の図が示すとおり、リニアレギュレータの効率は $V_{out}/V_{in}$ という「降圧幅そのもの」に縛られ、下げ幅が大きいほど効率が落ちます。一方バックコンバータの効率は降圧幅にほとんど依存せず、96 % 前後の水平線を保ちます。

ここでリニアレギュレータとの違いを噛み締めておきましょう。リニアレギュレータはトランジスタを「半開き」で使い、余った電圧を素子の両端にかけて熱として捨てます。トランジスタの両端に電圧 $V$ がかかり電流 $I$ が流れていれば、$P = VI$ の電力は必ず消えます。一方スイッチング方式では、スイッチは完全にオンか完全にオフの 2 状態しか取りません。オンのときは電流が流れますが両端電圧はほぼゼロ(オン抵抗 × 電流だけ)、オフのときは電圧はかかりますが電流はゼロ。どちらの状態でも $VI$ がほぼゼロなので、原理的には損失なしで電力を変換できます。実際に電力を食うのは、オンとオフを行き来する切り替えの瞬間と、オン抵抗による導通損だけです。

ではパルス列をどうやって直流に均すのか。抵抗とコンデンサの RC ローパスフィルタを使うと、抵抗でまた電力を捨ててしまいます。そこで抵抗を使わないローパスフィルタ、すなわち LC フィルタの出番になります。インダクタは理想的には電力を消費せず、エネルギーを磁界として一時的に預かるだけです。バックコンバータの「スイッチ+インダクタ+コンデンサ」という構成は、損失なしで平均化するという要求から必然的に出てくる形なのです。

スイッチノードの矩形波とその時間平均、LCフィルタ通過後の直流出力

上段の赤い矩形波がスイッチノードの電圧です。0 V と 12 V しか取らないのに、塗った部分(オン時間 $DT$)の割合を $D = 0.417$ にすると、破線で示した時間平均はちょうど 5.0 V になります。下段が LC フィルタを通したあとの出力で、8.8 mV のリプルは 5 V のスケールでは見えないほど小さく、実質的な直流になっています。電圧を「絞る」のではなく「時間で割る」ことで、損失なしに 5 V を作り出しているわけです。

次の節では、この回路が 1 周期のあいだにどんな 2 つの状態を行き来しているのかを、等価回路のレベルで見ていきます。

回路構成と 2 つのスイッチ状態

バックコンバータの最小構成は、ハイサイドスイッチ $S_1$(通常は P チャネル、あるいはブートストラップ駆動の N チャネル MOSFET)、ローサイドの還流経路(ダイオード、または同期整流用の MOSFET $S_2$)、インダクタ $L$、出力コンデンサ $C$、そして負荷 $R$ です。$S_1$ と還流経路の接続点をスイッチノードと呼び、その電圧を $v_{sw}$ と書きます。

オン期間($0 \le t < DT$)は $S_1$ が閉じ、スイッチノードが入力につながります。

$$ v_{sw} = V_{in}, \qquad v_L = V_{in} – V_{out} $$

インダクタの両端には $V_{in} – V_{out} > 0$ の電圧がかかるので、$v_L = L\,di_L/dt$ より電流は一定の傾き $(V_{in}-V_{out})/L$ で増加します。このとき電源から負荷へ電力が供給されると同時に、インダクタには磁気エネルギー $\frac{1}{2}L i_L^2$ が蓄えられていきます。

オフ期間($DT \le t < T$)は $S_1$ が開きます。ここでインダクタの性質が効きます。インダクタは電流を急に止められない(止めようとすると $di/dt$ が無限大になり、$v = L\,di/dt$ で無限大の電圧が発生してしまう)ので、電流は流れ続けようとします。その行き先を用意するのが還流ダイオード(または同期整流 MOSFET)で、スイッチノードはグランド側にクランプされます。

$$ v_{sw} \approx 0, \qquad v_L = -V_{out} $$

インダクタ電圧が負に反転したので、電流は傾き $-V_{out}/L$ で減少します。蓄えたエネルギーを負荷に吐き出しているフェーズです。

この 2 状態を繰り返すと、$v_{sw}$ は 0 と $V_{in}$ を行き来する矩形波、$i_L$ は増加と減少を繰り返す三角波になります。三角波の平均値が負荷電流 $I_{out}$ に等しく、その上に乗った振幅がリプル電流です。

ここまでは「何が起きているか」の記述でした。次は、この 2 状態の繰り返しから、出力電圧が $D V_{in}$ に決まってしまうことを厳密に導きます。

ボルト秒平衡から $V_{out} = D V_{in}$ を導く

回路が定常状態にあるとは、1 周期後にすべての状態量が元に戻ることを言います。インダクタ電流について書けば

$$ i_L(t_0 + T) = i_L(t_0) $$

です。もしこれが成り立たなければ、電流は毎周期じわじわ増え(あるいは減り)続けることになり、定常状態ではありません。

インダクタの基本式 $v_L = L\,\dfrac{di_L}{dt}$ を 1 周期にわたって積分します。左辺はインダクタ電圧の時間積分、右辺は電流変化です。

$$ \int_{t_0}^{t_0+T} v_L(t)\,dt = L\bigl[i_L(t_0+T) – i_L(t_0)\bigr] $$

定常状態の条件から右辺は 0 になります。したがって

$$ \begin{equation} \int_{t_0}^{t_0+T} v_L(t)\,dt = 0 \qquad\Longleftrightarrow\qquad \langle v_L \rangle = 0 \end{equation} $$

インダクタ電圧の正負の面積がつり合うボルト秒平衡と、1周期で元に戻るインダクタ電流

上段がインダクタ電圧 $v_L$ の波形です。オン期間は $+7$ V が 1.39 µs 続いて赤い面積 $9.72$ V·µs を作り、オフ期間は $-5$ V が 1.94 µs 続いて青い面積 $-9.72$ V·µs を作ります。この 2 つがぴったり打ち消し合っている、というのがボルト秒平衡です。下段はその面積を $L$ で割って累積したもの、すなわちインダクタ電流で、1 周期後にきっちり元の値へ戻っています。面積がつり合うことと、電流が周期的であることは同じ事実の裏表だと図から読み取れます。

定常状態では、インダクタ電圧の 1 周期平均は必ずゼロになる。 これをボルト秒平衡(volt-second balance、インダクタ電圧の面積つり合い)と呼びます。「電圧 × 時間」の次元を持つ量がプラス側とマイナス側で釣り合う、というイメージです。バックコンバータに限らず、ブースト・バックブースト・フライバックなど、あらゆるスイッチング電源の変換比はこの原理から出ます。

では前節で求めた $v_L$ を代入しましょう。オン期間は $v_L = V_{in} – V_{out}$ が $DT$ 秒、オフ期間は $v_L = -V_{out}$ が $(1-D)T$ 秒続くので、積分は 2 つの長方形の面積の和になります。

$$ (V_{in} – V_{out})\,DT \;+\; (-V_{out})\,(1-D)T = 0 $$

両辺を $T$($T \neq 0$)で割ります。

$$ (V_{in} – V_{out})D – V_{out}(1-D) = 0 $$

左辺を展開すると $D V_{in} – D V_{out} – V_{out} + D V_{out} = 0$ となり、$-D V_{out}$ と $+D V_{out}$ が消えます。残るのは

$$ \begin{equation} V_{out} = D\,V_{in} \end{equation} $$

きれいな結果です。出力電圧は入力電圧とデューティ比だけで決まり、負荷抵抗にもインダクタンスにもコンデンサ容量にも依存しません。 これがバックコンバータが「電圧源」として振る舞える理由です。$0 \le D \le 1$ なので $V_{out} \le V_{in}$、つまり必ず降圧になります。昇圧したければ別のトポロジ(ブーストコンバータ)が必要です。

同じ結果は別の見方でも得られます。スイッチノード電圧 $v_{sw}$ の平均値は、$V_{in}$ が $D$ の割合、0 が $(1-D)$ の割合なので $\langle v_{sw}\rangle = D V_{in}$。定常状態でインダクタの平均電圧はゼロ、つまりインダクタは直流的にはただの導線なので、$V_{out} = \langle v_{sw}\rangle = D V_{in}$。LC フィルタが矩形波の直流成分だけを通した、という解釈です。どちらの見方も本質は同じですが、後者は「フィルタ」としての理解につながるので覚えておくと便利です。

なお実際の回路では、MOSFET のオン抵抗 $R_{ds(on)}$、インダクタの直流抵抗 DCR、ダイオードの順方向電圧 $V_f$ による電圧降下があるため、出力は $D V_{in}$ よりわずかに低くなります。後の数値実験では、DCR = 30 mΩ で 2 A 流したときに約 60 mV 低い 4.94 V になることを確認します。

さて、出力電圧の平均値はわかりました。しかし実際の出力は完全な直流ではなく、スイッチング周波数のリプルが乗っています。そのリプルの大きさを決めるのは何でしょうか。次の節でインダクタ電流のリプルから見ていきます。

リプル電流 $\Delta I_L$ とインダクタの選定

インダクタ電流は三角波でした。オン期間の傾きは $(V_{in}-V_{out})/L$ で、それが $DT$ 秒続くので、山と谷の差(ピーク・ツー・ピーク値)は傾き × 時間で求まります。

$$ \begin{equation} \Delta I_L = \frac{V_{in} – V_{out}}{L}\,DT = \frac{(V_{in} – V_{out})D}{L f_s} \end{equation} $$

オフ期間から計算しても同じ値になるはずです。確かめてみましょう。オフ期間の傾きの大きさは $V_{out}/L$、期間は $(1-D)T$ なので

$$ \Delta I_L = \frac{V_{out}(1-D)}{L f_s} $$

ここに $V_{out} = D V_{in}$ を代入すると $\Delta I_L = \dfrac{D V_{in}(1-D)}{L f_s}$。一方、式 (3) に $V_{out}=DV_{in}$ を代入すると $\Delta I_L = \dfrac{(V_{in} – DV_{in})D}{Lf_s} = \dfrac{V_{in}D(1-D)}{Lf_s}$。両者は一致します。オン期間の増分とオフ期間の減分が等しい、というのは定常状態の定義そのものなので、当然といえば当然ですが、式が整合していることの確認になります。

この式から読み取れることは 3 つあります。

  1. リプルは $L$ と $f_s$ の積に反比例する。 インダクタを 2 倍にしても、周波数を 2 倍にしても、リプルは半分になります。小型化のために $L$ を減らしたければ、$f_s$ を上げて埋め合わせる必要があります。これがスイッチング電源が MHz 帯へ向かう動機です。
  2. リプルは $D(1-D)$ に比例するので、$D = 0.5$ で最大になる。 つまり $V_{out} = V_{in}/2$ のときが最悪条件です。入力電圧範囲が広い設計では、リプルが最大になる動作点でインダクタを選ぶ必要があります。
  3. リプルは負荷電流に依存しない。 負荷が 0.1 A でも 2 A でも、三角波の振幅は同じです。変わるのは三角波が乗っている「直流の高さ」だけ。これが後に述べる DCM の話につながります。

実務ではリプル率 $r = \Delta I_L / I_{out(max)}$ を 20〜40 % に設計するのが定石です。小さくしすぎるとインダクタが大きく重くなり、大きくしすぎるとピーク電流が上がってコアが磁気飽和し、RMS 電流も増えて損失が増えます。$r = 0.3$ 前後が、体積・損失・過渡応答のバランス点として経験的に選ばれています。

インダクタに要求される飽和電流は、平均値ではなくピーク値で決まります。

$$ I_{L,peak} = I_{out} + \frac{\Delta I_L}{2} $$

データシートの飽和電流 $I_{sat}$ がこの値を下回ると、コアが飽和してインダクタンスが急落し、電流が指数関数的に暴走します。過負荷や起動突入も考慮して 1.2〜1.5 倍のマージンを取るのが普通です。

本記事を通じて使う設計例を決めておきましょう。$V_{in} = 12$ V、$V_{out} = 5$ V、$f_s = 300$ kHz、$L = 22$ µH(DCR 30 mΩ)、$C = 100$ µF(ESR 20 mΩ)、$I_{out} = 2$ A。このとき $D = 5/12 = 0.4167$、$T = 3.333$ µs で、

$$ \Delta I_L = \frac{(12-5)\times 0.4167}{22\times10^{-6} \times 300\times10^{3}} = 0.442\ \text{A} $$

リプル率は $0.442/2 = 22.1$ % となり、狙いの範囲に収まっています。

リプル電流のデューティ比依存とスイッチング周波数依存

左の図は $\Delta I_L$ を $D$ の関数として描いたものです。$D(1-D)$ の放物線なので $D = 0.5$ で最大となり、入力電圧が振れて $D$ が 0.5 に近づく動作点が最悪条件になることが一目でわかります。本記事の設計例(赤丸)は $D = 0.417$ で頂点のわずかに左、$\Delta I_L = 0.442$ A です。右の図は $f_s$ 依存で、両対数で直線(傾き $-1$)になっているのが $\Delta I_L \propto 1/(Lf_s)$ の証拠です。緑の帯がリプル率 20〜40 % の定石ゾーンで、$L$ を 22 µH から 10 µH へ小さくしたければ、$f_s$ を 300 kHz から 660 kHz へ上げないと帯に戻らないという関係が読み取れます。

インダクタ電流のリプルが決まれば、次はそれがコンデンサでどこまで平滑されるか、つまり出力電圧のリプルが計算できます。

出力リプル電圧とコンデンサ容量

インダクタ電流 $i_L$ は三角波、負荷に流れる電流はほぼ一定の $I_{out}$。その差分がコンデンサに出入りします。

$$ i_C(t) = i_L(t) – I_{out} $$

定常状態では $\langle i_L \rangle = I_{out}$ なので、$i_C$ は平均ゼロの三角波になります。平均がゼロでなければコンデンサの電圧が毎周期増減し続けてしまうので、これも定常状態の要請です(コンデンサ電荷平衡)。

コンデンサ電圧の振れ幅は、$i_C$ が正である半周期のあいだに流れ込む電荷 $\Delta Q$ で決まります。三角波なので、$i_C > 0$ の区間は 1 周期のちょうど半分、その区間の最大値は $\Delta I_L/2$。よって $\Delta Q$ は底辺 $T/2$、高さ $\Delta I_L/2$ の三角形の面積になります。

$$ \Delta Q = \frac{1}{2}\cdot\frac{T}{2}\cdot\frac{\Delta I_L}{2} = \frac{\Delta I_L\,T}{8} $$

$Q = CV$ の関係から、電圧の振れ幅は $\Delta V = \Delta Q / C$ です。

$$ \begin{equation} \Delta V_C = \frac{\Delta I_L}{8\,C f_s} \end{equation} $$

分母の 8 は、三角波の面積計算から出てきた数字です。設計例で計算すると $\Delta V_C = 0.442/(8 \times 100\times10^{-6} \times 300\times10^{3}) = 1.84$ mV。5 V に対して 0.04 % ですから、極めて小さく見えます。

ところがこれは理想コンデンサの話です。実際のコンデンサには等価直列抵抗 ESR $R_c$ があり、リプル電流がそこを流れると素直にオームの法則で電圧が出ます。

$$ \begin{equation} \Delta V_{ESR} = \Delta I_L \cdot R_c \end{equation} $$

ESR = 20 mΩ なら $\Delta V_{ESR} = 0.442 \times 0.020 = 8.84$ mV。容量成分の 4.8 倍です。電解コンデンサ(ESR が数百 mΩ)を使えば、この項が完全に支配的になります。「出力リプルを減らしたいので容量を 10 倍にした」のに全然減らなかった、という経験は、たいていこの ESR 項が原因です。容量を増やすより、ESR の低いセラミックコンデンサを並列にするほうが効きます。

コンデンサ電流の三角波と、容量成分・ESR成分・合成リプルの内訳

上段が平均ゼロの三角波であるコンデンサ電流 $i_C$ で、塗った三角形の面積が $\Delta Q = \Delta I_L T/8 = 184.1$ nC。中段はそれが 2 つの経路で電圧に化けたところで、容量成分(青)は 1.84 mV しかないのに ESR 成分(赤)は 8.84 mV あります。注目すべきは波形の形と位相で、青は積分なので滑らかな山型で頂点が遅れ、赤は電流そのものなので鋭い三角波。下段の合成リプルは 8.83 mV で、単純和の 10.68 mV(灰色の点線)より小さく、ESR 単独の 8.84 mV(赤の破線)とほぼ一致しています。

なお $\Delta V_C$ と $\Delta V_{ESR}$ を単純に足すのは保守的すぎる見積りです。容量成分の電圧は電流の積分なので三角波の頂点で最大になるのに対し、ESR 成分は電流そのものに比例するので位相が 90° ずれています。両者のピークは同時に来ません。後の数値実験では、合計 10.68 mV という単純和に対して、実際のリプルは 8.78 mV(ESR 単独の 8.84 mV とほぼ同じ)になることを確認します。ESR が支配的なときは、ESR 項だけ見ておけばよいという実用的な結論が得られます。

ここまでは負荷電流が十分大きく、インダクタ電流が常に正である場合を暗黙に仮定してきました。では負荷を軽くしていくと何が起きるでしょうか。

連続導通モード(CCM)と不連続導通モード(DCM)

インダクタ電流の三角波は、平均 $I_{out}$、振幅 $\pm\Delta I_L/2$ です。負荷を軽くしていくと三角波は下に降りていき、やがて谷が 0 に触れます。その条件は

$$ I_{out} = \frac{\Delta I_L}{2} $$

です。これより負荷が重ければ電流は常に正で、連続導通モード(CCM)。軽ければ電流が 0 を切ろうとしますが、還流ダイオードは逆方向に電流を流せないので、電流は 0 で止まり、次のオン期間まで流れない時間ができます。これが不連続導通モード(DCM)です。

境界電流を書き下すと

$$ \begin{equation} I_{crit} = \frac{\Delta I_L}{2} = \frac{(V_{in}-V_{out})D}{2 L f_s} = \frac{V_{in}D(1-D)}{2 L f_s} \end{equation} $$

設計例では $I_{crit} = 0.442/2 = 0.221$ A。つまり負荷が 221 mA を下回ると DCM に入ります。5 V / 0.221 A = 22.6 Ω より軽い負荷、ということです。

重負荷・境界・軽負荷でのインダクタ電流波形の比較(CCMとDCM)

3 つのパネルは、負荷抵抗だけを 2.5 Ω → 22.6 Ω → 100 Ω と変えて同じ回路を回した結果です。三角波の振幅は 3 枚とも同じ(リプルは負荷に依存しない)で、変わるのは三角波が乗っている高さだけ、という前節の主張がそのまま見えています。中央のパネルでは谷がちょうど 0 に触れ、右のパネルでは電流が 0 に張り付いて流れない時間ができています。そして右のパネルだけ変換比が $M = 0.669$ と $D = 0.417$ から大きく外れていることに注目してください。電流が途切れた瞬間から、出力電圧はデューティ比だけでは決まらなくなるのです。

ここで無次元パラメータ $K$ を導入すると議論が見通しよくなります。

$$ K \equiv \frac{2L f_s}{R} = \frac{2L}{RT} $$

$I_{out} = V_{out}/R = D V_{in}/R$ を使って CCM 条件 $I_{out} > I_{crit}$ を書き換えます。

$$ \frac{D V_{in}}{R} > \frac{V_{in}D(1-D)}{2Lf_s} $$

両辺を $D V_{in}$(正)で割ると $\dfrac{1}{R} > \dfrac{1-D}{2Lf_s}$、すなわち

$$ \begin{equation} K > 1 – D \quad \Longrightarrow \quad \text{CCM} \end{equation} $$

$K$ は「インダクタの大きさと周波数の積を、負荷抵抗で測ったもの」です。$L$ が大きい、$f_s$ が高い、負荷が重い($R$ が小さい)ほど $K$ は大きく、CCM に留まりやすい。直感どおりの振る舞いです。

DCM での変換比を導く

DCM に入ると、ボルト秒平衡の計算が変わります。1 周期が 3 つの区間に分かれるからです。

  • 区間 1(長さ $D_1 T$):$S_1$ オン、電流は 0 から $I_{pk}$ まで増加
  • 区間 2(長さ $D_2 T$):$S_1$ オフ、電流は $I_{pk}$ から 0 まで減少
  • 区間 3(長さ $D_3 T$):電流ゼロ。スイッチノードは宙に浮き、$v_{sw} \approx V_{out}$、つまり $v_L = 0$

区間 3 でインダクタ電圧がゼロになるのがポイントです。ボルト秒平衡は「面積の和がゼロ」なので、区間 3 は積分に寄与しません。

まず区間 1 の終わりのピーク電流は

$$ I_{pk} = \frac{V_{in} – V_{out}}{L}D_1 T $$

区間 2 では傾き $-V_{out}/L$ で 0 まで落ちるので、その所要時間 $D_2T$ は、落ちる高さ $I_{pk}$ を傾きの大きさで割った値です。

$$ D_2 T = \frac{I_{pk}L}{V_{out}} = \frac{(V_{in}-V_{out})D_1T}{V_{out}} \quad\Longrightarrow\quad D_2 = D_1\frac{V_{in}-V_{out}}{V_{out}} $$

次に、平均出力電流を求めます。$i_L$ は「底辺 $(D_1+D_2)T$、高さ $I_{pk}$ の三角形」が 1 周期に 1 個あるだけなので、その面積を $T$ で割ったものが平均電流です。

$$ I_{out} = \frac{1}{T}\cdot\frac{1}{2}I_{pk}(D_1+D_2)T = \frac{1}{2}I_{pk}(D_1+D_2) $$

ここに $I_{pk}$ と $D_2$ の式を代入します。まず $D_1 + D_2 = D_1\left(1 + \dfrac{V_{in}-V_{out}}{V_{out}}\right) = D_1\dfrac{V_{in}}{V_{out}}$ と整理できることに注意してください。すると

$$ I_{out} = \frac{1}{2}\cdot\frac{(V_{in}-V_{out})D_1T}{L}\cdot D_1\frac{V_{in}}{V_{out}} = \frac{D_1^2 T\,V_{in}(V_{in}-V_{out})}{2L\,V_{out}} $$

一方 $I_{out} = V_{out}/R$ なので、両者を等置します。

$$ \frac{D_1^2 T\,V_{in}(V_{in}-V_{out})}{2L\,V_{out}} = \frac{V_{out}}{R} $$

ここで変換比 $M \equiv V_{out}/V_{in}$ を導入し、$V_{out} = M V_{in}$ を代入して整理しましょう。左辺の分子は $D_1^2 T V_{in}^2(1-M)$、分母は $2LMV_{in}$ となるので

$$ \frac{D_1^2 T V_{in}(1-M)}{2LM} = \frac{MV_{in}}{R} $$

$V_{in}$ が両辺で消え、$\dfrac{2L}{RT} = K$ を使うと

$$ \begin{equation} D_1^2 (1-M) = K M^2 \end{equation} $$

という簡潔な関係が得られました。これを $M$ について解きます。$K M^2 + D_1^2 M – D_1^2 = 0$ という $M$ の二次方程式なので、解の公式から($M>0$ を取る)

$$ M = \frac{-D_1^2 + \sqrt{D_1^4 + 4KD_1^2}}{2K} $$

このままでも正しいのですが、分子を有理化すると教科書でよく見る形になります。分子・分母に $\left(\sqrt{D_1^4+4KD_1^2} + D_1^2\right)$ を掛けると、分子は $(D_1^4+4KD_1^2) – D_1^4 = 4KD_1^2$ となり、

$$ M = \frac{4KD_1^2}{2K\left(\sqrt{D_1^4+4KD_1^2}+D_1^2\right)} = \frac{2D_1^2}{D_1^2\left(\sqrt{1+4K/D_1^2}+1\right)} $$

分子分母の $D_1^2$ が約分できて

$$ \begin{equation} M = \frac{V_{out}}{V_{in}} = \frac{2}{1 + \sqrt{1 + \dfrac{4K}{D^2}}}, \qquad K = \frac{2Lf_s}{R} \end{equation} $$

(以降 $D_1$ を単に $D$ と書きます。)DCM では変換比がデューティ比だけでなく負荷抵抗にも依存する——これが CCM との決定的な違いです。$K \to \infty$(重負荷)の極限では $\sqrt{1+4K/D^2} \approx 2\sqrt{K}/D$ となり $M \to D/\sqrt{K} \cdot \ldots$ と CCM 式に滑らかにつながります。実際、境界 $K = 1-D$ を代入すると

$$ M = \frac{2}{1+\sqrt{1 + 4(1-D)/D^2}} $$

で、$D = 5/12$ のとき $4(1-D)/D^2 = 13.44$、$\sqrt{14.44} = 3.80$、$M = 2/4.80 = 0.4167 = D$。ちょうど CCM の答えに一致します。境界で連続につながっているので、導出は正しいと確認できます。

DCM が実務で問題になる理由

$M > D$ になる、つまり同じデューティ比なら軽負荷ほど出力電圧が上がるのが DCM の困ったところです。設計例で負荷 50 mA($R = 100$ Ω)にすると $K = 0.132$、$M = 0.664$ となり、$D$ を 0.4167 のまま固定していると出力は $0.664 \times 12 = 7.97$ V まで跳ね上がります。フィードバックがあれば $D$ を下げて 5 V に戻しますが、ループから見た制御対象の直流ゲインも周波数特性も CCM と DCM で別物になるため、両モードで安定な補償器を設計する必要があります。

もう一つ、同期整流を使う場合の注意があります。ローサイドを MOSFET にすると逆方向にも電流を流せるので、軽負荷でも電流は 0 を切って負に振れ、CCM が維持されます(強制 CCM)。変換比が負荷に依らないので制御は楽ですが、負の電流はコンデンサから電源へエネルギーを押し戻す無駄な往復なので、軽負荷効率は落ちます。そこで市販の電源 IC は、軽負荷時にローサイドをオフして DCM に落とす「ダイオードエミュレーション」や、スイッチング自体を間引く「パルススキップ(PFM)」モードを備えています。軽負荷効率とループ設計の複雑さは、こういう形でトレードオフになっているわけです。

モードの話が済んだので、次は「そもそもどこで電力を失っているのか」を分解していきます。

損失モデルと効率

スイッチング電源の効率を上げるには、まず損失を項目ごとに分けて、どれが支配的かを知る必要があります。バックコンバータの損失は大きく導通損スイッチング損に分かれます。

導通損

電流が抵抗成分を通ることで生じる損失です。抵抗損は電流の実効値(RMS)の 2 乗に比例するので、三角波リプルを含んだ RMS 電流を求めておく必要があります。

インダクタ電流を「直流 $I_{out}$ + 平均ゼロの三角波」と分解すると、直交する成分なので二乗平均は単純に足せます。ピーク・ツー・ピーク $\Delta I$ の三角波の RMS 値は、頂点までの振幅が $\Delta I/2$ で、三角波の RMS はピーク値の $1/\sqrt{3}$ ですから $\dfrac{\Delta I}{2\sqrt{3}}$。したがって

$$ \begin{equation} I_{rms}^2 = I_{out}^2 + \frac{\Delta I_L^2}{12} \end{equation} $$

この電流が流れる抵抗は、経路によって異なります。ハイサイド MOSFET はオン期間(割合 $D$)だけ、ローサイド MOSFET はオフ期間(割合 $1-D$)だけ電流を流し、インダクタの DCR は常に電流を流します。よって等価な直流抵抗は

$$ R_{dc} = D R_{ds(on),H} + (1-D)R_{ds(on),L} + \text{DCR} $$

設計例(20 mΩ / 15 mΩ / 30 mΩ)では $R_{dc} = 0.4167\times0.020 + 0.5833\times0.015 + 0.030 = 47.1$ mΩ。2 A のとき導通損は $I_{rms}^2 R_{dc} = (4 + 0.0163)\times 0.0471 = 189$ mW です。

還流にダイオードを使う場合は事情が変わります。ダイオードの電圧降下 $V_f$ は電流にあまり依存しない(ほぼ一定電圧)ので、損失は $P_D = (1-D)V_f I_{out}$ と電流の1 乗に比例します。$V_f = 0.4$ V、$I_{out} = 2$ A なら $0.5833\times0.4\times2 = 467$ mW。同期整流の 2 A 時ローサイド損($0.5833\times0.015\times4 = 35$ mW)と比べて 1 桁大きく、これが低電圧・大電流の電源で同期整流が必須になる理由です。

スイッチング損

MOSFET がオンからオフへ(またはその逆へ)遷移する短い時間、素子には電圧と電流が同時にかかります。遷移中に電圧が $V_{in}$ から 0 へ、電流が 0 から $I$ へ線形に変化すると近似すると、瞬時電力 $p(t) = v(t)i(t)$ は三角形状のパルスになり、その面積(=1 回の遷移で失うエネルギー)は

$$ E_{sw} = \int_0^{t_{tr}} v(t)i(t)\,dt \approx \frac{1}{2}V_{in} I\, t_{tr} $$

立ち上がり $t_r$ と立ち下がり $t_f$ の 2 回ぶんを 1 周期に 1 セット、これが毎秒 $f_s$ 回起きるので

$$ \begin{equation} P_{sw} = \frac{1}{2}V_{in}I_{out}(t_r + t_f)f_s \end{equation} $$

設計例($t_r = t_f = 20$ ns、$I_{out} = 2$ A、$f_s = 300$ kHz)では $0.5\times12\times2\times40\times10^{-9}\times300\times10^{3} = 144$ mW。導通損 189 mW に匹敵する大きさです。

さらに、ゲート容量を充放電するためのゲート駆動損 $P_{gate} = n\,Q_g V_{drv} f_s$($n$ はスイッチ数)と、制御 IC 自身の静止電流損 $P_q = V_{in}I_q$ があります。これらは負荷電流に依存しない固定損なので、軽負荷では効率を大きく損ないます。設計例では $P_{gate} = 2\times10\text{nC}\times5\text{V}\times300\text{kHz} = 30$ mW、$P_q = 12\times0.5\text{mA} = 6$ mW。出力が 0.25 W(50 mA)しかない軽負荷では、この 36 mW が効率を 86 % まで引き下げます。

効率曲線の形

以上をまとめると、効率曲線は次のような形になります。

  • 軽負荷側:出力電力が小さいのに固定損(ゲート・静止電流)は変わらないので、効率は急激に落ちる
  • 中負荷:固定損の割合が下がり、導通損もまだ小さいのでピークを迎える
  • 重負荷側:導通損が $I^2$ で効いてくるので、再び効率が下がる

設計例では 0.885 A で最高効率 96.98 %、2 A で 96.44 %、50 mA では 85.97 % となります(後の Python 実験で確認します)。データシートの効率曲線が必ず山型をしているのは、この 3 つの領域の重ね合わせだからです。

最適スイッチング周波数の存在

ここから面白い結論が出ます。総損失を $f_s$ の関数として書きましょう。リプル電流は $\Delta I_L = a/f_s$(ただし $a = (V_{in}-V_{out})D/L$)なので

$$ P_{total}(f_s) = \underbrace{I_{out}^2 R_{dc}}_{\text{周波数に無関係}} + \underbrace{\frac{a^2}{12 f_s^2}R_{ac}}_{\text{リプル起因、}f_s^{-2}} + \underbrace{b\,f_s}_{\text{スイッチング+ゲート}} + P_q $$

ここで $R_{ac} = R_{dc} + R_c$ です。リプル電流はスイッチや DCR だけでなく出力コンデンサの ESR にも流れるので、交流成分が見る抵抗には $R_c$ が加わります。また $b = \frac{1}{2}V_{in}I_{out}(t_r+t_f) + nQ_gV_{drv}$ とまとめました。

第 2 項は $f_s$ が下がると発散し、第 3 項は $f_s$ が上がると発散します。したがってどこかに最小値があるはずです。微分してゼロと置きましょう。

$$ \frac{dP_{total}}{df_s} = -\frac{2a^2R_{ac}}{12 f_s^3} + b = 0 $$

$f_s^3$ について解くと

$$ \begin{equation} f_s^{*} = \left(\frac{a^2 R_{ac}}{6b}\right)^{1/3} \end{equation} $$

$L = 4.7$ µH、$I_{out} = 2$ A の条件で計算すると $f_s^* = 195$ kHz。後の数値実験で、損失の数値最小点が確かに 195.0 kHz に来ることを確認します。ただし 3 乗根なので極値はきわめて平坦です。周波数を 2 倍にしても最適点からのズレによる損失増は小さく、実際の周波数選定では EMI 規制帯(AM 放送帯 526.5〜1606.5 kHz を避ける、など)、部品サイズ、制御帯域といった別の要因が優先されることが多いのが実情です。

損失と効率の話が終わりました。しかしここまでは「デューティ比 $D$ が与えられたら出力はこうなる」という話でした。実際には出力を 5 V に保つよう $D$ を自動調整する必要があります。その制御ループの設計に進みましょう。

状態平均化と制御ループの設計

なぜ平均化が必要か

バックコンバータは 1 周期のあいだに 2 つの線形回路を行き来する、本質的に時変・非線形なシステムです。このままでは伝達関数が書けません。そこで「スイッチング周波数よりずっとゆっくりした変化」だけを見ることにして、1 周期の平均で状態方程式を置き換えます。これが状態平均化法(state-space averaging、Middlebrook & Ćuk, 1976)です。

状態を $\bm{x} = [i_L,\ v_C]^\top$ と取ります。オン期間の状態方程式を $\dot{\bm{x}} = \bm{A}_1\bm{x} + \bm{B}_1 V_{in}$、オフ期間を $\dot{\bm{x}} = \bm{A}_2\bm{x} + \bm{B}_2 V_{in}$ と書くと、平均化された方程式は各行列を時間の重みで混ぜたものになります。

$$ \dot{\bm{x}} = \bigl[d\bm{A}_1 + (1-d)\bm{A}_2\bigr]\bm{x} + \bigl[d\bm{B}_1 + (1-d)\bm{B}_2\bigr]V_{in} $$

バックコンバータの場合、オンでもオフでも回路の接続関係は同じ(LCR の直列並列構造は変わらず、変わるのは左端が $V_{in}$ につながるかグランドにつながるかだけ)なので $\bm{A}_1 = \bm{A}_2 = \bm{A}$ となり、入力行列だけが $\bm{B}_1 = [1/L,\ 0]^\top$、$\bm{B}_2 = \bm{0}$ と異なります。これはバックコンバータの解析が他のトポロジより易しい理由でもあります。

$$ \bm{A} = \begin{bmatrix} 0 & -1/L \\ 1/C & -1/(RC)\end{bmatrix}, \qquad d\bm{B}_1 + (1-d)\bm{B}_2 = d\begin{bmatrix}1/L \\ 0\end{bmatrix} $$

ここでデューティ比を $d = D + \hat{d}$ と摂動させ、状態も $\bm{x} = \bm{X} + \hat{\bm{x}}$ と分けます。直流成分は釣り合っているので消え、1 次の微小項だけ残すと

$$ \dot{\hat{\bm{x}}} = \bm{A}\hat{\bm{x}} + (\bm{B}_1 – \bm{B}_2)V_{in}\hat{d} $$

入力電圧 $V_{in}$ が、デューティ比の変動に対するゲインとして現れるのが重要です。ラプラス変換して $\hat{v}_{out}/\hat{d}$ を求めると

$$ \begin{equation} G_{vd}(s) = \frac{\hat{v}_{out}(s)}{\hat{d}(s)} = \frac{V_{in}}{LCs^2 + \dfrac{L}{R}s + 1} = \frac{V_{in}\,\omega_0^2}{s^2 + \dfrac{\omega_0}{Q}s + \omega_0^2} \end{equation} $$

$$ \omega_0 = \frac{1}{\sqrt{LC}}, \qquad Q = R\sqrt{\frac{C}{L}} $$

つまり制御対象は、直流ゲイン $V_{in}$ の 2 次系(LC 共振)そのものです。設計例では $f_0 = \omega_0/2\pi = 3393$ Hz、$Q = 2.5\sqrt{100\mu/22\mu} = 5.33$。直流ゲインは $20\log_{10}12 = 21.6$ dB。

出力コンデンサの ESR を入れると、$C$ と $R_c$ の直列インピーダンスが $1/(sC) + R_c$ になるので、分子にゼロ点が現れます。

$$ G_{vd}(s) \approx \frac{V_{in}(1 + sR_cC)}{LCs^2 + \left(\dfrac{L}{R}+R_cC\right)s + 1}, \qquad f_{z,ESR} = \frac{1}{2\pi R_c C} $$

設計例では $f_{z,ESR} = 1/(2\pi \times 0.02 \times 100\mu) = 79.6$ kHz。ちなみに昇圧(ブースト)コンバータには右半平面ゼロという厄介な項が現れて帯域が強く制限されますが、バックコンバータには RHP ゼロがありません。これがバックが最も制御しやすいトポロジと言われる理由です。

補償器の設計

制御対象 $G_{vd}$ は $f_0$ で位相が一気に $-180°$ 落ちます。PWM 変調器のゲイン $1/V_m$($V_m$ は鋸波の振幅)を含めた一巡伝達関数

$$ T(s) = G_c(s)\cdot\frac{1}{V_m}\cdot G_{vd}(s) $$

を安定にするには、補償器 $G_c$ で位相を持ち上げる必要があります。よく使われるのは次の 2 種類です。

Type-II(1 ゼロ 1 極 + 積分器):最大 90° 弱の位相ブーストが得られます。

$$ G_c(s) = \frac{A(1+s/\omega_z)}{s(1+s/\omega_p)} $$

Type-III(2 ゼロ 2 極 + 積分器):最大 180° 弱までブーストできます。

$$ G_c(s) = \frac{A(1+s/\omega_{z1})(1+s/\omega_{z2})}{s(1+s/\omega_{p1})(1+s/\omega_{p2})} $$

積分器(分母の $s$)は必ず入れます。直流ゲインを無限大にして定常偏差をゼロにするためです。

どちらを選ぶかは、$G_{vd}$ がどれだけ位相を失っているかで決まります。LC 二重極で $-180°$、そこから ESR ゼロが $+$方向に戻してくれる分を差し引いた値が、実際の位相です。設計例で交差周波数を $f_c = 30$ kHz($f_s/10$)に取ると、$G_{vd}$ の位相は約 $-158°$。位相余裕 60° を確保するには、$60 – 90 – (-158) = 128°$ のブーストが必要で、Type-II の 90° では足りません。Type-III が必要という判断になります。

逆に、ESR の大きい電解コンデンサを使う設計では $f_{z,ESR}$ が $f_c$ より十分低く、コンデンサ自身がゼロを提供してくれるので Type-II で足ります。「セラミックコンデンサに置き換えたら発振した」という現象は、この ESR ゼロが 10 倍以上高い周波数に飛んでしまい、位相の助けが消えることで起きます。後の実験で、ESR 20 mΩ のとき Type-II では位相余裕が 6.5° しか取れないこと、Type-III なら 71° 取れることを数値で確認します。

Type-III の極ゼロ配置の定石は次のとおりです。

  1. 2 つのゼロを LC 共振点 $f_0$ の近傍(0.5〜1 倍)に置く。二重極が奪う位相をその場で打ち消す
  2. 1 つの極を ESR ゼロ $f_{z,ESR}$ に置く。ESR ゼロが持ち上げる高域ゲインを相殺する
  3. もう 1 つの極を $f_s/2$ 付近に置く。スイッチングリプルとノイズを減衰させる
  4. ゲイン $A$ を、狙った $f_c$ で $|T| = 1$ になるよう決める

設計例では $f_{z1} = f_{z2} = 2.5$ kHz、$f_{p1} = 79.6$ kHz、$f_{p2} = 150$ kHz、$A = 8597$ rad/s。この配置で交差 30 kHz、位相余裕 71.1° が得られます。

交差周波数の上限は $f_s/10 \sim f_s/5$ です。平均化モデルはスイッチングリプルを均した近似なので、$f_s/2$ に近づくと平均化そのものが破綻し、サンプリング効果による位相遅れが現れます。

部品値への落とし込み

理論上の極ゼロを実際の CR 部品に翻訳しておきましょう。オペアンプ型 Type-III(分圧上側抵抗 $R_1$、帰還に $R_2 + C_1$ と $C_2$ の並列、$R_1$ に $R_3 + C_3$ を並列)では

$$ f_{z1} = \frac{1}{2\pi R_2C_1}, \quad f_{z2} = \frac{1}{2\pi (R_1+R_3)C_3}, \quad f_{p1} = \frac{1}{2\pi R_3C_3}, \quad f_{p2} \approx \frac{1}{2\pi R_2C_2}, \quad A \approx \frac{1}{R_1C_1} $$

$R_1 = 10$ kΩ から出発すると $C_1 = 11.6$ nF、$R_2 = 5.47$ kΩ、$C_2 = 194$ pF、$C_3 = 6.37$ nF、$R_3 = 314$ Ω が得られます。後の実験ではこの部品値から伝達関数を組み直し、理想的な極ゼロ配置とほぼ同じ特性(交差 30.4 kHz、位相余裕 71.4°)になることを確かめます。

過渡応答への効き方

負荷が急変したとき、電源はどれだけ電圧を保てるでしょうか。負荷が $\Delta I$ 増えても、インダクタ電流はすぐには増えません(増える速さは $(V_{in}-V_{out})/L$ に制限されます)。その間、不足分は出力コンデンサが吐き出し、電圧が下がります。ループが応答するまでの時間はおおむね $1/(2\pi f_c)$ 程度なので、電圧降下の目安は

$$ \Delta V \approx \frac{\Delta I}{2\pi f_c C} + \Delta I \cdot R_c $$

設計例で $\Delta I = 1$ A なら、第 1 項が 53 mV、第 2 項(ESR による瞬時ステップ)が 20 mV。交差周波数を上げることが過渡応答の改善に直結することが、この式からわかります。後の実験では、閉ループで実際に 44 mV の降下に収まること、一方デューティ比を固定した開ループでは 400 mV も落ちることを確認します。フィードバックが電圧降下を約 1/9 に抑えているわけです。

理論の準備はここまでです。すべてを Python で確かめていきましょう。

Python での実装と数値検証

設計式の数値化

まず設計例の諸元を入れて、これまでに導いた式の値を並べます。

import numpy as np

Vin, Vout, fs = 12.0, 5.0, 300e3
L, C = 22e-6, 100e-6
Rc, DCR = 0.020, 0.030          # 出力コンデンサ ESR とインダクタ DCR
Iout = 2.0

T = 1.0 / fs
D = Vout / Vin                                   # ボルト秒平衡: Vout = D*Vin
dIL = (Vin - Vout) * D / (L * fs)                # リプル電流
dV_C = dIL / (8 * C * fs)                        # 容量によるリプル電圧
dV_ESR = dIL * Rc                                # ESR によるリプル電圧
Icrit = dIL / 2                                  # CCM/DCM 境界電流

print(f"デューティ比 D            = {D:.4f} ({100*D:.1f} %)")
print(f"スイッチング周期 T        = {T*1e6:.3f} us")
print(f"リプル電流 dI_L           = {dIL:.4f} A ({100*dIL/Iout:.1f} % of Iout)")
print(f"リプル電圧(容量分) dV_C   = {dV_C*1e3:.3f} mV")
print(f"リプル電圧(ESR分) dV_ESR  = {dV_ESR*1e3:.3f} mV")
print(f"CCM/DCM 境界電流 I_crit   = {Icrit:.4f} A (負荷抵抗 {Vout/Icrit:.2f} ohm)")

出力は $D = 0.4167$、$\Delta I_L = 0.4419$ A(リプル率 22.1 %)、$\Delta V_C = 1.841$ mV、$\Delta V_{ESR} = 8.838$ mV、$I_{crit} = 0.2210$ A です。ここで注目すべきは、ESR による リプルが容量によるリプルの 4.8 倍あることです。$C = 100$ µF という数字だけ見ると十分に思えますが、リプル電圧を決めているのは容量ではなく ESR だとわかります。境界電流 0.221 A は最大負荷 2 A の約 11 % なので、10 % 以下の軽負荷では DCM に入る設計になっています。

スイッチング波形のシミュレーション

平均化する前の「生の」動作を再現します。状態 $[i_L, v_C]$ の微分方程式を、オン区間とオフ区間に分けて RK4 で積分します。区間の境目でステップ幅を切り直すことで、スイッチング時刻を正確に踏むのがポイントです。

import numpy as np

Vin, Vout, fs = 12.0, 5.0, 300e3
L, C, Rc, DCR = 22e-6, 100e-6, 0.020, 0.030
T = 1.0 / fs


def deriv(x, vsw, R, diode):
    """状態 x=[iL, vC] の時間微分と、ESR を含む出力電圧 vo を返す"""
    iL, vC = x
    vo = (vC + Rc * iL) / (1.0 + Rc / R)
    if diode and iL <= 0.0 and (vsw - vo) < 0.0:   # ダイオードが逆阻止する区間
        return np.array([0.0, (0.0 - vo / R) / C]), vo
    return np.array([(vsw - vo - DCR * iL) / L, (iL - vo / R) / C]), vo


def run(D, R, ncyc=2000, nsub=40, diode=False):
    """オン区間・オフ区間ごとに RK4 で積分する(スイッチ時刻をまたがない)"""
    x = np.zeros(2)
    ts, iLs, vos, vsws = [], [], [], []
    t = 0.0
    for _ in range(ncyc):
        for dur, vsw in ((D * T, Vin), ((1 - D) * T, 0.0)):
            h = dur / nsub
            for _ in range(nsub):
                d1, vo = deriv(x, vsw, R, diode)
                d2, _ = deriv(x + 0.5 * h * d1, vsw, R, diode)
                d3, _ = deriv(x + 0.5 * h * d2, vsw, R, diode)
                d4, _ = deriv(x + h * d3, vsw, R, diode)
                ts.append(t); iLs.append(x[0]); vos.append(vo); vsws.append(vsw)
                x = x + h * (d1 + 2 * d2 + 2 * d3 + d4) / 6.0
                if diode and x[0] < 0.0:
                    x[0] = 0.0
                t += h
    return map(np.array, (ts, iLs, vos, vsws))

diode=True にするとローサイドはダイオード(逆方向に流せない)として扱われ、DCM を再現できます。diode=False は同期整流で、電流が負になることも許します。定常状態に落ち着くまでには LC 共振の減衰時間($Q/(\pi f_0) \approx 0.5$ ms)の数倍が必要なので、十分な周期数を回します。

import matplotlib, matplotlib.pyplot as plt
for cand in ["Hiragino Sans", "Yu Gothic", "Noto Sans CJK JP", "IPAexGothic", "Meiryo"]:
    if any(cand == f.name for f in matplotlib.font_manager.fontManager.ttflist):
        plt.rcParams["font.family"] = cand
        break
plt.rcParams["axes.unicode_minus"] = False

D = 5.0 / 12.0
ts, iL, vo, vsw = run(D, R=2.5, ncyc=3000)
m = ts > ts[-1] - 3 * T                      # 定常状態の最後の3周期だけ描く
tp = (ts[m] - ts[m][0]) * 1e6

fig, ax = plt.subplots(3, 1, figsize=(9, 8), sharex=True)
ax[0].step(tp, vsw[m], where="post", color="tab:red")
ax[0].set_ylabel("スイッチノード電圧 [V]"); ax[0].grid(alpha=.3)
ax[0].set_title("降圧コンバータの定常波形(12V→5V, 300kHz)")
ax[1].plot(tp, iL[m], color="tab:blue")
ax[1].axhline(iL[m].mean(), ls="--", c="k", lw=1, label=f"平均 {iL[m].mean():.3f} A")
ax[1].set_ylabel("インダクタ電流 [A]"); ax[1].legend(); ax[1].grid(alpha=.3)
ax[2].plot(tp, (vo[m] - vo[m].mean()) * 1e3, color="tab:green")
ax[2].set_ylabel("出力リプル [mV]"); ax[2].set_xlabel("時間 [µs]"); ax[2].grid(alpha=.3)
plt.tight_layout(); plt.show()

print(f"実測リプル電流 = {iL[m].max()-iL[m].min():.4f} A  (理論 {dIL:.4f} A)")
print(f"実測出力電圧   = {vo[m].mean():.4f} V")
print(f"実測リプル電圧 = {(vo[m].max()-vo[m].min())*1e3:.3f} mV")

RK4で積分した定常波形(スイッチノード電圧・インダクタ電流・出力リプル)

上段のスイッチノード電圧は 0 と 12 V の矩形波、中段のインダクタ電流は三角波で、頂点がオン期間の終わり($t = DT = 1.39$ µs)にきっちり来ています。下段の出力リプルは放物線ではなく三角波の形をしていて、これが ESR 支配であることの視覚的な証拠です。

結果は実測リプル電流 0.4420 A に対して理論値 0.4419 A で、誤差 0.03 % 以内で一致します。三角波の頂点がオン区間の終わり($t = DT = 1.39$ µs)に来ていることも、導出の前提どおりです。出力電圧は 4.9406 V となり、$DV_{in} = 5.000$ V より約 59 mV 低い。これは DCR 30 mΩ に 2 A を流したときの降下 60 mV とほぼ一致し、理想式からのズレが寄生抵抗で説明できることを示しています。

リプル電圧は 8.775 mV。ESR 単独の予測 8.838 mV とほぼ同じで、容量分 1.841 mV を単純に足した 10.68 mV よりは小さくなっています。ESR 成分と容量成分のピークは位相が 90° ずれているので同時には来ないという予想どおりの結果です。実際、出力リプル波形は容量分の放物線的な波形ではなく、ESR 成分が支配する三角波の形をしています。

CCM と DCM の境界を確かめる

負荷を軽くしていったとき、変換比が $D$ から外れていく様子を追います。理論式(式 9)と、ダイオード還流でのシミュレーションを重ねます。

import numpy as np, matplotlib.pyplot as plt


def M_theory(D, R):
    K = 2 * L * fs / R
    if K >= 1 - D:            # CCM 条件
        return D
    return 2.0 / (1.0 + np.sqrt(1.0 + 4 * K / D ** 2))   # DCM の変換比


loads = np.array([0.05, 0.10, 0.15, 0.221, 0.5, 1.0, 2.0])
M_sim = []
for I in loads:
    R = Vout / I
    ts2, iL2, vo2, _ = run(D, R, ncyc=2500, nsub=40, diode=True)
    mm = ts2 > ts2[-1] - 2 * T
    M_sim.append(vo2[mm].mean() / Vin)
    print(f"Iout~{I:.3f} A: M_sim={M_sim[-1]:.4f}  M_theory={M_theory(D,R):.4f}"
          f"  iL_min={iL2[mm].min():.4f} A")
M_sim = np.array(M_sim)

Ic = np.logspace(-2, 0.5, 400)
Mth = np.array([M_theory(D, Vout / i) for i in Ic])
plt.figure(figsize=(8, 5))
plt.semilogx(Ic, Mth, label="理論式(DCM/CCM)")
plt.semilogx(loads, M_sim, "o", label="数値シミュレーション")
plt.axhline(D, ls="--", c="k", lw=1, label=f"CCM の変換比 D={D:.3f}")
plt.axvline(Icrit, ls=":", c="r", label=f"境界電流 {Icrit:.3f} A")
plt.xlabel("出力電流 [A]"); plt.ylabel("変換比 M = Vout/Vin")
plt.title("軽負荷では変換比が D から外れる(不連続導通モード)")
plt.legend(); plt.grid(alpha=.3); plt.tight_layout(); plt.show()

変換比Mの負荷依存:理論式と数値シミュレーションの一致

赤い丸(シミュレーション)が青い理論曲線の上にきれいに乗っています。境界電流 0.221 A(赤い縦の点線)を境に、右側では $M$ が $D = 0.417$ の水平線に張り付き、左側では急激に立ち上がります。この折れ曲がりが CCM と DCM の境目であり、式 (7) の $K = 1-D$ という条件がそのまま曲線の形に現れています。

シミュレーション値と理論値は DCM 領域で 0.3 % 以内に一致します($I_{out} = 0.10$ A で $M_{sim} = 0.5475$、$M_{theory} = 0.5463$)。境界電流 0.221 A ではちょうど $M = 0.4167 = D$ となり、CCM 式と DCM 式が境界で滑らかにつながることが数値でも確認できました。iL_min の列を見ると、0.221 A 以下ではインダクタ電流の最小値が 0.0002 A 以下(実質ゼロ)に張り付いており、電流が途切れていることがわかります。一方 CCM 側(0.5 A 以上)では $M_{sim}$ が $D$ よりわずかに小さく(2 A で 0.4117)、これは DCR による電圧降下です。

グラフの形も示唆に富みます。負荷抵抗 100 Ω(CCM なら 50 mA 相当)まで軽くすると $M = 0.669$、つまり 同じデューティ比のまま負荷を軽くすると出力が 8 V 近くまで跳ね上がる。フィードバックがなければ軽負荷で過電圧になる、という DCM の危険性が視覚的にわかります。

効率と損失の内訳

損失モデルを実装し、効率曲線と内訳を描きます。

import numpy as np, matplotlib.pyplot as plt

Rh, Rl = 0.020, 0.015              # ハイサイド/ローサイドのオン抵抗
tr, tf = 20e-9, 20e-9              # スイッチング遷移時間
Qg, Vdrv, Iq = 10e-9, 5.0, 0.5e-3  # ゲート電荷・駆動電圧・静止電流


def losses(Io, fsw, Lval=22e-6):
    dI = (Vin - Vout) * D / (Lval * fsw)
    Irms2 = Io ** 2 + dI ** 2 / 12                        # 三角波を含む RMS^2
    Pcond = Irms2 * (D * Rh + (1 - D) * Rl + DCR)         # 導通損
    Pesr = (dI ** 2 / 12) * Rc                            # コンデンサ ESR 損
    Psw = 0.5 * Vin * Io * (tr + tf) * fsw                # スイッチング損
    Pgate = 2 * Qg * Vdrv * fsw                           # ゲート駆動損
    Pq = Vin * Iq                                         # 静止電流損
    return dict(cond=Pcond, esr=Pesr, sw=Psw, gate=Pgate, q=Pq)


Io = np.logspace(-2, np.log10(3), 300)
eff = np.array([Vout * i / (Vout * i + sum(losses(i, fs).values())) for i in Io])
print(f"最高効率 {100*eff.max():.2f} % @ Iout={Io[np.argmax(eff)]:.3f} A")
for i in [0.05, 0.5, 2.0]:
    p = losses(i, fs)
    print(f"Iout={i:.2f} A: 導通 {p['cond']*1e3:.1f} mW / スイッチング {p['sw']*1e3:.1f} mW"
          f" / ゲート {p['gate']*1e3:.1f} mW / 静止 {p['q']*1e3:.1f} mW"
          f" -> 効率 {100*Vout*i/(Vout*i+sum(p.values())):.2f} %")

数値だけでも傾向は見えます。50 mA では導通損 0.9 mW に対してゲート駆動損が 30 mW と 30 倍以上あり、2 A では逆に導通損 189.1 mW がゲート駆動損 30 mW を大きく上回ります。負荷によって「主犯」が入れ替わるわけです。この入れ替わりを一目で見るために、効率曲線と損失の積み上げグラフを並べて描きます。

fig, ax = plt.subplots(1, 2, figsize=(12, 4.5))
ax[0].semilogx(Io, 100 * eff, lw=2)
ax[0].set_xlabel("出力電流 [A]"); ax[0].set_ylabel("効率 [%]")
ax[0].set_title("効率は中負荷でピークを持つ"); ax[0].grid(alpha=.3); ax[0].set_ylim(60, 100)
keys = ["cond", "esr", "sw", "gate", "q"]
labels = ["導通損", "ESR損", "スイッチング損", "ゲート駆動損", "静止電流損"]
stack = np.array([[losses(i, fs)[k] for i in Io] for k in keys])
ax[1].stackplot(Io, stack * 1e3, labels=labels)
ax[1].set_xscale("log"); ax[1].set_xlabel("出力電流 [A]"); ax[1].set_ylabel("損失 [mW]")
ax[1].set_title("損失の内訳"); ax[1].legend(loc="upper left"); ax[1].grid(alpha=.3)
plt.tight_layout(); plt.show()

効率曲線と、負荷電流に対する損失内訳の積み上げグラフ

左の効率曲線は教科書どおりの山型で、頂点(赤丸)が 0.885 A にあります。右の積み上げグラフでは、軽負荷側(左端)で全体のほとんどがゲート駆動損(赤)と静止電流損(紫)という負荷に依存しない層で占められ、重負荷側(右端)では導通損(青)の層が $I^2$ で立ち上がって全体を支配していく様子が見えます。効率が山型になる理由が、この 2 つの層の押し合いだと図から直接読み取れます。

効率は 0.885 A で 96.98 % のピークを取り、2 A では 96.44 %、50 mA では 85.97 % まで落ちます。内訳を見ると理由は明快です。50 mA では出力電力 0.25 W に対してゲート駆動損 30 mW + 静止電流損 6 mW という固定損が 36 mW もあり、これだけで効率を 14 ポイント押し下げています。逆に 2 A では導通損 189 mW が最大項になり、これは $I^2$ で増えるので重負荷ほど効率を削ります。

スタックプロット(右)を見ると、軽負荷側では面積の大半がゲート駆動損と静止電流損(負荷に依存しない層)で占められ、重負荷側では導通損の層が急速に立ち上がる様子が一目でわかります。軽負荷効率を改善したければ $f_s$ を下げるかスイッチングを間引く、重負荷効率を改善したければオン抵抗と DCR を下げる——対策が負荷領域によって正反対になることが、この図から読み取れます。

最適スイッチング周波数

式 (12) の解析解と、数値的な最小点を突き合わせます。リプル電流の影響が見えるよう、インダクタを小さめの 4.7 µH にした場合を扱います。

import numpy as np, matplotlib.pyplot as plt

Lsm = 4.7e-6
Req = D * Rh + (1 - D) * Rl + DCR       # 直流成分が見る抵抗
Rac = Req + Rc                          # 交流(リプル)成分は ESR も通る
a = (Vin - Vout) * D / Lsm              # dI_L = a / fs
b = 0.5 * Vin * 2.0 * (tr + tf) + 2 * Qg * Vdrv   # 周波数比例損の係数
f_star = (a ** 2 * Rac / (6 * b)) ** (1 / 3)
print(f"R_dc={Req:.4f} ohm, R_ac={Rac:.4f} ohm, a={a:.4g}, b={b:.4g}")
print(f"解析解 f* = {f_star/1e3:.1f} kHz")

fsw = np.logspace(np.log10(50e3), np.log10(2e6), 600)
Ptot = np.array([sum(losses(2.0, f, Lsm).values()) for f in fsw])
print(f"数値最小 f = {fsw[np.argmin(Ptot)]/1e3:.1f} kHz, 総損失 {Ptot.min()*1e3:.1f} mW, "
      f"効率 {100*10/(10+Ptot.min()):.2f} %")

plt.figure(figsize=(8, 5))
plt.semilogx(fsw / 1e3, Ptot * 1e3, lw=2, label="総損失")
plt.semilogx(fsw / 1e3, [losses(2.0, f, Lsm)["cond"] * 1e3 for f in fsw], "--",
             label="導通損(低周波ほどリプル増)")
plt.semilogx(fsw / 1e3, [(losses(2.0, f, Lsm)["sw"] + losses(2.0, f, Lsm)["gate"]) * 1e3
                         for f in fsw], "--", label="スイッチング損+ゲート損(周波数比例)")
plt.axvline(f_star / 1e3, c="r", ls=":", label=f"解析解 {f_star/1e3:.0f} kHz")
plt.xlabel("スイッチング周波数 [kHz]"); plt.ylabel("損失 [mW]")
plt.title("最適スイッチング周波数(L=4.7µH, Iout=2A)")
plt.legend(); plt.grid(alpha=.3); plt.tight_layout(); plt.show()

総損失の周波数依存と最適スイッチング周波数の存在

青の破線(導通損)は左肩上がり、赤の破線(スイッチング+ゲート損)は右肩上がり。この 2 本の和である黒い実線が谷を作り、その底が赤い点線で示した解析解 195 kHz と一致しています。緑の帯は最小値 +30 % の範囲で、99 kHz から 464 kHz までの 4.7 倍の幅がすべてこの帯に収まるほど谷は平坦です。周波数選定に「唯一の正解」がない理由がここにあります。

解析解 195.1 kHz に対し、数値最小点は 195.0 kHz。式 (12) が正しいことが確認できました。グラフでは、左肩上がりの導通損(低周波でリプルが暴れて RMS が増える)と、右肩上がりのスイッチング損が交差する谷が総損失の最小点になっています。

同時に、谷が非常に平坦であることも読み取れます。100 kHz にすると総損失は最小値 364.0 mW から 467.6 mW(+28 %)に増えるだけ、周波数を 5 倍の 1 MHz まで上げても 776.5 mW(2.13 倍)にとどまり、効率にすると 96.5 % → 95.5 % → 92.8 % の変化です。3 乗根が効くため最適点は鈍く、実際の周波数選定では EMI・部品サイズ・応答速度といった別の制約が支配的になる、という現場の感覚とも合致します。

制御対象のボード線図

平均化モデル $G_{vd}(s)$ を数値的に組み立てて周波数特性を見ます。ここでは ESR と DCR を含めた厳密なインピーダンス計算を使います。

import numpy as np, matplotlib.pyplot as plt

R = 2.5      # 2A 負荷相当


def Gvd(f):
    """制御(デューティ)→出力 の伝達関数。ESR・DCR 込み"""
    s = 2j * np.pi * np.asarray(f, dtype=float)
    Z = 1.0 / (1.0 / (Rc + 1.0 / (s * C)) + 1.0 / R)   # コンデンサ枝と負荷の並列
    return Vin * Z / (Z + s * L + DCR)


f0 = 1 / (2 * np.pi * np.sqrt(L * C))
Qf = R * np.sqrt(C / L)
fz_esr = 1 / (2 * np.pi * Rc * C)
print(f"LC 二重極 f0 = {f0:.0f} Hz, Q = {Qf:.2f}, ESR ゼロ = {fz_esr/1e3:.1f} kHz")

fv = np.logspace(1, 6, 4000)
G = Gvd(fv)
print(f"直流ゲイン {20*np.log10(abs(Gvd(1.0))):.2f} dB, "
      f"ピーク {20*np.log10(abs(G)).max():.2f} dB @ {fv[np.argmax(abs(G))]:.0f} Hz")

fig, ax = plt.subplots(2, 1, figsize=(9, 7), sharex=True)
ax[0].semilogx(fv, 20 * np.log10(abs(G)), lw=2)
ax[0].axvline(f0, ls=":", c="r"); ax[0].axvline(fz_esr, ls=":", c="g")
ax[0].set_ylabel("ゲイン [dB]"); ax[0].grid(alpha=.3, which="both")
ax[0].set_title("制御→出力伝達関数 Gvd(赤: LC二重極, 緑: ESRゼロ)")
ax[1].semilogx(fv, np.angle(G, deg=True), lw=2)
ax[1].axvline(f0, ls=":", c="r"); ax[1].axvline(fz_esr, ls=":", c="g")
ax[1].set_ylabel("位相 [deg]"); ax[1].set_xlabel("周波数 [Hz]"); ax[1].grid(alpha=.3, which="both")
plt.tight_layout(); plt.show()

制御対象Gvdのボード線図(LC二重極とESRゼロ)

上段のゲイン特性は、低域で 21.48 dB の平坦部、3393 Hz(赤い点線)で 32.28 dB の共振ピーク、その後 $-40$ dB/dec の落下、そして 79.6 kHz(緑の点線)から $-20$ dB/dec への傾き変化、という 4 つの区間に分かれます。下段の位相はもっと劇的で、共振点の前後わずか 1 オクターブほどで $0°$ から $-167°$ まで落ちます。狙う交差周波数 30 kHz(赤丸)での位相は $-157.4°$。位相余裕 60° を確保するには、補償器で 128° も持ち上げなければならないことが図から読めます。

直流ゲインは 21.48 dB。これは $V_{in}R/(R+\text{DCR}) = 11.86$ 倍に対応し、理論値 $V_{in} = 12$(21.58 dB)から DCR ぶんだけ下がっています。3393 Hz の LC 共振点付近(実測のピークは 3326 Hz)でゲインが 32.28 dB まで持ち上がり($Q = 5.33$ ぶんのピーク)、位相は $0°$ から一気に $-180°$ 近くまで落ちます。この急激な位相落ちが、バックコンバータの補償設計を難しくしている元凶です。

高域では 79.6 kHz の ESR ゼロによって傾きが $-40$ dB/dec から $-20$ dB/dec に緩み、位相も $-180°$ から少し戻ってきます。ESR はリプル電圧を悪化させる厄介者でしたが、制御の面ではありがたい位相の助けになっている——このねじれた関係が、電源設計でコンデンサ選定が悩ましい理由です。

Type-III 補償と一巡伝達関数

極ゼロを配置し、交差周波数 30 kHz で $|T| = 1$ になるようゲインを決めます。

import numpy as np, matplotlib.pyplot as plt

Vm = 1.0                      # PWM 鋸波の振幅
fz1 = fz2 = 2500.0            # 2つのゼロを LC 共振(3.4kHz)のやや下に
fp1, fp2 = 79.6e3, 150e3      # 極は ESR ゼロと fs/2 に
fc = 30e3                     # 狙う交差周波数 = fs/10


def Gc_shape(f):
    s = 2j * np.pi * np.asarray(f, dtype=float)
    return ((1 + s / (2 * np.pi * fz1)) * (1 + s / (2 * np.pi * fz2)) /
            (s * (1 + s / (2 * np.pi * fp1)) * (1 + s / (2 * np.pi * fp2))))


A = float(1.0 / abs(Gc_shape(fc) * Gvd(fc) / Vm))   # fc で |T|=1 になるゲイン
print(f"補償器ゲイン A = {A:.4g} rad/s")

Tl = A * Gc_shape(fv) * Gvd(fv) / Vm
mag = 20 * np.log10(abs(Tl))
pha = np.unwrap(np.angle(Tl)) * 180 / np.pi
i = np.argmin(abs(mag))
print(f"交差周波数 {fv[i]/1e3:.2f} kHz, 位相余裕 {180+pha[i]:.1f} deg")
print(f"|T|>0dB の範囲での最小位相 = {pha[mag>0].min():.1f} deg")

R1 = 10e3
C1 = 1 / (R1 * A); R2 = 1 / (2 * np.pi * fz1 * C1); C2 = 1 / (2 * np.pi * fp2 * R2)
C3 = 1 / (2 * np.pi * fz2 * R1); R3 = 1 / (2 * np.pi * fp1 * C3)
print(f"R1={R1/1e3:.1f}k C1={C1*1e9:.2f}nF R2={R2:.0f} C2={C2*1e12:.0f}pF "
      f"C3={C3*1e9:.2f}nF R3={R3:.0f}")

得られたゲインは $A = 8597$ rad/s、交差周波数は狙いどおり 30.00 kHz、位相余裕は 71.1° です。加えて「$|T| > 0$ dB の範囲での最小位相 $= -124.9°$」という出力に注目してください。これはゲインが 1 を超えている全周波数帯で位相が $-180°$ に一度も触れていないことを意味します。ゼロを LC 共振点より下に置いたおかげで、$f_0$ 付近の位相の谷が $-180°$ より上に踏みとどまった結果です。ゼロを $f_0$ より上に置く設計(k ファクタ法の素直な適用など)では、低域で位相が $-180°$ を割り込む「条件付き安定」になりやすく、飽和や起動時に不安定化する危険があります。

部品値は $R_1 = 10$ kΩ、$C_1 = 11.63$ nF、$R_2 = 5473$ Ω、$C_2 = 194$ pF、$C_3 = 6.37$ nF、$R_3 = 314$ Ω。E24 系列の近傍値(12 nF / 5.6 kΩ / 200 pF / 6.8 nF / 330 Ω)に丸めても、極ゼロは 10 % 程度しか動かないので設計は成立します。

この部品値が本当に狙いの特性を再現するか、オペアンプ回路のインピーダンスから伝達関数を組み直して確かめます。

def Gc_parts(f):
    """オペアンプ型 Type-III の伝達関数を、CR 部品値から直接組み立てる"""
    s = 2j * np.pi * np.asarray(f, dtype=float)
    Zf = (R2 + 1 / (s * C1)) * (1 / (s * C2)) / (R2 + 1 / (s * C1) + 1 / (s * C2))
    Zi = R1 * (R3 + 1 / (s * C3)) / (R1 + R3 + 1 / (s * C3))
    return -Zf / Zi                       # 反転増幅なので符号は負


Tp = -Gc_parts(fv) * Gvd(fv) / Vm         # 反転を打ち消して一巡伝達関数にする
mp = 20 * np.log10(abs(Tp))
pp = np.unwrap(np.angle(Tp)) * 180 / np.pi
jp = int(np.argmin(abs(mp)))
print(f"部品値版: 交差 {fv[jp]/1e3:.2f} kHz, 位相余裕 {180+pp[jp]:.1f} deg")
print(f"理想版  : 交差 {fv[i]/1e3:.2f} kHz, 位相余裕 {180+pha[i]:.1f} deg")

出力は「部品値版: 交差 30.43 kHz, 位相余裕 71.4 deg」「理想版: 交差 30.00 kHz, 位相余裕 71.1 deg」。交差周波数のズレは 1.4 %、位相余裕のズレは 0.3° にすぎません。理想的な極ゼロ配置と実部品による回路が実質同じ特性になっているので、紙の上の設計をそのまま基板に落とせることが確認できました。

fig, ax = plt.subplots(2, 1, figsize=(9, 7), sharex=True)
ax[0].semilogx(fv, 20 * np.log10(abs(Gvd(fv))), "--", label="制御対象 Gvd")
ax[0].semilogx(fv, 20 * np.log10(abs(A * Gc_shape(fv))), "--", label="補償器 Gc(Type-III)")
ax[0].semilogx(fv, mag, lw=2, label="一巡ゲイン T")
ax[0].axhline(0, c="k", lw=.8); ax[0].set_ylabel("ゲイン [dB]")
ax[0].legend(); ax[0].grid(alpha=.3, which="both"); ax[0].set_ylim(-80, 120)
ax[0].set_title("Type-III 補償後の一巡伝達関数")
ax[1].semilogx(fv, pha, lw=2)
ax[1].axhline(-180, c="k", ls="--", lw=.8)
ax[1].plot(fv[i], pha[i], "ro")
ax[1].annotate(f"位相余裕 {180+pha[i]:.0f}deg", (fv[i], pha[i]),
               textcoords="offset points", xytext=(-90, 20), color="r")
ax[1].set_ylabel("位相 [deg]"); ax[1].set_xlabel("周波数 [Hz]"); ax[1].grid(alpha=.3, which="both")
plt.tight_layout(); plt.show()

Type-III補償後の一巡伝達関数のボード線図

上段では、制御対象 $G_{vd}$(青の破線)と補償器 $G_c$(橙の破線)を掛け合わせた黒い実線が一巡ゲインです。低域では補償器の積分器が効いて $-20$ dB/dec で下り、30 kHz で 0 dB を横切ります。下段の位相を見ると、$f_0$ 付近で $-125°$ まで沈んだあと補償器の 2 つのゼロに持ち上げられ、交差点(赤丸)では $-108.9°$ まで戻っています。緑の点線が示す「$|T| > 0$ dB の帯域での最小位相 $-124.9°$」は $-180°$ より 55° も上にあり、条件付き安定の危険がないことを意味します。

一巡ゲイン(実線)は低域で $-20$ dB/dec の傾きを保ちながら 30 kHz で 0 dB を横切り、そこでの傾きも $-20$ dB/dec になっています。交差点での傾きが $-20$ dB/dec というのが、良い補償設計の視覚的な合格サインです($-40$ dB/dec で横切ると位相が $-180°$ に近づき余裕がなくなります)。位相曲線は $f_0$ 付近でいったん $-125°$ 付近まで沈んだあと、補償器の 2 つのゼロに持ち上げられて交差点では $-109°$ まで戻っており、そこから位相余裕 71° が確保されています。

比較のため、Type-II(ゼロ 1 個)で同じ交差周波数を狙うとどうなるかも見ます。

def type2(fc0, fz=2500.0, fp=150e3):
    def g(f):
        s = 2j * np.pi * np.asarray(f, dtype=float)
        return (1 + s / (2 * np.pi * fz)) / (s * (1 + s / (2 * np.pi * fp)))
    A2 = float(1.0 / abs(g(fc0) * Gvd(fc0) / Vm))
    Tt = A2 * g(fv) * Gvd(fv) / Vm
    m2 = 20 * np.log10(abs(Tt)); p2 = np.unwrap(np.angle(Tt)) * 180 / np.pi
    j = np.argmin(abs(m2))
    return fv[j], 180 + p2[j]


for fc0 in [10e3, 30e3]:
    fcx, pmx = type2(fc0)
    print(f"Type-II で fc={fcx/1e3:.0f} kHz を狙うと位相余裕 = {pmx:.1f} deg")

Type-IIとType-IIIの位相比較、および部品値から組み直した特性

左の図で、赤い破線が Type-II、緑の実線が Type-III の一巡位相です。Type-II はゲイン $A$ を変えても位相の形が変わらないので曲線は 1 本しか描けず、変わるのは 0 dB を横切る位置(丸印)だけ。その丸が $-180°$ の破線に接するか、わずかに下回ってしまっているのが見て取れます。ゼロが 1 個では、LC 二重極の落とし込みを埋め合わせられないという主張の図解です。右の図は理想の極ゼロ配置(緑)と、$R_1$〜$C_3$ の実部品値から組み直した特性(紫の破線)の比較で、2 本の線がほぼ完全に重なっています。交差 30.43 kHz・位相余裕 71.4° と、理想値(30.00 kHz・71.1°)から誤差 1.5 % 以内。紙の上の極ゼロ配置がそのまま CR 部品に落ちることが確認できました。

Type-II では 10 kHz 交差で位相余裕 $-4.3°$(不安定)、30 kHz でも 6.5° しか取れません。ゼロが 1 個では、LC 二重極が奪う $-180°$ を取り戻しきれないのです。ESR = 20 mΩ のセラミック出力段では Type-III が必須である、という先の判断が数値で裏づけられました(試しに Rc を 200 mΩ の電解コンデンサ相当にすると ESR ゼロが 8.0 kHz まで下がり、Type-II でも $f_c = 20$ kHz で位相余裕 59.9° が取れるようになります)。

負荷ステップに対する過渡応答

最後に、閉ループの効き目を時間領域で確認します。出力インピーダンス $Z_o(s)$ を $1 + T(s)$ で割ったものが閉ループの出力インピーダンスなので、そこに 1 A のステップを入れます。

import numpy as np, scipy.signal as sig, matplotlib.pyplot as plt

s = np.poly1d([1, 0])
Za = L * s + DCR                                   # インダクタ枝
Zb_n, Zb_d = np.poly1d([Rc * C, 1]), np.poly1d([C, 0])   # コンデンサ枝 (ESR込み)
Zc_n, Zc_d = np.poly1d([R]), np.poly1d([1])              # 負荷
Z_n = Zb_n * Zc_n
Z_d = Zb_n * Zc_d + Zb_d * Zc_n                    # コンデンサ枝 // 負荷
Gv_n, Gv_d = Vin * Z_n, Z_n + Za * Z_d             # Gvd
Zo_n, Zo_d = Za * Z_n, Z_n + Za * Z_d              # 開ループ出力インピーダンス

wz, wp1_, wp2_ = 2 * np.pi * fz1, 2 * np.pi * fp1, 2 * np.pi * fp2
Gc_n = A * np.poly1d([1 / wz, 1]) * np.poly1d([1 / wz, 1])
Gc_d = np.poly1d([1, 0]) * np.poly1d([1 / wp1_, 1]) * np.poly1d([1 / wp2_, 1])
T_n, T_d = Gv_n * Gc_n, Gv_d * Gc_d                # 一巡伝達関数

cl = sig.TransferFunction((Zo_n * T_d).c, (Zo_d * (T_d + T_n)).c)   # Zo/(1+T)
ol = sig.TransferFunction(Zo_n.c, Zo_d.c)
t = np.linspace(0, 300e-6, 60000)
_, y_cl = sig.step(cl, T=t)
_, y_ol = sig.step(ol, T=t)
print(f"閉ループ: 1A 負荷ステップでの最大電圧降下 = {y_cl.max()*1e3:.1f} mV")
print(f"開ループ(D固定): 最大電圧降下 = {y_ol.max()*1e3:.1f} mV")
print(f"目安式 dI/(2*pi*fc*C) = {1/(2*np.pi*fc*C)*1e3:.1f} mV")

plt.figure(figsize=(9, 5))
plt.plot(t * 1e6, -y_ol * 1e3, "--", label="開ループ(デューティ固定)")
plt.plot(t * 1e6, -y_cl * 1e3, lw=2, label="閉ループ(Type-III 補償)")
plt.xlabel("時間 [µs]"); plt.ylabel("出力電圧の変動 [mV]")
plt.title("1A の負荷ステップに対する応答")
plt.legend(); plt.grid(alpha=.3); plt.tight_layout(); plt.show()

1Aの負荷ステップに対する開ループと閉ループの応答比較

左が全体像です。デューティ比を固定した開ループ(赤の破線)は 68 µs で 400 mV も落ち、そのあと LC 共振の周期 295 µs でゆらゆらと振動を続けます。閉ループ(緑)は同じスケールではほぼ平坦にしか見えません。右はその閉ループを拡大したもので、7.6 µs という短時間で 44.1 mV の底を打ち、いったん $+6$ mV ほどオーバーシュートしたあと 163 µs で $\pm 5$ mV の帯(緑の網かけ)へ収まります。振動が 1 往復もせずに収まっているのは、補償器が LC 共振の $Q$ を実質的に潰しているからです。

閉ループでの最大電圧降下は 44.1 mV。目安式 $\Delta I/(2\pi f_c C) = 53.1$ mV と同じオーダーで、少し良い値に収まりました(実際にはループが完全に切れているわけではなく、交差周波数より低い帯域では有限のループゲインが効いているためです)。一方、デューティ比を固定した開ループでは 400.2 mV も落ち、LC 共振の $Q = 5.33$ に応じたリンギングが数百 µs 続きます。

グラフを見ると差は歴然です。開ループは 3.4 kHz の共振(周期 295 µs)でゆらゆらと振動し、最初の谷が 68 µs 付近に来たあともなかなか収まりません。対する閉ループは 7.6 µs で早々に底を打ち、163 µs で 5 mV 以内へ収束します。補償器が共振の Q を潰し、同時に電圧降下を約 1/9 に抑えているわけです。過渡応答を良くしたければ、$f_c$ を上げるか $C$ を増やす——式が示すとおりの結論が、時間波形でも確認できました。

まとめ

本記事では、降圧型 DC-DC コンバータ(バックコンバータ)を、動作原理から制御ループ設計まで通して解説しました。

  • ボルト秒平衡:定常状態ではインダクタ電圧の 1 周期積分がゼロ。ここから $V_{out} = D V_{in}$ が、負荷やインダクタンスに依らず成り立つ
  • リプル電流 $\Delta I_L = (V_{in}-V_{out})D/(Lf_s)$:$D = 0.5$ で最大、負荷電流に依存しない。リプル率 20〜40 % が設計の定石で、飽和電流はピーク値 $I_{out} + \Delta I_L/2$ で判断する
  • 出力リプル電圧 $\Delta V_C = \Delta I_L/(8Cf_s)$ と ESR 項 $\Delta I_L R_c$:低 ESR のセラミックでない限り ESR 項が支配する。設計例では 1.84 mV 対 8.84 mV
  • CCM/DCM:境界は $I_{out} = \Delta I_L/2$、無次元では $K = 2Lf_s/R$ と $1-D$ の大小。DCM では変換比が $M = 2/(1+\sqrt{1+4K/D^2})$ となり、負荷にも依存する
  • 損失の分解:導通損は $I_{rms}^2 = I_{out}^2 + \Delta I_L^2/12$ に比例、スイッチング損は $\frac{1}{2}V_{in}I(t_r+t_f)f_s$。両者の綱引きで最適周波数 $f_s^* = (a^2R_{ac}/6b)^{1/3}$ が決まるが、極値は平坦
  • 制御:状態平均化で $G_{vd}(s) = V_{in}/(LCs^2 + (L/R)s + 1)$。LC 二重極が $-180°$ を奪うので、低 ESR では Type-III 補償が必要。設計例では交差 30 kHz・位相余裕 71°、1 A ステップの電圧降下を 400 mV から 44 mV に改善

ここで身につけた「ボルト秒平衡 → 変換比」「電荷平衡 → リプル電圧」「平均化 → 小信号モデル」という 3 段構えの解析手順は、ブースト・バックブースト・フライバック・フォワードなど他のトポロジにもそのまま使えます。トポロジが変わっても、変わるのはインダクタにかかる電圧のパターンだけです。

次のステップとして、以下の記事も参考にしてください。