単三電池1本は 1.5 V しかありません。それなのに、その電池1本で動く LED ライトは 3 V 以上を必要とする白色 LED を平気で光らせます。モバイルバッテリーの中身は 3.7 V のリチウムイオンセルですが、USB 端子からは 5 V が、USB PD なら 9 V や 20 V が出てきます。電気自動車では 400 V のバッテリーから 800 V の駆動系へ電圧を持ち上げますし、太陽電池パネルの 30 V 前後の出力をパワーコンディショナ内部の 350 V の直流バスへ送り込むのも、同じ回路です。
「低い電圧から高い電圧を作る」。これは一見すると、エネルギー保存則に反しているように見えます。トランスなら巻数比で電圧を上げられますが、直流にはトランスが使えません。抵抗もコンデンサも、電圧を分けることはできても増やすことはできません。ところがインダクタ 1 個・スイッチ 1 個・ダイオード 1 個・コンデンサ 1 個、たったこれだけで直流電圧は上がります。この回路が昇圧チョッパ(ブーストコンバータ)です。

左の回路図が昇圧チョッパのすべてです。部品は 4 つしかなく、能動素子はスイッチ 1 個だけ。右のグラフはコイルに流れる電流で、スイッチを閉じている網掛け区間で電流が増え(磁界にエネルギーを溜め)、開いている区間で減る(出力へ吐き出す)という往復を延々くり返しています。この「溜めて吐き出す」を毎秒 10 万回のペースで行い、出力コンデンサでならすと、入力より高い安定な直流が得られます。
なぜ上がるのか、どこまで上げられるのか、そして「理論上は無限に上げられるはずなのに、実物は 5 倍あたりで頭打ちになる」のはなぜか。この記事ではそれを、ひとつも式を飛ばさずに追いかけます。理解すると、次のような場面で自分の手で設計判断ができるようになります。
- 電源回路の部品選定 — 「なぜインダクタは 47 µH なのか」「出力コンデンサを増やせばリプルは減るのか」を、データシートの推奨値に頼らず自分で計算できます。太陽電池の MPPT 回路や、小型衛星のバス電圧生成回路のように、既製の電源 IC がそのまま使えない場面で効いてきます。
- フィードバック制御の設計 — 昇圧チョッパには右半平面零点という厄介な性質があり、これが制御ループの帯域を強く縛ります。「降圧コンバータと同じ感覚で補償器を組んだら発振した」という定番の失敗を、原理から説明できるようになります。
- 効率と発熱の見積り — インダクタの巻線抵抗がわずか 0.1 Ω あるだけで、昇圧比 10 倍を狙った回路の効率が 70 % まで落ちます。この「わずかな抵抗が致命傷になる」構造を理解しておくと、無理な設計を早い段階で回避できます。
本記事の内容
- コイルとスイッチだけで電圧が上がる仕組みの直感的な理解
- 電圧時間積平衡(ボルト秒平衡)から $V_o/V_{in} = 1/(1-D)$ を導出する
- 電荷平衡から入力電流と出力電流の関係 $I_{in} = I_o/(1-D)$ を導出する
- インダクタ電流リプル $\Delta i_L$ と出力電圧リプル $\Delta v_o$ の設計式
- 連続導通モード(CCM)と不連続導通モード(DCM)の境界、臨界インダクタンス $L_{crit}$
- 寄生直流抵抗による昇圧比の頭打ちと、そのときの効率
- 状態空間平均化による小信号モデルと右半平面零点
- 以上すべてを Python の区分線形シミュレーションで数値検証する
前提知識
この記事を読む前に、以下の記事を読んでおくと理解がスムーズです。
必要な道具はごくわずかです。インダクタの $v_L = L\,di_L/dt$、コンデンサの $i_C = C\,dv_C/dt$、そして「定常状態では 1 周期後に元の状態に戻る」という周期性の考え方。この 3 つだけで、昇圧比からリプル式まで全部導けます。降圧コンバータを先に読んでいれば、ボルト秒平衡の考え方はそのまま再利用できます。
昇圧チョッパとは — なぜコイルとスイッチだけで電圧が上がるのか
数式に入る前に、まず「電圧が上がる」という現象そのものの正体をつかんでおきましょう。鍵はインダクタの電流の慣性です。
水道の蛇口を勢いよく閉めたとき、「ドン」という音とともに配管が揺れることがあります。水撃(ウォーターハンマー)と呼ばれる現象です。管の中を流れている水には運動量があり、蛇口を急に閉じても水は止まりたがりません。行き場を失った水が弁を押し、瞬間的に元の水圧をはるかに超える圧力が発生します。実際、家庭用水道の 0.3 MPa 程度の圧力が、水撃では 1 MPa を超えることもあります。「流れを急に止めると、圧力が跳ね上がる」のです。
インダクタで起きているのはまったく同じことです。インダクタを流れる電流は、水の流れに相当する「電気の運動量」を持っています。$v_L = L\,di_L/dt$ という式は、「電流を変えようとすると電圧が発生する」と読めますが、裏返せば「電流を急に変えようとすると、いくらでも大きな電圧が発生する」という意味でもあります。$di_L/dt$ が大きいほど $v_L$ は大きくなり、原理的に上限はありません。
そこで、こういう手順を考えます。
- まずインダクタの片側を電源に、もう片側をスイッチでグランドに落とす。インダクタには電源電圧がまるごとかかり、電流がぐんぐん増えていく(エネルギーを磁界に溜める)。
- 電流がある程度たまったところで、スイッチを開く。行き場を失った電流は、それでも流れ続けようとする。
- 電流の逃げ道をダイオード経由で出力側に用意しておく。すると電流はそちらへ流れ込み、出力コンデンサを充電する。このときインダクタの端子電圧は、電流を維持するために入力電圧より高くまで自動的に持ち上がる。
ポイントは 3 番です。オフの瞬間、インダクタは「電流を流し続けるために必要な電圧を、自分で作り出す」ように振る舞います。出力コンデンサの電圧が $V_{in}$ より高くても、インダクタ側の電位はそれを超えるところまで上がり、電流を押し込みます。エネルギー保存則には反していません。オン期間に電源から受け取ったエネルギーを、オフ期間に「高い電圧・短い時間」の形で吐き出しているだけです。電圧が上がった分、電流は減ります。これが後で出てくる $I_{in} = I_o/(1-D)$ の正体です。
車のイグニッションコイルや、使い捨てカメラのストロボ充電回路は、まさにこの原理をむき出しで使っています。12 V のバッテリーから数万ボルトの火花を作るのも、1.5 V の乾電池から 300 V のフラッシュ用電圧を作るのも、「コイルに電流を溜めて、急に切る」の一言で説明できます。昇圧チョッパは、この乱暴な現象を毎秒 10 万回きれいに繰り返し、出力コンデンサで平滑して安定な直流にしたものだと考えてください。
さて、直感がつかめたところで、実際の回路の 2 つの状態を式に落としていきましょう。
回路構成と 2 つのスイッチ状態
昇圧チョッパの部品は 4 つだけです。入力側から順に、インダクタ $L$、スイッチ $S$(実際は MOSFET)、ダイオード $D$、出力コンデンサ $C$、そして負荷 $R$。降圧コンバータとの違いはインダクタの位置です。降圧型はスイッチが入力側・インダクタが出力側にありましたが、昇圧型はインダクタが入力側・スイッチがインダクタとグランドの間にあります。この順番の入れ替えだけで、電圧が下がる回路が上がる回路に変わります。
スイッチは周期 $T = 1/f_s$ で開閉し、1 周期のうち $DT$ の時間だけオンになります。この $D$($0 \le D < 1$)がデューティ比です。以下、定常状態でインダクタ電流が常にゼロより大きい状態(連続導通モード、CCM)を仮定します。
オン期間($0 \le t < DT$) — スイッチ $S$ が導通し、インダクタの右端がグランドに落ちます。インダクタの両端には入力電圧がそのままかかります。
$$ v_L = V_{in} \quad \Longrightarrow \quad L\frac{di_L}{dt} = V_{in} > 0 $$
インダクタ電流は一定の傾き $V_{in}/L$ で直線的に増加します。このときダイオードは、出力電圧 $V_o$ がアノード側(グランド)より高いので逆バイアスされ、遮断されます。つまり出力側は入力から完全に切り離されており、負荷 $R$ に流れる電流はすべて出力コンデンサ $C$ が供給します。コンデンサは放電する一方なので、出力電圧はゆっくり下がっていきます。
$$ C\frac{dv_C}{dt} = -\frac{v_C}{R} $$
オフ期間($DT \le t < T$) — スイッチが開きます。インダクタ電流の行き場はダイオードしかないので、ダイオードが導通し、電流は出力へ流れ込みます。インダクタの右端の電位は $v_C$(ダイオードの順方向電圧を無視すれば)に固定されるので、
$$ v_L = V_{in} – v_C \quad \Longrightarrow \quad L\frac{di_L}{dt} = V_{in} – v_C < 0 $$
$v_C > V_{in}$(昇圧しているので当然)なので、この傾きは負です。インダクタ電流は直線的に減少します。同時にコンデンサ側は、インダクタからの電流 $i_L$ を受け取りつつ負荷へ $v_C/R$ を吐き出します。
$$ C\frac{dv_C}{dt} = i_L – \frac{v_C}{R} $$
ここで降圧コンバータとの決定的な違いに気づいてください。降圧型ではインダクタが出力に直結しているので、負荷には常に $i_L$ が流れ続けます。ところが昇圧型では、オン期間に出力へ電流が届きません。負荷電流はコンデンサだけで賄われます。この非対称性が、後で見る出力リプル電圧の式の形と、右半平面零点という制御上の難物、その両方の根っこになっています。

2 つの状態を色分けした経路で並べると、昇圧チョッパの構造がはっきりします。上のオン期間では回路が2 つの独立したループに分断されており、青いループでコイルが充電される一方、橙のループでは出力コンデンサが単独で負荷を支えています。下のオフ期間ではダイオードが導通して 2 つのループがつながり、コイル電流がそのまま出力へ流れ込みます。「オン期間は入力と出力が完全に切り離される」というこの図の事実が、後の出力リプル式と右半平面零点の両方の出発点になります。
2 つの状態の微分方程式が書けたので、次はこれを 1 周期にわたって眺め、「定常状態とは何か」を式にしていきます。
定常状態とは何か — ボルト秒平衡と電荷平衡
スイッチング電源の解析には、ひとつ強力な武器があります。「定常状態では、1 周期後に回路の状態が元に戻る」という、ほとんど当たり前の事実です。当たり前ですが、これを式にすると昇圧比が一発で出ます。
定常状態では、インダクタ電流は 1 周期後に元の値に戻ります。
$$ i_L(T) = i_L(0) $$
一方、インダクタの基本式 $v_L = L\,di_L/dt$ を $0$ から $T$ まで積分すると
$$ i_L(T) – i_L(0) = \frac{1}{L}\int_0^T v_L(t)\,dt $$
左辺がゼロなので、右辺の積分もゼロでなければなりません。
$$ \begin{equation} \int_0^T v_L(t)\,dt = 0 \end{equation} $$
これが電圧時間積平衡(ボルト秒平衡、volt-second balance)です。「インダクタにかかる電圧を 1 周期分積分するとゼロ」、言い換えれば「インダクタの平均電圧はゼロ」。直流的にはインダクタはただの導線なのだから当然だ、と思えれば理解できています。
同じ議論をコンデンサでもやります。$i_C = C\,dv_C/dt$ を積分し、$v_C(T) = v_C(0)$ を使うと
$$ \begin{equation} \int_0^T i_C(t)\,dt = 0 \end{equation} $$
これが電荷平衡(charge balance)です。「コンデンサの平均電流はゼロ」。直流的にはコンデンサは断線なのだから、これも当然です。
この 2 つを昇圧チョッパに適用します。
ボルト秒平衡から昇圧比を導く
インダクタ電圧は、オン期間で $V_{in}$、オフ期間で $V_{in} – V_o$ でした(出力リプルは小さいとして $v_C \approx V_o$ と近似します)。式 (1) の積分を 2 つの区間に分けて書き下すと
$$ V_{in}\cdot DT + (V_{in} – V_o)\cdot(1-D)T = 0 $$
$T$ で割ってから、$V_{in}$ の項をまとめます。第 1 項と第 2 項の $V_{in}$ をくくり出すと
$$ V_{in}\big[D + (1-D)\big] – V_o(1-D) = 0 $$
$D + (1-D) = 1$ なので、括弧の中はきれいに 1 になります。
$$ V_{in} = V_o(1-D) $$
$V_{in}$ で両辺を割って、$V_o/V_{in}$ について解くと、昇圧チョッパの中心となる式が出ます。
$$ \begin{equation} M \equiv \frac{V_o}{V_{in}} = \frac{1}{1-D} \end{equation} $$
昇圧比 $M$ はデューティ比だけで決まり、負荷にもインダクタンスにも周波数にもよりません。 $D = 0$ なら $M = 1$(スイッチを一度も入れなければ、ダイオードを通って入力がそのまま出るだけ)、$D = 0.5$ なら $M = 2$、$D = 0.9$ なら $M = 10$。そして $D \to 1$ で $M \to \infty$ に発散します。
この発散は明らかに物理的におかしいです。デューティ比を 0.999 にすれば 1000 倍の電圧が出る、というのは信じがたい。実際には出ません。なぜ出ないのかは「寄生抵抗」のセクションで種明かしをしますが、まず理想の世界での関係式をひととおり揃えておきましょう。
同じ結果を、別の見方で確認しておきます。オフ期間にインダクタ電圧の大きさは $V_o – V_{in}$ です。ボルト秒平衡は「オン期間に溜めたボルト秒とオフ期間に吐き出すボルト秒が等しい」と読めるので
$$ \underbrace{V_{in} \cdot DT}_{\text{溜める}} = \underbrace{(V_o – V_{in})\cdot(1-D)T}_{\text{吐き出す}} $$
オフ期間が短くなる($D$ が大きくなる)ほど、同じボルト秒を吐き出すには $V_o – V_{in}$ を大きくするしかありません。だから $D$ を上げると出力電圧が上がる。この読み方のほうが物理的な因果関係がはっきりします。

上段がコイル電圧、下段がコイル電流です。青く塗った $V_{in}\cdot DT = 60\ \mu$V·s と赤く塗った $(V_{in}-V_o)(1-D)T = -60\ \mu$V·s がぴったり同じ面積になっていることが、ボルト秒平衡の中身そのものです。この面積の釣り合いが崩れれば電流は毎周期ずれていってしまうので、定常状態では必ずこう釣り合うしかありません。下段を見ると、電圧が区間ごとに一定なので電流は折れ線(三角波)になり、1 周期後にきっちり 1.7 A へ戻っています。この三角波の高さ 0.600 A が、次節で求める電流リプル $\Delta i_L$ です。
電荷平衡から電流の関係を導く
次にコンデンサ電流です。オン期間はダイオードが切れているので $i_C = -V_o/R = -I_o$(放電のみ)。オフ期間は $i_C = i_L – I_o$。リプルを無視してインダクタ電流の平均値を $I_L$ と書けば、式 (2) は
$$ (-I_o)\cdot DT + (I_L – I_o)\cdot(1-D)T = 0 $$
$T$ で割り、$I_o$ の項をまとめます。
$$ I_L(1-D) = I_o\big[D + (1-D)\big] = I_o $$
よって
$$ \begin{equation} I_L = \frac{I_o}{1-D} \end{equation} $$
昇圧チョッパではインダクタが入力に直結しているので、入力電流の平均値はインダクタ電流の平均値そのものです。つまり $I_{in} = I_L = I_o/(1-D)$。
この式の意味を噛み締めてください。$D = 0.9$ で 10 倍に昇圧すると、入力電流は出力電流の 10 倍流れます。出力 1 A が欲しければ入力に 10 A 流す必要がある。昇圧チョッパの設計で「インダクタと入力側コンデンサが妙に大きい」のは、この入力電流の大きさのせいです。
エネルギー保存との整合も確認しておきます。理想(損失ゼロ)なら入力電力と出力電力は等しいはずです。
$$ P_{in} = V_{in}I_{in} = V_{in}\cdot\frac{I_o}{1-D} = \frac{V_{in}}{1-D}\cdot I_o = V_o I_o = P_o $$
$V_o = V_{in}/(1-D)$ を使うと、確かにぴったり一致しました。電圧が $1/(1-D)$ 倍になり、電流が $(1-D)$ 倍になる。理想の昇圧チョッパは「直流のトランス」であり、巻数比が $1 : 1/(1-D)$ で連続可変というわけです。この見方は、後で寄生抵抗を入れるときにも役立ちます。

左のグラフで、電圧の倍率(青)は $D \to 1$ で急激に立ち上がる一方、電流の倍率(橙)は直線的にゼロへ向かいます。右の棒グラフは同じことを動作点ごとに並べたもので、$D = 0.9$ では電圧が 10 倍になる代わりに出力電流は入力の 0.10 倍しか取れず、両者の積である電力はどの $D$ でも常に ×1.00 です。昇圧チョッパが「巻数比を連続可変できる直流トランス」だと言われるのは、この対称性のためです。逆に言えば、10 倍昇圧の回路は入力側に出力の 10 倍の電流を流す設計にしなければなりません。
ここまでは電圧・電流の平均値の話でした。しかし実際の波形は三角波状に脈動しています。次はその脈動の大きさ、つまりリプルを定量化しましょう。部品選定に直結する、いちばん実用的なパートです。
インダクタ電流リプル $\Delta i_L$ とインダクタの選定
インダクタ電流は平均値 $I_L$ のまわりを三角波状に揺れます。この山と谷の差が電流リプル $\Delta i_L$ です。
オン期間のあいだ、インダクタには一定電圧 $V_{in}$ がかかり続けます。$L\,di_L/dt = V_{in}$ の右辺が定数なので、電流は一定の傾きで増加します。オン期間の長さは $DT$ ですから、この間の増加量は傾き × 時間で
$$ \begin{equation} \Delta i_L = \frac{V_{in}}{L}\cdot DT = \frac{V_{in}D}{Lf_s} \end{equation} $$
念のため、オフ期間からも同じ値が出ることを確かめておきます。オフ期間の傾きは $(V_{in}-V_o)/L$(負)で、長さは $(1-D)T$ なので、減少量の大きさは
$$ |\Delta i_L| = \frac{V_o – V_{in}}{L}(1-D)T $$
ここに $V_o = V_{in}/(1-D)$ を代入すると、$V_o – V_{in} = V_{in}\left[\frac{1}{1-D}-1\right] = \frac{V_{in}D}{1-D}$ なので
$$ |\Delta i_L| = \frac{1}{L}\cdot\frac{V_{in}D}{1-D}\cdot(1-D)T = \frac{V_{in}DT}{L} $$
きちんと一致しました。当然といえば当然で、これはボルト秒平衡そのものです。
式 (5) を眺めると、設計上の含意が読み取れます。
- リプルは $L$ に反比例する。 リプルを半分にしたければインダクタンスを 2 倍にする。ただし同じコアなら体積も重量もほぼ 2 倍になります。
- リプルは $f_s$ に反比例する。 周波数を上げれば同じリプルを小さいインダクタで実現できます。これがスイッチング周波数の高周波化が進む最大の理由です。ただし周波数を上げるとスイッチング損失が増えるので、無制限には上げられません。
- リプルは出力電圧に依存しない。 式 (5) には $V_o$ が出てきません。入力電圧とデューティ比だけで決まります。降圧型では $\Delta i_L = \frac{(V_{in}-V_o)D}{Lf_s}$ と出力電圧が入るので、ここは対照的です。
実務ではリプル率 $r = \Delta i_L / I_L$ を 20〜40 % に取るのが定石です。リプルを小さくしすぎるとインダクタが巨大になり、大きくしすぎると次に述べる DCM に落ちたり、ピーク電流が増えて磁気飽和や損失が問題になります。$r = 0.3$ あたりが体積・損失・安定性のバランス点です。
具体例で数値を入れてみましょう。以降この記事では次の設計例を通して使います。
$$ V_{in} = 12\,\mathrm{V},\quad D = 0.5,\quad f_s = 100\,\mathrm{kHz},\quad L = 100\,\mu\mathrm{H},\quad C = 100\,\mu\mathrm{F},\quad R = 24\,\Omega $$
まず $V_o = 12/(1-0.5) = 24$ V、$I_o = 24/24 = 1$ A、$I_L = 1/0.5 = 2$ A。そしてリプルは
$$ \Delta i_L = \frac{12 \times 0.5}{100\times 10^{-6}\times 100\times 10^{3}} = \frac{6}{10} = 0.6\ \mathrm{A} $$
リプル率は $0.6/2 = 30\ \%$、狙いどおりです。ピーク電流は $I_L + \Delta i_L/2 = 2.3$ A なので、インダクタの飽和電流はこれに余裕を見て 3〜4 A 品を選びます。ここで注意すべきは、ピーク電流を決めるのは出力電流ではなく入力電流側の $I_L$ だという点です。出力 1 A の電源なのに 2.3 A のインダクタが要る、というのが昇圧型の相場観です。
電流リプルの次は、読者が実際にオシロで見る量、出力電圧のリプルを求めましょう。ここで昇圧型と降圧型の性格の違いがはっきり出ます。
出力リプル電圧 $\Delta v_o$ とコンデンサの選定
出力電圧のリプルを決めるのは、コンデンサが「充電されている時間」と「放電されている時間」に何クーロン出入りするかです。
昇圧チョッパのオン期間を思い出してください。ダイオードが遮断されているので、出力コンデンサは負荷にひとりで電流を供給します。その電流は $I_o$(一定とみなす)、時間は $DT$。したがってこの間にコンデンサから失われる電荷は
$$ \Delta Q = I_o \cdot DT $$
コンデンサの電圧降下は $\Delta v = \Delta Q / C$ ですから
$$ \begin{equation} \Delta v_o = \frac{I_o D T}{C} = \frac{I_o D}{C f_s} \end{equation} $$
オフ期間には、インダクタから流れ込む電流が負荷電流を上回るぶんだけコンデンサが充電され、電圧が元に戻ります。定常状態なら往復でちょうど収支が合うので、リプルの山と谷の差は式 (6) で与えられます。
降圧型の $\Delta v_o = \frac{\Delta i_L}{8Cf_s}$ と見比べてください。形がまったく違います。
- 降圧型のリプルは電流リプル $\Delta i_L$ に比例します。インダクタを大きくして $\Delta i_L$ を減らせば、出力リプルも減ります。
- 昇圧型のリプルは負荷電流 $I_o$ そのものに比例します。インダクタをいくら大きくしても、オン期間中にコンデンサが負荷を賄う事実は変わらないので、リプルは減りません。
この違いは実務でかなり効きます。昇圧チョッパの出力リプルを下げる手段は、実質的にコンデンサ容量を増やすか、周波数を上げるかの二択です。「リプルが大きいのでインダクタを大きくしよう」という降圧型の直感は通用しません。
設計例で計算してみます。
$$ \Delta v_o = \frac{1 \times 0.5}{100\times10^{-6}\times 100\times10^{3}} = \frac{0.5}{10} = 0.05\ \mathrm{V} = 50\ \mathrm{mV} $$
24 V に対して 0.21 % ですから、まずまずの値です。
ただし、実物のオシロ波形はこれよりずっと汚くなります。理由は等価直列抵抗(ESR)です。実際のコンデンサは理想容量に小さな抵抗が直列に入ったモデルで表され、コンデンサ電流が流れるとその抵抗にも電圧が発生します。昇圧型のコンデンサ電流は、オン期間の $-I_o$ からオフ期間の $i_L – I_o$ へステップ状に跳ぶので、電流の振れ幅はインダクタのピーク電流 $I_{L,\mathrm{peak}}$ に等しくなります。したがって ESR による寄与は
$$ \Delta v_{ESR} \approx R_{ESR}\cdot I_{L,\mathrm{peak}} $$
設計例で $I_{L,\mathrm{peak}} = 2.3$ A、ESR が 30 mΩ の電解コンデンサだとすると、$\Delta v_{ESR} \approx 69$ mV。容量成分の 50 mV より大きい。つまりこの設計では、リプルの主役はコンデンサの容量ではなく ESR です。容量を 2 倍にしても容量成分の 25 mV しか減らず、全体はほとんど改善しません。低 ESR のセラミックコンデンサや導電性高分子コンデンサが電源回路で好まれるのは、まさにこの理由です。
リプルの式が揃ったので、次はもう一段深い問題に進みます。ここまではずっと「インダクタ電流は常に正」と仮定してきましたが、負荷が軽いとその仮定が破れます。そのときに何が起きるかを見ていきましょう。
連続導通モード(CCM)と不連続導通モード(DCM)
インダクタ電流は平均値 $I_L$ のまわりを $\pm\Delta i_L/2$ で揺れています。負荷が軽くなると $I_o$ が減り、式 (4) より $I_L$ も減ります。一方リプル $\Delta i_L$ は式 (5) より負荷に依存しません。平均値だけが下がり、振幅は変わらない。 そうすると、いずれ谷がゼロに達します。
$$ I_L – \frac{\Delta i_L}{2} = 0 $$
これより電流が減ろうとすると、ダイオードが逆流を許さないため電流はゼロに張り付き、そこで止まります。この状態が不連続導通モード(DCM: Discontinuous Conduction Mode)、そうならない状態が連続導通モード(CCM: Continuous Conduction Mode)です。1 周期が「オン」「オフ(ダイオード導通)」の 2 区間から、「オン」「オフ」「電流ゼロ」の 3 区間に増えます。
臨界インダクタンス $L_{crit}$ の導出
CCM を維持する条件は $I_L > \Delta i_L/2$ です。それぞれ式 (4)(5) で書き換えると
$$ \frac{I_o}{1-D} > \frac{V_{in}DT}{2L} $$
左辺の $I_o$ を入力側の量で表しましょう。$I_o = V_o/R$ で $V_o = V_{in}/(1-D)$ ですから、$I_o = \dfrac{V_{in}}{(1-D)R}$。これを代入すると
$$ \frac{V_{in}}{(1-D)^2 R} > \frac{V_{in}DT}{2L} $$
両辺に $V_{in}$ が共通なので消え、$L$ について解くと臨界インダクタンスが得られます。
$$ \begin{equation} L > L_{crit} = \frac{D(1-D)^2 R T}{2} = \frac{D(1-D)^2 R}{2f_s} \end{equation} $$
設計例($D=0.5$、$R=24\,\Omega$、$T=10\,\mu$s)で計算すると
$$ L_{crit} = \frac{0.5 \times 0.25 \times 24 \times 10\times10^{-6}}{2} = 15\ \mu\mathrm{H} $$
採用した $L = 100\ \mu$H は十分これを上回っているので CCM です。
ここでひとつ注意があります。$L_{crit}$ は $D$ に依存するので、動作範囲全体で CCM を保証したければ、$D(1-D)^2$ が最大になる $D$ で評価しなければなりません。この関数を微分すると
$$ \frac{d}{dD}\Big[D(1-D)^2\Big] = (1-D)^2 – 2D(1-D) = (1-D)(1 – 3D) $$
$0 < D < 1$ では $(1-D) > 0$ なので、$1-3D = 0$、すなわち $D = 1/3$ で最大です。そのときの値は $\frac{1}{3}\cdot\left(\frac{2}{3}\right)^2 = \frac{4}{27}$。したがって最悪ケースの臨界インダクタンスは
$$ L_{crit,\max} = \frac{4}{27}\cdot\frac{RT}{2} = \frac{2RT}{27} $$
設計例では $2\times24\times10\times10^{-6}/27 = 17.8\ \mu$H。降圧型の最悪ケースが $D \to 0$ だったのに対し、昇圧型は $D = 1/3$ で最も CCM を失いやすいという違いがあります。この $D=1/3$ は昇圧比 1.5 倍にあたるので、「軽めの昇圧で軽負荷」という、ごく普通の動作点が実は一番きわどい、という覚えておくべき事実です。

左のグラフは $L = 15\ \mu$H 固定で負荷抵抗だけを変えたときのコイル電流です。3 本とも三角波の高さ(リプル幅)は 4 A でまったく同じで、平均値だけが下へずり落ちているのがわかります。重負荷(青)では谷が 2 A で浮いていますが、$R = 24\ \Omega$(橙)で谷がちょうどゼロに接し、さらに軽い $R = 120\ \Omega$(赤)では電流がゼロに張り付く区間が現れて DCM に入ります。右のグラフは臨界インダクタンス $L_{crit} = D(1-D)^2RT/2$ の形で、ピンクに塗った領域が DCM です。頂点が $D = 1/3$ にあり、そこでの値 17.8 µH が「どの動作点でも CCM を保証するために必要な最小の $L$」になります。採用値 100 µH(緑破線)はこの山全体より十分上にあるので、全デューティ範囲で CCM を維持できます。
DCM での変換比を導く
DCM に入ると、昇圧比 $M = 1/(1-D)$ は成り立ちません。導出し直しましょう。
DCM では 1 周期が 3 区間に分かれます。デューティ比を $D_1 = D$(スイッチオン)、ダイオード導通期間を $D_2 T$、残りを電流ゼロ期間 $D_3 T$ とします($D_1 + D_2 + D_3 = 1$)。
ステップ 1: ピーク電流を求める。 オン期間は電流ゼロから始まり、傾き $V_{in}/L$ で増えるので、オン終了時のピーク電流は
$$ I_{pk} = \frac{V_{in}}{L}D_1 T $$
ステップ 2: ダイオード導通期間の長さを求める。 オフ期間は傾き $(V_{in}-V_o)/L$(負)で減少し、$D_2T$ でちょうどゼロに達します。減少量がピーク電流に等しいので
$$ I_{pk} = \frac{V_o – V_{in}}{L}D_2 T $$
2 式の右辺どうしを等しいと置き、$T/L$ を約分すると
$$ V_{in}D_1 = (V_o – V_{in})D_2 $$
昇圧比 $M = V_o/V_{in}$ を使って整理すると、$V_o – V_{in} = V_{in}(M-1)$ なので
$$ D_2 = \frac{D_1}{M – 1} $$
ステップ 3: 電荷平衡(出力側)を書く。 出力に届く電流はダイオードを通る電流だけで、その波形は高さ $I_{pk}$・底辺 $D_2T$ の三角形です。1 周期の平均をとると
$$ \bar{i}_D = \frac{1}{T}\cdot\frac{1}{2}I_{pk}D_2T = \frac{I_{pk}D_2}{2} $$
定常状態ではこれが負荷電流に等しくなければなりません。
$$ \frac{I_{pk}D_2}{2} = I_o = \frac{V_o}{R} $$
ステップ 4: 代入して整理する。 $I_{pk} = V_{in}D_1T/L$ と $D_2 = D_1/(M-1)$ を左辺に、$V_o = MV_{in}$ を右辺に代入すると
$$ \frac{1}{2}\cdot\frac{V_{in}D_1T}{L}\cdot\frac{D_1}{M-1} = \frac{MV_{in}}{R} $$
両辺の $V_{in}$ が消えます。$M-1$ と $R$ を掛けて移項すると
$$ \frac{D_1^2 T R}{2L} = M(M-1) $$
ここで伝導パラメータ $K \equiv \dfrac{2L}{RT}$ を導入すると、左辺は $D_1^2/K$ と書けます。$D_1 = D$ と書き直して
$$ M^2 – M – \frac{D^2}{K} = 0 $$
$M$ についての二次方程式なので、解の公式で解きます。$M > 0$ の解を取ると
$$ \begin{equation} M_{DCM} = \frac{1 + \sqrt{1 + \dfrac{4D^2}{K}}}{2},\qquad K = \frac{2L}{RT} \end{equation} $$
この式は CCM の式とまったく違う性質を持ちます。$M_{DCM}$ は負荷抵抗 $R$ とインダクタンス $L$ に依存するのです。CCM では $D$ さえ決めれば昇圧比が決まりましたが、DCM では負荷が軽くなる($R$ が大きくなる、$K$ が小さくなる)ほど昇圧比が上がります。フィードバック制御をかけていない裸の回路を軽負荷にすると、出力電圧が跳ね上がって部品を壊すのはこのためです。
境界での整合も確認しておきましょう。CCM の $M = 1/(1-D)$ を式 (8) の元になった $D^2/K = M(M-1)$ に代入すると
$$ \frac{D^2}{K} = \frac{1}{1-D}\left(\frac{1}{1-D}-1\right) = \frac{1}{1-D}\cdot\frac{D}{1-D} = \frac{D}{(1-D)^2} $$
$K$ について解くと $K = D(1-D)^2$、すなわち $\frac{2L}{RT} = D(1-D)^2$ から $L = \frac{D(1-D)^2RT}{2}$。式 (7) の $L_{crit}$ とぴったり一致しました。2 つの独立な導出が同じ境界を指しているので、どちらの式も正しいという確認になります。
さて、ここまでは「スイッチもインダクタもダイオードも理想」という世界の話でした。次のセクションでは、たった 0.1 Ω の巻線抵抗を入れるだけで、この理想がどれほど激しく崩れるかを見ます。昇圧チョッパを理解するうえで、いちばん面白く、いちばん実務的なパートです。
寄生抵抗が壊す理想 — 昇圧の頭打ちと効率
式 (3) の $M = 1/(1-D)$ は $D \to 1$ で無限大に発散します。しかし現実の昇圧チョッパで 100 倍の昇圧を試みても、絶対に出ません。せいぜい 5〜10 倍で頭打ちになり、それ以上 $D$ を上げるとむしろ出力が下がり始めます。この不思議な振る舞いの犯人は、インダクタの巻線抵抗をはじめとする寄生直流抵抗です。
犯人が小さな抵抗である理由は、直感的にはこう説明できます。$D$ を上げると昇圧比は上がりますが、同時に式 (4) より入力電流 $I_L = I_o/(1-D)$ も同じ比率で増えます。抵抗での損失は電流の 2 乗に比例するので、$D$ を上げると損失は $1/(1-D)^2$ で急増します。一方、電源から取り出せる電力には限りがある。昇圧比を上げようとする力と、増えた電流が抵抗で電圧を食い潰す力がどこかで釣り合い、そこが昇圧の限界になるのです。
寄生抵抗込みのボルト秒平衡
インダクタに直列な直流抵抗 $r_L$(巻線抵抗+スイッチのオン抵抗の時間平均など)を入れて、ボルト秒平衡をやり直します。リプルを無視して $i_L \approx I_L$ とすると、
- オン期間: $v_L = V_{in} – r_L I_L$
- オフ期間: $v_L = V_{in} – r_L I_L – V_o$
抵抗はオン・オフどちらの期間にも同じ電流が流れているので、両方の期間で同じ $r_L I_L$ が引かれます。式 (1) に代入すると
$$ (V_{in} – r_L I_L)D + (V_{in} – r_L I_L – V_o)(1-D) = 0 $$
$V_{in} – r_L I_L$ を共通因子としてくくると、$D + (1-D) = 1$ なので
$$ V_{in} – r_L I_L = V_o(1-D) $$
一方、電荷平衡(式 (4))は寄生抵抗を入れても変わりません。コンデンサの充放電の話にインダクタの抵抗は関係しないからです。$I_L = I_o/(1-D) = \dfrac{V_o}{(1-D)R}$ をそのまま代入します。
$$ V_{in} – \frac{r_L V_o}{(1-D)R} = V_o(1-D) $$
$V_o$ について整理しましょう。右辺に $V_o$ の項を集めると
$$ V_{in} = V_o\left[(1-D) + \frac{r_L}{(1-D)R}\right] $$
括弧の中から $(1-D)$ をくくり出します。
$$ V_{in} = V_o(1-D)\left[1 + \frac{r_L}{(1-D)^2 R}\right] $$
したがって昇圧比は
$$ \begin{equation} M = \frac{V_o}{V_{in}} = \frac{1}{1-D}\cdot\frac{1}{1 + \dfrac{r_L}{(1-D)^2 R}} \end{equation} $$
理想の昇圧比 $1/(1-D)$ に、$1$ より小さい補正係数が掛かった形になりました。補正係数の分母に現れる $\dfrac{r_L}{(1-D)^2R}$ が、この記事でいちばん重要な無次元量です。
この量の意味を読み解きましょう。$(1-D)^2R$ は「負荷抵抗をインダクタ側から見た等価抵抗」です。理想の昇圧チョッパは巻数比 $1:1/(1-D)$ の直流トランスでしたから、二次側の $R$ を一次側に換算すると巻数比の 2 乗で割られ、$(1-D)^2R$ になります。つまり $\dfrac{r_L}{(1-D)^2R}$ は「寄生抵抗が、換算後の負荷抵抗に対してどれくらいの割合を占めるか」という分圧比なのです。
設計例で数値を見ましょう。$r_L = 0.1\ \Omega$、$R = 24\ \Omega$ として、いくつかの $D$ で計算します。
| $D$ | 理想 $1/(1-D)$ | $(1-D)^2R\ [\Omega]$ | $\dfrac{r_L}{(1-D)^2R}$ | 実際の $M$ | 効率 $\eta$ |
|---|---|---|---|---|---|
| 0.1 | 1.111 | 19.44 | 0.0051 | 1.105 | 99.5 % |
| 0.5 | 2.000 | 6.00 | 0.0167 | 1.967 | 98.4 % |
| 0.7 | 3.333 | 2.16 | 0.0463 | 3.186 | 95.6 % |
| 0.8 | 5.000 | 0.96 | 0.1042 | 4.528 | 90.6 % |
| 0.9 | 10.000 | 0.24 | 0.4167 | 7.059 | 70.6 % |
| 0.95 | 20.000 | 0.06 | 1.6667 | 7.500 | 37.5 % |
$D = 0.5$ ではほとんど理想どおりですが、$D = 0.9$ では 10 倍を狙って 7.06 倍しか出ず、$D = 0.95$ に至っては 20 倍を狙ってむしろ下がって 7.5 倍です。効率も 37.5 % まで落ちています。たった 0.1 Ω でこれです。
効率の式と、驚くほどきれいな最大昇圧比
効率も求めておきましょう。出力電力は $P_o = V_o^2/R$、入力電力は $P_{in} = V_{in}I_L$(入力電流はインダクタ電流)です。
$$ \eta = \frac{P_o}{P_{in}} = \frac{V_o^2/R}{V_{in}I_L} $$
$I_L = \dfrac{V_o}{(1-D)R}$ を代入すると、分母は $\dfrac{V_{in}V_o}{(1-D)R}$ になります。$R$ が約分され、$V_o$ が 1 個消えて
$$ \eta = \frac{V_o(1-D)}{V_{in}} = M(1-D) $$
さらに式 (9) を代入すると、$M(1-D)$ の $1/(1-D)$ と $(1-D)$ が打ち消し合い
$$ \begin{equation} \eta = \frac{1}{1 + \dfrac{r_L}{(1-D)^2 R}} \end{equation} $$
効率と昇圧比の補正係数がまったく同じ式になりました。つまり「理想からの昇圧比の落ち込み率=効率」です。式 (9) は $M = \eta \cdot \frac{1}{1-D}$ と書き換えられ、「理想昇圧比に効率を掛けたものが実際の昇圧比」という覚えやすい形になります。
では、$M$ を最大にする $D$ はどこでしょうか。$u \equiv 1-D$ と置いて式 (9) を書き直します。
$$ M(u) = \frac{1}{u}\cdot\frac{1}{1 + \dfrac{r_L}{u^2R}} = \frac{1}{u}\cdot\frac{u^2R}{u^2R + r_L} = \frac{uR}{u^2R + r_L} $$
$u$ で微分して商の微分公式を使います。
$$ \frac{dM}{du} = \frac{R(u^2R + r_L) – uR\cdot 2uR}{(u^2R+r_L)^2} = \frac{R\big(r_L – u^2R\big)}{(u^2R+r_L)^2} $$
分子がゼロになる条件から $u^2 R = r_L$、すなわち
$$ u^* = \sqrt{\frac{r_L}{R}} \quad\Longleftrightarrow\quad D^* = 1 – \sqrt{\frac{r_L}{R}} $$
このときの最大昇圧比を求めます。$u^{*2}R = r_L$ なので分母は $r_L + r_L = 2r_L$ となり
$$ \begin{equation} M_{\max} = \frac{u^*R}{2r_L} = \frac{R}{2r_L}\sqrt{\frac{r_L}{R}} = \frac{1}{2}\sqrt{\frac{R}{r_L}} \end{equation} $$
そして、そのときの効率は式 (10) に $u^{*2}R = r_L$ を入れて
$$ \eta^* = \frac{1}{1 + \dfrac{r_L}{r_L}} = \frac{1}{2} $$
最大昇圧比の動作点では、効率はぴったり 50 % になります。 抵抗値にも負荷にもよらない、普遍的な結果です。最大電力伝送定理(電源抵抗と負荷抵抗が等しいとき最大電力、そのときの効率 50 %)とまったく同じ構図で、ここでも「寄生抵抗と換算負荷抵抗が等しくなる点」が最大点になっています。
設計例では $M_{\max} = \frac{1}{2}\sqrt{24/0.1} = \frac{1}{2}\sqrt{240} = 7.75$ 倍、そのときの $D^* = 1 – \sqrt{0.1/24} = 0.9355$。上の表の傾向とぴったり合います。
この結果から実務的な指針が出ます。昇圧比は、部品が良ければ 10 倍程度まで、通常の設計では 4〜5 倍までに抑える。 それ以上必要なら、フライバックやプッシュプルなどトランスを使ったトポロジで巻数比を稼ぐか、2 段直列にするべきです。式 (11) は「どこまで頑張れるか」を部品定数から即座に見積もる道具になります。
なお実際の損失には、この $r_L$ による導通損のほかに、ダイオードの順方向電圧 $V_F$ による損失($P = V_F \bar{i}_D = V_F I_o$)、MOSFET のスイッチング損、コアのヒステリシス損などが加わります。特に低電圧・大電流の昇圧では $V_F$ 損が支配的になりやすく、ショットキーバリアダイオードや同期整流(ダイオードを MOSFET に置き換える)が使われます。この記事の Python 検証では、$r_L$・オン抵抗・$V_F$・ダイオード内部抵抗を全部入れた損失内訳も出します。
静的な特性はここまでで尽きました。最後の理論パートとして、昇圧チョッパを動かすとき、つまりフィードバック制御をかけるときの厄介な性質を見ておきましょう。
状態空間平均化と右半平面零点
昇圧チョッパの出力電圧を一定に保つには、出力を測ってデューティ比を調整するフィードバックが要ります。そのためには「$D$ を少し変えたら $V_o$ がどう動くか」を伝達関数の形で知る必要があります。
問題は、この回路がスイッチによって 2 つの線形システムを行き来する時変系だということです。そのままでは伝達関数が定義できません。そこで使うのが状態空間平均化法です。アイデアは単純で、「スイッチング周期がフィルタの時定数よりずっと短いなら、出力はスイッチング 1 周期の細かい動きを見ておらず、平均値の動きしか感じていないはずだ」というものです。
平均化モデルを立てる
オン期間とオフ期間の状態方程式を、それぞれの時間割合 $d$ と $d’ = 1-d$ で重み付けして足します。
オン期間: $$ L\frac{di_L}{dt} = V_{in},\qquad C\frac{dv_C}{dt} = -\frac{v_C}{R} $$
オフ期間: $$ L\frac{di_L}{dt} = V_{in} – v_C,\qquad C\frac{dv_C}{dt} = i_L – \frac{v_C}{R} $$
重み付き平均をとると、平均化モデルが得られます。
$$ \begin{equation} L\frac{di_L}{dt} = V_{in} – d’\,v_C,\qquad C\frac{dv_C}{dt} = d’\,i_L – \frac{v_C}{R} \end{equation} $$
この式は $d’$ と状態変数の積を含むので非線形です。制御設計には線形モデルが欲しいので、動作点まわりで線形化します。
小信号線形化
各変数を「定常値+微小変動」に分けます。
$$ d = D + \hat{d},\quad d’ = D’ – \hat{d},\quad i_L = I + \hat{i},\quad v_C = V + \hat{v} \qquad (D’ \equiv 1-D) $$
定常値は $V_{in} = D’V$ と $D’I = V/R$(つまり $I = V/(D’R)$)を満たします。これを式 (12) の第 1 式に代入すると
$$ L\frac{d\hat{i}}{dt} = V_{in} – (D’ – \hat{d})(V + \hat{v}) = \underbrace{V_{in} – D’V}_{=0} – D’\hat{v} + \hat{d}V + \underbrace{\hat{d}\hat{v}}_{\text{2次}} $$
定常項は打ち消し合い、微小量どうしの積 $\hat d\hat v$ は 2 次なので落とします。残るのは
$$ L\frac{d\hat{i}}{dt} = -D’\hat{v} + V\hat{d} $$
同様に第 2 式は
$$ C\frac{d\hat{v}}{dt} = (D’-\hat{d})(I+\hat{i}) – \frac{V+\hat{v}}{R} = \underbrace{D’I – \frac{V}{R}}_{=0} + D’\hat{i} – I\hat{d} – \frac{\hat{v}}{R} $$
ここに右半平面零点の種があります。 $-I\hat{d}$ の項に注目してください。デューティ比を増やす($\hat d > 0$)と、この項が負に効きます。物理的には「オン期間を長くすると、出力に電流を送るオフ期間が短くなり、瞬間的に出力へ届く電荷が減る」という意味です。長期的にはインダクタ電流 $\hat i$ が増えて出力が上がりますが、その前に一瞬だけ逆方向に動きます。
伝達関数を求める
ラプラス変換して整理します。まず第 1 式から $\hat i$ を解きます。
$$ sL\hat{i} = -D’\hat{v} + V\hat{d} \quad\Longrightarrow\quad \hat{i} = \frac{V\hat{d} – D’\hat{v}}{sL} $$
これを第 2 式のラプラス変換 $sC\hat v = D’\hat i – I\hat d – \hat v/R$ に代入します。
$$ sC\hat{v} + \frac{\hat{v}}{R} = D’\cdot\frac{V\hat{d} – D’\hat{v}}{sL} – I\hat{d} $$
両辺に $sL$ を掛けて分母を払うと
$$ s^2LC\,\hat{v} + \frac{sL}{R}\hat{v} = D’V\hat{d} – D’^2\hat{v} – sLI\hat{d} $$
$\hat v$ の項を左辺に、$\hat d$ の項を右辺にまとめます。
$$ \hat{v}\left(s^2LC + \frac{sL}{R} + D’^2\right) = \big(D’V – sLI\big)\hat{d} $$
したがって制御入力から出力電圧への伝達関数は
$$ G_{vd}(s) = \frac{\hat{v}(s)}{\hat{d}(s)} = \frac{D’V – sLI}{s^2LC + \dfrac{sL}{R} + D’^2} $$
見やすくするため、分母を $D’^2$ で割って定数項を 1 にし、分子にも $I = V/(D’R)$ を代入します。分子は $D’V – \dfrac{sLV}{D’R} = \dfrac{V}{D’}\left(D’^2 – \dfrac{sL}{R}\right)$ となり、これを $D’^2$ で割ると
$$ \begin{equation} G_{vd}(s) = \frac{V}{D’}\cdot\frac{1 – \dfrac{sL}{D’^2R}}{1 + \dfrac{sL}{D’^2R} + \dfrac{s^2LC}{D’^2}} \end{equation} $$
この式から 3 つの特徴量が読み取れます。
① 直流ゲイン $\;G_{vd}(0) = \dfrac{V}{D’} = \dfrac{V_o}{1-D}$。設計例では $24/0.5 = 48$ V/(デューティ比 1 あたり)。デューティ比を 0.01 動かすと出力が 0.48 V 動く計算です。
② 二重極 $\;\omega_0 = \dfrac{D’}{\sqrt{LC}}$、$\;Q = D’R\sqrt{\dfrac{C}{L}}$。設計例では $\omega_0 = 0.5/\sqrt{10^{-8}} = 5000$ rad/s($f_0 = 796$ Hz)、$Q = 0.5\times 24\times 1 = 12$。$Q$ が高いので共振ピークが鋭く立ちます。降圧型の $\omega_0 = 1/\sqrt{LC}$ と違って、昇圧型では共振周波数が $D$ とともに下がっていく($D’$ が掛かる)点が重要です。動作点によってプラントが動くので、補償器は最悪ケースで設計する必要があります。
③ 右半平面零点(RHP zero) $\;\omega_z = \dfrac{D’^2R}{L} = \dfrac{(1-D)^2R}{L}$。分子が $1 – s/\omega_z$ という形なので、零点は $s = +\omega_z$、つまり複素平面の右半分にあります。設計例では $\omega_z = 0.25\times 24/10^{-4} = 60000$ rad/s、$f_z = 9.55$ kHz です。
右半平面零点が何をするか
右半平面零点は制御工学でもっとも嫌われる存在です。その理由は周波数特性に現れます。$1 – s/\omega_z$ に $s = j\omega$ を入れると、
- ゲインは $\sqrt{1 + (\omega/\omega_z)^2}$ で、通常の左半平面零点と同じく $+20$ dB/dec で持ち上がります。
- 位相は $-\arctan(\omega/\omega_z)$ で、遅れます(左半平面零点なら進みます)。
つまりゲインは上がるのに位相は遅れる。制御屋にとって最悪の組み合わせです。位相余裕を確保するにはゲイン交差周波数を下げるしかなく、しかも RHP 零点は補償器の極では打ち消せません(極で打ち消すと不安定な極零相殺になり、内部安定性を失います)。

上段のゲイン特性を見ると、右半平面零点は $\omega > \omega_z$ で $+20$ dB/dec と、ふつうの零点とまったく同じ持ち上がり方をします。ところが下段の位相を見ると、左半平面零点(緑破線)が $+90^\circ$ へ進むのに対し、右半平面零点(赤実線)は $-90^\circ$ へ遅れていきます。しかも $\omega = \omega_z$ の時点ですでに $45^\circ$ の位相遅れが発生しており、交差周波数を $\omega_z$ 付近まで上げると位相余裕を一気に失うことがこの図から読み取れます。「ゲインだけ見て設計すると足をすくわれる」というのが右半平面零点の怖さです。
実務では交差周波数を $f_z$ の 1/3〜1/5 以下に抑えるのが定石です。設計例なら $9.55/3 \approx 3$ kHz、これは $f_s = 100$ kHz の 3 % にすぎません。降圧型なら $f_s/10 = 10$ kHz 程度の帯域が普通に取れることを思えば、昇圧型はその 1/3 以下ということになります。昇圧チョッパの負荷急変への応答が鈍いのは、部品が悪いからではなく、トポロジそのものの制約なのです。
$\omega_z = (1-D)^2R/L$ の形も重要です。
- $D$ を上げる(昇圧比を上げる)と $\omega_z$ が下がる。 高い昇圧比ほど制御が難しくなります。
- 軽負荷($R$ 大)で $\omega_z$ が上がる。 軽いほうが制御は楽です。逆に重負荷が最悪ケースになります。
- $L$ を大きくすると $\omega_z$ が下がる。 リプルを減らそうとインダクタを大きくすると、制御帯域を失います。リプルと応答性のトレードオフがここに現れます。
なお DCM ではインダクタ電流が毎周期リセットされるためインダクタの状態が「記憶」を持たず、RHP 零点はずっと高い周波数に移動します。軽負荷時にわざと DCM で動かす設計に制御上の利点があるのは、このためです。
理論はここまでです。次は、ここまで導いた式がすべて正しいことを、スイッチング動作そのものを数値的に解いて確かめましょう。
Python での実装と数値検証
ここからは、区分線形の常微分方程式をスイッチング周期ごとに solve_ivp で解き、これまでに導いた式を一つずつ検証していきます。検証項目は次の 6 つです。
- 起動から定常までの波形(起動時の突入電流と過電圧)
- 定常 1 周期の波形と、リプル式 $\Delta i_L = V_{in}DT/L$、$\Delta v_o = I_oDT/C$ の一致
- $L$・$C$ 掃引によるリプル式の精度確認
- $D$ 掃引での理想式・寄生込み式・数値解の比較
- $L$ 掃引での CCM/DCM 遷移と DCM 変換比の検証
- 損失内訳と、右半平面零点によるステップ応答の逆振れ
設計例の数値を確認する
まず、これまで手計算した設計値をコードで確認します。
import numpy as np
# --- 設計例のパラメータ ---
Vin, D, fs = 12.0, 0.5, 100e3 # 入力12V, デューティ比0.5, 100kHz
L, C, R = 100e-6, 100e-6, 24.0 # インダクタ100uH, コンデンサ100uF, 負荷24Ω
T = 1.0 / fs
# --- CCM の設計式 ---
Vo = Vin / (1 - D) # 昇圧比 M = 1/(1-D)
Io = Vo / R # 出力電流
IL = Io / (1 - D) # インダクタ平均電流 = 入力電流
di = Vin * D * T / L # 電流リプル
dv = Io * D * T / C # 電圧リプル
Lcrit = D * (1 - D)**2 * R * T / 2 # 臨界インダクタンス
print(f"出力電圧 Vo = {Vo:.2f} V")
print(f"出力電流 Io = {Io:.3f} A")
print(f"平均コイル電流 IL = {IL:.3f} A")
print(f"電流リプル Δi_L = {di:.3f} A (リプル率 {di/IL*100:.1f} %)")
print(f"ピーク電流 IL_peak = {IL + di/2:.3f} A")
print(f"電圧リプル Δv_o = {dv*1e3:.1f} mV ({dv/Vo*100:.3f} %)")
print(f"臨界L L_crit = {Lcrit*1e6:.1f} uH (採用 {L*1e6:.0f} uH → CCM)")
# --- 小信号モデルの特徴量 ---
Dp = 1 - D
print(f"共振周波数 f_0 = {Dp/np.sqrt(L*C)/(2*np.pi):.1f} Hz")
print(f"Q値 = {Dp*R*np.sqrt(C/L):.2f}")
print(f"RHP零点 f_z = {Dp**2*R/L/(2*np.pi):.0f} Hz")
実行すると $V_o = 24.00$ V、$I_L = 2.000$ A、$\Delta i_L = 0.600$ A(リプル率 30.0 %)、$\Delta v_o = 50.0$ mV、$L_{crit} = 15.0\ \mu$H、$f_0 = 795.8$ Hz、$Q = 12.00$、$f_z = 9549$ Hz が表示されます。手計算した値と完全に一致しました。ここで注目すべきは $Q = 12$ という高さと、$f_z$ が $f_s$ の 1/10 程度しかないことです。前者は出力コンデンサの共振ピークが鋭いこと、後者は制御帯域が 3 kHz 程度に制限されることを意味しており、どちらも昇圧型に固有の設計上の制約になります。
スイッチング波形のシミュレータを作る
次に、スイッチング動作そのものを解くシミュレータを書きます。オン期間とオフ期間で異なる状態方程式を、周期ごとに solve_ivp で交互に解いていく形です。寄生抵抗(インダクタ直流抵抗 $r_L$、MOSFET オン抵抗 $R_{on}$、ダイオードの順方向電圧 $V_F$ と内部抵抗 $r_D$)も入れられるようにしておきます。
import numpy as np
from scipy.integrate import solve_ivp
def simulate_boost(Vin, D, L, C, R, T, n_cycles,
rL=0.0, Ron=0.0, Vf=0.0, rD=0.0, x0=(0.0, 0.0), n_out=40):
"""昇圧チョッパを区分線形ODEとして周期ごとに積分する(CCM前提)
状態 x = [インダクタ電流 iL, コンデンサ電圧 vC]"""
def f_on(t, x): # スイッチON: コイルは入力に、出力は切り離される
iL, vC = x
return [(Vin - (rL + Ron) * iL) / L, (-vC / R) / C]
def f_off(t, x): # スイッチOFF: ダイオード経由で出力へ電流が流れる
iL, vC = x
return [(Vin - (rL + rD) * iL - Vf - vC) / L, (iL - vC / R) / C]
x = np.array(x0, dtype=float)
ts, ys = [], []
for k in range(n_cycles):
t0 = k * T
for f, t_end in ((f_on, t0 + D * T), (f_off, t0 + T)):
sol = solve_ivp(f, (t0 if f is f_on else t0 + D * T, t_end), x,
t_eval=np.linspace(t0 if f is f_on else t0 + D * T,
t_end, n_out),
rtol=1e-9, atol=1e-12)
ts.append(sol.t); ys.append(sol.y); x = sol.y[:, -1]
return np.concatenate(ts), np.concatenate(ys, axis=1)
この関数は「オン期間を積分 → 終端状態を引き継いでオフ期間を積分 → 次の周期へ」を繰り返すだけの素直な実装です。平均化モデルではなく実際のスイッチング波形を解いているので、リプルの形やピーク値まで正しく再現されます。$r_L$ などをゼロにすれば理想回路、値を入れれば実回路のシミュレーションになります。
起動から定常までの波形
まず電源投入直後の様子を見ます。出力コンデンサは空、インダクタ電流もゼロの状態からスタートします。
import numpy as np
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
Vin, D, fs, L, C, R = 12.0, 0.5, 100e3, 100e-6, 100e-6, 24.0
T = 1 / fs
t, y = simulate_boost(Vin, D, L, C, R, T, n_cycles=1500, n_out=10)
fig, ax = plt.subplots(2, 1, figsize=(11, 7), sharex=True)
ax[0].plot(t * 1e3, y[1], lw=0.7, color="C0")
ax[0].axhline(Vin / (1 - D), color="crimson", ls="--", label="定常値 $V_o=24$ V")
ax[0].set_ylabel("出力電圧 [V]"); ax[0].legend(); ax[0].grid(alpha=0.3)
ax[0].set_title("起動から定常まで:出力電圧は定常値の約1.9倍まで行き過ぎる")
ax[1].plot(t * 1e3, y[0], lw=0.7, color="C1")
ax[1].axhline(2.0, color="crimson", ls="--", label="定常平均 $I_L=2$ A")
ax[1].set_xlabel("時間 [ms]"); ax[1].set_ylabel("コイル電流 [A]")
ax[1].legend(); ax[1].grid(alpha=0.3)
ax[1].set_title("起動時の突入電流は定常値の12倍を超える")
plt.tight_layout(); plt.show()
print(f"コイル電流ピーク : {y[0].max():.2f} A(定常 2.00 A の {y[0].max()/2:.1f} 倍)")
print(f"出力電圧ピーク : {y[1].max():.2f} V(定常 24.0 V の {y[1].max()/24:.2f} 倍)")
print(f"整定後の平均出力 : {y[1][t > 13e-3].mean():.3f} V")

上段の出力電圧は 45 V 付近まで一気に行き過ぎたあと、$2RC = 4.8$ ms の時定数でゆっくり 24 V へ収束していきます。下段のコイル電流はさらに激しく、最初の山だけで定常値の 12 倍を超えており、ここで MOSFET の定格を超えれば一発で壊れることが波形の形から一目でわかります。なお下段の電流が負まで振れているのはダイオードの逆阻止を無視したモデルだからで、実回路では 0 でクランプされて代わりに DCM 動作になります。このシミュレーションから、教科書には書かれにくい実務上の重大な事実が読み取れます。コイル電流のピークは 24.74 A に達し、定常値 2.00 A の 12.4 倍です。出力電圧も 45.09 V まで跳ね上がり、定常値 24 V の 1.88 倍に達します。$Q = 12$ という高い共振の Q 値がそのまま起動時のオーバーシュートとして現れ、$2RC = 4.8$ ms という長い時定数でゆっくり減衰していく様子も確認できます。実際の電源 IC が必ずソフトスタート(デューティ比を数ミリ秒かけて徐々に上げる機能)を備えているのは、この突入電流と過電圧で MOSFET や出力コンデンサを壊さないためです。定常に落ち着いた後の平均出力は 24.20 V で、理論値 24 V にほぼ一致します(わずかな差はリプルの非対称性によるものです)。
定常状態を「不動点」として一発で取り出す
前の図が示したとおり、この回路は $Q = 12$ の共振を持つので、起動から定常に落ち着くまでに $2RC$ の何倍もの時間がかかります。「たくさんの周期を回して最後のほうを見る」という素朴なやり方では、$C$ を大きくしたときに整定が間に合わず、リプルを過大評価してしまいます(実際、$C = 470\ \mu$F では 2500 周期=25 ms 回しても $2RC = 22.6$ ms の整定に追いつかず、リプルが真値の 75 倍も過大に出ます)。
そこで、定常状態を数値的に直接求めることにします。オン・オフの区間はどちらも線形(正確にはアフィン)な微分方程式なので、1 周期の写像は必ず
$$ \bm{x}_{k+1} = A\bm{x}_k + \bm{b} $$
という形になります。定常状態とはこの写像の不動点 $\bm{x}^* = A\bm{x}^* + \bm{b}$、つまり $(I – A)\bm{x}^* = \bm{b}$ の解です。$A$ と $\bm{b}$ は「1 周期だけシミュレーションする」ことを 3 回($\bm{x}_0 = \bm{0}, \bm{e}_1, \bm{e}_2$)行えば取り出せます。
import numpy as np
def steady_state(Vin, D, L, C, R, T, **kw):
"""1周期の写像 x -> A x + b を数値的に同定し、その不動点(定常状態)を返す"""
def one_cycle(x0):
return simulate_boost(Vin, D, L, C, R, T, 1, x0=x0, n_out=2, **kw)[1][:, -1]
b = one_cycle((0.0, 0.0)) # x0 = 0 のときの1周期後
A = np.column_stack([one_cycle((1.0, 0.0)) - b, # 単位ベクトルの応答から A を復元
one_cycle((0.0, 1.0)) - b])
return np.linalg.solve(np.eye(2) - A, b) # (I - A) x* = b を解く
x_ss = steady_state(12.0, 0.5, 100e-6, 100e-6, 24.0, 1e-5)
print(f"定常状態の初期値: iL = {x_ss[0]:.4f} A, vC = {x_ss[1]:.4f} V")
$i_L = 1.6997$ A、$v_C = 24.0225$ V という値が返ってきます。これは周期の先頭(オン開始の瞬間)の値で、コイル電流はここから 0.6 A 上昇して 2.2997 A に達し、また戻ってくる——ちょうど平均 2.0 A の三角波の谷にあたります。この 1 点さえ分かれば、あとは 1 周期だけ積分すれば完全な定常波形が得られます。過渡を待つ必要がなくなるので、以降の掃引はこの方法で行います。
定常 1 周期の波形とリプル式の検証
不動点から出発して 3 周期分を描き、リプル式と比べます。
import numpy as np
import matplotlib.pyplot as plt
Vin, D, T, L, C, R = 12.0, 0.5, 1e-5, 100e-6, 100e-6, 24.0
Io = (Vin / (1 - D)) / R
x_ss = steady_state(Vin, D, L, C, R, T)
t, y = simulate_boost(Vin, D, L, C, R, T, 3, x0=x_ss, n_out=200)
tt, iL, vC = t * 1e6, y[0], y[1]
iC = np.where(((t / T) % 1.0) < D, -vC / R, iL - vC / R) # コンデンサ電流
fig, ax = plt.subplots(3, 1, figsize=(11, 9.5), sharex=True)
ax[0].plot(tt, iL, color="C1", lw=1.8)
ax[0].set_ylabel("コイル電流 $i_L$ [A]")
ax[0].set_title(f"定常波形(網掛けがスイッチON区間) "
f"Δi_L 実測 {iL.max()-iL.min():.4f} A / 式 {Vin*D*T/L:.4f} A")
ax[1].plot(tt, iC, color="C2", lw=1.8)
ax[1].axhline(0, color="k", lw=0.8)
ax[1].set_ylabel("コンデンサ電流 $i_C$ [A]")
ax[1].set_title("ON区間は $-I_o$ 一定、OFF区間は $i_L-I_o$:段差がESRリプルを生む")
ax[2].plot(tt, vC, color="C0", lw=1.8)
ax[2].set_xlabel("時間 [μs]"); ax[2].set_ylabel("出力電圧 $v_o$ [V]")
ax[2].set_title(f"ON区間で単調に下がり、OFF区間で充電されて戻る "
f"Δv_o 実測 {(vC.max()-vC.min())*1e3:.2f} mV / 式 {Io*D*T/C*1e3:.2f} mV")
for a in ax: # スイッチON区間を網掛け
for k in range(3):
a.axvspan(k * 10, k * 10 + 5, color="C0", alpha=0.12)
a.grid(alpha=0.3)
plt.tight_layout(); plt.show()
print(f"Δi_L 実測 {iL.max()-iL.min():.4f} A / 式 {Vin*D*T/L:.4f} A")
print(f"Δv_o 実測 {(vC.max()-vC.min())*1e3:.2f} mV / 式 {Io*D*T/C*1e3:.2f} mV")
print(f"ピーク電流 {iL.max():.4f} A / 式 {Io/(1-D)+Vin*D*T/L/2:.4f} A")

3 段に並べると、リプル式の導出がそのまま波形の形として見えてきます。上段のコイル電流はオン区間(網掛け)で直線的に上昇し、オフ区間で直線的に下降する、きれいな三角波で、実測のリプル 0.600 A は式 $V_{in}DT/L = 0.600$ A と小数点以下 4 桁まで一致します。中段のコンデンサ電流はオン区間がずっと $-I_o = -1$ A 一定で、オフ区間に入った瞬間に $i_L – I_o$ へ跳ね上がります。この跳びの高さがピーク電流 2.30 A に等しいことが、ESR リプルが $R_{ESR}I_{L,\mathrm{peak}}$ で与えられる理由です。下段の出力電圧は、網掛け区間(スイッチオン)で単調に下降しているのが決定的に重要で、オン期間はダイオードが遮断されコンデンサだけが負荷を支えて放電しているという式 (6) の導出が、波形の形からそのまま読み取れます。実測 49.99 mV は式 $I_oDT/C = 50.00$ mV と一致しました。
リプル式の精度を掃引で確かめる
1 点の一致は偶然かもしれないので、$L$ と $C$ を広い範囲で振って確認します。ここでも各条件ごとに不動点を求めてから 2 周期だけ積分します。
import numpy as np
import matplotlib.pyplot as plt
Vin, D, T, R = 12.0, 0.5, 1e-5, 24.0
Io = (Vin / (1 - D)) / R
L_list = np.array([22e-6, 47e-6, 100e-6, 220e-6, 470e-6])
C_list = np.array([22e-6, 47e-6, 100e-6, 220e-6, 470e-6])
di_sim, dv_sim = [], []
for L in L_list: # 電流リプル:Lを振る
x0 = steady_state(Vin, D, L, 100e-6, R, T)
t, y = simulate_boost(Vin, D, L, 100e-6, R, T, 2, x0=x0, n_out=200)
di_sim.append(y[0].max() - y[0].min())
for C in C_list: # 電圧リプル:Cを振る
x0 = steady_state(Vin, D, 100e-6, C, R, T)
t, y = simulate_boost(Vin, D, 100e-6, C, R, T, 2, x0=x0, n_out=200)
dv_sim.append(y[1].max() - y[1].min())
err_i = np.abs(np.array(di_sim) - Vin * D * T / L_list) / (Vin * D * T / L_list) * 100
err_v = np.abs(np.array(dv_sim) - Io * D * T / C_list) / (Io * D * T / C_list) * 100
print("電流リプルの式との差 [%]:", np.round(err_i, 4))
print("電圧リプルの式との差 [%]:", np.round(err_v, 4))
fig, ax = plt.subplots(1, 2, figsize=(12, 4.5))
ax[0].loglog(L_list * 1e6, Vin * D * T / L_list, "-", lw=2, label="式 $V_{in}DT/L$")
ax[0].loglog(L_list * 1e6, di_sim, "o", ms=9, mfc="none", label="数値シミュレーション")
ax[0].set_xlabel("インダクタンス [μH]"); ax[0].set_ylabel("電流リプル $\\Delta i_L$ [A]")
ax[0].set_title("電流リプルは $L$ に反比例(傾き $-1$ の直線)")
ax[0].legend(); ax[0].grid(alpha=0.3, which="both")
ax[1].loglog(C_list * 1e6, Io * D * T / C_list * 1e3, "-", lw=2, label="式 $I_oDT/C$")
ax[1].loglog(C_list * 1e6, np.array(dv_sim) * 1e3, "s", ms=9, mfc="none",
label="数値シミュレーション")
ax[1].set_xlabel("静電容量 [μF]"); ax[1].set_ylabel("電圧リプル $\\Delta v_o$ [mV]")
ax[1].set_title("電圧リプルは $C$ に反比例")
ax[1].legend(); ax[1].grid(alpha=0.3, which="both")
plt.tight_layout(); plt.show()

両対数グラフで、式(実線)と数値解(マーカー)が全域でぴったり重なります。マーカーが直線から一切外れず、傾きはどちらも $-1$、つまり厳密に反比例です。電流リプルは 22 µH での 2.727 A から 470 µH での 0.128 A まで、式との差は表示桁(4 桁)の範囲で 0 % です。電圧リプルの誤差は最大でも 0.049 %(22 µF のとき)で、容量が大きいほど誤差はさらに小さくなります。この誤差は「オン期間中の負荷電流を一定とみなした」近似から来るもので、リプル電圧が小さいほど近似が良くなるという理屈どおりの振る舞いです。設計で使うぶんには、これらの式は近似ではなく厳密解だと思って構いません。
$D$ 掃引 — 理想式と寄生込み式の乖離
いよいよ、この記事の山場である「昇圧の頭打ち」を数値で確認します。
import numpy as np
import matplotlib.pyplot as plt
Vin, T, L, C, R, rL = 12.0, 1e-5, 100e-6, 100e-6, 24.0, 0.1
D_list = np.array([0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.85, 0.9, 0.9355, 0.95])
M_sim = []
for D in D_list:
t, y = simulate_boost(Vin, D, L, C, R, T, 4000, rL=rL, n_out=20)
m = t > 3980 * T
M_sim.append(y[1][m].mean() / Vin)
Dg = np.linspace(0.01, 0.97, 400)
M_ideal = 1 / (1 - Dg)
M_real = M_ideal / (1 + rL / ((1 - Dg)**2 * R))
Dstar, Mmax = 1 - np.sqrt(rL / R), 0.5 * np.sqrt(R / rL)
plt.figure(figsize=(11, 6))
plt.plot(Dg, M_ideal, "--", lw=2, color="gray", label="理想 $M=1/(1-D)$")
plt.plot(Dg, M_real, "-", lw=2.5, color="C3",
label="寄生込み $M=\\frac{1}{1-D}\\cdot\\frac{1}{1+r_L/((1-D)^2R)}$")
plt.plot(D_list, M_sim, "o", ms=9, mfc="none", color="k", label="数値シミュレーション")
plt.plot(Dstar, Mmax, "*", ms=20, color="C1",
label=f"最大昇圧比 {Mmax:.2f} 倍 ($D^*$={Dstar:.3f}, 効率50%)")
plt.ylim(0, 22); plt.xlabel("デューティ比 $D$"); plt.ylabel("昇圧比 $M=V_o/V_{in}$")
plt.title(f"巻線抵抗 $r_L$ = {rL} Ω があるだけで昇圧比は約 {Mmax:.1f} 倍で頭打ちになる")
plt.legend(loc="upper left"); plt.grid(alpha=0.3)
plt.tight_layout(); plt.show()

左が昇圧比、右が効率です。理想式(灰破線)と寄生込みの式(赤実線)は $D < 0.7$ ではほとんど重なって見えますが、$D$ が 0.8 を超えたあたりから急速に離れ、赤い曲線は星印の $D^* = 0.935$ で頂点に達したあとはっきり下向きに折り返します。右の効率カーブと見比べると、その頂点がちょうど効率 50 %(赤破線)と交わる点になっており、「最大昇圧比の動作点では効率が必ず 50 %」という式 (10)(11) の結論が数値でも確認できます。黒丸の数値シミュレーションが両方の曲線にぴたりと乗っている点にも注目してください。このグラフが昇圧チョッパの本質を一枚で表しています。理想式(灰色破線)は $D \to 1$ で天井知らずに発散しますが、寄生込みの式(赤実線)は $D^* = 0.9355$ で最大値 7.75 倍を取り、そこから下降に転じます。数値シミュレーション(黒丸)は寄生込みの式に完全に乗っており、$D = 0.5$ で 1.967 倍、$D = 0.9$ で 7.059 倍、$D = 0.95$ では 7.500 倍と、理論値と 4 桁一致しています。理想式との乖離は $D = 0.5$ では 1.6 % に過ぎませんが、$D = 0.9$ では 29 %、$D = 0.95$ では 62 % にもなります。「デューティ比を上げれば上げるほど電圧が出る」という素朴な理解は、$D > 0.8$ の領域では完全に間違いであることが、たった 0.1 Ω の抵抗で示されました。星印で示した最大点での効率は理論どおり正確に 50 % で、ここが「これ以上は物理的に無意味」という限界線です。
$L$ 掃引 — CCM/DCM 遷移
次は導通モードの遷移です。DCM ではダイオードの逆阻止を扱う必要があるので、電流ゼロを検出するイベント付きのシミュレータを用意します。
import numpy as np
from scipy.integrate import solve_ivp
def simulate_boost_dcm(Vin, D, L, C, R, T, n_cycles):
"""ダイオードの逆阻止(iL >= 0)を扱うシミュレータ。DCMでも正しく動く"""
f_on = lambda t, x: [Vin / L, -x[1] / (R * C)]
f_off = lambda t, x: [(Vin - x[1]) / L, (x[0] - x[1] / R) / C]
f_dis = lambda t, x: [0.0, -x[1] / (R * C)] # 電流ゼロ期間
zero_cross = lambda t, x: x[0] # iL = 0 でイベント
zero_cross.terminal, zero_cross.direction = True, -1
x = np.array([0.0, 0.0])
for k in range(n_cycles):
t0 = k * T
x = solve_ivp(f_on, (t0, t0 + D * T), x, rtol=1e-10, atol=1e-13).y[:, -1]
s = solve_ivp(f_off, (t0 + D * T, t0 + T), x,
events=zero_cross, rtol=1e-10, atol=1e-13)
x = s.y[:, -1]
if s.t_events[0].size > 0: # 途中で電流が尽きた = DCM
x[0] = 0.0
x = solve_ivp(f_dis, (s.t_events[0][0], t0 + T), x,
rtol=1e-10, atol=1e-13).y[:, -1]
return x
このシミュレータでは、オフ期間の積分中に $i_L = 0$ を横切ったらイベントで積分を打ち切り、残りの時間は「電流ゼロ・コンデンサ放電のみ」の方程式に切り替えます。これで CCM と DCM を自動的に区別して解けます。
import numpy as np
import matplotlib.pyplot as plt
Vin, D, T, R = 12.0, 0.5, 1e-5, 24.0
L_list = np.array([2e-6, 3e-6, 5e-6, 7e-6, 10e-6, 12e-6, 15e-6, 20e-6, 30e-6,
50e-6, 100e-6])
Vo_sim = np.array([simulate_boost_dcm(Vin, D, L, 100e-6, R, T, 3000)[1]
for L in L_list])
Lcrit = D * (1 - D)**2 * R * T / 2
Lg = np.logspace(np.log10(1.5e-6), np.log10(1.5e-4), 300)
K = 2 * Lg / (R * T)
Vo_dcm = Vin * (1 + np.sqrt(1 + 4 * D**2 / K)) / 2
Vo_ccm = np.full_like(Lg, Vin / (1 - D))
plt.figure(figsize=(11, 6))
plt.semilogx(Lg * 1e6, np.where(Lg < Lcrit, Vo_dcm, np.nan), "-", lw=2.5,
color="C3", label="DCM式 $M=(1+\\sqrt{1+4D^2/K})/2$")
plt.semilogx(Lg * 1e6, np.where(Lg >= Lcrit, Vo_ccm, np.nan), "-", lw=2.5,
color="C0", label="CCM式 $M=1/(1-D)$")
plt.semilogx(Lg * 1e6, Vo_dcm, ":", lw=1, color="C3", alpha=0.6)
plt.semilogx(Lg * 1e6, Vo_ccm, ":", lw=1, color="C0", alpha=0.6)
plt.semilogx(L_list * 1e6, Vo_sim, "o", ms=9, mfc="none", color="k",
label="数値シミュレーション")
plt.axvline(Lcrit * 1e6, color="C1", ls="--", lw=2,
label=f"臨界 $L_{{crit}}$ = {Lcrit*1e6:.1f} μH")
plt.xlabel("インダクタンス [μH]"); plt.ylabel("出力電圧 $V_o$ [V]")
plt.title("$L$ が臨界値を下回ると DCM に入り、出力電圧が跳ね上がる($D$ は 0.5 固定)")
plt.legend(); plt.grid(alpha=0.3, which="both")
plt.tight_layout(); plt.show()

グラフは 15 µH の縦線($L_{crit}$)を境に、はっきりと 2 つの領域に分かれます。右の青い水平線と左の赤い上昇曲線が縦線の位置でちょうど 24 V で滑らかにつながっており、CCM 式と DCM 式が同じ境界を指すことが視覚的に確認できます。薄い点線で描いた「その領域では成り立たない側の式」を見ると、境界を越えて使うとどれだけ外れるか(CCM 式を DCM 領域に当てはめると 2 µH で 24 V と 53 V の 2 倍以上のずれ)もわかります。右側(CCM)では $L$ を変えても出力は 24 V で一定、これは $M = 1/(1-D)$ が $L$ に依存しないという式 (3) の予言どおりです。左側(DCM)では $L$ が小さくなるほど出力が急上昇し、2 µH では 52.9 V にまで達します。数値シミュレーションは両領域とも理論曲線に完全に乗っており、10 µH で 27.65 V(DCM 式 27.63 V)、5 µH で 36.01 V(DCM 式 36.00 V)、2 µH で 52.87 V(DCM 式 52.86 V)と一致します。そして境界の 15 µH ではちょうど CCM 式と DCM 式が同じ 24 V を与える——これは式 (7) と式 (8) が独立に導かれたにもかかわらず同じ境界を指すという、理論の内部整合性の証明になっています。実務的な含意は明快で、「デューティ比を固定したまま負荷を軽くすると出力電圧が暴走する」という DCM の危険性は、この左側の急上昇そのものです。
損失の内訳と効率
寄生要素をすべて入れて、電力の行方を追います。
import numpy as np
import matplotlib.pyplot as plt
Vin, D, T, L, C, R = 12.0, 0.5, 1e-5, 100e-6, 100e-6, 24.0
rL, Ron, Vf, rD = 0.1, 0.05, 0.5, 0.02 # 巻線/オン抵抗/ダイオードVf/ダイオード内部抵抗
t, y = simulate_boost(Vin, D, L, C, R, T, 4000,
rL=rL, Ron=Ron, Vf=Vf, rD=rD, n_out=200)
m = t > 3998 * T # 定常の2周期分
tt, iL, vC = t[m], y[0][m], y[1][m]
phase_on = ((tt / T) % 1.0) < D # ON区間かどうか
Vo, Iin = vC.mean(), iL.mean()
Pin, Po = Vin * Iin, Vo**2 / R
P_rL = rL * (iL**2).mean() # 巻線抵抗(全区間)
P_Ron = Ron * (iL[phase_on]**2).mean() * D # MOSFETオン抵抗(ON区間のみ)
P_rD = rD * (iL[~phase_on]**2).mean() * (1 - D) # ダイオード内部抵抗
P_Vf = Vf * iL[~phase_on].mean() * (1 - D) # ダイオード順方向電圧
losses = {"巻線抵抗 $r_L$": P_rL, "ダイオード $V_F$": P_Vf,
"MOSFET $R_{on}$": P_Ron, "ダイオード $r_D$": P_rD}
plt.figure(figsize=(10, 5.5))
plt.bar(list(losses.keys()), list(losses.values()), color=["C0", "C3", "C1", "C2"])
for i, (k, v) in enumerate(losses.items()):
plt.text(i, v + 0.012, f"{v*1e3:.0f} mW\n({v/sum(losses.values())*100:.0f} %)",
ha="center", fontsize=10)
plt.ylabel("損失 [W]"); plt.ylim(0, max(losses.values()) * 1.35)
plt.title(f"損失内訳(合計 {sum(losses.values()):.3f} W, 効率 {Po/Pin*100:.2f} %)"
f" 入力 {Pin:.2f} W → 出力 {Po:.2f} W")
plt.grid(alpha=0.3, axis="y"); plt.tight_layout(); plt.show()
print(f"Vo = {Vo:.3f} V(理想 24.0 V), 昇圧比 {Vo/Vin:.3f}, 効率 {Po/Pin*100:.2f} %")
print(f"損失合計 {sum(losses.values()):.4f} W vs Pin-Po = {Pin-Po:.4f} W")

棒グラフを見ると、いちばん高い棒が「巻線抵抗」ではなく「ダイオード $V_F$」であることが一目でわかります。抵抗性の損失(巻線・オン抵抗・ダイオード内部抵抗)を全部足しても 499 mW で、$V_F$ 単独の 479 mW とほぼ同じ規模です。設計改善を考えるとき、まず手をつけるべきはインダクタの太線化ではなくダイオードの置き換え(同期整流化)だと、この 1 枚が教えてくれます。損失の内訳は、巻線抵抗 370 mW(38 %)、ダイオード順方向電圧 479 mW(49 %)、MOSFET オン抵抗 92 mW(9 %)、ダイオード内部抵抗 37 mW(4 %)となり、合計 0.978 W です。入力 22.98 W から出力 22.01 W を引いた 0.9779 W と、内訳の合計 0.9782 W が 0.03 % の差で一致しており、エネルギー収支がきちんと閉じていることが確認できます(わずかな差は電流リプルの二乗平均を有限個の標本で評価したことによるものです)。効率は 95.75 %、出力電圧は理想の 24.0 V に対して 22.98 V に落ちています。
注目すべきは、最大の損失源が抵抗ではなくダイオードの順方向電圧 $V_F$ だという点です。$V_F$ による損失は $P = V_F I_o$ で、出力電流にのみ比例します。この設計では出力 0.96 A × 0.5 V ≈ 0.48 W が、出力電力 22.0 W に対して 2.2 % を占めます。もし出力電圧がもっと低い(たとえば 5 V 出力)なら、同じ 0.5 V の $V_F$ が相対的にはるかに重くのしかかります。低電圧出力の昇圧回路で、ダイオードを MOSFET に置き換える同期整流が事実上必須になるのはこのためです。逆に高電圧出力なら $V_F$ 損の割合は小さくなるので、シンプルなダイオードで十分です。
右半平面零点によるステップ応答の逆振れ
最後に、制御上の難物である右半平面零点を波形で見ます。平均化モデル(式 (12))にデューティ比のステップを加え、出力電圧の動きを追います。
import numpy as np
import matplotlib.pyplot as plt
from scipy.integrate import solve_ivp
Vin, C, R = 12.0, 100e-6, 24.0
cases = [(100e-6, 0.5), (470e-6, 0.5), (100e-6, 0.7), (470e-6, 0.7)]
dD = 0.05
plt.figure(figsize=(11, 6))
for L, D in cases:
def avg(t, x, d=D + dD): # 平均化モデル(式12)
iL, vC = x
return [(Vin - (1 - d) * vC) / L, ((1 - d) * iL - vC / R) / C]
x0 = [Vin / ((1 - D)**2 * R), Vin / (1 - D)] # ステップ前の定常状態
s = solve_ivp(avg, (0, 1.5e-3), x0, max_step=1e-6, rtol=1e-11, atol=1e-13)
fz = (1 - D)**2 * R / L / (2 * np.pi)
plt.plot(s.t * 1e3, s.y[1] - x0[1], lw=2,
label=f"$L$={L*1e6:.0f} μH, $D$={D} → $f_z$={fz:.0f} Hz "
f"(逆振れ {s.y[1].min()-x0[1]:.3f} V)")
plt.axhline(0, color="k", lw=0.8)
plt.xlabel("時間 [ms]"); plt.ylabel("出力電圧の変化 $\\Delta V_o$ [V]")
plt.title("デューティ比を +0.05 したのに、出力は最初いったん「下がる」(右半平面零点)")
plt.legend(fontsize=9); plt.grid(alpha=0.3); plt.xlim(0, 1.5)
plt.tight_layout(); plt.show()

上段の全体像では 4 本とも最終的に出力が上がっており、一見ふつうのステップ応答に見えます。ところが下段で最初の 0.55 ms を拡大すると、全部がいったんゼロ線の下に潜ってから浮き上がってくるのがはっきり見えます。$f_z$ が最も低い赤($L$=470 µH, $D$=0.7)は 0.24 ms かけて $-0.33$ V まで沈み、$f_z$ が最も高い青($L$=100 µH, $D$=0.5)は 0.018 ms で $-0.009$ V とほとんど沈まない。逆振れの深さと長さが $1/\omega_z$ に比例して悪化するという理論が、そのまま曲線の形の違いになって現れています。
4 本の曲線すべてが、$t=0$ 直後にいったんマイナス側へ振れてから上昇に転じます。デューティ比を増やしたのだから出力は上がるはずなのに、最初の数十〜数百マイクロ秒は逆に下がる。これが右半平面零点の正体です。逆振れの深さは $f_z$ が低いほど大きく、$f_z = 9549$ Hz($L$=100 µH, $D$=0.5)では $-0.009$ V・0.018 ms なのに対し、$f_z = 731$ Hz($L$=470 µH, $D$=0.7)では $-0.332$ V・0.241 ms と、深さも時間も 1 桁以上大きくなります。$\omega_z = (1-D)^2R/L$ という式が予言するとおり、インダクタを大きくするほど、昇圧比を上げるほど、この逆振れは悪化します。
物理的な因果関係もはっきりしています。デューティ比を増やした瞬間、オフ期間 $(1-D)T$ が短くなるので、出力へ電荷を送る時間が減ります。インダクタ電流はまだ増えていないので、送られる電荷は正味で減少し、出力が下がる。インダクタ電流が増えて追いつくまでの時間が $L/((1-D)^2R)$、つまり $1/\omega_z$ です。フィードバック制御器がこの逆振れを「まだ足りない」と誤解してさらにデューティ比を上げると発振します。だから交差周波数を $f_z$ の 1/3 以下に抑え、制御器がこの時間スケールの動きに反応しないようにする。昇圧チョッパの応答が鈍いのは、この「見かけの逆応答に騙されないための減速」なのです。
設計例のまとめ
これまでの検証結果を、設計例の数値としてまとめておきます。
| 項目 | 式 | 値 |
|---|---|---|
| 昇圧比(理想) | $1/(1-D)$ | 2.000($V_o = 24.0$ V) |
| 昇圧比($r_L=0.1\,\Omega$ 込み) | $\frac{1}{1-D}\cdot\frac{1}{1+r_L/((1-D)^2R)}$ | 1.967($V_o = 23.6$ V) |
| 入力電流 | $I_o/(1-D)$ | 2.000 A |
| 電流リプル | $V_{in}DT/L$ | 0.600 A(30 %) |
| ピーク電流 | $I_L + \Delta i_L/2$ | 2.300 A |
| 電圧リプル(容量分) | $I_oDT/C$ | 50.0 mV |
| 電圧リプル(ESR 30 mΩ) | $R_{ESR}I_{L,peak}$ | 69 mV |
| 臨界インダクタンス | $D(1-D)^2RT/2$ | 15.0 µH |
| 最悪臨界インダクタンス | $2RT/27$($D=1/3$) | 17.8 µH |
| 最大昇圧比 | $\frac{1}{2}\sqrt{R/r_L}$ | 7.75 倍($D^*=0.936$, 効率 50 %) |
| 共振周波数 | $(1-D)/(2\pi\sqrt{LC})$ | 796 Hz($Q = 12$) |
| RHP 零点 | $(1-D)^2R/(2\pi L)$ | 9549 Hz |
| 推奨交差周波数 | $f_z/3$ 以下 | 3 kHz 以下 |
| 効率(全損失込み) | — | 95.75 % |
この表を眺めると、昇圧チョッパの設計が「リプル・体積・効率・応答性」の四つ巴のトレードオフであることが見えてきます。$L$ を増やせばリプルは減り CCM を保ちやすくなりますが、体積が増え、$f_z$ が下がって応答が鈍くなります。$f_s$ を上げれば $L$ と $C$ を小さくできますがスイッチング損が増えます。$D$ を上げれば昇圧比は上がりますが、効率が落ち $f_z$ が下がります。どの式も互いに引っ張り合っていて、どこか一つを良くすると必ずどこかが悪くなる。この構造を頭に入れておくと、電源 IC のデータシートに書かれた推奨定数の意図が読めるようになります。
まとめ
本記事では、昇圧チョッパ(ブーストコンバータ)について、直感から小信号モデルまでを通しで解説しました。要点を整理します。
- 昇圧の原理はインダクタの電流の慣性。オン期間に磁界へエネルギーを溜め、スイッチを切った瞬間に「電流を流し続けるために必要な電圧」をインダクタが自分で作り出す。水撃現象と同じ物理です。
- ボルト秒平衡(インダクタの平均電圧はゼロ)から $M = 1/(1-D)$。$D$ だけで昇圧比が決まり、$L$ にも $C$ にも $R$ にもよりません。
- 電荷平衡(コンデンサの平均電流はゼロ)から $I_{in} = I_o/(1-D)$。電圧が上がった分だけ入力電流が増え、理想の昇圧チョッパは巻数比連続可変の直流トランスとして振る舞います。
- リプルは $\Delta i_L = V_{in}DT/L$、$\Delta v_o = I_oDT/C$。降圧型と違い、出力リプルは電流リプルではなく負荷電流に比例するので、インダクタを大きくしても減りません。実物では ESR の寄与が容量分を上回ることも珍しくありません。
- CCM/DCM 境界は $L_{crit} = D(1-D)^2RT/2$。最悪ケースは $D = 1/3$(昇圧比 1.5 倍)。DCM では $M = (1+\sqrt{1+4D^2/K})/2$ となり、負荷が軽いほど出力が上がるので、無制御なら過電圧で壊れます。
- 寄生抵抗 $r_L$ が昇圧を頭打ちにする。$M = \frac{1}{1-D}\cdot\frac{1}{1+r_L/((1-D)^2R)}$ で、最大昇圧比は $\frac{1}{2}\sqrt{R/r_L}$、そのときの効率はぴったり 50 %。実務では昇圧比 4〜5 倍までに抑え、それ以上はトランス方式に切り替えます。
- 状態平均化モデルには右半平面零点 $\omega_z = (1-D)^2R/L$ がある。デューティ比を上げた瞬間に出力がいったん下がる逆応答を生み、制御帯域を $f_z/3$ 以下に縛ります。昇圧型の応答が鈍いのはトポロジ由来の宿命です。
数値検証では、これらの式がすべてスイッチング波形の数値解と 3〜4 桁の精度で一致することを確認しました。特に、独立に導いた $L_{crit}$ と DCM 変換比が同じ境界を指すこと、損失内訳の合計が入出力電力差とぴったり一致することは、理論の内部整合性の裏付けになっています。
昇圧チョッパを理解すると、その先の DC-DC トポロジがぐっと近くなります。昇圧と降圧を組み合わせれば昇降圧(バックブースト)になり、インダクタをトランスに置き換えれば絶縁型のフライバックになり、入力電流を正弦波に整形すれば力率改善(PFC)回路になります。どれも「ボルト秒平衡と電荷平衡で解く」という同じ道具立てで攻略できます。
次のステップとして、以下の記事も参考にしてください。