低電力設計とスリープモード
電池動作の組込み機器を「何年もつか」で語れるようになる。スリープ階層・電源ドメイン・平均電流の見積り・復帰時間のトレードオフを原理から押さえ、無駄な電流を狙って削れる。
- 1.低電力設計の本質は「止められるものを止める」こと。クロックゲーティングで動的電力を、電源ドメイン遮断とリーク対策で静的(リーク)電力を削る。深いスリープほど消せる回路が増える代わりに、状態を失い復帰も遅くなる。
- 2.電池寿命はピーク電流ではなく平均電流で決まる。各モードの電流と滞在時間から加重平均を取り、デューティ比を下げる(アクティブ時間を短く、スリープを深く)ことが効く。
- 3.スリープの深さと復帰時間・状態保持はトレードオフ。RAM保持・PLL再ロック・発振器の起動時間が復帰レイテンシを支配し、頻繁に起きる用途では深いスリープが逆にエネルギーを増やす損益分岐点が存在する。
低電力設計は「止める技術」
電池で何年も動くセンサーノードも、常時給電のマイコンも、低消費電力の勘所は同じ一言に集約されます——使っていない回路をどれだけ確実に止められるか。CMOS 回路の消費電力は大きく2つに分かれます。スイッチングのたびに容量を充放電する動的電力(周波数と電圧の二乗に比例)と、トランジスタがオフでも漏れ続ける**静的電力(リーク電流)**です。動的電力はクロックを止めれば消え、リーク電力は電源そのものを断つか電圧を下げなければ消えません。スリープモードとは、この2種類の電力を段階的に削るために「どの回路を、どこまで止めるか」を定義した状態の階層に他なりません。
CMOS がなぜ静止時にほぼ電流を消費しないか、その物理は /semiconductor/ の反転層としきい値電圧の議論に、クロックを止めて動的電力を削る回路技法は /hardware-components/ のクロックゲーティングにつながります。本稿ではそれらを組込みシステムの視点で束ね、モード設計・電流見積り・復帰時間の設計判断まで通しで見ます。
スリープの階層:浅い眠りから深い眠りへ
マイコンのスリープモードは、ベンダによって名称は違えど「止める範囲が広がるほど省電力だが、失うものも増える」という一本の軸で並びます。典型的には次の3段です。
| モード | 止める範囲 | 保持されるもの | 代表的な消費電流 |
|---|---|---|---|
| スリープ(アイドル) | CPUクロックのみ停止 | RAM・レジスタ・周辺・PLL 全て生きたまま | 数 mA 〜 数百 µA |
| ディープスリープ(ストップ) | CPU+主クロック(PLL/高速発振器)停止 | RAM とレジスタは保持、低速発振器と一部周辺のみ稼働 | 数十 µA 〜 数 µA |
| スタンバイ(シャットダウン) | 電源ドメインを遮断、レギュレータも縮退 | ごく一部のバックアップ領域のみ(RTC・少量の保持RAM) | µA 〜 nA 台 |
スリープは最も浅く、CPU のクロックだけをゲーティングして命令実行を止めます。周辺回路(タイマ、通信、ADC)は動き続けるため、DMA でデータを集めながら CPU だけ休ませるといった使い方ができ、復帰は割込み一発で数クロックです。ディープスリープは高速クロック源(PLL や高速水晶/RC 発振器)まで止めるため動的電力がほぼ消え、リーク電流と低速発振器の消費だけが残ります。スタンバイでは電源ドメインそのものを切り離し、リーク電流の発生源であるロジックへの給電を断ちます。ここまで来ると RAM 内容は原則失われ、復帰はほぼリセットからの再起動に近くなります。
クロックを止める(クロックゲーティング)だけでは動的電力しか消えず、リーク電流は流れ続けます。数 µA〜nA を狙うにはリーク源そのものへの給電を断つ「パワーゲーティング(電源ドメイン遮断)」が必須です。微細プロセスほどリーク比率が上がるため、「クロックだけ止めれば十分」という直感は最先端ノードでは成り立ちません。
クロックゲーティングと電源ドメイン
省電力の実装は、チップ内部の2つの制御機構に支えられています。
クロックゲーティングは、使っていないブロックへのクロック供給を論理ゲートで遮断する技法です。フリップフロップは入力が変化しなくてもクロックが来るたびに内部で電力を消費するため、クロックを止めるだけで動的電力を大きく削れます。実装では、イネーブル信号でクロックを止める際にグリッチ(ひげ状の誤パルス)が出ないよう、ラッチを挟んだ「グリッチフリー・クロックゲーティングセル」を使うのが定石です。
電源ドメイン(パワードメイン)は、チップを独立に給電・遮断できる区画に分割する考え方です。使わないドメインをパワースイッチで切り離せば、そのドメインのリーク電流をゼロにできます。ただし遮断したドメインの出力は不定値(フローティング)になるため、生きている側への信号線にはアイソレーションセルを挟んで既知の値に固定します。さらに、遮断前のレジスタ状態を復帰時に取り戻したいときは、常時給電の小領域に値を退避するリテンションフリップフロップを使います。
電源ドメインの遮断・復帰シーケンス(概念):
[遮断]
1. 対象ドメインのクロックをゲーティング
2. アイソレーションを有効化(境界信号を固定値にクランプ)
3. リテンションが必要ならレジスタ状態を退避(保持セルへ)
4. パワースイッチOFF(ドメインへの給電を断つ)
→ このドメインのリーク電流 ≒ 0
[復帰]
5. パワースイッチON → 電源が安定するまで待つ(突入電流に注意)
6. リテンション状態を復元
7. アイソレーション解除
8. クロック再供給 → 通常動作へ
アイソレーションを掛ける前に電源を切ると、不定値が生きたドメインへ伝播して誤動作します。逆に復帰時は電源を安定させてからアイソレーションを解かないと、電圧が立ち上がりきる前のノイズを拾います。パワーゲーティングのバグの多くはこのシーケンス誤りに起因し、電源投入時の突入電流でレールが一瞬垂下(ドループ)してブラウンアウトを誘発することもあります。
消費電流の見積り:平均電流がすべて
「このデバイスは電池で何年もつか」を決めるのは、アクティブ時のピーク電流ではなく、時間で加重平均した平均電流です。各モードの電流 I と滞在時間 t が分かれば、平均電流は「電荷の総和 ÷ 周期」で求まります。
平均電流の計算(周期 T のあいだの加重平均):
I_avg = ( Σ I_mode × t_mode ) / T
例: 1秒周期で 10ms だけ計測・送信、残り 990ms はディープスリープ
アクティブ : I = 20 mA, t = 10 ms
ディープ : I = 5 µA, t = 990 ms
電荷 Q = 20mA×10ms + 5µA×990ms
= 200 µA·s + 4.95 µA·s ≒ 205 µA·s
I_avg = 205 µA·s / 1 s ≒ 205 µA
電池寿命(概算) = 電池容量[mAh] / I_avg[mA]
例: 220 mAh コイン電池 / 0.205 mA ≒ 1073 時間 ≒ 約45日
この式が示す設計指針は明快です。アクティブ電流を下げる努力より、アクティブ時間そのものを短くし(デューティ比を下げ)、残りをできるだけ深いスリープで過ごすほうが平均電流に効きます。上の例で送信を高速化してアクティブを 10ms から 5ms に半減できれば、支配項の 200µA·s が 100µA·s に減り、平均電流はほぼ半分になります。逆にスリープ電流を 5µA から 1µA に下げても、寄与は 4.95→0.99µA·s とわずかで、全体はほとんど動きません。支配している項を見極めて削るのが鉄則です。
データシートの「スリープ電流」だけで計算すると実測と合いません。実際には、(1) レギュレータの静止電流(IQ)、(2) センサや外付け IC の待機電流、(3) 復帰のたびに発振器やレギュレータが安定するまでの過渡電流、(4) プルアップ抵抗やリーク経路の常時電流が上乗せされます。特に (3) の起動時電流は、頻繁に起きる用途では無視できない比率を占めます。
ウェイクアップ要因と復帰時間
スリープからの復帰は、あらかじめ有効にしたウェイクアップ要因が発火して初めて起こります。深いモードほど動いている回路が少ないため、使える要因も絞られます。
| ウェイクアップ要因 | 浅いスリープ | ディープスリープ | スタンバイ |
|---|---|---|---|
| 外部ピン割込み(GPIO エッジ) | 可 | 可(非同期検出回路が必要) | 限定的(専用ウェイクピンのみ) |
| 低速タイマ / RTC アラーム | 可 | 可(低速発振器が稼働) | 可(バックアップ電源側で動作) |
| 通信ペリフェラル受信 | 可(クロック供給あり) | 不可が多い(クロック停止のため) | 不可 |
| ウォッチドッグ / 電圧監視 | 可 | 可 | 一部可 |
復帰時間(ウェイクアップレイテンシ)は、そのモードで「何を止めていたか」に直結します。浅いスリープはクロックが生きているので割込みから数クロックで実行を再開できますが、深いモードでは止めていた資源を立ち上げ直す時間が加わります。
復帰レイテンシを支配する主な要素(深いモードほど加算される):
発振器の起動時間 : 水晶発振子は安定まで数百µs〜数ms(RC発振器は速いが精度低)
PLL の再ロック時間 : 主クロックを止めた場合、逓倍PLLの再ロックに数十µs
レギュレータ復帰 : 低消費モードから通常出力へ戻す整定時間
RAM/状態の復元 : リテンション復帰やフラッシュからの再ロード
→ 合計が数µs(浅い)〜 数ms(深い)まで変動
「復帰に固定コスト(時間とエネルギー)が掛かる」ことが、低電力設計で最も問われる勘所です。イベント間隔が短く頻繁に起きる用途では、深いスリープに入って発振器・PLL・レギュレータを毎回立ち上げ直すエネルギーが、浅いスリープで留まり続けるより大きくなる損益分岐点が存在します。判断基準は「スリープで節約できる電力 × 滞在時間」と「復帰の過渡エネルギー+復帰待ちで延びるアクティブ時間」の比較です。稀にしか起きないならスタンバイ、ミリ秒周期で起きるならディープスリープに入らずアイドルに留める、という設計が正解になり得ます。
割込み駆動そのものの仕組み(ベクタ・優先度・コンテキスト退避)は /hardware-components/ の割込み・例外処理、OS を載せる場合の省電力スケジューリング(アイドルループでの WFI 発行やティックレス動作)は /os/ のスケジューラ側とも密接に関わります。ハードとソフトの両輪で「止める」設計を組むのが、実務の低電力設計です。
まとめ
- 消費電力は**動的電力(クロックで発生)と静的電力=リーク(給電中は流れ続ける)**に分かれ、スリープモードは両者を段階的に削る状態階層である。クロックゲーティングは動的電力を、電源ドメイン遮断(パワーゲーティング)はリーク電力を消す。
- スリープ→ディープスリープ→スタンバイと深くなるほど止める回路が増えて省電力になるが、保持される状態が減り、復帰も遅くなる。アイソレーションセルとリテンションフリップフロップ、正しい遮断・復帰シーケンスが安全な省電力の前提。
- 電池寿命はピークでなく平均電流で決まる。各モードの電流×滞在時間の加重平均を取り、**支配項(多くはアクティブ時間)**を削る。デューティ比を下げるのが最も効く。
- 復帰は有効化したウェイクアップ要因(GPIO・RTC・ウォッチドッグ等)で起こり、復帰時間は発振器起動・PLL 再ロック・レギュレータ整定・状態復元が支配する。頻繁に起きる用途では、深いスリープが逆に損になる損益分岐点を見極める。
組込み・IoT Article
低電力設計とスリープモードを実務で読む
TL;DRは入口です。実際に選ぶ・使う段階では、何を解決するか、何と比較するか、導入後にどこで詰まるかまで見る必要があります。
解決すること
組込み
比較で見る軸
難易度: advanced / カテゴリ: 組込み・IoT / タグ数: 5
導入後に効く点
電池寿命はピーク電流ではなく平均電流で決まる。各モードの電流と滞在時間から加重平均を取り、デューティ比を下げる(アクティブ時間を短く、スリープを深く)ことが効く。
先に潰すリスク
用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。
- 難易度
- advanced
- カテゴリ
- 組込み・IoT
- タグ数
- 5
判断チェックリスト
- 自社の用途が「組込み / 低電力」に近いか確認する。
- 強みである「低電力設計の本質は「止められるものを止める」こと。クロックゲーティングで動的電力を、電源ドメイン遮断とリーク対策で静的(リーク)電力を削る。深いスリープほど消せる回路が増える代わりに、状態を失い復帰も遅くなる。」が本当に評価軸になるか確認する。
- 注意点の「用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。」を運用で吸収できるか確認する。
- 公開値や仕様値は、対象プラン・対象機種・対象リージョンまで確認する。
- 既存システム、ID、ネットワーク、監視、バックアップとの接続方法を先に洗い出す。
- 小さく試してから、本番移行、権限設計、障害時手順、コスト監視を決める。