본문 바로가기
Study/ESP8266(WIFI),ESP32(BLE,WIFI)

ESP32 ADC

by Answer Choi 2020. 3. 12.
반응형

ESP32의 경우 12bit 18개의 ADC를 가지고 있습니다.

 

또한 ESP32의 경우 ADC값이 완전히 리니어하지는 않습니다.

 

위 그래프처럼 조금 울퉁불퉁한 면이 있어서 주위해야하며, 0.00v~0.10v와 3.10v~3.30v 사이는 거의 변화가 없는걸

 

유의 하셔야 합니다.

 

물론 adc를 calibration하는 방법이 여러가지가 있는데 크게 영향을 미치지 않는 영역의 adc를 사용한다면

 

그대로 사용하셔도 됩니다.

 

크게 ADC1 8채널과 ADC2 10채널로 나뉘어져 있으며 ADC1과 ADC2는 차이가 조금 있는데

 

ADC2의 경우 WiFi나 BT를 사용하면 ADC기능을 사용할 수 없습니다.

 

이런경우 ADC1을 사용해야 합니다.

 

가변저항을 이용하여 간단하게 테스트를 해보겠습니다.

 

우선 가변저항의 한쪽엔 VCC 다른 한쪽엔 GND를 연결한 후 가운데를 ADC 입력으로 연결합니다.

 

1. ADC 2 TEST

 

a. WiFi나 BT OFF

#define adcpin 4
int adcValue = 0;
float adcCur=0;
int temp=0;

void setup() {  
    Serial.begin(115200);    
}

void loop() {
  // put your main code here, to run repeatedly:
    
    temp=analogRead(adcpin);
    Serial.print("adc Value=");
    Serial.print(temp);
    Serial.print(" adc percentage=");
    Serial.print(temp/4095.);
    Serial.print("% volt=");
    Serial.print(temp*3.3/4095);
    Serial.println("V");
    delay(500);
}

위 코드에 대한 결과값입니다.

 

가변저항의 값을 조절하면 ADC값이 제대로 변경되는 것을 확인할 수 있습니다.

 

하지만 위에서도 말했듯이 WiFi나 BT기능을 켜면 동작을 하지 않는데, 확인해 보겠습니다.

 

B. WiFi나 BT ON

 

#include <BluetoothSerial.h>

BluetoothSerial ESP_BT;
#define adcpin 4
int adcValue = 0;
float adcCur=0;
int temp=0;

void setup() {   
	ESP_BT.begin("GT_1tdcs"); //Name of your Bluetooth Signal    
    Serial.begin(115200);
}

void loop() {  
    temp=analogRead(adcpin);
    Serial.print("adc Value=");
    Serial.print(temp);
    Serial.print(" adc percentage=");
    Serial.print(temp/4095.);
    Serial.print("% volt=");
    Serial.print(temp*3.3/4095);
    Serial.println("V");
    delay(500);
}

BT를 ON하면 가변저항을 조절해서 전압값을 변경해도 ADC값을 인식하지 않고, ADC 맥스값인 4095로만 인식이 됩니다.

 

2. ADC 1 TEST

 

이 상태에서 ADC2를 ADC1으로 변경해 보겠습니다.

 

#include <BluetoothSerial.h>

BluetoothSerial ESP_BT;
#define adcpin 36
int adcValue = 0;
float adcCur=0;
int temp=0;

void setup() {   
	ESP_BT.begin("GT_1tdcs"); //Name of your Bluetooth Signal    
    Serial.begin(115200);
}

void loop() {  
    temp=analogRead(adcpin);
    Serial.print("adc Value=");
    Serial.print(temp);
    Serial.print(" adc percentage=");
    Serial.print(temp/4095.);
    Serial.print("% volt=");
    Serial.print(temp*3.3/4095);
    Serial.println("V");
    delay(500);
}

ADC2인 GPIO2번에서 ADC1인 GPIO36번으로 변경하였습니다.

 

물론 BT도 활성화가 되어있지만 ADC값이 변화되는 것을 확인할 수 있습니다.

 

반응형

인기글