DAC — 구조와 글리치

한 줄 요약 — DAC 의 정확도는 저항 정합이 정하고, 파형의 깨끗함은 글리치가 정합니다. 둘은 서로 다른 문제이고 대책도 다릅니다.


세 가지 구조

구조원리정확도속도어디에
R-2R저항 사다리로 전류 분배저항 정합이 정함빠름범용, 내장 DAC
전류 스티어링가중 전류원을 켜고 끔전류원 정합가장 빠름고속 (통신·영상)
ΔΣ1비트를 빠르게 + 필터가장 높음느림오디오, 정밀 기준
PWM + LPF듀티비 → 평균시간 분해능분해능 resolutionADC 가 구분할 수 있는 가장 작은 전압 차이로, 비트 수와 기준전압으로 정해집니다.1 LSB=Vref/2n1\,\mathrm{LSB} = V_{ref}/2^n자세히 보기 →이 정함느림싸게 때울 때

R-2R — 왜 두 값만 쓰는가

NN 비트에 2N2^N 가지 저항을 쓰면 정합이 불가능합니다. R-2R 은 RR 과 2R2R 두 값만으로 이진 가중을 만듭니다.

핵심은 사다리의 어느 지점에서 보아도 오른쪽이 항상 RR 이라는 것입니다.

끝에서 시작: 2R 과 2R 이 병렬 = R그 앞의 직렬 R 을 더하면 2R다시 옆의 2R 과 병렬 → R이 패턴이 무한히 반복된다어느 마디에서 보아도 오른쪽은 R

그래서 각 마디를 지날 때마다 전류가 정확히 반씩 갈라집니다.

Vout=Vref∑k=0N−1bk2N−k=Vref⋅D2NV_{out} = V_{ref}\sum_{k=0}^{N-1}\frac{b_k}{2^{N-k}} = V_{ref}\cdot\frac{D}{2^N}
기호
D듀티비duty cycle
k결합 계수 또는 상수coupling coefficient or constant
N개수count
V_out출력 전압output voltageV
V_ref기준 전압reference voltageV

저항의 절대값은 상관없습니다. RR 이 10 k 든 100 k 든 비만 맞으면 됩니다 — 이것이 IC 안에서 만들기 쉬운 이유입니다.

정확도는 정합이 정합니다

NN 비트 정확도를 얻으려면 저항 비가 2−N2^{-N} 수준으로 맞아야 합니다.

비트필요한 저항 정합
80.4%
120.024%
160.0015%

개별 저항으로는 12비트가 한계입니다. 그 위는 같은 칩 위에 만들어 레이저 트리밍하거나, 아예 ΔΣ 로 갑니다.

💡 01 값을 정하는 순서의 차동 증폭기 CMRR 이야기와 같은 구조입니다 — 절대값이 아니라 비가 중요하고, 그러면 같은 칩 위가 절대적으로 유리합니다.


★ 글리치 — 코드가 바뀌는 순간

정적으로는 완벽한 DAC 도 코드가 바뀌는 순간에 엉뚱한 값을 냅니다.

최악은 메이저 캐리 입니다. 0111 1111 → 1000 0000 으로 갈 때 모든 비트가 동시에 바뀝니다.

스위치가잠깐 나오는 값
MSB 가 먼저 켜짐1111 1111 → 풀스케일
MSB 가 늦게 켜짐0000 0000 → 0

1 LSB 만 올리려던 것이 풀스케일까지 튑니다.

글리치의 크기는 면적(V·s) 으로 잽니다 — 데이터시트의 glitch impulse 가 그것이고, 보통 pV·s ~ nV·s 단위입니다.

대책 셋:

방법어떻게대가
디글리처 (샘플홀드)전이 동안 출력을 붙잡아 둠부품, 자체 오차
저역통과 필터글리치를 평균해서 없앰대역폭↓
세그먼트 구조상위 비트를 온도계 코드로스위치 수↑ (칩 안에서 해결)

요즘 DAC 은 대부분 세그먼트 구조입니다. 상위 3~4비트를 이진이 아니라 온도계 코드(0001, 0011, 0111, 1111…)로 만들면 한 번에 스위치 하나만 바뀌므로 메이저 캐리가 아예 없습니다. 대가는 스위치가 2k2^k 개 필요한 것인데, 칩 안에서는 싼 비용입니다.


ΔΣ DAC — ADC 를 거꾸로

10-07 ADC 의 한계에서 본 노이즈 셰이핑을 그대로 뒤집습니다.

높은 분해능의 디지털 값예: 24비트보간 필터샘플링률을 OSR 배로 올린다ΔΣ 변조기1비트로 줄이면서 양자화 잡음을 고주파로 민다1비트 DAC스위치 하나 — 정합 문제가 없다!아날로그 LPF밀어 놓은 고주파 잡음을 버린다

1비트라서 정합 문제가 원천적으로 없습니다. 값이 둘뿐이니 “비가 맞는다” 는 말 자체가 성립하고, 그래서 24비트가 가능합니다.

Δn=2L+12log⁡2(OSR)\Delta n = \frac{2L+1}{2}\log_2(\mathrm{OSR})
기호
L인덕턴스inductanceH
n비트 수 또는 개수number of bits or count
대가왜
느림OSR 배로 돌려야 함
지연보간·데시메이션 필터의 군지연
아날로그 LPF 필수밀어 놓은 잡음을 안 버리면 그대로 나옴

PWM + 필터 — 싸게 때울 때

MCU 타이머로 PWM 을 만들고 RC 로 평균 냅니다. 부품 두 개면 됩니다.

Vout=VDD×DV_{out} = V_{DD}\times D
기호
D듀티비duty cycle
V_DD전압 (DD)voltage (DD)V
V_out출력 전압output voltageV

분해능은 타이머가 정합니다. 시스템 클럭 fsysf_{sys}, PWM 주파수 fPWMf_{PWM} 이면

N=log⁡2fsysfPWMN = \log_2\frac{f_{sys}}{f_{PWM}}
기호
f_PWM주파수 (PWM)frequency (PWM)Hz
f_sys주파수 (sys)frequency (sys)Hz
N개수count

fsysf_{sys} = 72 MHz, fPWMf_{PWM} = 20 kHz 면 N=log⁡23600=11.8N = \log_2 3600 = 11.8 비트.

리플이 문제입니다. 1차 RC 로 거른 뒤 남는 리플은

Vripple≈VDD4fPWMRCV_{ripple} \approx \frac{V_{DD}}{4 f_{PWM} RC}
기호
C정전용량capacitanceF
f_PWM주파수 (PWM)frequency (PWM)Hz
R저항resistanceΩ
V_DD전압 (DD)voltage (DD)V
V_ripple전압 (ripple)voltage (ripple)V

12비트 LSB(VDD/4096V_{DD}/4096) 아래로 만들려면

RC≥40964fPWM=409680000=51 msRC \ge \frac{4096}{4 f_{PWM}} = \frac{4096}{80000} = 51\ \mathrm{ms}
기호
C정전용량capacitanceF
f_PWM주파수 (PWM)frequency (PWM)Hz
R저항resistanceΩ

시정수 51 ms — 정착에 0.46 초 걸립니다. 12비트를 원하면 9τ=0.469\tau = 0.46 s 입니다.

⚠️ PWM DAC 은 “느려도 되는 DC 값” 에만 씁니다. 바이어스 전압, 오프셋 조정, 기준전압 미세 조정 같은 것. 파형을 만들려는 순간 리플과 정착이 동시에 발목을 잡습니다.


계산 예제 — 전극 오프셋 보정용 DAC

요구: ±300 mV 를 12비트로 보정. 갱신은 1초에 한 번이면 충분. 잡음은 측정 대역(1 kHz)에서 신호(50 µV)의 1/10 아래.

1) 분해능

1 LSB=600 mV4096=146 μV1\ \mathrm{LSB} = \frac{600\ \mathrm{mV}}{4096} = 146\ \mu\mathrm{V}
기호
mu이동도mobilitym²/V·s

⚠️ 신호가 50 µV 인데 LSB 가 146 µV 입니다. 보정 잔차가 신호의 3배 — 분해능이 모자랍니다.

되돌아가서: 보정을 두 단으로 나눕니다. 거친 보정(12비트, ±300 mV) 뒤에 미세 보정(12비트, ±10 mV) 을 더하면

1 LSB미세=20 mV4096=4.9 μV1\ \mathrm{LSB}_{미세} = \frac{20\ \mathrm{mV}}{4096} = 4.9\ \mu\mathrm{V}
기호
mu이동도mobilitym²/V·s

신호의 1/10 입니다. ✓

2) 잡음

DAC 출력 잡음이 그대로 신호에 더해집니다. 미세 DAC 은 ±10 mV 범위이므로 기준전압을 분압해서 만드는데, 그 분압 저항의 열잡음열잡음 thermal noise모든 저항이 온도 때문에 내는 피할 수 없는 잡음으로, 측정의 바닥을 정합니다.en=4kBTRe_n = \sqrt{4k_BTR}자세히 보기 → 을 봐야 합니다.

10 kΩ 이면 12.8 nV/√Hz × √1570 = 0.5 µV — 신호의 1% 입니다. ✓ (100 kΩ 이면 1.6 µV 로 3% — 경계입니다.)

3) 구조 선택

후보판정
PWM + RC정착 0.46 s. 1초에 한 번이면 OK. 부품 2개 ✓
R-2R IC빠르지만 필요 없음
ΔΣ DAC과함

PWM 으로 갑니다. 요구가 느리므로 가장 싼 것이 맞습니다.

이것이 18-01 값을 정하는 순서의 방식입니다 — 사양이 요구를 정하고, 요구가 구조를 정합니다. 좋은 것부터 고르는 게 아니라 충분한 것 중 싼 것을 고릅니다.


시뮬레이션으로 확인

PWM DAC 의 리플과 정착 회로도R1100kΩR2100kΩ2단V1C1470nFC2470nFPWMMIDOUTGND
PWM DAC 의 리플과 정착워크벤치에서 열기 →
# examples/10-mcu-interfacing/pwm-dac-ripple.yaml
meta:
  name: PWM DAC 의 리플과 정착
  lesson: docs/10-mcu-interfacing/08-dac.md
  note: R1·C1 을 키우며 리플이 줄고 정착이 느려지는 것을 같이 본다
components:
  - {ref: V1, type: vpulse, params: {v1: 0, v2: 3.3, td: 0, tr: 10n, tf: 10n, pw: 25u, per: 50u}}
  - {ref: R1, type: r, value: 100k}
  - {ref: C1, type: c, value: 470n}
  - {ref: R2, type: r, value: 100k, label: 2단}
  - {ref: C2, type: c, value: 470n}
nets:
  PWM: [V1.p, R1.1]
  MID: [R1.2, C1.1, R2.1]
  OUT: [R2.2, C2.1]
  GND: [V1.n, C1.2, C2.2]
analyses:
  - {type: tran, tstep: 1u, tstop: 500m}

2단으로 나눈 이유: 같은 총 시정수에서 리플이 훨씬 작습니다. 1단 RCRC = 47 ms 하나보다 2단 23.5 ms 두 개가 20 kHz 에서 감쇠가 크기 때문입니다. MID 와 OUT 의 리플을 견줘 보면 보입니다.


⚖️ 부품 트레이드오프

선택✅⚠️
R-2R IC빠르고 예측 가능12비트 이상은 값이 뜀
ΔΣ DAC24비트, 정합 문제 없음느림, 지연, 아날로그 LPF 필요
PWM + RC부품 2개, 공짜리플 vs 정착이 정면충돌
PWM 2단 필터같은 정착에서 리플↓부품 4개
세그먼트 DAC글리치 거의 없음칩 안에서만 가능
디글리처 추가글리치 제거부품, 자체 오차

🔌 실제 쓰임새

  • 전극 오프셋 보정 — 위 예제
  • 기준전압 미세 조정 — 교정 계수를 하드웨어로
  • 자극 파형 생성 — 여기서는 글리치와 속도가 둘 다 중요
  • 테스트 신호 주입 — 시스템을 자기 자신으로 교정 (14-05)
  • 가변 바이어스 — 온도 보상

⚠️ 이상과 실제의 차이

이상실제
출력이 코드에 정확히 비례INL·DNL 이 있습니다. DNL > 1 LSB 면 코드가 빠집니다
코드가 바뀌면 바로 그 값글리치가 먼저 지나갑니다
DAC 출력이 이상적 전압원출력 임피던스가 있습니다 — 버퍼가 필요할 때가 많습니다
기준전압이 정확DAC 정확도의 상한이 기준전압 정확도입니다
PWM 은 그냥 평균리플·정착·타이머 지터가 다 들어옵니다

연습문제

문제 1. 8비트 R-2R DAC 을 1% 저항으로 만들면 실제 몇 비트가 나옵니까?

연습 10-08-1 — 1 % 저항으로 만든 8비트 R-2R 은 몇 비트인가 회로도RMSB20kΩMSB 의 2R — 여기가 전부R2B20kΩR1B20kΩR0B20kΩRA10kΩRB10kΩRC10kΩVB33.3VMSB (비트3) = 1VB20V비트2 = 0VB10V비트1 = 0VB00VLSB (비트0) = 0RT20kΩ종단B3B2B1B0N0N1N2OUTGND
연습 10-08-1 — 1 % 저항으로 만든 8비트 R-2R 은 몇 비트인가워크벤치에서 열기 →
풀이

MSB 의 오차가 가장 크게 나타납니다. MSB 가 1% 틀리면 출력이 풀스케일의 0.5% 만큼 틀립니다.

0.5%=1200⇒log⁡2200=7.6 비트0.5\% = \frac{1}{200} \quad\Rightarrow\quad \log_2 200 = 7.6\ \text{비트}

약 7.6비트 — 8비트를 못 채웁니다.

⚠️ 게다가 DNL 이 1 LSB 를 넘으면 단조성이 깨져 코드를 올렸는데 출력이 내려가는 구간이 생깁니다. 제어 루프 안에 넣으면 발진합니다.

12비트를 개별 저항으로 만들려면 0.024%(0.1% 도 부족) 이 필요한데, 그런 저항은 개당 수천 원이고 온도계수까지 맞춰야 합니다. IC 를 사는 것이 언제나 쌉니다.

문제 2. PWM DAC 의 리플을 1/10 로 줄이면서 정착 시간은 그대로 두려면?

exercises/10-08-pwm-ripple-settling.yaml
풀이

1차 RC 로는 불가능합니다 — 리플과 정착이 같은 RCRC 로 정해지니까요.

방법 둘:

① PWM 주파수를 10배로. 리플 ∝1/fPWM\propto 1/f_{PWM} 이므로 20 kHz → 200 kHz 면 리플이 1/10. ⚠️ 대가: 분해능이 log⁡210=3.3\log_2 10 = 3.3비트 줄어듭니다 (같은 시스템 클럭에서).

② 2단 필터로. 같은 총 정착 시간에서 20 kHz 감쇠가 훨씬 큽니다. 1단 −20 dB/dec 대신 2단 −40 dB/dec.

RCRC 를 각각 절반으로 나눠 두 단을 만들면 정착은 비슷하고 리플은 크게 줍니다. 부품 2개 추가로 해결되는 가장 싼 답입니다.

⚠️ 2단은 2차 시스템이므로 ζ\zeta 를 봐야 합니다. 같은 RCRC 두 단을 버퍼 없이 이으면 뒷단이 앞단을 로딩로딩 loading뒷단이 앞단에서 전류를 끌어가면서 신호가 줄어드는 현상으로, 고임피던스 신호원에서 특히 심합니다.자세히 보기 →해서 계산과 어긋납니다 — 뒷단 저항을 앞단의 10배로 하거나 사이에 버퍼를 넣습니다.

문제 3. DAC 으로 만든 자극 파형에 매 코드 전환마다 스파이크가 보입니다. 어떻게 합니까?

exercises/10-08-dac-glitch.yaml
풀이

글리치입니다. 특히 메이저 캐리(0111→1000)에서 큽니다.

대책을 순서대로:

  1. 데이터시트의 glitch impulse 확인 — 세그먼트 구조인지 봅니다. 아니면 소자를 바꾸는 것이 가장 확실합니다
  2. 출력에 LPF — 파형 대역보다 충분히 위에 놓으면 글리치만 평균됩니다. ⚠️ 자극 파형의 상승 시간도 같이 느려집니다
  3. 디글리처(샘플홀드) — 전이 동안 출력을 붙잡습니다. 정확하지만 샘플홀드 자체의 전하 주입전하 주입 charge injection아날로그 스위치를 끌 때 게이트의 전하가 신호 쪽으로 새어 나와 전압을 튀게 하는 현상입니다.자세히 보기 →이 새 오차입니다
  4. 코드 전환을 부드럽게 — 큰 점프를 여러 작은 스텝으로 나누면 메이저 캐리를 피할 수 있을 때가 있습니다

측정 회로에서는 2번이 보통 정답입니다 — 자극 파형이 그렇게 빠를 필요가 없다면, 필터로 글리치를 없애는 것이 가장 싸고 확실합니다.


이전 ← 07 ADC 의 실제 한계 | 다음 → 11장. 기생 성분