概要
ESP32は3.6Vから3.0Vぐらいまでの電源電圧で動作をすると思いますが、どれぐらいの電源が供給されているのかをトリッキーな方法で取得してみました。
接続
GPIO | 接続先 |
---|---|
5 | GPIO6と接続 |
6 | GPIO5と接続 |
ESP32-S3のPIN番号ですが、5と6をジャンパケーブル等で接続しておきます。
ESP32の電源電圧取得スケッチ例
uint8_t pinOut = 6;
uint8_t pinAdc = 5;
void setup(void) {
Serial.begin(115200);
// GPIO6をプルアップ、プルダウン設定 供給電圧/2を出力
pinMode(pinOut, INPUT|PULLUP|PULLDOWN);
}
void loop(void) {
delay(1000);
Serial.printf("%3d\n", analogRead(pinAdc));
}
GPIO6をプルアップとプルダウン設定にして、測定用の電圧を作っています。プルアップすることで供給電圧がそのまま出力されます。同時にプルダウンをすることで、電圧が半分に落ちます。3.3Vを供給した場合には1.65Vぐらいが出力されます。
GPIO5はADCで電圧を測定しています。そのままだと取得できないので、外部でGPIO6とGPIO5をジャンパケーブルなどで接続しておきます。
実験
#include <M5Unified.h>
uint8_t pinOut = 6;
uint8_t pinAdc = 5;
void setup(void) {
auto cfg = M5.config();
M5.begin(cfg);
M5.delay(500); // Serial出力用のウエイト
// 画面上にログを表示する
M5.setLogDisplayIndex(0);
M5.Display.setTextScroll(true);
pinMode(pinOut, INPUT | PULLUP | PULLDOWN);
}
void loop(void) {
M5.delay(1000);
M5.update();
M5.Log.printf("%3d\n", analogRead(pinAdc));
}
実はさっきのスケッチだとUSB経由でシリアル出力を確認しようとするとUSBケーブル経由で給電されてしまうので実験できません。
黄色基板やM5Stack AtomS3などの液晶付きでバッテリー無しの機材を利用して外部から電源だけを接続するのがわかりやすいです。
上記で実験をすると手元だと3.3V供給で1800ぐらいのADC値になり、3.0Vに下げると1600ぐらいまでたしか下がりました。いろいろな要素がからむので個体差が大きいと思いますので注意してください。

ESP32は供給電圧をADCの基準電圧に利用するのではなく、内蔵LDOで1.1Vなどに落とされています。ただし、その基準電圧も若干個体差があるのでキャリブレーションされているはずです。プルアップとプルダウンの抵抗値もスペック上は同じですが個体差があるはずです。
そして実際に電圧を測定する場合には、減衰器を使って入力電圧を下げてから測定をしています。通常は11dbで減衰させて、1V以下にしてから測定をしているようです。減衰器にも個体差があると思います。
上記で内部の動きを確認しています。個体差がありますが3.13VでADCは最大値になってしまいましたので、今回プルアップとプルダウンを同時に実行することで1.65Vぐらいの中間値を作り出しています。
また、バッテリー駆動の場合にはバッテリー直結ではなくて3.3V出力のLDOを間にいれているはずです。そのためバッテリー電圧は取得できません。あくまでESP32に供給されている電圧を測定しています。バッテリー電圧が下がってLDOから出力される電圧が3.3Vを下回ったかは測定できると思います。
まとめ
ほんとうはアナログ入力のままプルアップとプルダウンを設定して読み出すことで未使用のGPIOを1つ使うだけで計測できるはずです。
ただし、analogRead()を使うと毎回pinMode()を内部で実行する動きになっており、プルアップとプルダウンを維持できませんでした。そして昔調べた1.0.6のときにはプルアップとプルダウンは排他指定だったのですが、2.0.0以降だと同時設定可能になっていました。
あとanalogRead()のかわりにESP-IDFのadc関数を直接呼び出そうと思ったのですが、もうすぐリリースされる3.0.0をみたところ、ガラリと呼び出し方が変わっているので3.0.0が出たら検証し直したいと思います。Arduino経由で呼び出す分には影響範囲が少なそうですが、その中身はがらっと変わっていました。ESP-IDFを直接利用している場合にはバージョンアップの影響が大きそうですね。
コメント