電源回路の基礎 — リニアレギュレータとスイッチング電源

スマートフォンのバッテリーは約3.7Vの電圧を出力しますが、内部のプロセッサは1V以下、メモリは1.2V、ディスプレイドライバは3.3V、カメラモジュールは2.8Vと、異なる電圧で動作する多数のチップが搭載されています。1つのバッテリーからこれらすべての電圧を効率よく生成し、各チップに安定して供給する — これが電源回路の役割です。

電源回路はあらゆる電子機器の「縁の下の力持ち」であり、信号処理や通信といった華やかな機能の裏で黙々と働いています。しかし、電源回路の設計が不十分だと、ノイズ、発熱、バッテリー寿命の短縮、さらには回路の誤動作を引き起こします。IoTセンサのバッテリー寿命を最大化するために消費電力をμWレベルに抑えたり、高速プロセッサが急激に電流を要求したときに電圧を瞬時に安定させたりする技術は、現代エレクトロニクスの重要な設計課題です。

本記事の内容

  • 電源回路の役割と要求仕様(出力電圧精度、リップル、効率)
  • リニアレギュレータ(シリーズレギュレータ、LDO)の動作原理と効率限界
  • スイッチング電源の基本原理(PWM制御)
  • 降圧(Buck)コンバータの動作と設計
  • 昇圧(Boost)コンバータの概要
  • Pythonによる Buckコンバータの過渡シミュレーションと効率解析

前提知識

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

電源回路の役割と要求仕様

なぜ電源回路が必要なのか

電池やACアダプタから供給される電圧は、そのままでは電子回路に使えないことがほとんどです。理由は3つあります。

電圧の不一致: バッテリーの電圧は充電状態によって変化します(リチウムイオン電池は4.2V〜3.0V)。しかし、CPUは正確に1.0V±3%を要求します。電圧が上限を超えるとデバイスが破壊され、下限を割ると動作不良を起こします。

複数の電圧が必要: 1つの電源から異なる電圧を複数生成する必要があります。

ノイズの除去: ACアダプタには商用周波数(50/60Hz)のリップルが含まれ、デジタル回路のスイッチングノイズもアナログ回路に影響します。

電源回路の主要な性能指標

電源回路の性能は以下の指標で評価されます。

出力電圧精度(Load/Line Regulation): 負荷電流や入力電圧が変化したときに出力電圧がどれだけ安定しているかを示します。

$$ \text{Load Regulation} = \frac{\Delta V_{out}}{\Delta I_{load}} \quad [\Omega] \quad \text{or} \quad \frac{\Delta V_{out}}{V_{out}} \times 100 \quad [\%] $$

$$ \text{Line Regulation} = \frac{\Delta V_{out}}{\Delta V_{in}} \quad [\text{mV/V}] $$

リップル電圧: 出力電圧に重畳される交流成分の振幅です。

$$ V_{ripple,pp} = V_{out,max} – V_{out,min} $$

リニアレギュレータでは数μV〜数mV、スイッチング電源では数mV〜数十mVが典型値です。

効率: 入力電力に対する出力電力の比率です。

$$ \eta = \frac{P_{out}}{P_{in}} = \frac{V_{out} \cdot I_{out}}{V_{in} \cdot I_{in}} \times 100 \quad [\%] $$

効率が低いほど、電力が熱として無駄に消費されます。バッテリー駆動機器では効率が直接バッテリー寿命に影響するため、極めて重要な指標です。

過渡応答: 負荷が急変(ロードステップ)したときの出力電圧の応答特性です。高速デジタル回路では、クロックエッジでの電流変動が数Aに達することがあり、電源は数nsのオーダーで応答する必要があります。

電源回路に求められる性能がわかったところで、最もシンプルな電源回路であるリニアレギュレータから見ていきましょう。

リニアレギュレータ

動作原理 — 可変抵抗のアナロジー

リニアレギュレータの動作は、蛇口の水量調整に例えるとわかりやすいです。水道管の圧力(入力電圧)は変動しますが、蛇口を適切に絞ったり開いたりすることで、出口の水量(出力電圧)を一定に保てます。蛇口の絞りが「制御されたインピーダンス」に相当します。

電気回路では、入力と出力の間に制御可能な抵抗素子(通常はトランジスタ)を挿入し、帰還制御によってトランジスタの抵抗を自動調整することで出力電圧を一定に保ちます。

シリーズレギュレータの構成

最も基本的なリニアレギュレータ(シリーズレギュレータ)は、次の要素で構成されます。

  1. パストランジスタ(Pass Transistor): 入力-出力間に直列に挿入されるトランジスタ。NPN BJTまたはPチャネルMOSFETが使われる
  2. 誤差増幅器(Error Amplifier): 出力電圧と基準電圧を比較し、パストランジスタの制御信号を生成
  3. 基準電圧源(Reference Voltage): バンドギャップリファレンス等による精密な基準電圧(例: 1.25V)
  4. 帰還抵抗分圧回路: 出力電圧を分圧して誤差増幅器に帰還

動作の流れを追いましょう。出力電圧 $V_{out}$ は抵抗分圧 $R_1$, $R_2$ で分圧され、誤差増幅器の一方の入力に接続されます。もう一方の入力には基準電圧 $V_{ref}$ が接続されています。

$$ V_{FB} = V_{out} \cdot \frac{R_2}{R_1 + R_2} $$

安定状態では $V_{FB} = V_{ref}$ となり、出力電圧は次のように決まります。

$$ V_{out} = V_{ref} \cdot \frac{R_1 + R_2}{R_2} = V_{ref} \left(1 + \frac{R_1}{R_2}\right) $$

もし負荷が増えて $V_{out}$ が下がると、$V_{FB} < V_{ref}$ となり、誤差増幅器の出力がパストランジスタをさらにONに駆動します。パストランジスタの抵抗が減少し、$V_{out}$ が上昇して元の値に戻ります。この帰還制御により、出力電圧は負荷変動に対して自動的に安定化されます。

リニアレギュレータの効率限界

リニアレギュレータの効率を導出しましょう。入力電流と出力電流はほぼ等しい($I_{in} \approx I_{out}$、基準電圧回路の消費電流は無視)ため、効率は次のようになります。

$$ \eta = \frac{V_{out} \cdot I_{out}}{V_{in} \cdot I_{in}} \approx \frac{V_{out}}{V_{in}} $$

パストランジスタでの電力損失は次のとおりです。

$$ P_{loss} = (V_{in} – V_{out}) \cdot I_{out} $$

この式から、リニアレギュレータの本質的な問題が見えます。入出力の電圧差 $V_{in} – V_{out}$ が大きいほど、損失が増えて効率が悪化します。

具体例: $V_{in} = 12 \, \text{V}$ から $V_{out} = 3.3 \, \text{V}$ を生成する場合

$$ \eta = \frac{3.3}{12} = 27.5\% $$

入力電力の72.5%が熱に変わります。$I_{out} = 1 \, \text{A}$ なら、$P_{loss} = (12 – 3.3) \times 1 = 8.7 \, \text{W}$ もの熱が発生し、ヒートシンクなしでは使えません。

具体例2: $V_{in} = 3.3 \, \text{V}$ から $V_{out} = 3.0 \, \text{V}$ を生成する場合

$$ \eta = \frac{3.0}{3.3} = 90.9\% $$

入出力の電圧差が小さい場合は高効率を実現できます。

LDO(Low Dropout Regulator)

LDOは、パストランジスタにPチャネルMOSFET(またはPNP BJT)を使うことで、入出力間の最小電圧差(ドロップアウト電圧)を数十mVまで低減したリニアレギュレータです。

通常のシリーズレギュレータ(NPNパストランジスタ)ではドロップアウト電圧が約2V必要ですが、LDOでは次のように表されます。

$$ V_{dropout} = I_{out} \cdot R_{DS(on)} $$

$R_{DS(on)}$ はMOSFETのオン抵抗です。$R_{DS(on)} = 100 \, \text{m}\Omega$, $I_{out} = 500 \, \text{mA}$ の場合、$V_{dropout} = 50 \, \text{mV}$ です。

LDOの利点はリップルが小さく(高PSRR: Power Supply Rejection Ratio)、出力ノイズも小さいことです。そのため、アナログ回路やRF回路、クロック回路など、ノイズに敏感な回路の電源に最適です。

しかし、LDOも $\eta \approx V_{out}/V_{in}$ の効率限界は免れません。大きな電圧変換比が必要な場合や高出力電流の場合は、根本的に異なるアプローチが必要です。次は、スイッチングによる電力変換の基本原理を見ていきましょう。

スイッチング電源の基本原理

スイッチング電源の発想

リニアレギュレータの効率限界は、パストランジスタが「可変抵抗」として動作し、常に電流が流れている(つまりアクティブ領域で動作している)ことに起因します。

スイッチング電源は、全く異なるアプローチを取ります。トランジスタを「スイッチ」として使い、完全にON(抵抗≈0)または完全にOFF(電流≈0)の2状態だけで動作させます。どちらの状態でも $P = V \times I$ のうちどちらかがほぼゼロなので、理想的には電力損失がゼロです。

では、スイッチのON/OFFだけでどうやって電圧を下げるのでしょうか? ここで重要な役割を果たすのがインダクタコンデンサによるエネルギー貯蔵です。

PWM(Pulse Width Modulation)制御

スイッチング電源の基本動作は次のとおりです。

  1. スイッチをONにして、入力電源からインダクタにエネルギーを蓄える
  2. スイッチをOFFにして、インダクタに蓄えたエネルギーを出力に放出する
  3. このON/OFFを高速(数百kHz〜数MHz)で繰り返す
  4. 出力コンデンサが高周波のリップルを平滑化する

スイッチのON時間とOFF時間の比率をデューティサイクル $D$ と定義します。

$$ D = \frac{t_{ON}}{t_{ON} + t_{OFF}} = \frac{t_{ON}}{T_s} $$

$T_s = 1/f_s$ はスイッチング周期です。$D$ を変えることで、出力電圧を連続的に制御できます。

出力電圧を安定に保つために、帰還制御が使われます。出力電圧が目標値より低ければ $D$ を大きくし(ONの比率を増やし)、高ければ $D$ を小さくします。この制御がPWM制御です。

スイッチング電源のメリットとデメリット

特性 リニアレギュレータ スイッチング電源
効率 $V_{out}/V_{in}$(入出力差で劣化) 80〜95%(高効率を維持)
出力ノイズ 低い(μV級) 高い(mV級のリップル)
回路の複雑さ シンプル インダクタ、ダイオード、制御ICが必要
面積/コスト 小さい(パスFET + コンデンサ) 大きい(インダクタが必要)
昇圧の可否 不可(降圧のみ) 可能(昇圧、反転も可)
EMI ほぼなし スイッチングノイズを放射

スイッチング電源の基本的な考え方が理解できたところで、次は最も広く使われている降圧(Buck)コンバータの動作を詳しく見ていきましょう。

降圧(Buck)コンバータ

回路構成

Buckコンバータは、入力電圧を低い出力電圧に変換する最も基本的なスイッチング電源です。回路は次の4つの要素で構成されます。

  1. スイッチ(ハイサイドFET): 入力電源とインダクタの間に接続
  2. ダイオード(またはローサイドFET): インダクタとグランドの間に接続(同期整流の場合はFET)
  3. インダクタ $L$: エネルギーを磁気的に蓄積し、電流を平滑化
  4. 出力コンデンサ $C$: 電圧を平滑化してリップルを低減

動作モード

ONフェーズ($0 < t < DT_s$): スイッチがONのとき、入力電圧 $V_{in}$ がインダクタの左端に印加されます。インダクタの右端は出力電圧 $V_{out}$ に接続されているので、インダクタの両端電圧は $V_{in} - V_{out} > 0$ です。

インダクタの電圧-電流関係 $V_L = L \cdot dI_L/dt$ から、電流は線形に増加します。

$$ \frac{dI_L}{dt} = \frac{V_{in} – V_{out}}{L} > 0 $$

ONフェーズでの電流増加量(リップル電流の半分)は次のとおりです。

$$ \Delta I_{L,on} = \frac{(V_{in} – V_{out}) \cdot D T_s}{L} $$

OFFフェーズ($DT_s < t < T_s$): スイッチがOFFになると、インダクタの電流は急に止められません(インダクタはエネルギーを蓄えており、電流の連続性を維持しようとする)。電流はダイオードを通じて流れ続けます。インダクタの左端はダイオードによりほぼグランド電位($\approx 0$)になるので、インダクタの両端電圧は $0 - V_{out} = -V_{out} < 0$ です。

$$ \frac{dI_L}{dt} = \frac{-V_{out}}{L} < 0 $$

電流は線形に減少します。OFFフェーズでの電流減少量は次のとおりです。

$$ \Delta I_{L,off} = \frac{V_{out} \cdot (1 – D) T_s}{L} $$

入出力電圧の関係

定常状態では、1周期にわたるインダクタの電流変化はゼロでなければなりません(そうでなければ電流が毎周期増え続けるか減り続ける)。これはボルト秒平衡と呼ばれ、インダクタの1周期にわたる平均電圧がゼロであることを意味します。

$$ \Delta I_{L,on} = \Delta I_{L,off} $$

$$ \frac{(V_{in} – V_{out}) \cdot D}{L} = \frac{V_{out} \cdot (1 – D)}{L} $$

$L$ を消去して整理すると、次の重要な関係式が得られます。

$$ V_{out} = D \cdot V_{in} $$

$D$ は $0 \leq D \leq 1$ なので、$V_{out} \leq V_{in}$ です。つまり、Buckコンバータは常に降圧動作をします。$D = 0.5$ なら入力電圧の半分が出力に現れます。

インダクタのリップル電流

インダクタ電流のピーク-ピークリップルは次のとおりです。

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

2番目の等号は $V_{in} D = V_{out}$ を使いました。リップルはインダクタンス $L$ とスイッチング周波数 $f_s$ に反比例します。$L$ や $f_s$ を大きくすればリップルは減りますが、$L$ を大きくするとインダクタのサイズが増え、$f_s$ を高くするとスイッチング損失が増えます。

一般的な設計指針として、リップル電流は平均電流の20〜40%程度に設定します。

$$ \Delta I_L = (0.2 \sim 0.4) \cdot I_{out} $$

この条件から必要なインダクタンスが求まります。

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

出力電圧リップル

出力コンデンサは、インダクタ電流のリップル成分を平滑化します。ESR(等価直列抵抗)を無視した理想コンデンサの場合、出力電圧リップルは次のとおりです。

$$ \Delta V_{out} = \frac{\Delta I_L}{8 C f_s} $$

ESRが無視できない場合は、ESR $R_{ESR}$ によるリップル成分が追加されます。

$$ \Delta V_{out,ESR} = \Delta I_L \cdot R_{ESR} $$

多くの場合、ESRによるリップルが支配的です。低ESRのセラミックコンデンサを使うことでリップルを低減できます。

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

上記の解析は、インダクタ電流が常にゼロより大きいCCM(Continuous Conduction Mode)を前提としています。負荷電流が小さくなると、インダクタ電流の谷がゼロに達し、インダクタ電流がゼロの期間が存在するDCM(Discontinuous Conduction Mode)に移行します。

CCMとDCMの境界条件は、インダクタ電流の谷がちょうどゼロになるときです。

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

DCMでは $V_{out} = D \cdot V_{in}$ の関係が成り立たなくなり、出力電圧は負荷に依存するようになります。多くの実用的なコンバータはCCMで動作するよう設計されています。

Buckコンバータの動作原理が理解できました。次は、入力電圧より高い出力電圧が必要な場合に使うBoostコンバータについて概要を見ていきましょう。

昇圧(Boost)コンバータ

動作原理

Boostコンバータは、Buckコンバータとは逆に、入力電圧を高い出力電圧に変換します。回路構成はBuckの要素を再配置した形です。

  • インダクタは入力電源に直列に接続
  • スイッチはインダクタの出力端とグランドの間に接続
  • ダイオードはインダクタの出力端と出力コンデンサの間に接続

ONフェーズ: スイッチONでインダクタの右端がグランドに接続され、$V_L = V_{in}$ でインダクタにエネルギーが蓄積されます。

OFFフェーズ: スイッチOFFでインダクタのエネルギーがダイオードを通じて出力に放出されます。インダクタの電圧は $V_L = V_{in} – V_{out} < 0$ となり、電流は減少します。

ボルト秒平衡から、入出力電圧の関係は次のようになります。

$$ V_{in} \cdot D + (V_{in} – V_{out}) \cdot (1 – D) = 0 $$

整理すると、次の式が得られます。

$$ V_{out} = \frac{V_{in}}{1 – D} $$

$0 \leq D < 1$ なので $V_{out} \geq V_{in}$ となり、常に昇圧動作をします。$D = 0.5$ で2倍昇圧、$D = 0.75$ で4倍昇圧ですが、$D$ が1に近づくとスイッチのオン時間がほとんどを占め、実際にはスイッチング損失と寄生抵抗のため効率が急激に悪化します。実用的には $D < 0.8$(5倍昇圧)程度が限界です。

Buck-Boostコンバータ

Buckとboostを組み合わせたBuck-Boostコンバータは、入力電圧の上下にかかわらず一定の出力電圧を生成できます。入出力電圧関係は次のとおりです。

$$ V_{out} = -\frac{D}{1 – D} V_{in} $$

負号は出力極性が反転することを意味します。非反転型のBuck-Boostが必要な場合は、SEPIC(Single-Ended Primary-Inductor Converter)やCuk(チュック)コンバータが使われます。

Boostコンバータの基本を理解した上で、次はPythonシミュレーションでBuckコンバータの動作を詳しく確認しましょう。

Pythonシミュレーション

Buckコンバータの過渡シミュレーション

Buckコンバータの起動から定常状態までの過渡応答をシミュレーションします。

import numpy as np
import matplotlib.pyplot as plt

# Buckコンバータのパラメータ
V_in = 12.0        # 入力電圧 [V]
V_out_target = 3.3  # 目標出力電圧 [V]
D = V_out_target / V_in  # デューティサイクル
L = 10e-6           # インダクタンス [H]
C = 47e-6           # 出力コンデンサ [F]
R_load = 3.3        # 負荷抵抗 [Ω](→ I_out ≈ 1A)
f_s = 500e3         # スイッチング周波数 [Hz]
T_s = 1 / f_s

# 寄生成分
R_L = 50e-3         # インダクタのDCR [Ω]
R_ESR = 10e-3       # コンデンサのESR [Ω]
R_SW = 30e-3        # スイッチのオン抵抗 [Ω]

# シミュレーション
dt = 1e-9           # タイムステップ [s](ナノ秒精度)
t_total = 1e-3      # 総シミュレーション時間 [s](1ms)
n_steps = int(t_total / dt)

# 状態変数
I_L = 0.0           # インダクタ電流 [A]
V_C = 0.0           # コンデンサ電圧 [V]

# 記録用(間引いて保存)
record_interval = 100
n_records = n_steps // record_interval
t_arr = np.zeros(n_records)
I_L_arr = np.zeros(n_records)
V_out_arr = np.zeros(n_records)
V_sw_arr = np.zeros(n_records)

for i in range(n_steps):
    t = i * dt

    # スイッチ状態の判定(PWM)
    t_in_cycle = t % T_s
    sw_on = t_in_cycle < D * T_s

    # スイッチノードの電圧
    if sw_on:
        V_sw = V_in - I_L * R_SW  # スイッチON: 入力電圧(オン抵抗による損失あり)
    else:
        V_sw = -0.5  # ダイオード順方向電圧降下(同期整流ならほぼ0)

    # 出力電圧
    V_out = V_C + I_L * R_ESR  # ESRによる電圧降下を考慮

    # 負荷電流
    I_load = V_out / R_load

    # インダクタの電圧方程式: V_L = V_sw - V_out - I_L * R_L
    V_L = V_sw - V_C - I_L * (R_L + R_ESR)

    # 状態更新
    dI_L = V_L / L * dt
    dV_C = (I_L - I_load) / C * dt

    I_L += dI_L
    V_C += dV_C

    # インダクタ電流が負にならない(DCMの場合)
    if I_L < 0:
        I_L = 0

    # 記録
    if i % record_interval == 0:
        idx = i // record_interval
        t_arr[idx] = t
        I_L_arr[idx] = I_L
        V_out_arr[idx] = V_out
        V_sw_arr[idx] = V_sw

fig, axes = plt.subplots(3, 1, figsize=(12, 10), sharex=True)

# 出力電圧
axes[0].plot(t_arr * 1e3, V_out_arr, 'b-', linewidth=1)
axes[0].axhline(y=V_out_target, color='r', linestyle='--', alpha=0.7,
                label=f'Target: {V_out_target} V')
axes[0].set_ylabel('$V_{out}$ [V]', fontsize=12)
axes[0].set_title('Buck Converter: Startup Transient', fontsize=14)
axes[0].legend(fontsize=11)
axes[0].grid(True, alpha=0.3)

# インダクタ電流
axes[1].plot(t_arr * 1e3, I_L_arr, 'g-', linewidth=1)
axes[1].axhline(y=V_out_target / R_load, color='r', linestyle='--', alpha=0.7,
                label=f'Steady state: {V_out_target/R_load:.2f} A')
axes[1].set_ylabel('$I_L$ [A]', fontsize=12)
axes[1].legend(fontsize=11)
axes[1].grid(True, alpha=0.3)

# スイッチノード電圧(定常状態の一部を拡大)
t_start = 0.8e-3
t_end = 0.81e-3
mask = (t_arr >= t_start) & (t_arr <= t_end)
axes[2].plot(t_arr[mask] * 1e6, V_sw_arr[mask], 'r-', linewidth=1)
axes[2].set_ylabel('$V_{SW}$ [V]', fontsize=12)
axes[2].set_xlabel('Time [ms] (bottom: [$\\mu$s] zoomed)', fontsize=12)
axes[2].grid(True, alpha=0.3)
axes[2].set_title('Switch Node Voltage (Zoomed: 800-810 $\\mu$s)', fontsize=12)

plt.tight_layout()
plt.savefig('buck_transient.png', dpi=150, bbox_inches='tight')
plt.show()

# 定常状態の数値確認
steady_mask = t_arr > 0.8e-3
V_out_avg = np.mean(V_out_arr[steady_mask])
V_out_ripple = np.max(V_out_arr[steady_mask]) - np.min(V_out_arr[steady_mask])
I_L_avg = np.mean(I_L_arr[steady_mask])
I_L_ripple = np.max(I_L_arr[steady_mask]) - np.min(I_L_arr[steady_mask])

print(f"定常状態の特性:")
print(f"  V_out平均: {V_out_avg:.3f} V (目標: {V_out_target:.1f} V)")
print(f"  V_outリップル(p-p): {V_out_ripple*1e3:.1f} mV")
print(f"  I_L平均: {I_L_avg:.3f} A")
print(f"  I_Lリップル(p-p): {I_L_ripple:.3f} A ({I_L_ripple/I_L_avg*100:.0f}%)")
print(f"  デューティサイクル: D = {D:.4f}")

3つのグラフから、Buckコンバータの起動から定常状態への移行が読み取れます。

上段の出力電圧を見ると、起動時にゼロから目標値3.3Vに向かって上昇しています。出力コンデンサの充電とインダクタの電流立ち上がりにより、ある程度のオーバーシュートの後に定常値に収束しています。定常状態での出力電圧はほぼ目標値に一致し、リップルは数mV程度に抑えられています。

中段のインダクタ電流は、起動時にゼロから急増し、振動しながら定常値($V_{out}/R_{load} \approx 1 \, \text{A}$)に収束しています。定常状態では三角波状のリップル電流が観察されます。リップルの大きさは $\Delta I_L = V_{out}(1-D)/(Lf_s)$ で予測される値と一致するはずです。

下段のスイッチノード電圧(拡大表示)は、PWM制御の様子を示しています。スイッチON時は $V_{in} \approx 12 \, \text{V}$、OFF時はダイオードの順方向降下で約 $-0.5 \, \text{V}$ になっており、このパルスをインダクタとコンデンサで平滑化して3.3Vの直流を得ていることが視覚的にわかります。

効率の負荷依存性

次に、負荷電流を変化させたときの効率を解析します。

import numpy as np
import matplotlib.pyplot as plt

# パラメータ
V_in = 12.0
V_out = 3.3
D = V_out / V_in
f_s = 500e3
L = 10e-6

# 損失モデルのパラメータ
R_DS_on = 30e-3      # MOSFETオン抵抗 [Ω]
V_D = 0.5            # ダイオード順方向電圧 [V](非同期の場合)
R_D = 20e-3          # ダイオードの直列抵抗 [Ω]
R_L_dc = 50e-3       # インダクタDCR [Ω]
R_ESR = 10e-3        # コンデンサESR [Ω]
Q_g = 20e-9          # ゲート電荷 [C]
V_g = 10.0           # ゲートドライブ電圧 [V]
I_q = 2e-3           # レギュレータの静止電流 [A]

# 負荷電流の範囲
I_out = np.linspace(0.01, 3.0, 300)

# リップル電流
delta_I_L = V_out * (1 - D) / (L * f_s)
I_L_rms = np.sqrt(I_out**2 + (delta_I_L**2 / 12))

# 各損失の計算
# 1. スイッチ導通損失
P_sw_cond = D * R_DS_on * I_L_rms**2

# 2. ダイオード導通損失(非同期整流の場合)
P_diode = (1 - D) * (V_D * I_out + R_D * I_L_rms**2)

# 3. インダクタ銅損
P_inductor = R_L_dc * I_L_rms**2

# 4. ESR損失
P_ESR = R_ESR * (delta_I_L / (2 * np.sqrt(3)))**2  # リップル電流のRMS

# 5. スイッチング損失(簡略化)
t_sw = 20e-9  # スイッチング遷移時間 [s]
P_switching = 0.5 * V_in * I_out * t_sw * f_s * 2  # ON+OFF

# 6. ゲートドライブ損失
P_gate = Q_g * V_g * f_s

# 7. 静止電流損失
P_quiescent = V_in * I_q

# 総損失
P_total_loss = P_sw_cond + P_diode + P_inductor + P_ESR + P_switching + P_gate + P_quiescent
P_out = V_out * I_out
P_in = P_out + P_total_loss

efficiency = P_out / P_in * 100

# 同期整流の場合(ダイオードをMOSFETに置き換え)
P_sync_cond = (1 - D) * R_DS_on * I_L_rms**2  # ローサイドFET
P_total_sync = P_sw_cond + P_sync_cond + P_inductor + P_ESR + P_switching + P_gate * 2 + P_quiescent
P_in_sync = P_out + P_total_sync
efficiency_sync = P_out / P_in_sync * 100

# リニアレギュレータの効率(比較用)
efficiency_linear = V_out / V_in * 100

fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(14, 6))

# 効率 vs 負荷電流
ax1.plot(I_out, efficiency, 'b-', linewidth=2, label='Buck (diode rectification)')
ax1.plot(I_out, efficiency_sync, 'r-', linewidth=2, label='Buck (synchronous)')
ax1.axhline(y=efficiency_linear, color='gray', linestyle='--', linewidth=1.5,
            label=f'Linear: {efficiency_linear:.1f}%')
ax1.set_xlabel('Load Current $I_{out}$ [A]', fontsize=12)
ax1.set_ylabel('Efficiency [%]', fontsize=12)
ax1.set_title('Efficiency vs Load Current', fontsize=13)
ax1.legend(fontsize=10)
ax1.grid(True, alpha=0.3)
ax1.set_ylim([0, 100])

# 損失の内訳(同期整流)
ax2.fill_between(I_out, 0, P_sw_cond, alpha=0.7, label='HS FET conduction')
ax2.fill_between(I_out, P_sw_cond, P_sw_cond + P_sync_cond, alpha=0.7, label='LS FET conduction')
ax2.fill_between(I_out, P_sw_cond + P_sync_cond,
                  P_sw_cond + P_sync_cond + P_inductor, alpha=0.7, label='Inductor DCR')
ax2.fill_between(I_out, P_sw_cond + P_sync_cond + P_inductor,
                  P_sw_cond + P_sync_cond + P_inductor + P_switching, alpha=0.7,
                  label='Switching loss')
ax2.fill_between(I_out, P_sw_cond + P_sync_cond + P_inductor + P_switching,
                  P_total_sync, alpha=0.7, label='Other (gate, quiescent, ESR)')
ax2.set_xlabel('Load Current $I_{out}$ [A]', fontsize=12)
ax2.set_ylabel('Power Loss [W]', fontsize=12)
ax2.set_title('Loss Breakdown (Synchronous Buck)', fontsize=13)
ax2.legend(fontsize=9, loc='upper left')
ax2.grid(True, alpha=0.3)

plt.tight_layout()
plt.savefig('buck_efficiency.png', dpi=150, bbox_inches='tight')
plt.show()

# ピーク効率の表示
peak_eff = np.max(efficiency_sync)
peak_eff_current = I_out[np.argmax(efficiency_sync)]
print(f"同期整流Buckのピーク効率: {peak_eff:.1f}% (@ I_out = {peak_eff_current:.2f} A)")
print(f"リニアレギュレータの効率: {efficiency_linear:.1f}%")
print(f"効率改善: {peak_eff - efficiency_linear:.1f}ポイント")

2つのグラフから、Buckコンバータの効率特性が明確に読み取れます。

左のグラフでは、スイッチング電源の効率がリニアレギュレータ(灰色破線、27.5%)を大幅に上回っていることがわかります。同期整流方式(赤)はダイオード整流方式(青)よりも高い効率を示しています。これはダイオードの順方向電圧降下($\approx 0.5 \, \text{V}$)がないためです。

特に注目すべきは効率の負荷依存性です。軽負荷時($I_{out} < 0.1 \, \text{A}$)では効率が急落しています。これは、静止電流やゲートドライブ損失などの「固定損失」が、小さな出力電力に対して相対的に大きくなるためです。重負荷時には導通損失($I^2 R$ に比例)が支配的になり、やはり効率が低下します。ピーク効率は中程度の負荷で得られます。

右の損失内訳グラフは、負荷電流に応じてどの損失が支配的かを示しています。低負荷ではスイッチング損失(固定損失)が支配的で、高負荷ではFETの導通損失($I^2R$ に比例)とインダクタのDCR損失が支配的になっています。この情報は、どの部品を改善すれば効率が上がるかを判断する設計指針になります。

インダクタンスとスイッチング周波数の設計トレードオフ

最後に、設計パラメータの選択が性能にどう影響するかを可視化します。

import numpy as np
import matplotlib.pyplot as plt

# 固定パラメータ
V_in = 12.0
V_out = 3.3
D = V_out / V_in
I_out = 1.0  # 負荷電流 [A]

# パラメータ範囲
L_range = np.logspace(-6, -4, 100)  # 1 μH ~ 100 μH
f_s_range = np.logspace(4.5, 7, 100)  # ~30 kHz ~ 10 MHz

# リップル電流と出力リップルの計算
fig, axes = plt.subplots(2, 2, figsize=(14, 10))

# 左上: リップル電流 vs L(f_s固定)
f_s_fixed = [100e3, 500e3, 2e6]
for f_s in f_s_fixed:
    delta_IL = V_out * (1 - D) / (L_range * f_s)
    ripple_pct = delta_IL / I_out * 100
    axes[0, 0].semilogx(L_range * 1e6, ripple_pct, linewidth=2,
                         label=f'$f_s$ = {f_s/1e3:.0f} kHz')

axes[0, 0].axhline(y=30, color='gray', linestyle='--', alpha=0.5, label='30% guideline')
axes[0, 0].set_xlabel('Inductance [$\\mu$H]', fontsize=12)
axes[0, 0].set_ylabel('$\\Delta I_L / I_{out}$ [%]', fontsize=12)
axes[0, 0].set_title('Ripple Current vs Inductance', fontsize=13)
axes[0, 0].legend(fontsize=10)
axes[0, 0].grid(True, which='both', alpha=0.3)
axes[0, 0].set_ylim([0, 200])

# 右上: 出力リップル vs C(L, f_s固定)
C_range = np.logspace(-6, -3, 100)  # 1 μF ~ 1 mF
L_fixed = 10e-6
f_s_val = 500e3
delta_IL_val = V_out * (1 - D) / (L_fixed * f_s_val)

delta_Vout_cap = delta_IL_val / (8 * C_range * f_s_val) * 1e3  # mV

axes[0, 1].semilogx(C_range * 1e6, delta_Vout_cap, 'b-', linewidth=2,
                     label='Capacitive ripple')
# ESRリップルも表示
ESR_values = [5e-3, 10e-3, 50e-3]
for esr in ESR_values:
    delta_V_esr = delta_IL_val * esr * 1e3
    axes[0, 1].axhline(y=delta_V_esr, linestyle='--', alpha=0.5,
                        label=f'ESR={esr*1e3:.0f} mΩ ripple')

axes[0, 1].set_xlabel('Output Capacitance [$\\mu$F]', fontsize=12)
axes[0, 1].set_ylabel('$\\Delta V_{out}$ [mV]', fontsize=12)
axes[0, 1].set_title('Output Voltage Ripple vs Capacitance', fontsize=13)
axes[0, 1].legend(fontsize=9)
axes[0, 1].grid(True, which='both', alpha=0.3)
axes[0, 1].set_ylim([0, 50])

# 左下: CCM/DCM境界電流 vs L
for f_s in f_s_fixed:
    I_boundary = V_out * (1 - D) / (2 * L_range * f_s)
    axes[1, 0].semilogx(L_range * 1e6, I_boundary, linewidth=2,
                         label=f'$f_s$ = {f_s/1e3:.0f} kHz')

axes[1, 0].set_xlabel('Inductance [$\\mu$H]', fontsize=12)
axes[1, 0].set_ylabel('$I_{out,boundary}$ [A]', fontsize=12)
axes[1, 0].set_title('CCM/DCM Boundary Current', fontsize=13)
axes[1, 0].legend(fontsize=10)
axes[1, 0].grid(True, which='both', alpha=0.3)

# 右下: 効率 vs スイッチング周波数
R_DS = 30e-3
R_L_dc = 50e-3
t_sw = 20e-9
Q_g = 20e-9
V_g = 10.0

eta_vs_fs = []
for fs in f_s_range:
    L_design = V_out * (1-D) / (fs * 0.3 * I_out)  # 30%リップル設計
    dIL = V_out * (1-D) / (L_design * fs)
    I_rms = np.sqrt(I_out**2 + dIL**2/12)

    P_cond = R_DS * I_rms**2  # 両FET合計(簡略化)
    P_ind = R_L_dc * I_rms**2
    P_sw = V_in * I_out * t_sw * fs
    P_gate = 2 * Q_g * V_g * fs
    P_total = P_cond + P_ind + P_sw + P_gate
    P_out_val = V_out * I_out
    eta_vs_fs.append(P_out_val / (P_out_val + P_total) * 100)

axes[1, 1].semilogx(f_s_range / 1e3, eta_vs_fs, 'b-', linewidth=2)
axes[1, 1].set_xlabel('Switching Frequency [kHz]', fontsize=12)
axes[1, 1].set_ylabel('Efficiency [%]', fontsize=12)
axes[1, 1].set_title('Efficiency vs Switching Frequency', fontsize=13)
axes[1, 1].grid(True, which='both', alpha=0.3)

plt.tight_layout()
plt.savefig('buck_design_tradeoffs.png', dpi=150, bbox_inches='tight')
plt.show()

# 最適スイッチング周波数
optimal_fs = f_s_range[np.argmax(eta_vs_fs)]
print(f"最適スイッチング周波数: {optimal_fs/1e3:.0f} kHz (効率 {max(eta_vs_fs):.1f}%)")

4つのグラフから、Buckコンバータの設計トレードオフが総合的に理解できます。

左上のリップル電流のグラフでは、インダクタンスを大きくするほどリップルが減少し、スイッチング周波数が高いほどリップルが小さくなることが確認できます。設計指針の30%ライン(灰色破線)を基準にインダクタンスの最小値を決めます。

右上の出力リップルのグラフでは、コンデンサの容量を増やすほどリップルが減少しますが、ESRによるリップル(水平の破線)がボトルネックになることがわかります。ESR 50 mΩのコンデンサでは、容量をいくら増やしてもリップルは約30 mV以下に下がりません。低ESRのセラミックコンデンサの使用がリップル低減の鍵です。

左下のCCM/DCM境界電流のグラフは、どの負荷電流以下でDCMに移行するかを示しています。インダクタンスが大きいほど、また周波数が高いほど、より小さな電流までCCMを維持できます。

右下の効率のスイッチング周波数依存性では、周波数を高くすると受動部品(インダクタ、コンデンサ)を小型化できるメリットがある一方で、スイッチング損失とゲートドライブ損失が増加して効率が低下する様子が見えます。最適な周波数は損失のバランス点に存在し、この例では数百kHz付近にピークがあります。

まとめ

本記事では、電源回路の基礎を体系的に解説しました。

  • リニアレギュレータ: 構造がシンプルでノイズが小さいが、効率は $V_{out}/V_{in}$ が上限。LDOはドロップアウト電圧を数十mVまで低減し、入出力電圧差が小さい用途で高効率を実現
  • スイッチング電源の原理: トランジスタをスイッチとして使い、インダクタとコンデンサでエネルギーを一時蓄積して変換。PWM制御のデューティサイクル $D$ で出力電圧を制御
  • Buckコンバータ: $V_{out} = D \cdot V_{in}$ の降圧動作。ボルト秒平衡が基本原理。インダクタンス、コンデンサ、スイッチング周波数の設計トレードオフが重要
  • Boostコンバータ: $V_{out} = V_{in}/(1-D)$ の昇圧動作。高い昇圧比では効率が低下
  • 効率の最適化: 導通損失($I^2R$、負荷に比例)とスイッチング損失(固定、周波数に比例)のバランスでピーク効率が決まる。同期整流でダイオード損失を削減

電源回路は、信号処理やデータ通信と同様にエレクトロニクスの基盤技術です。高効率な電源は省エネルギーとバッテリー寿命の延長に直結し、低ノイズな電源は高精度のアナログ・RF回路を支えます。

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