ADC 입력 설계
한 줄 요약 — ADC는 샘플링 커패시터(sampling capacitor)를 충전해서 측정합니다. 소스 임피던스가 크면 충전이 안 되고 값이 틀립니다.
SAR ADC의 입력 구조
| 부품 | 정체 | 하는 일 |
|---|---|---|
| ADC 칩 내부 아날로그 스위치아날로그 스위치 analog switch신호를 그대로 통과시키거나 끊는 반도체 스위치로, 다채널 측정의 채널 선택이 여기서 이뤄집니다.자세히 보기 →의 도통 저항도통 저항 R_DS(on)MOSFET 이 켜져 있을 때의 저항으로, 여기에 전류의 제곱을 곱한 만큼이 열이 됩니다.자세히 보기 → | 샘플링할 때만 닫힌다. 없앨 수 없는 직렬 저항 | |
| ADC 칩 내부 샘플링 커패시터 | 여기에 담긴 전압을 변환한다. 이 커패시터가 다 안 차면 그만큼 오차 | |
| 우리가 붙인 바깥 회로의 출력 임피던스출력 임피던스 output impedance회로가 부하에 전압을 얼마나 굳건히 유지해 주는지를 나타내는 값으로, 낮을수록 부하에 덜 흔들립니다.자세히 보기 → | 가 크면 이 늦게 차서 값이 낮게 읽힌다 |
💡 ADC 입력은 “고임피던스 전압계”가 아니라 “주기적으로 커패시터를 물리는 회로” 입니다. 그래서 앞단의 출력 임피던스가 정확도를 직접 결정합니다.
샘플링 단계: 스위치가 닫혀 을 입력 전압까지 충전 변환 단계: 스위치가 열리고 SAR 알고리즘으로 비교
| 항목 | 전형값 |
|---|---|
| 4~20 pF | |
| 0.5~2 kΩ |
★ 획득 시간 계산
tau시정수time constantsC_sample샘플링 커패시터sampling capacitorFR_source신호원 저항source resistanceΩR_sw스위치 저항switch resistanceΩ비트 정확도에 필요한 시간 (3-02):
tau시정수time constantsn비트 수 또는 개수number of bits or countt_acq획득 시간acquisition times인 이유는 1/2 LSB 이내로 안정되어야 하기 때문입니다.
계산 예제
= 10 pF, = 1 kΩ, 12비트:
| 필요 | ||
|---|---|---|
| 0 | 10 ns | 90 ns |
| 1 kΩ | 20 ns | 180 ns |
| 10 kΩ | 110 ns | 991 ns |
| 100 kΩ | 1.01 µs | 9.1 µs |
| 1 MΩ | 10 µs | 90 µs |
데이터시트의 “권장 소스 임피던스(impedance)임피던스 impedance교류에서의 저항으로, 크기뿐 아니라 전압과 전류의 시간 차이(위상)까지 담은 복소수입니다.자세히 보기 → ≤ 10 kΩ” 은 기본 샘플링 시간 설정에서 나온 값입니다. 샘플링 시간을 늘리면 더 큰 임피던스도 가능합니다.
★ 세 가지 해결책
1. 소스 임피던스 낮추기
분압기(voltage divider) 저항을 낮추거나 버퍼(ADC 드라이버) 를 넣습니다. 가장 확실한 방법입니다.
2. 샘플링 시간 늘리기
MCU 설정으로 획득 시간(acquisition time)을 늘립니다. 대신 샘플링률이 떨어집니다.
3. 입력에 커패시터 달기 (전하 저장)
는 ADC 입력 핀 바로 옆, 뒤에 붙습니다. 샘플링 순간 에 전하를 대 주는 것은 먼 소스가 아니라 이 입니다.
이면, 샘플링 순간 가 전하를 공급합니다.
전하 공유로 인한 오차:
Delta V전압 변화량voltage changeVC_ext외부 커패시터external capacitorFC_sample샘플링 커패시터sampling capacitorFV전압voltageV= 10 pF, = 100 nF → (0.01%) — 12비트(0.024%)에 충분 ✅
⚠️ 단, 가 다음 샘플링 전까지 재충전되어야 합니다.
C_ext외부 커패시터external capacitorFe잡음 전압 밀도noise voltage densityV/√Hzg컨덕턴스 (소신호)small-signal conductanceSr저항 (소신호)small-signal resistanceΩR_s신호원 저항source resistanceΩ샘플링 주기가 1 ms보다 짧으면 따라가지 못합니다. 신호가 빠르게 변할 때도 문제입니다.
💡 방식은 느리게 변하는 신호(온도, 배터리 전압)에 적합하고, 빠른 신호에는 ADC 드라이버(버퍼) 가 필요합니다.
ADC 드라이버 설계
| 요소 | 역할 |
|---|---|
| OP앰프 | 낮은 출력 임피던스, 빠른 정착 |
| 용량성 부하용량성 부하 capacitive loadOP앰프 출력에 붙은 커패시터가 출력 저항과 만나 극점을 만들어, 위상 여유를 갉아먹고 발진시킵니다.자세히 보기 →로부터 OP앰프 보호 (7-07) | |
| 샘플링 전하 공급 + 안티에일리어싱 |
OP앰프 선정 기준:
- 정착 시간(settling time)정착 시간 settling time출력이 목표값의 허용 오차 안으로 들어와 머무를 때까지 걸리는 시간으로, 다채널 측정의 속도 상한을 정합니다.자세히 보기 →이 샘플링 주기 내에 들어갈 것 (데이터시트의 0.01% 정착 시간 확인)
- 대역폭(bandwidth) ≥ 샘플링률
- 출력이 ADC 입력 범위 전체를 커버 (레일투레일)
- 저잡음
입력 범위와 기준전압
| 항목 | 고려 |
|---|---|
| 입력 범위 | 0~ (단극성) 또는 ± (양극성) |
| 범위 초과 | 클리핑, 심하면 입력 보호 다이오드(diode) 동작 → 다른 채널까지 오염 |
| 범위 미달 | 분해능(resolution) 낭비 |
⚠️ 멀티플렉스 ADC에서 한 채널이 범위를 크게 초과하면 인접 채널 값도 틀어집니다. 입력 보호 다이오드로 전류가 흐르면서 내부 노드를 흔들기 때문입니다. 입력 클램프와 직렬 저항으로 방지하세요.
시뮬레이션으로 확인
# examples/10-mcu-interfacing/adc-acquisition.yaml
meta:
name: ADC 샘플링 커패시터 충전
lesson: docs/10-mcu-interfacing/03-adc-input.md
note: RSRC를 1k/10k/100k로 바꾸며 세틀링 시간을 비교
components:
- {ref: VS, type: vpulse, params: {v1: 0, v2: 2.5, td: 0, tr: 1n, tf: 1n, pw: 10u, per: 20u}}
- {ref: RSRC, type: r, value: 10k, label: 소스 임피던스}
- {ref: RSW, type: r, value: 1k, label: ADC 스위치 저항}
- {ref: CS, type: c, value: 10p, label: 샘플링 커패시터}
nets:
SRC: [VS.p, RSRC.1]
IN: [RSRC.2, RSW.1]
CAP: [RSW.2, CS.1]
GND: [VS.n, CS.2]
analyses:
- {type: tran, tstep: 1n, tstop: 5u}
expect:
- {measure: v, node: CAP, at: 1u, analysis: tran, value: 2.5, tol: 0.03%}ns이므로 1 µs면 로 충분히 정착합니다.
⚖️ 부품 트레이드오프
| 선택 | ✅ 좋아지는 것 | ⚠️ 나빠지는 것 |
|---|---|---|
| ADC 드라이버(버퍼) | 소스 임피던스 무관, 빠른 샘플링 | 부품·전력, OP앰프 잡음·옵셋 추가 |
| 입력 커패시터 (100 nF) | 전하 공급, 노이즈 필터 | 응답 느림, 빠른 신호에 부적합 |
| 작은 입력 커패시터 (1 nF) | 빠른 재충전 | 전하 공급 부족 |
| 샘플링 시간 늘리기 | 부품 0 | 샘플링률 감소 |
| 소스 저항 낮추기 | 근본 해결 | 전류 소비, 신호원 부담 |
| 직렬 저항 + 커패시터 (RC) | 안티에일리어싱 겸용 | 대역폭 제한 |
저항 분압 + ADC의 딜레마
| 분압 저항 | 소비 전류 | 소스 임피던스 | ADC 적합성 |
|---|---|---|---|
| 1 k / 1 k | 큼 | 500 Ω | ✅ 우수 |
| 10 k / 10 k | 중간 | 5 kΩ | ✅ 양호 |
| 100 k / 100 k | 작음 | 50 kΩ | ⚠️ 샘플링 시간 필요 |
| 1 M / 1 M | 극소 | 500 kΩ | ❌ 버퍼 필수 |
🔌 실제 쓰임새
| 측정 대상 | 권장 구성 |
|---|---|
| 배터리 전압 | 분압(100 k급) + 100 nF (느린 신호) |
| 온도 센서 (NTC) | 분압 + RC 필터 |
| 생체 신호 | AFE + ADC 드라이버 + 안티에일리어싱 |
| 전류 (션트) | 전류 감지 증폭기 + 드라이버 |
| 광센서 | TIA + 드라이버 |
| 포텐셔미터 | 직접 (임피던스 낮음) |
⚠️ 이상과 실제의 차이
| 이상 | 실제 |
|---|---|
| 입력 임피던스 무한 | 샘플링 중에는 매우 낮음 (kΩ) |
| 즉시 측정 | 획득 시간 필요 |
| 채널 독립 | 멀티플렉스 시 이전 채널의 잔류 전하 (메모리 효과) |
| 기준전압(voltage reference) 정확 | 기준전압 잡음이 모든 측정에 곱해짐 (8-06) |
| 선형 | INL/DNL 오차, 미싱 코드 |
⚠️ 멀티플렉스 ADC의 메모리 효과: 이전 채널의 전압이 샘플링 커패시터(capacitor)에 남아 있어, 다음 채널이 그 값에서 출발합니다. 두 채널의 전압 차가 크면 획득 시간이 더 필요합니다. 최악의 경우(풀스케일 → 0)를 기준으로 설계하세요.
연습문제
문제 1. = 8 pF, = 1.5 kΩ, 소스 임피던스 20 kΩ. 10비트 획득 시간은?
풀이
tau시정수time constantsmu이동도mobilitym²/V·st_acq획득 시간acquisition times문제 2. 1 MΩ 분압기 출력을 ADC로 읽습니다. 100 nF 커패시터를 달면 되나요?
exercises/10-03-1meg-adc.yaml풀이
전하 공유 오차는 해결됩니다:
C_ext외부 커패시터external capacitorFC_sample샘플링 커패시터sampling capacitorF✅
하지만 재충전 시정수:
tau시정수time constants응답이 극도로 느려집니다. (는 1M∥1M = 500 kΩ)
| 용도 | 가능? |
|---|---|
| 배터리 전압 (분당 1회) | ✅ 가능 |
| 온도 (초당 1회) | ✅ 가능 |
| 50 Hz 이상 신호 | ❌ 불가 |
빠른 신호라면 버퍼가 필수입니다. 또는 분압 저항을 10 k/10 k로 낮추세요 (소비 전류가 100배 늘지만 가 500 µs로 개선).
문제 3. 8채널 멀티플렉스 ADC로 8개 센서를 읽습니다. 채널 1은 3.0 V, 채널 2는 0.1 V인데, 채널 2를 읽으면 0.15 V로 나옵니다. 원인과 해결책은?
exercises/10-03-mux-crosstalk.yaml풀이
원인: 메모리 효과 (획득 시간 부족)
채널 1의 3.0 V가 샘플링 커패시터에 남은 상태에서 채널 2로 전환됩니다. 커패시터를 3.0 V → 0.1 V로 방전시켜야 하는데, 획득 시간이 부족해 0.15 V에서 멈춘 것입니다.
필요한 정확도 확인: 12비트, 3.3 V 범위에서 1 LSB = 0.8 mV. 0.05 V 오차는 62 LSB입니다.
tau시정수time constants해결책:
- 획득 시간 늘리기 ← 가장 간단. MCU 설정에서 샘플링 사이클 증가
- 소스 임피던스 낮추기 — 각 채널에 버퍼 또는 낮은 임피던스 분압
- 각 채널에 커패시터 (100 nF) — 채널마다 전하를 준비해둠 ✅ 효과적
- 더미 변환 — 채널 전환 후 한 번 버리고 두 번째 값을 사용 (간단하고 효과적)
- 채널 순서 최적화 — 전압이 비슷한 채널끼리 인접하게 배치
가장 실용적: 채널 전환 후 첫 변환을 버리기 + 채널마다 커패시터. 펌웨어 한 줄과 부품 몇 개로 해결됩니다.
이전 ← 02 버튼과 디바운싱 | 다음 → 04 안티에일리어싱