ESP32 ADCのテスト
JH7UBC 2020.1.14
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 <SPI.h>
#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); int p = 36; //GPIOの番号
void setup() {
tft.begin(); tft.setRotation(3); tft.fillScreen(ILI9341_BLACK); tft.setTextColor(ILI9341_CYAN); tft.setTextSize(3); tft.setCursor(50, 50); tft.print("PIN"); } void pinDisp(int pin_No){
tft.fillRect(110,50,50,30,ILI9341_BLACK); tft.setTextColor(ILI9341_CYAN); tft.setTextSize(3); tft.setCursor(110, 50); tft.print(pin_No); } void ADC(int 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); } void loop() {
pinDisp(p); ADC(p); delay(50 |