ESP32のアナログ入力回路の改良、オフセットのキャンセル
2020年09月14日11:52
ESP8266, ESP32
◆まえがき
ESP32のアナログ入力特性について調べてきましたが、その中で一番いやらしいのが、入力感度特性でゼロボルト付近のオフセット(不感帯)が大きいという問題です。何しろフルスケールに対して8%もの不感帯があるのはいただけません。ESP32を使ってオシロを作りたいと思っているのですが、こんなに不感帯があったのでは作る気がしません。
・ESP32搭載モジュール、DEVKITV2

この問題に対する簡単な対策として、内蔵されているDAコンバーターを使ってオフセットをキャンセルする方法が考えられます。そのために、DAコンバーターの特性について調べたのですが、DAコンバーターにも大きめのオフセット電圧があるものの、ADコンバーターの補正に使うのに大きな問題は無さそうな感じでした。なお、キャンセルの考え方は、その記事の最初の方に書いておきました。
ということで、いよいよ実際のオフセットのキャンセルを行ってみました。なお、最終的にはESP32で作るオシロの入力回路として使うことを考えているので、回路もそういう使い方を意識したものになっています。
なお、オシロではADコンバーターの入力感度は5Vと50Vレンジの2つを使います(これ以外の感度はソフト的に刻んでいます)。ということで、この二つのレンジで補正の効果を確認していきます
◆テストプログラム
必要な部分のコメントアウトを適宜外して使います。
20200912_ESP32AdcTest.txt
◆5Vレンジの場合
・5Vレンジ補正無しの回路図 (Fig-A)

何も補正しない場合の回路です。INが入力端子で、ここから入った電圧はR1とR2で分圧してADCに入力しています。ADコンバーターはフルスケール約1.4V(アッテネーター -2.5dB)で使うので、抵抗で分圧しているだけです。ちなみにATmega328P (Arduino UNO)で作ったオシロはこの回路を使っています。
・特性 (Fig-A)

入力感度特性です。5Vレンジと言っても余裕を持たせて7Vくらいまで入力可能になっています。ここで問題はグラフの左下の部分で、入力電圧が0.4V以上無いと出力が変化していません。これが冒頭に書いた不感帯で、何度も書きますがこれでは小さな電圧の検出が出来ません。
・対策回路 (Fig-B)

分圧抵抗R2の下側をDACに接続し、ADコンバーターのオフセットをキャンセルすることを狙っています。ESP32のD25ピンからDAコンバーターの電圧を取り出し、R2経由でバイアスを与えています。
・特性(2V付近まで) (Fig-B)

DACの設定値を0から3まで変えた場合の感度特性です。狙い通りグラフが上にシフトしてオフセットの補正がうまく行っていることを示しています。ちなみにDACは設定値がゼロでも出力電圧は80mVあり、その上に設定値に対して3.3*X / 256 の電圧が乗ってきます。具体的には設定値1に対して12.9mV加算した値が出力されます。
・特性(ゼロ付近拡大) (Fig-B)

DACの設定値が2、つまり実際の補正電圧 = 80 + 2*12.9 = 105.8mV 付近でADコンバーターのオフセット(不感帯)をほぼキャンセルすることが出来ています。
◆50Vレンジ
5Vレンジは上のやり方でいけそうなので、今度は50Vレンジです。
・従来の50Vレンジの回路図 (Fig-C)

これは元の回路で、分圧抵抗のR2(120kΩ)はGNDに接続されていて、もう一つR3(12kΩ)をパラに接続することで分圧比を上げるようになっています。なお、ATmega328P(Arduino UNO )にはオープンドレイン出力は無いのでデジタル出力のLOWを使っています。
・特性 (Fig-C)

これはゼロボルト付近を見たグラフです。入力電圧が6V以上無いとADコンバーターが反応していません。アッテネーターが入るので、Fig-Aの特性が拡大されるためにこういうことになります。ともかくこれでは6V以下の電圧は検出出来ないので困ります。
注:このグラフはちょっと変かも知れません。再測定したほうが良いのですが面倒なのでこのまま放置します。たぶん傾向は合っているはずです。
・対策回路 (Fig-D)

オフセットをキャンセルするために、R3(12kΩ)の下側に別のDACを接続する手もあるのですが、もったいないのでR2側のDACの出力電圧を上げることで補正することにしました。R3はオープンドレインでGNDに接続されているので、入力に対する補正電圧はR2とR3で分圧された値になります。
・特性 (Fig-D)

狙い通りDACの設定値を増加させるとオフセットが補正されていきます。DACの設定値=68で、オフセット(不感帯)をキャンセルすることが出来ています。
◆まとめ
ESP32を使ったオシロ作りに必要なADコンバーターのオフセット補正回路の動作確認を行いました。今回の考え方で補正を行えばうまく行きそうです。この補正方法はオシロに限らずセンサー応用の回路などでも使えると思います。
なお、この補正方法には以下のような重大な問題点があるのでここに明記しておきます。それは、
1)入力ピンに残留電圧が発生
オフセット補正電圧はR1を通して入力端子に現れてしまいます。つまり、入力残留電圧が約0.11V発生します。入力電流で言うと、0.22μAの流れ出しがあります。微小な電位変化が問題になる回路には使えません。
2)信号源のインピーダンスによってオフセット量が変化
Fig-Bで説明すると、DACの出力電圧は約0.11Vですが、その電圧はR1を通して入力端子に出ています。もし信号電の入力インピーダンスがゼロだったら、オフセットの補正電圧はR1とR2で分圧されてしまうので少し小さな値となってしまいます。
これらが問題になるなら正負電源を使ったオペアンプを使えば解決出来ますが、回路が大幅にややこしくなります。
こういう問題はありますが、信号源のインピーダンスが変化しない場合(普通の回路なら変化しないことが多い)には問題にはならないと思います。
良い機会なのでAC測定の場合の入力回路についても整理しておきたいと思いますが、長くなったので次の記事にまわします。
ESP32のアナログ入力特性について調べてきましたが、その中で一番いやらしいのが、入力感度特性でゼロボルト付近のオフセット(不感帯)が大きいという問題です。何しろフルスケールに対して8%もの不感帯があるのはいただけません。ESP32を使ってオシロを作りたいと思っているのですが、こんなに不感帯があったのでは作る気がしません。
・ESP32搭載モジュール、DEVKITV2

この問題に対する簡単な対策として、内蔵されているDAコンバーターを使ってオフセットをキャンセルする方法が考えられます。そのために、DAコンバーターの特性について調べたのですが、DAコンバーターにも大きめのオフセット電圧があるものの、ADコンバーターの補正に使うのに大きな問題は無さそうな感じでした。なお、キャンセルの考え方は、その記事の最初の方に書いておきました。
ということで、いよいよ実際のオフセットのキャンセルを行ってみました。なお、最終的にはESP32で作るオシロの入力回路として使うことを考えているので、回路もそういう使い方を意識したものになっています。
なお、オシロではADコンバーターの入力感度は5Vと50Vレンジの2つを使います(これ以外の感度はソフト的に刻んでいます)。ということで、この二つのレンジで補正の効果を確認していきます
◆テストプログラム
必要な部分のコメントアウトを適宜外して使います。
20200912_ESP32AdcTest.txt
◆5Vレンジの場合
・5Vレンジ補正無しの回路図 (Fig-A)

何も補正しない場合の回路です。INが入力端子で、ここから入った電圧はR1とR2で分圧してADCに入力しています。ADコンバーターはフルスケール約1.4V(アッテネーター -2.5dB)で使うので、抵抗で分圧しているだけです。ちなみにATmega328P (Arduino UNO)で作ったオシロはこの回路を使っています。
・特性 (Fig-A)

入力感度特性です。5Vレンジと言っても余裕を持たせて7Vくらいまで入力可能になっています。ここで問題はグラフの左下の部分で、入力電圧が0.4V以上無いと出力が変化していません。これが冒頭に書いた不感帯で、何度も書きますがこれでは小さな電圧の検出が出来ません。
・対策回路 (Fig-B)

分圧抵抗R2の下側をDACに接続し、ADコンバーターのオフセットをキャンセルすることを狙っています。ESP32のD25ピンからDAコンバーターの電圧を取り出し、R2経由でバイアスを与えています。
・特性(2V付近まで) (Fig-B)

DACの設定値を0から3まで変えた場合の感度特性です。狙い通りグラフが上にシフトしてオフセットの補正がうまく行っていることを示しています。ちなみにDACは設定値がゼロでも出力電圧は80mVあり、その上に設定値に対して3.3*X / 256 の電圧が乗ってきます。具体的には設定値1に対して12.9mV加算した値が出力されます。
・特性(ゼロ付近拡大) (Fig-B)

DACの設定値が2、つまり実際の補正電圧 = 80 + 2*12.9 = 105.8mV 付近でADコンバーターのオフセット(不感帯)をほぼキャンセルすることが出来ています。
◆50Vレンジ
5Vレンジは上のやり方でいけそうなので、今度は50Vレンジです。
・従来の50Vレンジの回路図 (Fig-C)

これは元の回路で、分圧抵抗のR2(120kΩ)はGNDに接続されていて、もう一つR3(12kΩ)をパラに接続することで分圧比を上げるようになっています。なお、ATmega328P(Arduino UNO )にはオープンドレイン出力は無いのでデジタル出力のLOWを使っています。
・特性 (Fig-C)

これはゼロボルト付近を見たグラフです。入力電圧が6V以上無いとADコンバーターが反応していません。アッテネーターが入るので、Fig-Aの特性が拡大されるためにこういうことになります。ともかくこれでは6V以下の電圧は検出出来ないので困ります。
注:このグラフはちょっと変かも知れません。再測定したほうが良いのですが面倒なのでこのまま放置します。たぶん傾向は合っているはずです。
・対策回路 (Fig-D)

オフセットをキャンセルするために、R3(12kΩ)の下側に別のDACを接続する手もあるのですが、もったいないのでR2側のDACの出力電圧を上げることで補正することにしました。R3はオープンドレインでGNDに接続されているので、入力に対する補正電圧はR2とR3で分圧された値になります。
・特性 (Fig-D)

狙い通りDACの設定値を増加させるとオフセットが補正されていきます。DACの設定値=68で、オフセット(不感帯)をキャンセルすることが出来ています。
◆まとめ
ESP32を使ったオシロ作りに必要なADコンバーターのオフセット補正回路の動作確認を行いました。今回の考え方で補正を行えばうまく行きそうです。この補正方法はオシロに限らずセンサー応用の回路などでも使えると思います。
なお、この補正方法には以下のような重大な問題点があるのでここに明記しておきます。それは、
1)入力ピンに残留電圧が発生
オフセット補正電圧はR1を通して入力端子に現れてしまいます。つまり、入力残留電圧が約0.11V発生します。入力電流で言うと、0.22μAの流れ出しがあります。微小な電位変化が問題になる回路には使えません。
2)信号源のインピーダンスによってオフセット量が変化
Fig-Bで説明すると、DACの出力電圧は約0.11Vですが、その電圧はR1を通して入力端子に出ています。もし信号電の入力インピーダンスがゼロだったら、オフセットの補正電圧はR1とR2で分圧されてしまうので少し小さな値となってしまいます。
これらが問題になるなら正負電源を使ったオペアンプを使えば解決出来ますが、回路が大幅にややこしくなります。
こういう問題はありますが、信号源のインピーダンスが変化しない場合(普通の回路なら変化しないことが多い)には問題にはならないと思います。
良い機会なのでAC測定の場合の入力回路についても整理しておきたいと思いますが、長くなったので次の記事にまわします。
- 関連記事
-
- ESP32を使ったオシロは開発中止
- ESP32のアナログ入力回路の改良、AC入力とまとめ
- ESP32のアナログ入力回路の改良、オフセットのキャンセル
- ESP32のオープンドレイン出力の特性調査
- ESP32のDAコンバーターの特性調査
トラックバックURL
http://radiopench.blog96.fc2.com/tb.php/1040-2a7fa581