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

inserted by FC2 system