이번에 LM35Z를 이용한 온도 변화를 감지하는 회로를 구성하게 될텐데, LM35DZ가 온도 변화를 아날로그로 출력합니다. 따라서 이를 디지털로 변환하기 위해서는 ADC가 필요한데, 비록 128에 ADC가 있기는 합니다만, ADC를 일부러 구현해 보려고 합니다. LM35를 ADC가 없는 PIC에 장착하려면 장착할수가 없잖아여.
당근이가 고려하는 ADC로는 온도 변화에 따른 정밀한 ADC가 필요합니다. 그런데 온도 변화는 영상처리와 같은 고속 샘플링이 불필요하므로 (초당 온도가 몇도씩 변하는 경우는 거의 없으니까요) 약간의 정밀도만 유지하면 됩니다. 8 bit로도 왠지 충분할듯 합니다. 이제 ADC 선택시 무엇이 중요한 문제인지에 대해서 좀 고찰해 보도록 하겠습니다. (ADC가 무언지 모르면 대략 낭패.. ^^)
A/D Convertor시 유의사항
1. conversion time or sampling rate : 변환 시간 혹은 샘플링 속도
Analog Data 한개를 Digital Data 한개로 변환하는데 걸리는 시간을 conversion time이라 합니다. 당연히 빠른 시간내에 아날로그 데이터를 디지털로 바꿔줄수 있는 것이 좋기는 하지만 가격이 비싸므로 적절한 것을 선택하면 됩니다. 예를 들어 온도나 수위 조절은 에지간히 느린 ADC라도 충분히 아날로그 데이터를 디지털로 바꾸어 줄수 있으므로 일부러 빠른것을 채택할 필요는 없습니다.
언제나 말씀드리지만 속도(혹은 어떤 값)는 상대적인 것입니다. 열심히 자전거를 타는 사람에게 20km/h는 빠른 속도이기는 하지만, 자동차는 엉금엉금 가도 20km/h 보다는 훨씬 빠릅니다. 또, 자동차를 타는 사람이 자전거를 타는 사람을 보기에는 느려터질 정도로 답답한것이 사실이지만, 비행기가 자동차를 본다면 느려보이기는 역시 마찬가지 입니다.
이와 비슷한 예로 변환 시간이 1 msec 걸리는 것이 매우 느리기는 하지만, 온도 변화가 아무리 빠르다고 해도 1 sec 걸린다면 1 msec로도 충분히 이를 소화해 낼수 있는것과 마찬가지입니다. 중요한 것은 언제나 목적에 맞는 방법을 세운다는 것이죠.
대부분의 ADC는 아날로그 데이터의 값이 모두 디지털로 바뀌면 이를 알려주는 인터럽트 단자가 있습니다. 만일 마이컴으로 제어한다고 하면 이 인터럽트 단자를 폴링 혹은 인터럽트로 읽어들인후 디지털 값을 읽어들이면 되겠습니다.
2. resolution : 분해능
분해능이란 아날로그 데이터 값을 최소한의 디지털 값으로 변환할수 있는 능력을 말합니다. 이렇게 설명하면 이해하기가 곤란하므로 간단하게 예로 들어 봅니다.
예를 들어 0V-0.5V 사이의 전압을 4 bit의 ADC로 읽어들일 경우와 10 bit 로 읽어들일 경우에 분해능을 비교해 봅시다.
n 비트 AD 컨버터의 경우 디지털 데이터의 출력 범위는 0 - 2^n-1 이므로 4 bit의 경우는 0 - 15, 10 bit의 경우 0 - 1023 으로 나눌수 있습니다. 즉, 4 bit는 0-5V 사이의 전압을 5/2^4 = 0.3125V의 단위로 나타낼수 있고, 10 bit는 5/2^10 = 0.0048828125 의 단위로 나타낼수 있습니다. 후자가 당연히 전압의 변화에 따른 민감한 변화를 디지털 데이터의 값으로 알아낼수 있습니다. 따라서, 분해능의 값은 AD의 bit수에 좌우 하므로 bit수가 높으면 높을수록 "분해능이 좋다"라고 얘기합니다.
따라서 분해능이 높으면 높을수록 좋은것은 당연한 이치입니다. 그러나, 분해능이 좋을수록 가격이 비싸지므로 어느 경우에나 분해능을 매우 높일 필요는 없습니다. 아까 언급했지만, 1 초 단위로나 간신히 변하는 온도를 측정하기 위해서 수십 나노초 단위로 미세하게 체크하는 분해능을 가질 필요는 없다는 말이죠. 또한, 이 데이터가 많아질수록 이를 받아들이는 쪽에서도 부담이 됩니다. 예를 들어 8 bit MCU에 32 bit Digital Data 값을 전송하려면 4번씩 나누어 써주게 될 문제가 발생할수도 있습니다. 따라서, 이 분해능도 사용 목적에 따라 적절하게 선택해야 할것입니다.
3. Sample/Hold or Track/Hold
입력 신호인 아날로그 데이터가 디지털 데이터로 변환하는 중에 기준 값이 변환하게 된다면 출력 역시 불안정한 값이 되게 됩니다. 예를 들어 0-5V 사이를 10 bit ADC로 측정하는 경우 128은 Aref라는 단자를 기준 전압 혹은 입력 전압으로 인식하는데, 이 입력 전압이 항상 5V를 유지하면 상관이 없겠지만 (가변저항으로 이 전압을 내렸다 올렸다 하여 ADC를 테스트 해보았습니다) 전류기(라고 해야 하나, POWER라고 해야 하나.. 우리는 걍 "밥"이라고 하는데 말이죠)의 출력을 통해 나오는 전압 자체가 약간씩 흔들리기 때문에 입력 전압 자체가 불안정 하므로 당연히 출력되는 디지털 데이터도 불안정 합니다.
완벽하게 이상적인 경우야 0V로 만들때 ADC가 0이 나오고, 5V 일때 ADC가 1023로 나오는 거겠지만, 이런 경우는 거의 없습니다. 그렇다고 해도, 0V 일때 300 이상이 나온다거나, 5V 인데도 800도 안나오지도 않습니다. 실상이 불안정하다고 해도 머 봐줄만 합니다.
이런 현상을 방지하기 위해서 입력 전압을 Sample/Hold 혹은 Track/Hold 라는 회로를 붙입니다. 이 회로의 원리는 입력 전압을 컨덴서로 충전해 놓았다가, 입력을 끊고 컨덴서의 방전되는 전압을 입력전압으로 넣어줘서 불안정한 입력 전압을 극복하는 방법입니다.
제가 쓰는 회로는 Aref를 걍 Vcc에 물려놓았고요. 보통은 인덕터와 커패시터를 조합해서 붙인다고 합니다. 이렇게 자세하게 까지는 저도 잘 모르겠습니다. ㅠㅠ
어쨌거나, 입력 전압의 불안정함을 막기위해 S/H, T/H가 중요하다고 하니 잘 알아둡시다.
끝으로 ADC의 종류로는 병렬 비교형, 축차 비교형, 단순 계수형, 적분형이 있다고 합니다. 이거는 다음에 알아보도록 하지요. ^^
참고로, 위에서도 언급했지만 입력값(전압이 됐던 전류가 됐던) 자체가 잡음을 포함하고 있으므로 센서를 통해서 읽은 값을 AD 컨버터를 거치기 적진에 Filter 혹은 Amplifier를 통해 넣어준다고 합니다. 그러나, MCU가 매우 빠른 DSP 같은 경우는 중간의 하드웨어 적인 필터를 넣지않고, 불안정하게 읽은 데이터 자체를 소프트웨어 적인 필터를 거칠수도 있습니다.