ESP32-C3のLightSleepで超低消費電力を実現する(という夢を見た)

マイコン/Arduino

これまでESP32-C3の電池による長時間駆動の取り組みを行ってきました。その第4回目です。

今回は消費電力の削減に必須となるマイコンのSleep動作の検証を行いました。

DeepSleepとLightSleep

これまでの検証では、待機中の消費電力が最も小さくなるDeepSleepを用いてきました。
マイコン単体としてはDeepSleep時の消費電流は5μAです。周辺機器の電力消費もあるため実運用でこの値となるわけではありませんが非常に小さな値です。

ESP32にはもう1つのSleepモードが用意されていて(*)、それがLightSleepです。LightSleepの待機時の電流はデータシートによると130μAとなっており、DeepSleepと比較すると非常に大きな値です。

しかしながら、場合によってはDeepSleepよりもLightSleepの方が総合的な消費電力が小さくなる可能性があるのです。その理由を見ていきましょう。


*この他にも通信関係の電力のみをカットするModemSleepなどもあります。

LightSleepの方が低消費電力?

DeepSleepはマイコンの動作をほぼ止めてしまい、復帰時には通常起動と同じように初期化動作から開始されます。

一方、LightSleep時にはマイコンの動作自体はほぼ止まるものの、メモリ内容は保持されたままでありプログラムはSleepさせたところから復帰します。

初期化動作が入るかどうかが大きな違いとなるわけですが、この初期化動作にはプログラムに明示されているもの(例えばGPIO.setmodeなど)以外にもマイコンの内部的な処理(クロックの安定化待ち時間、フラッシュの読み込み、ブートローダーの処理など)も含まれるようです。

そして、これらの初期化動作が意外と馬鹿にならないようなのです。

ESP32-C3のDeepSleepからの復帰時間

次の図はESP32-C3の電源ラインに0.1オームの抵抗を直列に接続し、その両端の電圧をオシロスコープで観察した結果です。要するに電流波形を観察したものです。ESP32-C3のDeepSleepからの復帰

プログラムは前回の記事で紹介した、BLEでデータをアドバタイズするものを使用しました。DeepSleepを使用した15秒の間欠動作をしています。

BLEのアドバタイズ継続時間は200msecに設定していますが、マイコンが動作している時間は500msec程度になっています。プログラム後半の、ピークが何本か立っている部分が通信時の波形です。

つまり、実際に必要な消費電力の約2倍もの無駄な電力を食っている可能性があるわけです。

DeepSleep時の消費電流は実測で10μA程度ですが、平均化した電流は3~4mAでしたので消費電力に支配的な影響を及ぼしているのは起動中の消費電力です。

Sleep時の消費電流が10倍になったとしても、起動中の消費電流を削減できた方がが総合的にはお得なはずです。

LightSleepからの復帰時間

プログラムをDeepSleepからLightSleepを使用するように変更し、先ほどと同様に電源ラインに流れる電流を観察した結果が次の図です。

ESP32-C3のLightSleepからの復帰

 

マイコンの起動時間はBLEのアドバタイズ時間の200msecとほぼ一致しています。つまり、LightSleepからの復帰の場合には初期化の時間がほとんどかからないということがわかりました。逆に言えば、DeepSleepからの復帰の場合、マイコンの初期化によって300msecかかっていたということになります。(*)

これで、マイコン起動時の消費電力は半分以下にできそうです。LightSleepを使用していますので、Sleep待機時の消費電力は10倍以上になるはずですが、それでも0.1mA程度です。
総合的な消費電流である3~4mAに比べれば影響は小さく、起動時の消費電力削減効果の方が勝ります。


*初期化のどの部分が支配的な影響を及ぼしているのかは調べ切れていません。
ざっと調べた感じではBLEの初期化シーケンスの部分が最も時間がかかっているようでした。

実験/結果

LightSleepを使用して実際に駆動実験を行ってみました。
DeepSleepでの実験と同様に、15秒間隔の間欠動作で、アドバタイズ時間は200msecです。

その結果、駆動時間は178.6時間で平均消費電流は10.1mAでした。

これは、ほぼ同様の条件でDeepSleepを使った場合(503.7時間、3.57mA)よりも悪化してしまいました。

まとめ

いろいろと調べてみると、BLEスタック動作中はLightSleepでも公称の130μAではなく、もっと多くの電力を消費するようです。

実際にLightSleep中の電流値を測定したところ、数mA~数十mAの電力を消費していることが確認できました。

2倍程度の駆動時間を見込んでいたのですが、今回の試みは失敗ということで。残念。

コメント