ESP32のADC(アナログ・デジタル・コンバータ)のテストをします。
ESP32のADCについては、ESPRESSIFのESP-IDF Programming Guide および スイッチサイエンスのESP-WROOM-32に関するTIPSが参考になります。
ESP32には、12ビットのADCが2つ内蔵されています。(ADC1とADC2)
ADC1は、GPIO32-39の8チャンネルに使用され、ADC2は、GPIO 0, 2, 4, 12 - 15 及び 25 - 27の10チャンネルに使用されます。
ただし、ADC2は、WiFiドライバで使用されるため、WiFiドライバで使用していない時のみ使用できます。
ADC入力と各GPIOの番号は次のようになっています。
------------------------------
ADC_No GPIO
ADC0 36
ADC3 39
ADC4 32
ADC5 33
ADC6 34
ADC7 35
ADC10 4
ADC11 0
ADC12 2
ADC13 15
ADC14 13
ADC15 12
ADC16 14
ADC17 27
ADC18 25
ADC19 26
---------------------------
ESP32-DevKitCでADC入力テストを行い、上記のGPIOでADCが動作することを確認しました。
ただし、GPIO 0,2,15については、他の機能に使われることがあります。
ESP32のADCは、0~1Vを0~4095の値に変換します。
入力ピンとADCの間には、アッテネータが入っていて、その減衰率を設定できます。デフォルトでは、減衰率が11dBに設定されています。
11dBの場合、0~3.6Vを0~4095に変換することになります。
デフォルトの状態で、実際にADCを動かし見ると3.28Vの時4095に変換しました。
setup()でanalogSetAttenation(ADC_0dB);として、アッテネータの減衰率を0dB(減衰なし)に設定すると
1.04Vで4095に変換しました。
試しに、減衰率を6dBに設定した場合は、1.89Vで4095に変換しました。
AD変換直線性と誤差を見るために0.2V刻みで変換値を測定してみました。(アッテネータはデフォルトの11dBです)
ADCの変換値の1桁目はノイズのため、ばらつきます。また、0V付近と最大値付近長が大きくなりますが、精度を求めなければ、使えそうです。
参考までに、ADCのテストに使ったスケッチです。表示用に2.2インチTFTを使っています。
(上の画面では、ADC0と表示していますが、その後下のスケッチのようにGPIOピン番号に変更しました)
----------------------------------------------------
* ESP32 ADC test
* 2020.01.13
* JH7UBC Keiji Hata
*/
#include <Adafruit_GFX.h>
#include <Adafruit_ILI9341.h>
#define TFT_DC 17
#define TFT_CS 5
#define TFT_RST 16
Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC, TFT_RST);
tft.begin();
tft.setRotation(3);
tft.fillScreen(ILI9341_BLACK);
tft.setTextColor(ILI9341_CYAN);
tft.setTextSize(3);
tft.setCursor(50, 50);
tft.print("PIN");
}
tft.fillRect(110,50,50,30,ILI9341_BLACK);
tft.setTextColor(ILI9341_CYAN);
tft.setTextSize(3);
tft.setCursor(110, 50);
tft.print(pin_No);
}
int val = analogRead(pin_No);
tft.fillRect(50,100,120,50,ILI9341_BLACK);
tft.setTextColor(ILI9341_WHITE);
tft.setTextSize(5);
tft.setCursor(50, 100);
tft.print(val);
}
pinDisp(p);
ADC(p);
delay(500);
}