1. 아날로그 입력(ADC, Analog-to-Digital Conversion)
MCU에서 아날로그 신호를 읽을 때는 ADC(Analog-to-Digital Converter, 아날로그-디지털 변환기)를 사용합니다. ADC는 연속적인 아날로그 신호를 디지털 값으로 변환하는 장치로, 센서 입력, 전압 모니터링, 오디오 신호 처리 등에 필수적입니다.
1) 12비트 ADC의 분해능
분해능(Resolution)은 ADC가 입력 전압을 몇 단계로 나누어 측정할 수 있는지를 의미합니다.
12비트(12-bit) ADC의 경우:
12비트는 2¹² = 4096 단계로 나뉩니다.
만약 ADC의 Reference 전압(Vref)이 0V ~ 3.3V라면,
각 단계의 분해능 = 3.3V / 4096
약 0.0008V(0.8mV) 단위로 구분 가능
즉, 입력 전압이 0.8mV씩 변하면 ADC 값이 1씩 증가합니다.
예제
0V 입력 → ADC 값 0
1.65V 입력 → 2048(≈ 1.65V ÷ 0.0008V)
3.3V 입력 → 4095(최대값)
2) ADC 내부 동작 원리
ADC는 다양한 방식이 있지만 MCU에서 가장 널리 쓰이는 방식은 SAR(Successive Approximation Register) ADC입니다.
MCU 내부 SAR ADC 블록 다이어그램
1. 아날로그 신호 입력 (AINx)
2. 샘플 및 홀드 회로 (S&H)
3. 비교기 (Comparator)
4. SAR 로직
5. 디지털 출력 (n비트 값)
SAR ADC 변환 과정
(1) 샘플 및 홀드(Sample & Hold, S&H)
입력된 아날로그 신호를 일정 시간 유지하여 안정적인 변환이 가능하도록 합니다.
(2) 비교기(Comparator)와 SAR 로직
내부에서 이진 탐색(Binary Search) 방식으로 순차적으로 값을 비교하여 디지털 값을 결정합니다.
예를 들어, 12비트 ADC라면 12번 비교하여 최종 디지털 값을 결정합니다.
(3) 출력
변환된 디지털 값은 MCU 내부의 레지스터(ADC 데이터 레지스터)에 저장됩니다.
3) MCU에서 아날로그 입력을 읽는 예제 코드 (아두이노 12비트 ADC)
#define SENSOR_PIN A0 // 아날로그 입력 핀 A0
void setup() {
Serial.begin(9600); // 시리얼 통신 시작
}
void loop() {
int adcValue = analogRead(SENSOR_PIN); // ADC 값 읽기 (0 ~ 4095)
float voltage = (adcValue / 4095.0) * 3.3; // 전압 변환 (Vref = 3.3V)
Serial.print("ADC 값: ");
Serial.print(adcValue);
Serial.print(" | 전압: ");
Serial.println(voltage);
delay(500);
}
2. 아날로그 출력(DAC, Digital-to-Analog Conversion)
MCU에서 아날로그 출력을 구현하려면 DAC(Digital-to-Analog Converter, 디지털-아날로그 변환기)를 사용해야 합니다.
1) DAC의 원리
DAC는 디지털 데이터를 전압 또는 전류로 변환하여 스피커, 모터, 조명 밝기 조절 등에 활용됩니다.
- DAC 변환 과정
(1) 디지털 입력(12-bit 값)
ADC의 반대 개념으로, 4096(12-bit) 단계의 디지털 값을 입력 받습니다.
(2) 전압 레퍼런스(Vref)와 가중 저항 배열(R-2R)
저항 네트워크(R-2R Ladder)를 통해 전압을 가중치에 따라 변환합니다.
(3) 출력 버퍼 및 필터
스위칭 잡음을 제거하고 부드러운 아날로그 신호를 생성합니다.
- MCU 내부 DAC 블록 다이어그램
MCU 내부 DAC 구조
1. 디지털 입력 (n비트 값)
2. R-2R Ladder 회로
3. 출력 버퍼 (LPF 포함)
4. 아날로그 출력 (Vout)
2) MCU에서 아날로그 출력을 생성하는 예제 코드 (PWM 기반)
#define DAC_PIN 9 // PWM 출력 핀
void setup() {
pinMode(DAC_PIN, OUTPUT);
}
void loop() {
for (int i = 0; i < 255; i++) { // 0 ~ 255까지 출력 증가
analogWrite(DAC_PIN, i);
delay(10);
}
for (int i = 255; i >= 0; i--) { // 255 ~ 0까지 출력 감소
analogWrite(DAC_PIN, i);
delay(10);
}
}
- PWM과 DAC의 차이점
PWM(Pulse Width Modulation)은 디지털 신호의 듀티 사이클을 변경하여 아날로그 출력처럼 보이게 하는 방식입니다.
실제 DAC는 연속적인 아날로그 전압을 생성하는 방식이며, PWM은 필터를 사용하지 않으면 계단식 신호(노이즈 발생)가 나타날 수 있습니다.
3. ADC와 DAC 비교
기능 | ADC (Analog to Digital) | DAC (Digital to Analog) |
입력 | 아날로그 전압(0~Vref) | 디지털 데이터 (n비트) |
출력 | 디지털 값 (0~4095, 12-bit) | 아날로그 전압 (0~Vref) |
내부 원리 | 샘플링, 이진 비교, SAR | 저항 네트워크, R-2R Ladder |
사용 사례 | 센서 입력, 전압 측정 | 오디오 출력, 모터 제어 |
4. 결론
MCU에서 아날로그 신호를 다루기 위해 ADC와 DAC가 필수적이며, 각각의 원리를 정확히 이해해야 합니다.
ADC(Analog to Digital Converter)
12비트 ADC의 경우 4096단계로 나뉘며, 3.3V 기준으로 0.8mV 분해능을 가집니다.
SAR ADC 방식이 가장 일반적이며, MCU 내부에서 비교기와 샘플링 회로를 사용하여 변환됩니다.
DAC(Digital to Analog Converter)
디지털 데이터를 R-2R 저항 네트워크를 통해 아날로그 전압으로 변환합니다.
PWM 방식으로 아날로그 출력을 흉내 낼 수도 있지만, 실제 DAC보다는 부드러운 신호 생성이 어렵습니다.