요즘에는 시험공부 모드로 과제가 살짝 중단이 되어있어서
하드웨어에 입문하게 되면
가장 기초 중에 기초이면서도 난관인 ADC(Analog to Digital Converter)를 소개해봅니다.
우선 이론적인 내용을 긁어왔습니다. (만들기도 뭣한데 긁을만한 자료가 없어서 ,, 좀 오래된 느낌의 페이지를 갖고 왔습니다.)
세상은 모두 아날로그로 되어 있고, 이걸 디지털화시키면서, 디지털이라는 것이 생긴 겁니다 .따라서 모든! 기계나 제어장치에는
아날로그 디지털 컨버터가 들어갑니다.
하지만 요 개념이 처음에는 잘 와닫지 않습니다.
사실 직접 알려드리는 것이 훨 나을 듯 하지만,,,,
우선 블로그부터,,^^;
내용의 질이 좋지 못하군요^^
직접 만들기엔 양이 방대해서,,, 우선 좀 여기저기 있는 것 좀 정리했습니다.^^
다음 기회에 좀 더 보강해 보도록 하죠!!!
저는 DSP(Digital Signal Processing)시험이 있어서...ㅎㅎㅎ 요것도 아날로그를 디지털화 시킨다음 연산을 하는 이론입니다.^^
아날로그신호를 디지탈신호로 변환하는 여러 가지 방법이 있으나 그 주가 되는 3가지 방법에 관해서 회로구성, 동작원리, 특징 등을 설명한다. AD변환에는 입력 아날로그신호에 포함된 최고주파수의 2배 이상으로 샘플링하여야만 원신호를 재현할 수 있다는 사실이 알려져 있다(Nyquist 정리). 따라서 고주파신호일수록 고속 ADC를 요구한다. 또 ADC의 출력 2진수의 비트수가 많을수록 ADC의 분해능(resolution)이 높다고 말하며 입력 아날로그신호의 레벨이 더 세분화되어 디지탈신호로 표현된다.
병렬비교 ADC
이것은 병렬 비교형 ADC로써 flash형이라고도 불리우며 가장 속도가 빠른 ADC이다. 그림 17-1은 그 구조를 나타내며 아날로그 입력 전압
변환속도는 비교기 및 엔코더의 지연의 합에 의해서 결정되며, 현재 20ns이하의 ADC도 사용되고 있다. 4∼8비트(16∼256레벨)가 상용화되고 있으며 비트 수가 이 이상되면 구조가 너무 커진다. 1초에 변환할 수 있는 수를 변환율(conversion rate)이라 하고 변환속도의 역수와 같다.
이중적분형(dual slope) ADC
이것은 비교적 서서히 변하는 아날로그 신호를 정밀하게 디지탈신호로 변환하는 데 적합한 것으로써 그림 17-3에 표시한 바와 같이 적분기, 비교기, 카운터로 구성된다. 원리적으로 아날로그 전압에 비례하는 시간동안 클럭펄스를 카운트하여 그 카운트 수를 디지탈신호로 출력한다. 아날로그 입력전압에 비례하는 시간을 얻는 데 적분기를 쓴다. 그림에서 기준전압
이 회로는 RC에 무관하므로 R, C의 값이 정밀할 필요가 없다.
이 ADC는 아날로그 입력전압과 기준전압을 2회 적분하기 때문에 이중적분형이라고 부른다. 동작원리로부터 이 회로는 고속 AD변환에는 부적당함을 알 수 있다. 그러나 회로가 간단하고, 잡음에 강하므로(잡음을 적분하면 0이 된다 ; 또 1/60초 마다 한번씩 적분하면 60Hz의 방해도 제거된다) 저속 고정밀도 ADC에 흔히 쓰인다. 예컨대 6자리(999999 = 106-1 221 ; 21비트) 디지탈 전압계등은 이런 ADC를 이용한다.
DA 피드백 형 ADC
이것은 ADC의 츨력 디지탈 부호를 다시 DA로 변환하여 입력신호와 비교한다. 다음 3가지가 있다.
(1) 계단형 ADC(staircase ADC)
그림 17-4(a)에서 S/H된 아날로그신호
(2) 추적형 ADC(tracking ADC)
그림 17-5(a)는 그림 17-4(a)의 UP카운터를 UP/DOWN 카운터로 대치한 것으로써 이 그림에서 알 수 있듯이 작은 변화를 추적해가는 데 유용하다. 먼저와 같이 t=0에서 카운터는 0으로 세트된다. 따라서 DAC 출력전압
(3) 축차근사 ADC(successive approximation ADC)
이것은 카운터 대신 더 복잡한 디지탈회로를 포함한다. 처음에 모든 비트를 0으로 세트한다. MSB부터 시작하여 각 비트를 차례로 1로 세트한다. DAC의 출력은 비교기에서 입력신호
이 형의 ADC는 구조가 간단하고 비교적 정확하고 빠르기 때문에 많이 사용된다. 현재 8∼19비트의 AD변환 시간이 10μs되는 것들이 있다.
잘 이해가 되지 않으시리라 봅니다...ㅎㅎㅎㅎ
대충 이런 원리로 제작이 된다고 생각하시면 될 겁니다.
첨부파일로는 0809 ADC 컨버터 칩의 데이터 시트를 올려놓았습니다.
코딩은 이렇게 하는 겁니다...
--------------------------------------------------
ADC
- ADC0808 ADC로는 축차비교형인 ADC0808/0809를 사용하여 본다.
--@-- +5V | ------------------ | 11 | | Vcc | MSB AI0 -->>--| 26 21 |-->>-- D7 AI1 -->>--| 27 20 |-->>-- D6 AI2 -->>--| 28 19 |-->>-- D5 AI3 -->>--| 1 18 |-->>-- D4 AI4 -->>--| 2 8 |-->>-- D3 AI5 -->>--| 3 15 |-->>-- D2 AI6 -->>--| 4 14 |-->>-- D1 AI7 -->>--| 5 17 |-->>-- D0 | | Adr A0 -->>--| 25 6 |--<<-- Start Adr A1 -->>--| 24 9 |--<<-- Output Enable Adr A2 -->>--| 23 7 |-->>-- End of Conversion | | Adr -->>--| 22 10 |--<<-- Clock Enable | 12 |--<<-- Ref+ | GND 16 |--<<-- Ref- | 13 | ------------------ | @
- 사용 방법
- Clock은 외부에서 TTL 신호(최대 8 kHz)를 연결한다. Ref+ = 5 V. Ref- = 0을 연결한다.
- Adr Enable, Output Enable, Start를 0으로 한다.
- Adr A0, A1, A2는 8 개의 입력 channel을 선택하기 위한 것이다. 선택한 AIx에 analog 신호 (0 ~ 5 V)를 연결한다.
- Adr Enable울 1로 하고, Start를 1 로 하였다가 0으로 바꾼다.
- EoC가 1이 되면 Output Enable을 1로 한다.
ADC0808를 가동시키기 위하여는 Adr A0, Adr A1, Adr A2, Adr Enable, Start 및 Output Enable의 5 출력이 필요하다. parallel port의 DATA (8 outputs)를 이용하면 된다.
입력은 data 8 bits와 EoC으로 9 개가 필요하다. 따라서 STATUS 4~7을 data nibble로, CONTROL 3을 nibble select(출력)로 하고 STATUS 3을 EoC으로 연결하면 된다.
Adr A0 |----<---------------------- D0 Adr A1 |----<---------------------- D1 Adr A2 |----<---------------------- D2 Adr Enable |----<---------------------- D4 Start |----<---------------------- D5 Output Enable |----<---------------------- D6 | EoC |------------------------>-- S3 (15) | | --------------- LSB D0 |-----| I1d S |--<-- /C3 (17) D1 |-----| I1c | D2 |-----| I1b | D3 |-----| I1a Qd |-->-- S4 (13) D4 |-----| I0d Qc |-->-- S5 (12) D5 |-----| I0c Qb |-->-- S6 (10) D6 |-----| I0b Qa |-->-- /S7 (11) MSB D7 |-----| I0a | ----------- --------------- ADC0808 74LS157 Parallel port
- program 예제
PDATA% = &H378: REM &H278 or &H3BC PSTATUS% = PDATA% + 1 PCONTROL% = PDATA% + 2 AdrEn% = &H10 Start% = &H20 OutEn% = &H40 ADCCh% = 0 : 'ADC channel selection DBYTE% = 0 + ADCCh% OUT(PDATA%, DByte%) : 'Adr Enable, Output Enable, Start를 0으로 한다. DBYTE% = AdrEn% + Start% + ADCCh% OUT(PDATA%, DByte%) : 'Adr Enable, Start를 1 로 한다. DBYTE% = AdrEn% + Start% + ADCCh% OUT(PDATA%, DByte%) : 'Start를 0으로 한다. EoC% = 0 WHILE (EoC% = 0) : 'EoC = 1이 되기를 기다린다. DBYTE% = INP(PSTATUS%) DBYTE% = DBYTE% AND &H08 EoC% = DBYTE% \ 8 WEND DBYTE% = AdrEn% + OutEn% + ADCCh% OUT(PDATA%, DBYTE%) : 'EoC가 1이 되면 Output Enable을 1로 한다. OUT (PCONTROL%, &H08) : 'data의 low nibble 선택 LD% = INP (PSTATUS%) : 'low nibble을 읽는다. LD% = (LD% XOR &H80) \ 16 OUT (PCONTROL%, &H00) : 'data의 high nibble 선택 MD% = INP (PSTATUS%) : 'high nibble을 읽는다. MD% = (MD% XOR &H80) \ 16 DD% = MD% * 16 + LD% : 'byte로 바꾼다.