見出し画像

ESP32のADC補正

ガス配管のインライン圧力ロガーの製作時にADCの補正を行っていたので、概要を記事にします。
この時はそれほど精度を要求される内容ではなく0~200kPaの範囲で±10kPa程度の誤差は許容出来るレベルでした。圧力センサはPSE540A-R06(SMC)を使っています。Arduino IDEでは誤差補正をする関数?があるようでしたがMicroPythonには無さそうなので、自分で簡単な補正関数を作りました。

測定と補正係数決定

測定に当たり、ESP32の設定はアッテネータが11dB、分解能が12bitです。
ESP32のADC入力端子電圧をテスターで測定しながら、A/D変換値を記録しました。

画像1

理想値が422, 4083の2点から傾きと切片を求めて補正関数は以下としました。
y = 0.9622  x + 143.0

  def read_adc(self):         # ADC 読出し
    d = self.adc.read()
    res = int(0.9622 * d + 143.0 + 0.5)
    return res

タイトル画像はいずれも上表の理想値を横軸にとっています。右側のグラフは補正前後の誤差比較です。

測定した範囲の下側(422~0)の様子は不明ですが、今回の課題は理想値で800~1600付近を使うので不明でも良しとしました。
ADC端子電圧で0V付近が重要な場合はもう少し複雑な補正関数になると思います。

ESP32の機差や繰り返し測定精度の評価については、必要に応じて別途行うことにします。

補正結果と圧力測定誤差

詳細は省きますが、大気圧付近でも+10kPa程度の誤差になりました。端子電圧を測定するとセンサーの出力電圧の誤差の方が支配的なようです。今回の用途ではこのまま使うことにしました。

まとめ

Web上に同種の記事が散見されますが、ESP32のADCの誤差には注意が必要です。今回の用途では補正して使いますが、精度が必要な場合は外付けADCを検討することも視野に入れたいと思います。

もっとも、最近のセンサーはデジタル出力が多いのでADCの精度を要求される機会は少ないと思います。


出来ればサポート頂けると、嬉しいです。 新しい基板や造形品を作る資金等に使いたいと思います。