[중급] ADC 값은 왜 멀티미터보다 낮게 나올까? 샘플링 타임 이야기
한 줄 답 — ADC가 전압을 "재기 전에 담아두는 시간", 즉 샘플링 타임이 모자라서입니다. 얼마나 필요한지 계산으로 예상하고, 직접 재서 확인하는 과정까지 함께 따라가 볼게요.
먼저 알아둘 용어
| 용어 | 원래 이름 | 쉽게 말하면 |
|---|---|---|
| AD값 | ADC 결과값 | ADC가 알려주는 숫자. 12bit면 0~4095 중 하나 |
| ADC | Analog-to-Digital Converter | 전압을 숫자로 바꿔주는 부품 |
| ADCLK | ADC Clock | ADC의 박자. 샘플링 타임을 세는 기준 |
| cycle | Clock Cycle | ADCLK 한 박자. 21MHz면 1cycle ≈ 48ns |
| S/H 캡 | Sample & Hold Capacitor | 전압을 잠깐 담아두는 ADC 안의 작은 컵 |
| 샘플링 타임 | Sampling Time | 그 컵을 채우는 데 주는 시간 |
| 소스 임피던스 | Source Impedance | 컵에 전압을 넣는 빨대의 가늘기 (저항) |
| 세틀링 에러 | Settling Error | 컵이 덜 차서 생기는 오차 |
| 크로스토크 | Crosstalk | 앞에 읽은 채널 값에 끌려가는 현상 |
| Vref | Reference Voltage | ADC가 "여기가 최대"로 삼는 기준 전압 |
| p-p | peak-to-peak | 여러 번 잰 값의 최대 − 최소. 값이 얼마나 흔들리는지 |
| τ | 시정수 (타우) | 컵이 약 63% 차는 데 걸리는 시간 |
| DMM | Digital Multimeter | 흔히 쓰는 디지털 멀티미터 |
| MCU | Micro Controller Unit | ADC 같은 기능이 들어 있는 작은 컴퓨터 칩 |
| AN2834 | Application Note 2834 | 칩 제조사 ST가 낸 ADC 정확도 설명서 |
읽다가 밑줄 친 단어가 헷갈리면 눌러보세요. 이 표로 바로 옵니다.
이런 일, 겪어본 적 있나요? (ADC 값이 낮게 나올 때)
3.3V 전원이 잘 나오는지 ADC로 감시하는 회로입니다. 멀티미터(DMM)로 재면 정확히 1.65V인데, ADC로 읽으면 꽤 낮게 나옵니다.
더 이상한 건, 이 채널만 혼자 읽으면 멀쩡하고 온도센서 채널과 번갈아 읽을 때만 틀린다는 점이에요.
회로도 맞고, 기준 전압도 정상입니다. 그럼 어디서 새는 걸까요? 힌트는 "혼자 읽으면 괜찮다"는 부분에 있습니다.
ADC 안에는 작은 컵이 하나 있다
ADC는 전압을 바로 재지 않습니다. 먼저 내부의 작은 컵(S/H 캡)에 전압을 담아두고, 그다음에 잽니다. 이 컵을 채우는 데 주는 시간이 샘플링 타임이에요.
문제는 컵을 채우는 빨대입니다. 빨대가 가늘수록, 즉 저항이 클수록 컵이 늦게 찹니다. 100kΩ 두 개로 나눈 회로는 ADC 쪽에서 보면 약 50kΩ(두 저항의 병렬값)짜리 꽤 가는 빨대예요. 이 빨대의 저항을 소스 임피던스라고 부릅니다.
그런데 재밌는 점이 하나 있어요. 컵은 비어 있지 않습니다. 바로 전에 읽은 온도센서 전압(1.2V)이 남아 있거든요. 컵이 다 차기 전에 재버리면 결과가 1.2V 쪽으로 끌려갑니다.
이렇게 덜 차서 생기는 오차를 현업에선 세틀링 에러, 앞 채널에 끌려가는 현상을 크로스토크라고 부릅니다. 혼자 읽을 땐 컵에 이미 같은 전압이 차 있으니 멀쩡했던 거죠.
샘플링 타임은 얼마나 필요할까? [예상]
공식은 이렇게 생각하면 쉽습니다. 필요한 시간 = 빨대 저항 × 컵 크기 × 얼마나 꼼꼼히 채울지
- (Rsrc + Radc) × Cadc = τ. 컵이 약 63%(1 − 1/e) 차는 시간입니다.
- (N+2) × ln2 = 오차를 눈금 1칸의 1/4까지 줄이는 데 필요한 τ의 개수. 12bit면 약 9.7개입니다.
- 전제 조건: 빨대와 컵을 저항 하나·커패시터 하나로 단순화했고, 읽는 전압은 그동안 변하지 않는다고 봅니다. 이 식의 뼈대는 ST의 ADC 정확도 애플리케이션 노트(AN2834)에 나오는 소스 저항 계산식과 같습니다.
내부 저항과 컵 크기는 MCU 데이터시트의 ADC 특성표에 있습니다. 아래 기본값(1kΩ, 7pF)은 설명을 위한 예시 대표값이에요.
샘플링 타임 스윕으로 직접 확인하기
계산은 어디까지나 가설입니다. 샘플링 타임을 짧은 것부터 긴 것까지 바꿔가며 직접 재볼게요. 포인트는 실제 동작과 똑같은 순서로 읽는 것입니다. 전원 감시 채널만 혼자 읽으면 문제가 안 보여요.
// Sampling-time sweep test (pseudo code)
const SAMPLES = 256
SAMPLE_TIME_OPTIONS = [shortest, ..., longest] // from the datasheet
for sampleTime in SAMPLE_TIME_OPTIONS:
ADC_SetSamplingTime(CH_SUPPLY, sampleTime)
sum = 0
minVal = MAX_VALUE
maxVal = 0
repeat SAMPLES times:
ADC_Convert(CH_TEMP) // read the previous channel first
v = ADC_Convert(CH_SUPPLY)
sum = sum + v
minVal = min(minVal, v)
maxVal = max(maxVal, v)
print(sampleTime, avg = sum / SAMPLES, pp = maxVal - minVal)
CH_TEMP = 먼저 읽는 온도센서 채널, CH_SUPPLY = 문제의 전원 감시 채널. 함수 이름은 쓰는 MCU에 맞게 바꾸면 됩니다.
[결과] ADC 예상값과 실측값, 맞았을까?
| 샘플링 타임 | [예상] | [결과] 평균 | [결과] 흔들림(p-p) |
|---|---|---|---|
| 15cycle (지금) | 1972 | 1900 | 22 |
| 28cycle | 2035 | 2001 | 11 |
| 56cycle | 2048 | 2043 | 6 |
| 84cycle | 2048 | 2047 | 5 |
| 144cycle | 2048 | 2047 | 5 |
| 480cycle | 2048 | 2047 | 5 |
[결과] 무엇을 알게 됐나
- 방향은 적중: 샘플링 타임이 짧을수록 값이 낮고, 길게 주면 2047~2048로 모입니다. "컵이 덜 찼다"는 원인은 맞았어요.
- 크기는 빗나감: 15cycle에서 예상은 1972인데 실제는 1900. 실측값으로 거꾸로 계산해보면 τ가 예상의 약 1.5배(357ns → 약 535ns)입니다. 컵 크기(Cadc)를 10.5pF로 넣으면 계산기의 점선이 초록 점과 거의 겹쳐요. 데이터시트의 대표값만 믿으면 안 되고 최대값·온도 조건까지 봐야 하는 이유입니다.
- 끝까지 남는 1칸: 480cycle에서도 2047. ADC 자체의 작은 오차라서 기다려도 없어지지 않습니다.
- 결론: 실제 τ로 다시 계산하면 110cycle 이상이 필요합니다. 선택지 중 112cycle은 여유가 거의 없어서, 144cycle로 확정합니다.
ADC 오차 줄이는 현장 팁
"책상 위에선 되는데 실제 동작에선 틀린다"면, 읽는 순서부터 의심해보세요.
샘플링 타임을 늘릴 여유가 없다면, 천천히 변하는 신호는 ADC 핀 바로 옆에 커패시터를 달아 "미리 채워둔 큰 물통" 역할을 시킬 수 있습니다. 기준은 물통 ≥ 컵 크기 × (전압 차이 ÷ 눈금 1칸)으로, 이 예제면 7pF × 558칸 ≈ 3.9nF입니다(AN2834의 외부 커패시터 조건). 여유를 두면 수십 nF가 적당해요. 단, 물통이 다시 차는 시간(50kΩ × 물통)만큼 반응이 느려지니 빠르게 변하는 신호에는 쓰지 않습니다.
자주 묻는 질문
- Q. 그냥 샘플링 타임을 최대로 두면 안 되나요?
- 정확하긴 하지만 한 번 읽는 데 오래 걸립니다. 채널이 많거나 빠르게 제어해야 하는 시스템에선 시간이 부족해져요. 필요한 만큼 + 여유가 딱 좋습니다.
- Q. 평균을 여러 번 내면 해결되지 않나요?
- 안 됩니다. 매번 같은 방향으로 틀리기 때문에 평균을 내도 "똑같이 틀린 값"이 나올 뿐이에요. 위 표에서도 15cycle의 흔들림은 22칸인데, 치우침은 148칸입니다.
정리
ADC 안의 작은 컵이 다 차기 전에 재면 값이 틀립니다. 특히 앞에 읽은 채널 쪽으로 끌려가요. 계산으로 필요한 시간을 예상하고, 실제 순서대로 재서 확인하고, 예상과 다르면 그 이유(이번엔 컵이 생각보다 컸던 것)까지 찾은 뒤 여유를 두고 정하면 됩니다.
참고 자료
- STMicroelectronics, AN2834 "How to get the best ADC accuracy in STM32 microcontrollers" — PDF
'임베디드 실무' 카테고리의 다른 글
| [초급] 풀다운이 더 직관적인데, 스위치엔 왜 풀업 저항을 쓸까? (0) | 2026.09.27 |
|---|---|
| [초급] 차를 세워 뒀을 뿐인데 왜 배터리가 방전될까? 제어기 슬립(Sleep) 모드가 필요한 이유 (0) | 2026.09.26 |
| [초급] 워치독은 왜 필요할까? 아무도 리셋 버튼을 눌러 줄 수 없을 때 (0) | 2026.09.23 |
| [중급] 전압만 낮추면 어두워지는데, MCU는 왜 굳이 PWM으로 밝기를 조절할까? (0) | 2026.09.22 |
| [초급] PWM은 빠르게 깜빡일 뿐인데, 어떻게 LED 밝기가 조절될까? (0) | 2026.09.22 |
