[초급] ADC는 전압을 어떻게 숫자로 바꿀까? 업다운 게임 12번
한 줄 답 — ADC는 업다운 게임을 합니다. 값을 하나 불러보고 "더 높아요? 낮아요?"만 확인하는 식으로, 12bit면 12번 만에 답을 찾아요. 그래서 비트 수가 곧 변환 시간이 되고, 마지막엔 눈금 한 칸 안쪽의 오차가 남습니다.
먼저 알아둘 용어
약어·용어 정리 (모르는 말이 나오면 열어보세요)
| 용어 | 원래 이름 | 쉽게 말하면 |
|---|---|---|
| ADC | Analog-to-Digital Converter | 전압을 숫자로 바꿔주는 부품 |
| AD값 | ADC 결과값 | 전압이 아니라 몇 번째 눈금인지 알려주는 번호 |
| SAR | Successive Approximation Register (축차 비교형) | 업다운 게임처럼 절반씩 좁혀가며 답을 찾는 방식 |
| 플래시 ADC | Flash ADC | 비교기를 잔뜩 깔아 한 번에 끝내는 방식 |
| DAC | Digital-to-Analog Converter | 숫자를 전압으로 바꾸는 부품. ADC와 정반대 |
| 비교기 | Comparator | 두 전압 중 어느 쪽이 높은지만 알려주는 회로 |
| Vref | Reference Voltage | ADC가 끝이라고 삼는 기준 전압 |
| 해상도 | Resolution (bit) | 자를 몇 칸으로 나눴는지. 12bit면 4096칸 |
| ADCLK | ADC Clock | ADC의 박자. 한 번 물어보는 데 이 박자 하나가 쓰인다 |
| 샘플링 시간 | Sampling Time | 묻기 전에 전압을 ADC 안에 받아두는 시간 |
| DMA | Direct Memory Access | CPU를 거치지 않고 데이터를 알아서 옮겨주는 기능 |
| MCU | Micro Controller Unit | ADC 같은 기능이 들어 있는 작은 컴퓨터 칩 |
본문의 밑줄 친 단어를 누르면 이 표가 자동으로 열립니다.
이런 궁금증, 가져본 적 있나요?
센서 값을 1ms마다 읽는 코드를 짜다 보면 궁금해집니다. "ADC 한 번 읽는 데 얼마나 걸리지?"
데이터시트엔 "12bit 변환에 12.5cycle"처럼 적혀 있습니다. 왜 하필 비트 수와 비슷할까요?
ADC는 업다운 게임을 한다
1~100 중 숫자 맞히기 게임, 해보셨죠? 50을 부르고 "업!"이면 51~100, "다운!"이면 1~49로 후보가 절반이 됩니다. ADC도 똑같아요. 숫자 대신 전압일 뿐입니다.
단, 사람은 아무 숫자나 부르지만 ADC는 항상 남은 구간의 한가운데를 부릅니다. 그래야 답이 뭐든 후보가 정확히 절반으로 줄어 최소 횟수로 끝나거든요.
왜 하필 절반씩 나눌까?
방법이 이것만 있는 건 아니지만, MCU 안에 넣으려면 선택지가 사실상 하나로 좁혀집니다.
| 방식 | 비교 횟수 | 필요한 비교기 | 특징 |
|---|---|---|---|
| 한 번에 비교 (플래시 ADC) | 1번 | 4095개 | 제일 빠르지만 회로가 너무 커지고 전력도 많이 먹음 |
| 0부터 하나씩 세기 | 최대 4096번 | 1개 | 회로는 간단한데 너무 느림 |
| 절반씩 (SAR) | 12번 | 1개 | 비교기 하나로 12번 만에. 속도와 크기의 절충 |
비교기 하나로 횟수를 가장 줄이는 방법이 "절반씩 나누기"예요. 그래서 MCU 내장 ADC는 대부분 이 방식이고, 현업에선 SAR(축차 비교형)이라고 부릅니다.
※ "12bit면 딱 12번"은 교과서적인 이진 SAR 기준입니다. 비교 한 번에 비트 하나를 확정하니 N비트면 N번이에요. 고정밀 ADC 중에는 내부 오차를 보정하려고 구간을 겹치게 설계해 N번보다 몇 번 더 비교하는 것도 있는데, 데이터시트의 변환 cycle 수를 보면 구분됩니다.
ADC 안을 열어보면: 비교기와 내부 DAC
ADC에겐 "업!"이라고 답해줄 친구가 없으니, 칩 안에 심판 역할의 회로를 둡니다.
- 비교기 — 두 전압 중 어느 쪽이 높은지만 알려주는 회로. 업다운 게임의 심판이에요.
- 내부 DAC — "2048"처럼 부른 값을 진짜 전압(1.65V)으로 만들어 비교기에 넣어줍니다. 그 눈금자를 Vref로 만들고요.
- SAR 로직 — 비교기 답을 보고 이번 비트를 남길지 버릴지 정하고, 다음 값을 불러주는 부분입니다.
그래서 AD값의 정확도는 결국 Vref가 얼마나 반듯한가에 달려 있어요.
변환 시간은 얼마나 걸릴까? [예상]
변환 시간 = (전압을 받아두는 시간 + 질문 횟수) ÷ ADC 클럭
N은 해상도(bit)이자 질문 횟수입니다. 뒤의 0.5cycle은 결과를 정리하는 시간으로 MCU마다 조금 달라요.
[예상] 12번 물어보면 AD값은 1241, 변환 시간은 1.31µs가 나올 겁니다.
이 과정을 코드로 쓰면
// Successive approximation (pseudo code, inside the ADC)
code = 0
for bit = N-1 down to 0: // ask N times, biggest step first
guess = code + (1 << bit) // the value we call out
guessV = VREF * guess / 2^N // what that value means in volts
if guessV <= VIN: // "up!" -> the input is higher
code = guess // keep it -> this bit is 1
// else: "down!" -> drop it -> this bit is 0
return code
code = 지금까지 확정된 AD값, guess = 이번에 불러본 값, VIN = 실제 입력 전압. 하드웨어가 알아서 하는 일이지만 안에서 이렇게 돕니다.
[결과] 실제로 한 판 따라가 보기
| 횟수 | 불러본 값 | 그 값의 전압 | 1.000V와 비교 | 확정된 AD값 |
|---|---|---|---|---|
| 1번째 | 2048 | 1.6500 V | 다운! → 버림 | 0 |
| 2번째 | 1024 | 0.8250 V | 업! → 확정 | 1024 |
| 3번째 | 512 | 1.2375 V | 다운! → 버림 | 1024 |
| 4번째 | 256 | 1.0313 V | 다운! → 버림 | 1024 |
| 5번째 | 128 | 0.9281 V | 업! → 확정 | 1152 |
| 6번째 | 64 | 0.9797 V | 업! → 확정 | 1216 |
| … 이런 식으로 12번째까지 … | ||||
| 최종 | — | 0.9998 V | — | 1241 |
[결과] 무엇을 알게 됐나
- 예상 적중: 공식값 1.000 ÷ 3.3 × 4096 = 1241.2와 12번 물어서 얻은 1241이 같습니다. ADC는 이 나눗셈을 회로로 하는 셈이에요.
- 소수점은 버려진다: 1241.2의 0.2는 사라져 999.8mV, 오차 약 0.2mV가 남습니다. 한 칸 안쪽 오차는 없앨 수 없고 비트 수를 늘려야 줄어요.
- 변환 시간 1.31µs: 샘플링 15cycle + 질문 12.5cycle = 27.5cycle ÷ 21MHz. 질문에 쓰는 시간은 0.6µs뿐이고 나머지는 전압을 받아두는 시간이에요.
- 비트 수 = 시간: 8bit로 바꾸면 질문이 4번 줄어 1.12µs로 빨라지는 대신, 눈금 한 칸이 12.9mV로 커집니다. 정밀도와 속도는 맞바꾸는 관계예요.
그럼 설정은 어떻게 고를까?
해상도, 샘플링 시간, ADCLK는 순서대로 정하면 자연스럽게 맞아떨어집니다. 회로에서 정해지는 것부터 잡고, 소프트웨어에서 확인하면 돼요.
| 순서 | 정하는 기준 | 이 글의 예 |
|---|---|---|
| ① 해상도 | 회로 — 얼마나 작은 차이까지 구분해야 하나. 측정 범위 ÷ 구분 단위보다 눈금이 많으면 됨 | 3.3V를 10mV로 구분 → 330칸 → 9bit면 충분, 여유 두고 12bit |
| ② 샘플링 시간 | 회로 — 앞단 저항(분압·센서 출력)이 클수록 길게. 저항을 줄일 수 있으면 줄이는 게 먼저 | 15cycle |
| ③ ADCLK | 회로+소프트 — 데이터시트 허용 범위 안에서. 올리면 ②의 실제 충전 시간도 같이 짧아지는 점 주의 | 21MHz |
| ④ 확인 | 소프트 — (변환 시간 × 채널 수)가 읽는 주기 안에 여유 있게 들어가나 | 1.31µs × 8채널 = 10.5µs, 1ms 주기의 1% |
읽는 주기 자체는 신호가 얼마나 빨리 변하는지로 정합니다. 최소한 신호가 변하는 속도의 두 배보다 빠르게 읽어야 하고, 실무에선 5~10배로 잡는 편이에요. ④에서 여유가 많이 남으면 ②를 한 단계 더 길게 줘서 정확도를 챙기고, 반대로 빠듯하면 앞단 저항을 줄이거나 채널을 나누고, CPU가 기다리지 않도록 DMA로 받아오면 됩니다.
현장 팁
회로에서 꼭 챙길 것 (펼치기)
자주 묻는 질문
그럼 ADC는 전압을 "정확히" 재는 게 아닌가요?
비트 수는 높을수록 좋은가요?
정리
ADC는 남은 구간의 한가운데를 부르는 업다운 게임으로 전압을 숫자로 바꿉니다. 내부 DAC가 부른 값을 전압으로 만들고 비교기가 심판을 봐요. 그래서 비트 수가 곧 변환 시간이 되고, 설정은 해상도 → 샘플링 시간 → ADCLK 순으로 정한 뒤 채널 수까지 곱해 확인하면 됩니다.
참고 자료
- Analog Devices, Analog-to-Digital Converter Architectures and Choices for System Design (플래시는 n비트에 비교기 2ⁿ−1개, SAR은 비교기 1개): analog.com
- Analog Devices, Analog Dialogue 39-06, Which ADC Architecture Is Right for Your Application? (SAR 기본 구조와 멀티채널 활용): analog.com
- STMicroelectronics, AN2834 — How to get the best ADC accuracy in STM32 microcontrollers (샘플링 시간·신호원 저항·Vref 관리): st.com PDF
변환 cycle 수는 MCU마다 다르니 쓰는 칩의 데이터시트에서 확인하세요.
'임베디드 실무' 카테고리의 다른 글
| EEPROM과 Flash 차이: NVM은 칩 안 어디에 있을까 [초급] (0) | 2026.10.12 |
|---|---|
| NVM이란? 전원을 꺼도 값이 남는 메모리, 왜 필요할까 [초급] (0) | 2026.10.12 |
| 부트로더란? MCU에 부트로더가 필요한 이유와 용도 [초급] (0) | 2026.10.02 |
| MISRA-C 규칙, 왜 이렇게 까다로울까? 양산 전 코딩 규칙 입문 [초급] (1) | 2026.10.01 |
| 디버거는 어떻게 코드를 한 줄씩 따라갈까 [초급] (0) | 2026.09.29 |
