ESP32 ADC特性の補正を試す
ESP32のADCは何か使いづらい
ESP32のADCにセンサーなどからのアナログ値を入力する際、入力値に比例した変換値が得られない場合があり、扱いづらいという印象がありました。そこでこれを改善する方法を考えようと思い、まずはADCの入出力特性を把握するところからはじめました。
ESP32のADCの入出力特性
手元にESP32の初期バージョン(ESP-WROOM-32)の載ったトラ技付録のIoT Expressボードがあったので、これを使って実験しました。入力電圧を変化させた時のADCの変換値をグラフにしてみました(グラフ1:全体、グラフ2:入力電圧の低い部分の拡大)。入力電圧が小さい間は常に130mV前後の変換値となり、150mV以下の入力電圧を正しく変換できないようです。電池駆動機器の電池電圧の監視などの用途では、直線性の良い部分だけを使うことができるのでよいのですが、0Vから出力値が変化するセンサーの電圧などはそのままでは使えないようです。
試した補正方法
そこで、入力電圧をOPアンプを使用した加算回路でシフトさせ、150mV以上の直線性が良い部分で変換する方法を考えました。ADCで測定値を得た後にシフト分を演算で差し引けば元の入力電圧が得られるはずです。
試した加算回路を図1に示します。OPアンプは単電源、レールトゥレール動作が可能なNJM2746Mを使用しました。ここでは余裕を見て200mV入力電圧をシフトさせ、ADCの直線性のよい部分で変換できるようにしています。
実験環境を写真1に示します。左のDMMが入力電圧、右のDMMが加算回路でシフトした後の電圧(mV)を表示しています。また、上側のボリュームでシフトする電圧(200mV)を設定し、下側のボリュームで入力電圧(0V~)を変化させます。シフト後の電圧はESP32のADC(IO15)に入力しています。
一方、ESP32に書き込むスケッチでは、測定値から200mV分を差し引いています。
補正結果
入力電圧に対する表示値の変化をグラフ(グラフ3:全体、グラフ4:入力電圧の低い部分の拡大)に示します。橙色のグラフが上記方法による補正結果です。紺色のグラフは補正前のものです。200mVシフトしたため変換可能な上限は200mVほど低くなりますが、課題であった0~150mVの範囲の入力電圧については、入力電圧に比例した変換値が得られています。変換精度についてはOPアンプの特性などに左右されますが、それ程の精度を要求されない応用では安価なOPアンプ1つを加えることで0Vからの測定ができそうなことが分かりました。