ブログ/こばさんの wakwak 山歩き Twitter

2017-02-28 ESP32 電池(NiMH×2)で動かすときは 40MHz でコンパイルせよ

ESP32 電池(NiMH×2)で動かすときは 40MHz でコンパイルせよ

| ESP32 電池(NiMH×2)で動かすときは 40MHz でコンパイルせよを含むブックマーク

 先に断っておきますが、今回の Tips は私の発見じゃなくて、Keynee さんから伝授して頂いた技 です。


 人様の手柄を自分のことのように書くのは忍びないのですが、ESP32 で遊ぼうとしている人、全員に知らしめないといけないという使命感が沸いてきましたため、公益!?のため恥を忍んで記事にさせて頂く次第であります。

※アフェリエイトなし、(今年になって)広告も排除したブログなので許してください!


 電池でテスト(最初の実験その続き)を通して、公称電源電圧 2.2V〜 は嘘くさい、みたいなニュアンス気味に書いてしまったのですが、それは使い方を極めていなかっただけでした。


http://dl.ftrans.etr.jp/?2812c4dbd5334af4924830d1be9fc9516b4eecf3.png


 電池2本で運用の方は、40MHz でコンパイルしましょう!


Keyneeさん曰く

自分のところでは、Flash Frequency=40MHzにすれば 2.05VまでSNTPサンプルが動きましたよ。

SPI FlashからのReadはこの電圧が下限っぽいです。

キャッシュ内で動作できるようなプログラムなら、2.05V以上で起動後1.55Vまで電圧落としてもHaltせずに動作し続けます。

 NiMH の終止電圧は 1V(2本で2V)ほどなので、1.55V まで搾り取る必要もなく、とりあえず 2V まで粘ることが出来れば文句の一つも出ないというものです!!


http://dl.ftrans.etr.jp/?04bda2d9249847bcbd273d3daa513985f8c4d8e0.png

 充電し切れていない NiMH×2 を使ってテストしてみた結果が左です。


 1.93V(就寝していて実測はしてないが、たぶん2.00〜2.05V くらいと思われ)付近からシリアル出力も怪しくなり、1.90V を割り込んだところでフリーズ


 1秒おきに電圧値を出力させていたのですが、2.00→1.93V の変化は1分もかかってません。


 成り行き任せに挙動不審のまま終わせると Deep Sleep が効かず大電流のままとなるので

 if(voltage < 2.00)    // 40MHz
  {
    Serial.println("good night!");
//  必要に応じて
//  esp_deep_sleep_enable_timer_wakeup(30 * 60 * 1000 * 1000);
    esp_deep_sleep_start();
  }

という風で、制御できるうちに hibernation mode を発動させて、4μAモードに移行させたほうが安心かと思います。


 80MHz と比較して低電圧域の粘りが凄い 40MHz ですが、普段の消費電力も下がるのか?と気になりますが、電測してシリアル出力するだけのショボいサンプルだからかもしれませんけど

40MHz80MHz
http://dl.ftrans.etr.jp/?40f7453ae17c42e2b534e52a6a7042c2468ded1e.jpghttp://dl.ftrans.etr.jp/?092279442be6433a97012f999bd9306e08dc9225.jpg

 有為な違いはなし、という結論になりました。

(どちらの場合でも数値は動くんですが、1分ほど眺めた感じでは、80MHz のほうが精々 +0.5mA までかな?って程度)


 このクロックは外付けメモリーとのバスクロックで、読み書きが遅くなるだけで処理速度に影響するわけじゃないと思うので、積極的に 40MHz を使っていっていいと思います。


 では次回こそ、「自発的な再起動を諦める」 ことで得られる 1μA に満たない究極の過放電防止策を。。


(追記)2017/03/02

 究極の過放電防止策を記事にしました。

 ESP32 電源電圧を自己測定して過放電防止 (後編) をどうぞ

keyneekeynee 2017/03/01 21:08 ブロガーじゃないんで人様のところでコメントしています。
検証してどんどん手柄にしちゃってくださいませw

ADCの非線形の問題はあちらでも認識しているようですので、そのうちソフト的に補正されるはずです。
確認してみましたが、アッテネータ11dBで入力2.6Vを超えると非線形ですね。それと0.15V程のオフセットもありました。

ところで、この程度のプログラムではSPI Flashからの読込は起動時だけですし、SPI Flash通信CLKの違いは消費電流にはまず影響しないですよ。現状 Dual SPI で動作しているものが Quad SPIで動作できるようになれば、これによるクロック数の減少により多少は影響ありそうな気はします。念を押します。気がするだけです。当然、CPU Clockを下げれば瞬間的な消費電流は下がります。

ついでに、今回の経緯を述べておきます。
SPI Flash は Gigadevice GD25Q32 とのことでデータシートを見ると動作電圧2.7V〜3.6Vなんです。
そうすると、ESP-WROOM-32の動作電圧は2.7V〜3.6Vと表記するのが本当は正しいのでは???

机上のデータだけで考えていると2.2Vで本当に動くの??? なんて疑問がわいてくるわけです。
単なる好奇心です。
esptool.py や make menuconfig によると SPI Flashの通信CLKを20MHz, 26MHz, 40MHz, 80MHzと指定できることがわかります。また、これらの情報はバイナリファイルのヘッダに記述されることがソースコードなどからわかります。
通信CLKを指定できる。。。ふむふむ。
規格外の低電圧なら通信CLKを下げれば動作マージン的には有利です。
蓋あけて中の端子をあたればいいんですけど、1個しか持っていないものを開けるわけにもいかず…。
幸い、SPI Flashに直結している信号が外にでています。SD2, SD3などの電圧からVDD_SDIOが推測できるので計測すると、電源電圧に従います。IO12をプルアップすると確かに1.8Vなのもわかります。
Dual SPIで動作しているので、SD0, SD1, CMD, CLKの4端子をロジアナで見れば色々見えてきます。
"flash read err, 1000" の理由なんかもわかります。bootloaderの読込に限ってはヘッダ情報に関わらず標準SPIの10MHzで動作しているなんてこともわかります。

それと、忘れないうちに連絡です。
esp_deep_sleep_pd_configでESP_PD_DOMAIN_MAXを指定していたかと思いますが、これは全く意味がありません。要素数を示すenum値だからです。

長々失礼しました。では。