マイクロコントローラの超低電力(ULP)モード:スリープモードでエネルギーを節約


APDahlen Applications Engineer

超低電力(ULP)とは?

超低電力(ULP)とは、省エネのハードウェアおよびソフトウェア技術を網羅する包括的な用語です。主な目的は、リアルタイムシステムの制約を満たしながら、マイクロコントローラのエネルギー消費を可能な限り削減することです。

極端な例としては、血糖値測定器のようなバッテリ駆動の機器があります。この技術の驚くべき点は、コイン電池で動いていることです。リアルタイムクロック(RTC)を維持するために、ごくわずかなエネルギー消費でスリープ状態になっています。メインのマイクロコントローラは、ユーザーの入力に応じて起動し、測定を実行し、表示を更新し、あるいはPCと接続してデータをダウンロードします。

図1で示したSTM32L562CEU6のような強力で高度な設定が可能なプロセッサが利用可能になったことで、ULPはますます重要性を増しています。

マイクロコントローラの性能が重要であるのと同様に、ULPはその名が示すとおり、エネルギー消費とバッテリ寿命が重要であることを意味します

図1: STM32F767ZIT6 Cortex-M7を搭載したSTM32F767 Nucleo-144ボードの画像

技術的なヒント: スリープ電流とプロセッサの複雑さには反比例の関係があるようです。主役のCortex M7は非常に複雑なデバイスです。経験則では、性能が1/100の小型8ビットプロセッサは、スリープ電流が1/10になります。 しかし例外もあり、頭の良いエンジニアは常に技術を改良しています。現在、ミッドレンジの32ビットマイクロコントローラの中には、8ビットマイクロコントローラと同等のものもあります。 その一例が、オールオフで消費電流が17nAのSTM32L562CEU6シリーズです。

ULPにはどのようなハードウェアが使用されますか?

論理ゲートのエネルギー消費は、そのゲートが動作する速度にしばしば支配されることを思い出してください。 マイクロコントローラは論理ゲートの集合体であるため、エネルギー消費はクロック速度に直接関係します。例として、最新の32ビットARMプロセッサは、コアが216MHzでフル稼働している場合、かなりの電力を消費します。 32.768kHzの RTC周波数に切り替えると、同じコアが低温で動作します。さらに低消費電力を実現するには、メインCPUをオフにし、機能を周辺回路にシフトします。 専用の32.768kHz RTC周辺回路は良い例です。他の例としては、ウォッチドッグタイマ、ウェイクアップオンチェンジ割り込み、ダイレクトメモリアクセス(DMA)などがあります。

技術的なヒント: 消費電流は多くの場合、uA/MHz という指標で表されます。 これは、消費電流とクロック速度が関連しているという考え方を補強するものです。プロセッサをオーバークロックで使用したことがある方はご存知でしょう。クロック速度が上がれば上がるほど、発熱が大きくなり、プロセッサを損傷する可能性があります。

実際の例としては、図1に示すように、STMicroelectronicsのSTM32F767ZIT6が挙げられます。 すべての 周辺回路を有効にした状態で、高温において216MHzで動作させると、電流は258mAに増加します。しかし、RTC以外をすべてオフにしたディープスリープ状態では、電流は 770nA と低くなります(周囲温度 25 °C、1.7V DC電源の場合)。

技術的なヒント: スリープモードは単なるオン/オフスイッチではありません。 実際の条件は、チップ上の周辺回路の数だけ変化します。例えば、今回とりあげたSTM32F767ZIT6のデータシートでは、さまざまなモードを説明するために、12ページ以上を費やしています。

ULPにはどのようなソフトウェアが使用されますか?

クロック速度の変更と未使用の周辺回路の停止はULPの重要な部分です。 しかし、これらの操作は自動ではありません。真のULPのためには、ハードウェアをプログラマーが管理する必要があります。 そのためには、パフォーマンスとエネルギー消費の適切なバランスを見つけるために、アプリケーションにかなりの注意を払う必要があります。

割り込みサービスルーチンでエネルギーを節約

割り込みサービスルーチン(ISR)を使用して、ボタン押下やハードウェアタイマのオーバーフローなどの実際のイベントに応答することで、エネルギー消費を最小限に抑えることができます。各ISRはイベントによってトリガされ、コードの小さなセクションが実行され、マイクロコントローラはその後スリープに戻ります。極端な例を挙げると、コードは次のようになります。


// My ISRs

main(){
    // Setup
   while(1){
      goToSleep();
   }
}

実際には、プログラムはこの抜粋コードよりも複雑になるでしょう。しかし、私たちの目的はなお、スリープ時間を最大化することです。

クロック速度を下げてエネルギーを節約

ほとんどのマイクロコントローラは、実行中に変更できる、強力なクロック選択ロジックを備えています。作業負荷に合わせてクロック速度を調整することで、エネルギーを節約できます。高速クロックが必要な場合もあれば、ウォッチドッグやRTCで十分な場合もあります。

コードの簡素化でエネルギーを節約

個人的には、コードを簡単にするためにすべてをダブル型にしたくなりますが、浮動小数点演算のオーバーヘッドは保証されないので、そうすべきでないことは明らかです。メモリとの間で不要なビットをシャッフルするのに必要なオーバーヘッドもありません。

その代わり、32ビットマシンにはuint32_t、8ビットマシンにはuint8_tと、可能な限りマイクロコントローラのアトミック幅を使うべきです。

また、あったらいい計算と必要な計算のバランスも考慮する必要があります。これはよくあるデバッグの中間生成物で、中間計算と最終計算はすべて、将来必要になった場合に備えてきちんと保存されています。あったらいい計算や後処理を省くことで、エネルギーを節約できるかもしれません。

慎重にこの言葉を送ります - 「賢くなり過ぎないように」。コードの簡素化は行き過ぎると、プログラムの理解やトラブルシューティングが困難になります。極端な例は、アセンブラの使用です。

不必要な周辺回路をオフにしてエネルギーを節約

これは簡単なアイデアです。部屋を出るときに電気を消すように、周辺回路も使わないときは電源を切りましょう。プログラミングの技巧は必要ですが、ISRウェイクアップでレシーバを低消費電力モードにするような小さなことは、単にRXセクションとTXセクションをオンにするよりも好ましいことです。

おわりに

この記事は、マイクロコントローラのエネルギー消費削減に関しては、大海の一滴にすぎません。このトピックについては書籍も出版されています。

このトピックについてもっと話を続けましょう。ご意見、ご感想は下の欄にご記入ください。

ご健闘をお祈りします。

APDahlen

関連情報

以下のリンクから、関連情報や参考情報をご覧ください。

著者について

Aaron Dahlen氏、LCDR USCG(退役)は、DigiKeyでアプリケーションエンジニアを務めています。彼は、技術者およびエンジニアとしての27年間の軍役を通じて構築されたユニークなエレクトロニクスおよびオートメーションのベースを持っており、これは12年間教壇に立ったことによってさらに強化されました(経験と知識の融合)。ミネソタ州立大学Mankato校でMSEEの学位を取得したDahlen氏は、ABET認定EEプログラムで教鞭をとり、EETプログラムのプログラムコーディネーターを務め、軍の電子技術者にコンポーネントレベルの修理を教えてきました。彼はミネソタ州北部の自宅に戻り、このような記事のリサーチや執筆を楽しんでいます。




オリジナル・ソース(English)