ESP32のスリープ時の設定を調べた

esp_sleep_pd_config()での省電力設定まわりを調べました。現時点の情報ですので最新情報はM5StickC非公式日本語リファレンスを確認してください。

概要

スリープ時にタイマーやタッチなど複数のウェイクアップソースを指定できますが、指定したソースに応じて電源管理のオプションが異なっています。

初期値の調査と、各オプションの詳細を調べてみました。

初期値

esp_sleep_pd_config(ESP_PD_DOMAIN_RTC_PERIPH  , ESP_PD_OPTION_AUTO);
esp_sleep_pd_config(ESP_PD_DOMAIN_RTC_SLOW_MEM, ESP_PD_OPTION_AUTO);
esp_sleep_pd_config(ESP_PD_DOMAIN_RTC_FAST_MEM, ESP_PD_OPTION_AUTO);
esp_sleep_pd_config(ESP_PD_DOMAIN_XTAL        , ESP_PD_OPTION_OFF);

上記が初期値です。XTALは初期値が設定されていなかったので、NO扱いになっているはずです。

つまり全部AUTOですので、ウェイクアップソースによってONかOFFが決められています。

ソース別初期値

PERIPHSLOWFASTXTALMAX
初期値AUTOAUTOAUTOOFFX
TIMEROFFONONOFFX
TOUCHOFFONONOFFX
EXT0ONONONOFFX
EXT1OFFONONOFFX
ULPOFFONONOFFX
GPIOONONONOFFX
UARTOFFONONOFFX

EXT0とGPIOだけPERIPHがONで、それ以外はOFFになっています。

ESP_PD_DOMAIN_MAXはenumの最大値を確認するための宣言なので、実際に指定すると範囲外エラーになります。

ESP_PD_DOMAIN_RTC_PERIPH

周辺機器への電源供給を制御します。digitalWrite()などで、HIGHの出力を継続する場合などはONにする必要があります。 EXT0とGPIOを利用する場合にはONになりますが、それ以外の復帰をする場合にはOFFになります。

ただし、OFFにしてもULPが動いている間は一時的にONになり、ULPが停止するとOFFに戻ります。

同じくタッチセンサーを利用している場合にも、タッチタイマーが定期的に動いており、タッチ情報を取得しているごく短い時間だけONになり、すぐにOFFに戻ります。

ESP_PD_DOMAIN_RTC_SLOW_MEM

ULPやディープスリープから復帰した場合に保持しておくメモリ領域への電源供給を制御します。 OFFにするとRTC_DATA_ATTR指定された変数や、RTC_SLOW_MEM[]変数の値がおかしくなります。

またULPを指定した場合にOFFにするとULP自体が動きません。

ESP_PD_DOMAIN_RTC_FAST_MEM

ブートに関係するメモリですが、フラッシュメモリの初期化が遅い場合などに遅延を入れるコードなどが入っているようです。 OFFにしても、他に影響を与えない場合もありますが、環境によってはフラッシュメモリのエラーが発生して起動が失敗します。

ESP_PD_DOMAIN_XTAL

水晶振動子への電源供給を制御します。通常OFFで動いており、どんな場合にONにするのかがわかりませんでした。

まとめ

下記設定で、ディープスリープするのが一番省電力ですが、FAST_MEMをOFFにしているため、初期化が遅いフラッシュメモリを搭載していると復帰時にエラーになります。

とはいえ、日本で使えるESP32の場合はフラッシュメモリもパッケージングされているので、OFFにしても問題が起こることはないような気もします。

esp_sleep_pd_config(ESP_PD_DOMAIN_RTC_PERIPH  , ESP_PD_OPTION_OFF);
esp_sleep_pd_config(ESP_PD_DOMAIN_RTC_SLOW_MEM, ESP_PD_OPTION_OFF);
esp_sleep_pd_config(ESP_PD_DOMAIN_RTC_FAST_MEM, ESP_PD_OPTION_OFF);

ちょっとこの辺は環境と、使っているライブラリのバージョンで動きが変わるようですので、実際に使う環境で試してみるのがいいと思います。

コメント