4주차_참고 : ADC(Analog‐to‐Digital Converter) - dhryu60/SmartDevice_2025-1 GitHub Wiki

ESP32 ADC 강의 자료

1. ADC(Analog-to-Digital Converter) 개요

ADC(아날로그-디지털 변환기)는 아날로그 신호(전압)를 디지털 값으로 변환하는 장치입니다. ESP32는 최대 18개의 ADC 입력 채널을 제공하며, 센서 데이터 측정, 신호 처리, 전압 감지 등에 활용됩니다.

2. ESP32의 ADC 특징

  • ADC1: 8개 채널 (GPIO32-GPIO39)
  • ADC2: 10개 채널 (GPIO0, 2, 4, 12-15, 25-27)
  • 분해능(Resolution): 기본 12비트 (0~4095 값 출력, 설정 가능)
  • 입력 전압 범위: 기본 0~3.3V (조정 가능)
  • ADC2는 Wi-Fi와 동시에 사용할 경우 제한됨
  • 노이즈 영향이 크므로 평균값 필터링 필요

3. ADC 채널 및 GPIO 매핑

ADC 모듈 GPIO 핀
ADC1_CH0 GPIO36
ADC1_CH1 GPIO37
ADC1_CH2 GPIO38
ADC1_CH3 GPIO39
ADC1_CH4 GPIO32
ADC1_CH5 GPIO33
ADC1_CH6 GPIO34
ADC1_CH7 GPIO35
ADC2_CH0 GPIO4
ADC2_CH1 GPIO0
ADC2_CH2 GPIO2
ADC2_CH3 GPIO15
ADC2_CH4 GPIO13
ADC2_CH5 GPIO12
ADC2_CH6 GPIO14
ADC2_CH7 GPIO27
ADC2_CH8 GPIO25
ADC2_CH9 GPIO26

주의:

  • ADC1 채널은 Wi-Fi 동작과 무관하게 사용 가능
  • ADC2 채널은 Wi-Fi 사용 시 충돌이 발생할 수 있음
  • GPIO34~39는 입력 전용(출력 불가)

4. ESP32에서 ADC 사용법

ESP32에서는 analogRead() 함수를 사용하여 ADC 값을 읽을 수 있습니다. 보다 정밀한 설정을 위해 analogReadResolution()analogSetWidth() 등의 함수를 활용할 수 있습니다.

1) 기본적인 ADC 읽기 예제

#define ADC_PIN 34 // ADC 입력 핀 (ADC1 사용 권장)
void setup() {
    Serial.begin(115200);
}
void loop() {
    int adcValue = analogRead(ADC_PIN); // 0~4095 범위의 값 읽기
    float voltage = adcValue * (3.3 / 4095.0); // 전압 변환 (기본 3.3V 기준)
    Serial.print("ADC Value: "); Serial.print(adcValue);
    Serial.print("  Voltage: "); Serial.print(voltage, 2);
    Serial.println(" V");
    delay(500);
}

2) ADC 분해능 및 감도 조정

ESP32는 기본적으로 12비트(0~4095) 분해능을 사용하지만, 필요에 따라 조정할 수 있습니다.

analogReadResolution(10); // 10비트 분해능 설정 (0~1023 범위)
analogSetWidth(12);       // ADC 너비 설정 (9~12비트 가능)

3) ADC 노이즈 필터링 (이동 평균 필터 적용)

#define SAMPLES 10
int readADC(int pin) {
    int sum = 0;
    for (int i = 0; i < SAMPLES; i++) {
        sum += analogRead(pin);
        delay(5); // 안정적인 측정
    }
    return sum / SAMPLES;
}

5. ADC 활용 사례

  1. 온도 센서 (LM35 등) 측정
  2. 조도 센서 (LDR)로 빛 감지
  3. 전위차계(가변 저항) 값 읽기
  4. 배터리 전압 모니터링
  5. 아날로그 마이크 신호 분석

6. 주의사항 및 최적화 팁

  • ADC2는 Wi-Fi 사용 시 충돌 가능 (ADC1 사용 권장)
  • 입력 전압 범위가 3.3V를 초과하면 ESP32 손상 가능
  • ADC는 노이즈 영향을 받으므로 필터링 기법 사용
  • ESP32 내부 ADC는 고정밀 측정이 필요할 경우 캘리브레이션이 필요함

7. 결론

ESP32의 ADC 기능을 활용하면 다양한 센서 데이터를 수집할 수 있으며, ADC1을 사용하면 Wi-Fi 동작과 무관하게 안정적인 측정을 할 수 있습니다. ADC의 분해능을 적절히 설정하고, 노이즈 필터링을 적용하여 정확한 측정값을 얻는 것이 중요합니다.