ESP32でADCを使う (ESP32-DevKitC+ESP-IDF)
ESP32でIoTデバイスとして使用するにはADCの機能が使えないとアナログ出力センサの値等も見れないので今回はADCの使い方を勉強してみる。
内容はこのサイトを参考にさせて頂いた。 Analog to Digital Converter - ESP32 - — ESP-IDF Programming Guide latest documentation
ESPのADC ADC1とADC2
EPS32にはADC1とADC2という2つの12 bit逐次比較型 ADC(Analog to Digital Converter)が搭載されている。ADC1は8チャンネルあり、GPIO32~39が対応している。ADC2は10チャンネルあり、GPIO0,2,4,12~15が対応している。
ADC2は一見チャンネル数も多く便利そうだが、幾つか制約がある。
- ADC2はWiFiドライバで使用されており、WiFiドライバが動作していないときのみ使うことができる。(致命的では?)
- ADC2のピン(GPIO0,2,15)はモード設定等で使用されていることがあり、自由に使えないことがある。(ESP32 DevKitCではGPIO0、ESP-WROVER-KITではGPIO0,2,4,15が使えない)
というわけで今回はあまり制約がないADC1を使用してみる。
ADCのモード
ESP32のADCには2つのモードがある。それが、"ADC-RTC" と "ADC-DMA" というモードだ。ADC-RTCは低周期モードでRTCコントローラーから制御される。ADC-DMAは高周期モードでデジタルコントローラから制御される。
電池で動いてサンプリングレートが低くても良い用途だとADC-RTCモードで、消費電力は高くても良いからサンプリングレートを早くしたいときはADC-DMAを使用するべきなきがする。
私の用途だと主にADC-DMAを使用するほうが多そう。モータを動かし続ける用途だとあまりマイコンの消費電力を気にしたことがないから。
ADCの減衰設定
ESP32のADCには減衰設定(Attenuation configuration)がある。これはノイズ除去をするための設定だが、この設定によって入力電圧範囲が変わってしまうので厄介だ。
入力引数:atten の値が0のとき0~800mV、1のとき0~1100、2のとき0~1350mV、3のとき0=2600mV となっているらしい(資料によって微妙に値が異なるので確認が必要)。3.3Vまで測定できないので、直接接続できないセンサがありそうなので少しめんどくさい測定範囲。
新しいプロジェクトでテンプレートを開く
配線
ESP32-DevKitCのときはPIN34にアナログ値を入力すると読み込むことができる。ここでは可変抵抗を3.3V,PIN34,GNDに接続している。
動作
ESP32にプログラムを書き込んで実行したらTeraTarmを開いて接続する。
アナログ値のRaw値と電圧変換した値が1秒間隔で出力される。ソフトウェアで64回平均されているので、あまりノイズはのっていない。