JH7UBCブログ

アマチュア無線 電子工作 家庭菜園など趣味のブログです

ESP32 ADCのテスト

2020-01-14 09:11:54 | ESP32

 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(500);
}