SPRESENSEの消費電力を可視化して解析


図

PoC(実証実験:Proof-of-Concept)をクリアし実運用に耐えうるシステムを構築・展開していく中で「エッジの低消費電力化」が強く求められています。電源ケーブルの敷設やバッテリーの頻繁な交換を必要としないため、山岳・森林・海上といった遠隔地のデジタル化(デジタル・トランスフォーメーション:DX)の推進に絶大な効果を発揮できるためです。

また、電源設備の整ったFA分野、Industrial IoT(IIoT、Industry4.0)分野も低消費電力なエッジを必要としています。エッジが電力を効率的に活用することにより、瞬間的な電源異常(瞬停、瞬電)に対して巨大な補助電源装置を使うことなく、少量の電力を蓄積できるスーパーキャパシタ(大容量のコンデンサ)のみで電源の喪失を回避することができます。24時間365日稼働し続けなければならないFAの現場に対応できる、高い信頼性を備えたサービスを構築可能です。

こうした低消費電力化を推進する動向と、高スループットを達成するために多数の演算ユニットを統合したマルチコア・アーキテクチャを採用する動向は、背反するように感じられますが、実は両立することができます。

今回の初心者講座マルチコア編では、汎用コンピュータが採用している電力低減技術(電力削減技術)をはじめ、マルチコア・アーキテクチャのSPRESENSEが低消費電力を達成するために採用した技術、実際にデバイスが動作している最中の電力解析やその結果について詳解いたします。

図

▼目次

電力低減技術の紹介

汎用コンピュータに採用されている電力低減機能

SPRESENSEをはじめとするIoTエッジの低消費電力技術や電力解析手法を解説する前に、一般的に使われている汎用コンピュータの電力低減技術を紹介いたします。

休止状態(ハイバネーション)

WindowsやmacOS、Linuxといった汎用OSが当たり前のように使っている「スリープ」機能や「ハイバネーション(休止状態)」機能は低消費電力化の技術を理解するための最初の手がかりとなります。これらの機能は、大きな電力を消費し続ける内蔵機器への給電を停止することにより、システムの電力低減に貢献します。

ハイバネーションは、メモリへの電源供給を停止する機能です。メモリはあらゆる機能に必要とされていますが、電力を大量に消費することから、メモリを停止させることで劇的に電力を低減することができます。揮発性ストレージであるメモリ(SRAM・DRAM)上の情報は給電が停止すると消失してしまうため、ハイバネーション機能は、電力遮断前にメモリ上の全データを不揮発性ストレージへ移動(バックアップ)し、電源復帰後に不揮発性ストレージからメモリへデータを復元(リストア)することで、メモリ上の情報を維持したまま電力低減を実現します。

ハイバーネーション

Intel Turbo Boost Technology

すべてのプログラムが、マルチコア・アーキテクチャのCPUコアすべてを活用できるわけではありません。例えば、システムに6個のCPUコアを搭載されていたとしても、データ間の依存性が極めて高いアルゴリズムを実行している間は、同時に2個のCPUコアしか利用できず、他の4個のCPUコアが未使用状態となることがあります(図1中央)。

ターボ・ブースト・テクノロジーは、未使用のCPUコアを停止することにより余った電力・熱設計電力(TDP)を動作中のCPUコアへ移譲し、クロックアップする機能です。これにより消費電力と発熱量を安全域に保ちながら並列度の低い処理を短時間で完了させることができます(図1右、高い動作周波数のCPUコアは大きな電力を必要とします)。

図
図1:ターボ・ブースト・テクノロジの概要

インテル ターボ・ブースト・テクノロジー

PCI Express Architecture Power Management

マルチコア・アーキテクチャとして複数のCPUコアが集約されると、同時に大量のデータを処理できるようになるため、ペリフェラル(周辺機能)とそれらを接続するバス(通信経路)の高速化が求められます。そのため、ペリフェラルやバスも大量の電力を消費します。

PCI Expressは高速な通信路の代表例です。高機能・高いスループットで動作するペリフェラルと低レイテンシでアクセスできるメモリを結合するための高速なネットワークです。高速通信を実現するために高い周波数の信号を扱うため、大きな電力を消費します。そこでPCI Expressは電力低減機能として、周辺デバイスへの電力供給の管理(D*ステート)や、利用されていない通信リンクの管理(L*ステート)を規格として定義。未使用部への給電をダイナミックに制御することで、電力を効率的に活用します。

Intel|PCI Express Architecture Power Management

SPRESENSEが採用している消費電力の低減手法

次に、本初心者講座の学習機材「SPRESENSE」が取り入れている消費電力の低減手法を紹介いたします。大別して4種類の機能があります。ここでは要点のみを抜粋して紹介します(詳細については下記の記事をご参照ください)。

CPUコア/メモリタイル単位の給電制御機能

SPRESENSEは内蔵の電力制御コントローラにより、6個のCPUコアと128KBx12個のメモリタイルのうち、利用されていないハードウェアへの給電を自動的に遮断します。

電源ドメイン毎の給電制御機能

SPRESENSEの核となるLSI「CXD5602/CXD5247」は、機能別に4個の電源ドメインに分割されています(図2)。内蔵の電力制御コントローラが、未使用機能に対応するドメインへの給電を自動的に遮断することにより、電力の浪費を防ぎます。

  • Application Domain
  • System and IOP Domain
  • Sensor Domain
  • GNSS Domain

図
図2:SPRESENSEは複数の電源ドメインから構成される

スリープ機能

SPRESENSEは、定常状態に加えて、3種類のスリープ状態「Hot-Sleep(2020年1月現在:非対応)」「Cold-Sleep」「Deep-Sleep」を定義しています(機能の差異については後述)。アプリケーションがAPIを使ってデバイスをスリープ状態へと遷移させることにより、システムの電力を大きく低減することができます。その後、特定のイベントを検出すると定常状態へと復帰します。

動作クロックの上限を管理する機能

SPRESENSE SDKの提供するAPIを使うことにより、SPRESENSEの動作クロックの上限を「High」または「Low」に設定可能です。本APIを活用することにより、消費電力と処理性能(レイテンシ)のバランスをダイナミックに調整することができます。

 SPRESENSE SDK Library|up_pm_acquire_freqlock

はじめての電力解析

続いて、消費電力を解析する方法について紹介いたします。

シャント抵抗(直列)を使って電力を計測する

SPRESENSEで開発する際には、開発用PCとSPRESENSEをUSBで結合し、USB-UARTを介して実行するプログラムを転送、USBバスパワー(約5V)により必要な電力を供給します。そのため、USBの給電ラインの電流値を計測することにより消費電力の算出が可能です。電力を計測するためのソリューションは数多くありますが、今回はUSBの給電ラインにシャント抵抗を直列接続し、シャント抵抗の両端の電圧値から電流値を算出、消費電力量を推定します。

 ROHM|シャント抵抗器(電流検出抵抗器)とは

なお、今回の計測には2種類のシャント抵抗「0.025Ω」「10Ω」を利用しました。

小さなシャント抵抗(0.025Ω)を利用する場面

大きな電力を必要とするデバイスの電力解析には、小さな抵抗値のシャント抵抗が適しています。小さなシャント抵抗を使うことにより、大電流が通過した場合でも電圧降下を小さく抑えられるため、実際の運用環境に近い条件で電力を解析できます。ただし、出力電圧の幅も狭くなるため精度の高い電圧計が必要となります。

大きなシャント抵抗(10Ω)を利用する場面

一方で、消費電力のわずかな変動を可視化するには、大きな抵抗値のシャント抵抗が適しています。微小な電流の変化を、広い振幅の電圧変化に変換できるため、消費電力の遷移を簡単に可視化できます。また、RCローパスフィルタ(後述)の時定数も大きくできることからノイズの除去にも高い効果を発揮します。

ローパスフィルタにより電源ノイズを除去する

USB電源など、他の回路に隣接していてノイズ(スパイク状の電流変動)が発生しやすい電力源を解析する場合、ノイズの除去が不可欠です。今回の計測では、直列シャント抵抗と電解コンデンサより構築したRCローパスフィルタで高周波成分を除去。電力解析に不可欠な本質的な消費電力の推移を計測します。

SPRESENSEと他のプラットフォームの消費電力

それでは、電力解析をはじめましょう。

まず、SPRESENSEの消費電力と、他のマルチコア・プラットフォームの消費電力を比較します。比較対象には、クラウドとの接続が簡単なことからIoT分野を中心に人気の高い「Raspberry Pi 3 Model B+(※1)」と、安価にAIを実行できる組み込み向けプラットフォーム「Jetson Nano(※2)」を選択しました。

※1:SPRESENSEが、LTEをはじめとするネットワーク通信機能を提供しているため、選択。
※2:SPRESENSEがDNNRTとしてDeep-Neural-Networkのモデルを実行できる機能を備えているため、選択。

USBの給電ラインに0.025Ωのシャント抵抗を直接接続し、定常状態における電流の最大値を計測した結果を図3に示します。Cortex-AシリーズのマルチコアCPUを搭載したのRaspberry Pi 3とJetson Nanoと、Cortex-MシリーズのマルチコアCPUから構成されたSPRESENSEを比較すると、SPRESENSEはわずか30分のの電力で駆動できることがわかります。

SPRESENSEのメインコアに加えて、1個のサブコアを起動し合計2コア構成とした場合でも必要とされる最大電流はわずか0.612mAです。そのためSPRESENSEは、電源ケーブルの敷設が困難な場所にバッテリーを電源として配置することや、排熱の難しい狭い空間や密閉空間への設置、持ち運びを前提としたウェアラブルデバイスへの採用が可能です。

図
図3:待機時電力の比較(シャント抵抗 0.025Ω で計測)

消費電力の推移、精密な電力解析

続いて、USBの給電ラインに測定器を接続し、電流の推移を計測、処理中の消費電力を解析した結果を紹介いたします。本計測ではノイズの影響を取り除くため、シャント抵抗10Ωと電解コンデンサ1000uFから構成されたRCローパスフィルタを利用しています。

POR(Power-On-Reset)後の消費電力の推移を解析する

まず、電源投入直後における消費電力の推移を解析した結果を図4に示します。SPRESENSEのmicro-USBコネクタにUSBケーブルを接続すると、SPRESENSEのPower-On-Reset(POR)が開始されます。PORでは、最初にSPRESENSEの核となるLSI(CXD5602/CXD5247)が起動しペリフェラルを初期化。これと並行して、USBの信号線(D+/D-)とCXD5602のUART通信を中継しているUSB-UARTブリッジデバイス(CP2102N-A01-GQFN24R)が起動します。

図
図4:POR直後の消費電力の推移(電源投入とUSB-UART変換ICの起動)

SPRESENSEのPORが完了し、UART通信の無い状態が一定時間続くと、USB-UARTブリッジは通信状態から超低消費電力となるリセット状態へと遷移します(図5、スタートアップのプログラムにNuttShellを選択した場合の例)。これによりSPRESENSEの核となるLSI(CXD5602/CXD5247)の消費電力を推定することができます。

図
図5:POR後、一定時間が経過するとUSB-UART変換ICがリセット状態へと遷移する

USB-UARTの消費電力は、製品化されたエッジには不要な電力

SPRESENSE Main BoardにはUSB-UARTブリッジとしてSilicon LabsのCP2102N-A01-GQFN24Rが搭載されています。エッジを開発している最中は、NuttShellでの操作をはじめ、デバッグ出力の表示などにUSB-UARTブリッジを利用しますが、開発が完了し製品化されたエッジがUSB-UARTブリッジを使うことはほぼありません。そのため、以降はUSB-UARTブリッジの消費する電力量(7.5mA相当)を除外し消費電力を考察します。

 Silicon Labs|USB-UARTブリッジ(CP2102N-A01-GQFN24R)

さらに不要なデバイスを除去する

SPRESENSEは、極限まで素子を除去、停止させることにより数百uAまで、電力を低減することができます(「SPRESENSE SDK開発ガイド|消費電力」より)。今回は電力計測に最も大きな影響を及ぼすUSB-UARTブリッジを除外対象として取り挙げましたが、他にも不要な素子がいくつかあります。一例を挙げると、給電中に常時点灯するPower LED(Blue)があります(図6)。SPRESENSEの開発情報はすべて公開されているため、仕様書を調査・検討することにより、誰にも頼ることなく自社の設計するシステムに最適な素子を選出可能です。

 GitHub|SPRESENSE Main Boardの回路図

図
図6:電源供給中に常時点灯するLEDの切断も、電力低減のポイント

電源ドメイン

続いて、SPRESENSEが提供する自動給電制御機能について紹介いたします。この機能は、利用していないハードウェアや電源ドメインへの給電を遮断し、消費電力を低減できる機能です(図2)。

図
図2(再掲):SPRESENSEは複数の電源ドメインから構成される

活性化状態のCPUとメモリタイルのみに電力が供給される

図7は、メインコア上でNuttShellが実行されている状態から、コマンドアプリケーションを起動し、SPRESENSE SDKが自動生成したASMPワーカーのプログラムを1個のサブコアが実行、ASMPワーカーの処理が完了するまでの消費電流の推移です。

前述の通りNuttShellを操作している間はUSB-UARTブリッジが115200bpsの通信を中継するため、7.5mAがUSB-UARTブリッジにより消費されます。そのため、メインコアとその周辺のハードウェアの消費電力は8.0mA×5V、サブコア1個の消費電力は2.5mA×5V(10.5mA-8.0mA)となります。サブコアは合計5個搭載されていますが(合計消費電力:2.5mA×5V×5個)、CPUコアへの給電を自動的に遮断する機能により電力が浪費されることはありません。

図
図7:1個のサブコアを利用開始・終了した際の消費電力の推移

非活性状態のドメインの消費電力を抑える

次に、利用されていない電源ドメインへの給電を自動的に遮断する機能の効果を紹介いたします。図8は、GNSSを使用していない状態(図7相当)と、GNSSにより位置情報を収集している状態の消費電力を比較したグラフです。GNSSドメインは位置情報・時刻情報の取得と算出を担当するハードウェアです。このグラフよりGNSSドメインの消費電力は9.5mAx5Vであることがわかります。

必要なタイミング(一定時間周期あるいはイベント契機)のみでGNSSを利用するようにプログラミングすることにより、GNSSを利用するアプリケーションであっても、ほとんどの時間において9.5mAx5Vの電力を低減することができます。

図
図8:GNSS機能の利用前/利用中の消費電力の推移

Cold-SleepとDeep-Sleep

スリープ機能は、エッジの消費電力を抑える方法の中で、最も効果的な機能です。SPRESENSEはスリープ機能として、汎用コンピュータのハイバネーションに相当する「Cold-Sleep」機能と、電源のON/OFFに相当する「Deep-Sleep」機能を提供しています。

Cold-Sleep

Cold-Sleepは、システムの状態を維持したまま消費電力を低減できる機能です(図9)。メインメモリの内容をSPIフラッシュメモリ(不揮発性ストレージ、SPRESENSE Main Board背面に搭載済)へバックアップした後、CPUとメモリへの給電を停止。トリガーイベントの発生後、SPIフラッシュメモリからメモリへ情報をリストアし、Cold-Sleep前の状態に復帰させます。今回はトリガーイベントの注入にRTC Clockを使用しました。

図
図9:Cold-Sleep機能はメモリ上の情報を失うことなく電力低減を達成できる

Cold-Sleepへ突入した/Cold-Sleepからの復帰した際の消費電力の遷移を図10に示します。

NuttShell (NSH) NuttX-7.22
nsh> alarm 10
# 10秒後にイベントを発生させる
nsh> poweroff --cold
# この間CPUはCold-Sleep状態
# alarmイベントが発生すると復帰する
NuttShell (NSH) NuttX-7.22
nsh>

図
図10:Cold-Sleep突入時/復帰時の消費電力の推移

製品化時に不要となるUSB-UARTブリッジの電力を除くと、Cold-Sleep機能により消費電力をわずか2.5mAx5Vまで抑えることができます。定常時(8.5mAx5V)と比較して、わずか約30%の電力で各種イベントの発生を待つことができます。なお、Cold-Sleep状態への遷移時はメモリの情報をSPIフラッシュメモリへバックアップすることから、コマンド実行直後に消費電力量が一時的に増加します(スパイク状になる)。

Deep-Sleep

Deep-Sleepは、汎用コンピュータのシャットダウン動作に相当します(NuttShellもshutdownという名前で状態遷移用のコマンドを提供しています)。Deep-Sleepからの復帰した後は、メモリ上のデータは消失し、POR直後に近い状態となります。Deep-Sleepへ突入した/Deep-Sleepからの復帰した際の消費電力の遷移を図11に示します(トリガーイベントの注入にはRTC Clockを使用)。

製品化時に不要となるUSB-UARTブリッジの電力を除くと、Cold-Sleep機能により消費電力をわずか2.5mAx5Vまで抑えることができます。また、メモリデータのバックアップ(SPIフラッシュメモリへの書き込み)処理が無いため、Cold-Sleepのようなスパイク状の電力消費も発生しません。

NuttShell (NSH) NuttX-7.22
nsh> alarm 10
# 10秒後にイベントを発生させる
nsh> shutdown
# この間CPUはDeep-Sleep状態
# alarmイベントが発生すると復帰する
NuttShell (NSH) NuttX-7.22
nsh>

図
図11:Deep-Sleep突入時/復帰時の消費電力の推移

まとめ

今回紹介した内容から、省電力化に寄与するハードウェア機能を搭載したデバイスを選択することにより「マルチコア・アーキテクチャであっても、低消費電力のシステムを構築できる」ことを確信できたかと思います。

消費電力の計測データと、電力低減機能の動作、自身が求めるシステムの特性を把握し、高速・多機能・低消費電力なシステムの設計・構築にご活用ください。

計測内容 消費電力(概算)
定常状態 8.0mAx5V = 40mW
1個のサブコアを使用 (8.0mA+2.5mA)x5V = 52.5mW
全サブコアを使用 (8.0mA+2.5mA×5個)x5V = 102.5mW
スリープ状態(RTC on) 2.5mAx5V = 12.5mW
Raspberry Pi 3の待機電力(参考) 530.24mAx5V = 2651.2mW