본문 바로가기

배움의 즐거움/하드웨어

ATmega128로 배우는 마이크로컨트롤러 프로그래밍(8) 아날로그-디지털 변환

반응형

10.1 ATmega128의 ADC

아날로그 데이터를 디지털 데이터로 변환하는 장치를 아날로그-디지털 변환기(Analog-Digital Converter, ADC)라고 한다. 마이크로컨트롤러는 아날로그 값을 입력받아 ADC를 거쳐 디지털 데이터로 변환한 후 마이크로컨트롤러 내의 CPU에서 처리한다.

출처: ATmega128로 배우는 마이크로컨트롤러 프로그래밍

ATmega128은 10비트 해상도의 ADC를 포함하고 있는데, 이는 입력되는 전압을 0에서 1,023(2의 10승 - 1) 사이의 디지털 값으로 변환할 수 있다는 것을 의미한다. ADC 채널은 8개로, 8개의 아날로그 출력장치를 ATmega128에 연결할 수 있지만, 8개의 채널은 하나의 AD 변환기 멀티플렉서(MUX)에 연결되어 있으므로 한 번에 하나의 아날로그 입력만 디지털로 변환할 수 있다.

아날로그 전압을 디지털 값으로 변환하는 과정에서 기준전압이 필요한데 이는 AD 변환에서 최댓값으로 변환되는 전압을 의미한다. 기준 전압으로는 AVCC(Analog VCC), AREF(Analog Reference), 내부 2.56V 중 하나를 선택하여 사용할 수 있다. 일반적으로 AVCC에는 VCC와 동일하게 5V가 가해지는데, 5V 이외에 전압을 사용하고 싶다면 AREF에 5V 이하의 전압을 연결하면 된다.

기준 전압을 5V로 설정하였다면 5V/1023 = 4.89mV의 차이를 인식할 수 있게 된다. 

출처: ATmega128로 배우는 마이크로컨트롤러 프로그래밍

 ATmega128의 ADC는 축차비교 방식을 사용하는데, 이는 우선 변환될 디지털 값의 모든 비트를 0으로 설정한 후 아날로그 입력값과 현재 디지털 값을 비교하면서 각 비트의 값을 결정하는 방식이다. 이러한 방식으로 입력 전압과 같거나 같은 가장 근사화된 값을 출력하는데 이렇게 얻어진 값은 실제 값과는 차이가 있을 수 있다. 그 이유는 ADC의 해상도 뿐만 아니라 잡음, 아날로그 신호의 좁은 전압 범위 등등이 있다.

그 이유가 낮은 해상도일 경우는 더 높은 해상도의 ADC를 사용함으로써 해결할 수 있다.

그 원인이 잡음에 의한 경우에는 차동 입력을 통해 해결할 수 있다. 단일 입력의 경우 신호의 크기와 접지(GND) 값을 비교하는 반면, 차동 입력의 경우 2개의 입력 핀(+,-)으로 신호를 입력받아 이들의 차이를 ADC의 입력으로 받아들이는 방식이다. 

출처: ATmega128로 배우는 마이크로컨트롤러 프로그래밍

단일 입력의 경우 잡음이 들어오면 ADC에 그대로 반영되지만 차동 입력의 경우 2개의 입력에 공통으로 잡음이 들어오면 상쇄되는 효과를 얻을 수 있다. 또한 단일 입력은 GND를 기준으로 하기 때문에 디지털 0의 값에 대응하는 값이 무조건 0V인 반면, 차동입력의 경우 디지털 0에 대응하는 값을 2개의 입력 중 하나로 지정할 수 있다.

마지막으로 아날로그 신호의 범위가 좁아 디지털 데이터가 부정확한 경우에는 신호 증폭 기능을 사용하면 된다. 단 증폭 기능은 차동 입력을 사용하는 경우에만 지원하며 10배와 200배 증폭이 가능하다. 증폭 비율을 이득(gain)이라고 한다.

출처: ATmega128로 배우는 마이크로컨트롤러 프로그래밍

이 외에도 AD 변환 과정에서 시간이 많이 걸린다는 점을 주목해야 한다. ATmega128은 16 MHz로 동작하는데, 디지털로 변환된 10비트의 결과를 얻기 위해서는 많은 단계와 복잡한 연산이 필요하므로 16 MHz의 속도로는 동작할 수 없다. 그래서 메인 클록의 속도를 낮추어 사용하는데 이때 필요한 것이 위에 그림에서 보이는 분주기이다.

채널 전환 시 주의사항

2개 이상의 아날로그 입력을 사용하는 경우, 아날로그 값을 출력하는 센서를 2개 사용하고자 한다면 2개의 AD 변환기를 사용해야 한다. 하지만 ATmega128에는 하나의 AD 변환기만 존재하고, 8개의 아날로그 입력을 사용할 수는 있지만 8개의 채널이 모두 멀티플렉서로 묶여있기 때문에 한 번에 하나씩만 읽어 들일 수 있다.

그렇기 때문에 2개의 아날로그 값을 읽어 들이기 위해서는 먼저 하나의 값을 읽고 채널을 전환한 후, 두 번째 아날로그 값을 읽어 들이는 것을 반복해야 한다. 이때 주의할 점은 채널 전환에 시간이 필요하다는 점이다. 채널 전환 명령을 실행한 후 약간의 대기시간을 두어 회로가 안정화되기를 기다려야 하므로 채널이 전환된 이후 처음에 AD 변환된 값은 버리고 두 번째 읽은 값을 사용하는 것이 안전하다.

10.6 요약

ATmega128에는 10비트 해상도의 8 채널로 구성된 ADC를 가지고 있는데, 10비트 해상도에서는 0에서 1,023 사이의 값을 반환하므로 5V 기준 전압으로 4.89mV의 전압 차이를 인식할 수 있다. 해상도가 높은 별도의 ADC 칩을 사용하여 더 낮은 전압차이를 구분할 수도 있다. 

ATmega128의 8채널 ADC에는 8개의 아날로그 입력이 가능하지만 실제 아날로그-디지털 변환장치는 하나뿐이므로 한 번에 한 개씩만 변환이 가능하다. 그러므로 아날로그 입력을 두 개 이상 사용하는 경우 채널을 전환하고 안정되는 시간이 필요하다. 또한 아날로그 변환의 결과는 10비트이므로, 변환 결과를 얻는 시간 역시 디지털 데이터를 처리할 때와 비교해서는 느릴 수밖에 없다.

반응형