본문 바로가기

기술

ADC는 전압을 어떻게 숫자로 바꿀까: 코드 간격·입력 범위·포화 읽기

반응형

계측 프로그램에 0.3125 V라는 숫자가 표시됐을 때, 센서가 바로 그 전압을 내보냈다고 생각하기 쉽다. 하지만 ADC를 거쳐 얻은 값이라면 같은 숫자로 표시되는 입력 구간이 있고, 프로그램이 어떤 기준으로 코드를 전압으로 환산했는지도 함께 확인해야 한다.

ADC는 Analog-to-Digital Converter의 약자로, 아날로그 입력을 유한한 디지털 코드로 바꾸는 회로다. 실제 계측에서는 센서의 신호를 증폭하거나 감쇠하고 필터에 통과시킨 뒤 ADC에 넣는 경우가 많다. 파일에 저장한 전압도 이런 경로에서 얻은 코드를 기준 전압·입력 범위·보정식으로 환산한 결과다.

Open Tech Bench의 ADC 변환 원리 글을 바탕으로 작은 3 bit 모델부터 계산해 보자. 코드가 만들어지는 구간과 그 코드를 화면에서 읽는 방법을 구분하면, bit 수가 큰 장비에서도 무엇이 세밀해지고 어떤 오차가 남는지 생각하기 쉬워진다.

bit 수를 읽기 전에 전체 입력 폭을 확인한다

16 bit ADC는 이상적으로 2¹⁶ = 65,536개의 코드를 표현한다. 입력을 65,536개의 구간으로 나눌 수 있다는 뜻이지만, 이 숫자만으로 센서부터 화면까지의 정확도가 정해지지는 않는다. 코드를 나누는 전압 폭과 실제 신호 경로의 오차가 아직 남아 있다.

전체 입력 폭을 Vspan, bit 수를 b라 하면 이상적인 코드 간격은 q = Vspan/2ᵇ로 계산한다. 이 q를 1 LSB에 해당하는 전압 간격으로 읽는다. 먼저 분자에 어떤 전압 폭을 넣는지부터 확인해 보자.

±10 V 범위는 −10 V부터 +10 V까지이므로 전체 폭은 20 V다. 16 bit에서 q는 20/65,536 ≈ 0.000305176 V, 즉 약 305.176 μV가 된다. 양의 상한 10 V만 분자로 넣으면 실제 전체 폭을 절반으로 계산하게 된다.

0~10 V 범위에서는 전체 폭이 10 V이므로 같은 16 bit라도 약 152.588 μV가 된다. 같은 bit 수를 적은 두 장비의 코드 간격이 다를 수 있는 이유다. 범위를 비교할 때 양극성인지 단극성인지와 입력 단자에 걸리는 전압의 정의까지 맞춰야 한다.

입력 범위 설정이 실제 ADC 앞의 증폭률을 바꾸는 장비도 있다. 이때는 코드 간격뿐 아니라 잡음과 대역폭, 과부하 여유도 함께 달라질 수 있다. 이상적인 나눗셈으로 구한 값은 출발점이고, 실제 범위별 사양은 따로 읽게 된다.

0~1 V를 3 bit로 나누면 같은 코드가 되는 전압들이 생긴다

숫자가 많으면 구간을 따라가기 어려우니 0~1 V를 3 bit, 즉 여덟 구간으로 나누는 모델을 생각해 보자. 전체 폭 1 V를 8로 나누면 q = 0.125 V다. 여기서는 입력을 q로 나눈 뒤 내림하고, 코드가 0~7 안에 있도록 제한한다.

예를 들어 0.30 V를 넣으면 0.30/0.125 = 2.4이므로 코드 2가 된다. 0.36 V를 넣어도 0.36/0.125 = 2.88을 내림하면 같은 코드 2다. 이 모델에서 코드 2는 0.250 V 이상, 0.375 V 미만의 구간에 해당한다.

컴퓨터에는 코드 2를 이진수 010으로 저장할 수 있다. 여기서 010이라는 숫자만 받으면 원래 입력이 0.30 V였는지 0.36 V였는지는 알 수 없다. 두 입력이 같은 구간으로 들어왔기 때문이다.

코드 0은 0 V 이상 0.125 V 미만, 코드 1은 0.125 V 이상 0.250 V 미만이다. 이런 식으로 올라가 코드 7은 0.875 V부터 상한 1 V까지의 마지막 구간을 맡는다. 경계에 정확히 놓인 입력을 어느 코드로 보낼지도 모델의 정의에 포함된다.

아래 그림은 이 구간과 구간 중앙의 전압 환산값을 함께 나타낸 것이다. 실제 ADC의 전이 위치를 측정한 자료는 아니며, 내림으로 구간을 선택하고 중앙값으로 환산하는 교육용 모델을 계산했다. 뒤에서 다룰 반올림 모델과도 전이 위치가 다르므로 조건을 구분해서 읽는다.

3 bit ADC 모델의 코드 구간 중앙값과 입력 포화 계산

LSB를 무조건 검출할 수 있는 최소 변화라고 부르면 이 구간 경계를 빠뜨리기 쉽다. 같은 구간 안에서는 꽤 다른 입력도 같은 코드가 되지만, 경계 바로 양쪽에 놓인 입력은 아주 조금 달라도 다른 코드로 바뀐다. 실제로는 잡음까지 섞이므로 반복 관측했을 때의 코드 분포도 함께 보게 된다.

코드의 대표 전압과 입력 범위 끝점은 다르다

앞의 3 bit 모델에서는 각 구간의 중앙을 대표 전압으로 사용해 보자. 코드 k의 환산값은 (k + 0.5)q이므로 코드 2는 2.5 × 0.125 = 0.3125 V가 된다. 입력이 0.30 V였든 0.36 V였든 화면은 이 대표값을 표시한다.

환산값에서 실제 입력을 뺀 오차를 계산하면, 0.30 V에서는 +0.0125 V이고 0.36 V에서는 −0.0475 V이다. 코드가 같아도 원래 입력이 구간 안 어디에 있었는지에 따라 오차의 크기와 부호가 달라진다.

정상 입력 범위 안에서 이 중앙값 모델의 오차 크기는 반 구간인 0.0625 V 이내다. 이것은 방금 정의한 이상 모델에 관한 경계다. 실제 ADC의 오프셋이나 잡음, 비선형성까지 더한 전체 오차가 그 안에 들어간다는 의미로 사용해서는 안 된다.

코드 0의 중앙값은 0.0625 V이고 마지막 코드 7의 중앙값은 0.9375 V이다. 0과 7을 억지로 0 V와 1 V에 맞춰 환산하면 코드당 간격이 1/7 V가 되어, 처음 정한 여덟 구간의 중앙값과 다른 눈금이 된다.

실제 제품은 코드 전이와 환산값을 다른 관례로 정의할 수 있다. 따라서 전체 폭을 나누어 LSB를 구하는 계산과, 받은 raw code를 전압으로 변환하는 식을 구분해서 확인한다. 데이터시트나 드라이버가 제공하는 보정 계수를 쓰는 이유도 여기에 있다.

양극성 입력에는 부호 표현도 필요하다. 오프셋 바이너리와 2의 보수는 비트열을 전압의 양수·음수에 대응시키는 방법이 다르다. 음전압의 코드를 부호 없는 정수로 읽으면 큰 양수처럼 보일 수 있으므로, 코드 형식과 전압 환산을 함께 확인해야 한다.

입력 범위를 넘으면 반 코드 오차라는 설명을 적용할 수 없다

같은 모델에 1.20 V를 넣으면 어떨까? 출력 코드는 상한인 7로 제한되고 중앙 환산값은 여전히 0.9375 V다. 이때 환산 오차는 0.9375 − 1.20 = −0.2625 V로, 정상 범위에서 계산한 반 구간보다 훨씬 크다.

입력이 범위를 넘으면 원래 진폭을 표현할 코드가 부족해진다. 파형의 위나 아래가 평평하게 잘리는 클리핑도 이런 입력 한계와 연결해서 살펴볼 수 있다. 다만 실제 측정 경로에서는 ADC 앞 증폭기나 다른 회로가 먼저 포화할 수도 있어 ADC 코드만으로 어느 부품에서 잘렸는지까지 확정하기는 어렵다.

bit 수를 높이면 정상 범위 안의 코드 간격은 좁아지지만, 같은 입력 범위를 넘긴 부분이 되살아나는 것은 아니다. 높은 진폭에서 문제가 생겼다면 감쇠·증폭률·범위와 정격을 먼저 확인하고, 과부하 플래그나 회복 시간을 제공하는지도 살펴보자.

DC offset이 있는 신호에서는 AC 진폭만 보면 입력 여유를 잘못 판단할 수 있다. 예를 들어 0.7 V의 DC 위에 0.4 V peak 사인파가 더해지면 최대 1.1 V에 이른다. 0~1 V 범위를 쓴다면 상한을 넘으므로, 신호 전체의 최소·최대값으로 범위를 검토해야 한다.

범위를 충분히 크게 잡으면 과부하 여유는 늘지만 작은 신호가 사용하는 코드 수는 줄어든다. 반대로 범위를 좁힐 때는 정상 운전의 진폭뿐 아니라 시작 과도현상과 예상 충격도 고려한다. 단순히 가능한 가장 작은 범위를 고르는 문제로 끝내기 어려운 이유다.

화면에 표시되는 측정 범위와 입력 단자의 손상 방지 정격도 구분해야 한다. 교육용 포화 모델을 재현하려고 실제 장비의 허용 전압을 넘겨서는 안 된다. 과부하의 모양은 먼저 계산으로 비교하고, 실물 시험은 지원되는 정격과 연결 조건 안에서 계획한다.

더 촘촘한 코드를 얻어도 신호 경로의 오차는 남는다

기준 전압은 코드 눈금의 크기를 정하는 데 관여한다. 이 기준이 변하거나 전단 증폭기에 영점 오차가 있으면, 같은 센서 입력도 다른 코드로 읽힐 수 있다. 변환 결과를 더 많은 bit로 저장한다고 해서 눈금이나 영점이 어긋난 원인이 없어지지는 않는다.

오프셋 오차는 영점이 옮겨가는 모습으로, 이득 오차는 입력에 대한 출력 기울기가 달라지는 모습으로 생각할 수 있다. 코드별 폭이 이상적인 간격에서 얼마나 다른지는 DNL, 전체 전이 특성이 기준 선에서 얼마나 벗어나는지는 INL로 살펴본다. 이 사양들은 이상적인 LSB 계산과 별도로 읽는다.

입력이 잡음 때문에 흔들리면 비슷한 전압에서도 인접한 코드가 번갈아 나올 수 있다. 평균을 내면 표시 숫자는 더 세밀해질 수 있지만, 입력이 같은 코드에 완전히 고정돼 있다면 같은 숫자를 여러 번 더해 나누어도 구간 안의 위치를 새로 알게 되지는 않는다.

잡음과 표본의 조건이 적절할 때 평균에서 추가 정보를 얻을 수는 있다. 그 경우에도 시간에 따라 변하는 영점이나 교정 오차가 독립적인 랜덤 잡음처럼 줄어든다고 가정하면 곤란하다. 평균 횟수와 관측 시간을 늘렸을 때 실제로 무엇이 안정되는지 확인해야 한다.

ADC가 새로운 값을 내보내는 속도와 입력 경로의 정착도 함께 본다. 여러 채널을 순차 전환한다면 큰 전압을 읽은 뒤 작은 전압을 읽는 과정에서 충분히 정착할 시간이 필요한 경우가 있다. 입력이 DC라는 이유만으로 최고 속도에서도 같은 정확도를 기대할 수는 없다.

SAR와 시그마 델타 같은 구조도 이런 요구와 연결해 살펴보자. SAR는 입력을 잡아 비교를 반복하고, 시그마 델타는 내부 처리와 잡음 성형·디지털 필터를 함께 사용한다. 구조 이름만으로 우열을 정하기보다 필요한 대역·출력률·잡음·정착·지연에서 실제 사양이 맞는지 확인한다.

16·18·24 bit와 ENOB를 비교할 때는 시험 조건을 맞춘다

아래 ADC 분해능 글은 같은 범위에서 bit 수를 바꾸면 코드 간격이 얼마나 달라지는지 계산한다. ±10 V, 즉 전체 폭 20 V에서 16 bit는 약 305.176 μV, 18 bit는 약 76.294 μV, 24 bit는 약 1.192 μV다.

이 수치들은 이상 코드 간격이므로 24 bit 장비의 절대 전압 오차가 1.192 μV라고 읽을 수는 없다. 만약 같은 대역의 입력 잡음이 수십 μV RMS라면, 훨씬 촘촘한 코드로 저장하더라도 단일 샘플에서 작은 변화를 안정적으로 판단하기 어렵다.

ENOB는 정현파 시험에서 얻은 잡음과 왜곡을 이상 ADC의 bit 수에 대응시키는 동적 지표다. 정해진 풀스케일 정현파 조건에서 흔히 사용하는 식은 ENOB = (SINAD − 1.76)/6.02이며, SINAD는 기본파와 잡음·왜곡 잔류의 비를 dB로 표현한 값이다.

예를 들어 SINAD가 86 dB라면 (86 − 1.76)/6.02 ≈ 13.99 bit다. 16 bit 코드로 출력되는 장비라도 해당 입력 주파수와 진폭, 분석 대역에서 얻은 잡음·왜곡 성능은 이상적인 약 14 bit에 대응할 수 있다는 뜻이다.

이 결과를 1 V DC의 절대 오차 한계로 바꿔 읽으면 시험의 의미가 달라진다. 입력 진폭이 풀스케일보다 작은지, 시험 주파수와 대역이 무엇인지, 필터와 왜곡 처리 정의가 같은지도 확인해야 ENOB 값을 비교할 수 있다.

아래 글에는 이상 양자화 잡음을 q/√12로 나타내는 조건과, 한 코드보다 작은 변화·평균의 관계도 담겨 있다. 고정 DC가 한 구간에 머무르는 경우까지 언제나 균등한 양자화 잡음으로 볼 수는 없으므로, 단일 숫자보다 그 식이 성립하는 입력 조건을 함께 읽어보자.

 

ADC 분해능이란? 16·18·24 bit와 ENOB·노이즈의 차이 | OPEN TECH BENCH

ADC bit 수와 이상 코드 간격, ENOB, 입력 잡음을 구분하고 같은 범위의 16·18·24 bit 계산 및 SINAD 예제로 실제 성능 비교 조건을 설명합니다.

opentechbench.com

범용 신호 Bench에서는 범위별 코드 간격과 포화를 따로 읽는다

아래 범용 아날로그 신호 Bench는 함수발생기·기준 계측기·DAQ로 시험을 구성하는 방법과 합성 계산 자료를 제공한다. 실제 장비를 연결해 얻은 측정 결과나 ADC의 ENOB 성적서는 아니며, 샘플링·양자화·클리핑을 나누어 비교하는 페이지다.

실행 B는 1 mV DC를 같은 16 bit 모델로 읽으면서 범위를 ±10 V, ±1 V, ±0.1 V로 바꾼다. 코드 간격은 각각 약 305.176 μV, 30.518 μV, 3.052 μV가 된다. 같은 bit 수에서 전체 폭이 10분의 1로 줄 때 코드 간격도 10분의 1이 되는 계산이다.

이 실행은 전압을 q로 나눈 뒤 반올림해 다시 q를 곱하는 모델을 사용한다. 앞에서 설명한 내림·구간 중앙 모델과는 환산 관례가 다르다. 범위별 표를 비교하기 전에 어떤 코드 경계를 가정했는지 확인해 보자.

1 mV 입력의 계산 출력은 ±10 V에서 약 915.527 μV, ±1 V에서 1,007.080 μV, ±0.1 V에서 1,000.977 μV다. 오차 부호가 달라지는 것은 각 눈금에서 반올림되는 위치가 달라지기 때문이다. 모든 입력에서 오차가 일정 비율로 줄어든다고 보기보다, 이상 반올림 오차의 경계 q/2가 어떻게 작아지는지 살펴보면 좋다.

실행 C는 1 V peak, 50 Hz 사인파를 ±0.5 V에서 대칭으로 제한한다. 10 kS/s로 1초 동안 계산한 원신호 RMS는 약 0.707107 V이고, 잘린 파형은 약 0.442138 V다. 두 번째 값은 그 잘린 샘플들을 제곱 평균해 구한 결과다.

잘린 peak 0.5 V를 √2로 나누면 약 0.353553 V가 되지만, 이 파형은 정현파가 아니어서 그 관계를 적용할 수 없다. RMS가 달라지는 이유를 분석식 오류로만 보기 전에 실제 시간 파형과 범위 제한을 함께 확인해 보자. 이 실행은 양자화·잡음·필터를 제외해 클리핑 효과를 분리한 계산이다.

페이지의 CSV와 조건 표를 함께 읽으면 같은 데이터에서 주파수 접힘, 코드 간격, RMS 변화를 구분해 볼 수 있다. 실물로 이어갈 때는 입력 단자에 실제 걸리는 전압을 기준 계측기로 확인하고, 장비가 제공하는 것이 raw code인지 보정·필터된 전압인지도 기록한다. 아래 Bench에서 실행 B의 범위별 표와 실행 C의 합성 파형을 차례로 비교해 보자.

 

범용 아날로그 신호 Bench: 샘플링·ADC·필터·FFT·트리거 검증

샘플링·입력 범위·필터·창 함수·트리거를 같은 범용 신호 경로로 시험하고, 조건이 명시된 합성 CSV와 계산 응답을 비교합니다.

opentechbench.com

반응형