Blog | Tag | Local | Guest | Login | Write |  RSS
ADC 강좌

요즘에는 시험공부 모드로 과제가 살짝 중단이 되어있어서
하드웨어에 입문하게 되면
가장 기초 중에 기초이면서도 난관인 ADC(Analog to Digital Converter)를 소개해봅니다.


우선 이론적인 내용을 긁어왔습니다. (만들기도 뭣한데 긁을만한 자료가 없어서 ,, 좀 오래된 느낌의 페이지를 갖고 왔습니다.)

세상은 모두 아날로그로 되어 있고, 이걸 디지털화시키면서, 디지털이라는 것이 생긴 겁니다 .따라서 모든! 기계나 제어장치에는
아날로그 디지털 컨버터가 들어갑니다.
하지만 요 개념이 처음에는 잘 와닫지 않습니다.
사실 직접 알려드리는 것이 훨 나을 듯 하지만,,,,
우선 블로그부터,,^^;

내용의 질이 좋지 못하군요^^
직접 만들기엔 양이 방대해서,,, 우선 좀 여기저기 있는 것 좀 정리했습니다.^^

다음 기회에 좀 더 보강해 보도록 하죠!!!
저는 DSP(Digital Signal Processing)시험이 있어서...ㅎㅎㅎ 요것도 아날로그를 디지털화 시킨다음 연산을 하는 이론입니다.^^



아날로그신호를 디지탈신호로 변환하는 여러 가지 방법이 있으나 그 주가 되는 3가지 방법에 관해서 회로구성, 동작원리, 특징 등을 설명한다. AD변환에는 입력 아날로그신호에 포함된 최고주파수의 2배 이상으로 샘플링하여야만 원신호를 재현할 수 있다는 사실이 알려져 있다(Nyquist 정리). 따라서 고주파신호일수록 고속 ADC를 요구한다. 또 ADC의 출력 2진수의 비트수가 많을수록 ADC의 분해능(resolution)이 높다고 말하며 입력 아날로그신호의 레벨이 더 세분화되어 디지탈신호로 표현된다.

병렬비교 ADC


이것은 병렬 비교형 ADC로써 flash형이라고도 불리우며 가장 속도가 빠른 ADC이다. 그림 17-1은 그 구조를 나타내며 아날로그 입력 전압

V_1

 
이 병렬 비교기들에 의해서 그 레벨이 비교되어 3비트의 2진수로 동시에 부호화되어 나온다. 이 형태에서 n비트 출력을 위해서는

2^n

 
개의 동일저항과

2^n -1

 
개의 비교기가 필요하다(예컨대 8비트 ADC에서는 256개의 R과 255개의 비교기가 필요하다).

V_1

 
의 레벨에 따라 그보다 더 높은 "+"단자 전압이 걸리는 하위 비교기들은 출력이 모두 HIGH가 되고, 나머지 상위 비교기들의 출력은 모두 LOW가 된다. 예컨대

(3/8)V_R < V_1 < (4/8)V_R

 
일때 W1∼W3는 모두 HIGH, W4∼W7은 모두 LOW가 된다. 이 상태에서 ADC 출력은

Y_2 Y_1 Y_0 = 011(=3)

 
이 된다. 그림 17-2는 엔코더의 입·출력간의 관계를 나타낸다. 변환 도중에 아날로그 입력전압이 변하면 안되므로 Sample/Holder회로를 ADC 앞에 연결한다.

변환속도는 비교기 및 엔코더의 지연의 합에 의해서 결정되며, 현재 20ns이하의 ADC도 사용되고 있다. 4∼8비트(16∼256레벨)가 상용화되고 있으며 비트 수가 이 이상되면 구조가 너무 커진다. 1초에 변환할 수 있는 수를 변환율(conversion rate)이라 하고 변환속도의 역수와 같다.

이중적분형(dual slope) ADC


이것은 비교적 서서히 변하는 아날로그 신호를 정밀하게 디지탈신호로 변환하는 데 적합한 것으로써 그림 17-3에 표시한 바와 같이 적분기, 비교기, 카운터로 구성된다. 원리적으로 아날로그 전압에 비례하는 시간동안 클럭펄스를 카운트하여 그 카운트 수를 디지탈신호로 출력한다. 아날로그 입력전압에 비례하는 시간을 얻는 데 적분기를 쓴다. 그림에서 기준전압

V_R < 0

 
, 아날로그 입력전압

V_i > 0

 
이라고 가정하자. 처음에는 스위치 S2가 닫혀있다가(적분기의 출력전압

V_o = o

 
) t=0에서 S1이 1로 스위칭됨과 동시에 S2가 열린다. 그러면

V_o

 
는 직선적으로 감소하며

T_1

 
후에는

V_o = -(V_i / RC) T_1 ~ propto ~ V_i

 
,

t =T_1

 
에서 S1을 2로 옮기면

V_o

 

V_R / RC

 
의 증가율로 상승한다.

V_o = 0

 
이 될 때까지의 시간을

T_2

 
라 하면 다음과 같이 계산될 수 있다.

 

V_i over RC T_1 = V_R over RC T_2 , ~~~T_2 = T_1 over V_R V_i ~propto ~V_i

 

이 회로는 RC에 무관하므로 R, C의 값이 정밀할 필요가 없다.

T_2

 
동안만 카운터로 클럭펄스를 센다면 그 수는

V_i~

 
에 비례하고 결국 아날로그 입력에 비례하는 디지탈 신호를 얻을 수 있다.

이 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된 아날로그신호

V_i~

 
가 비교기의 "+"단자에 입력된다. t=0에서 2진 UP 카운터는 0으로 세트된다. 따라서 비교기의 "-"단자에 입력되는 DAC의 출력전압은 0이다. 그림 17-4(a)에서

V_i > V_A

 
이면 카운터는 클럭에 따라 1씩 카운트 UP한다. 그러므로

V_A

 
는 그림 17-4(b)에 표시한 바와 같이 계단적으로 증가한다.

V_A

 

V_i~

 
를 넘으면 비교기 출력의 부호가 바뀌어지고 카운터를 정지시킨다. 이때의 결과가 디지탈출력이 된다. 제어회로가 카운터를 0으로 다시 리셋시키고 위의 과정을 반복하여 새로운 입력신호의 레벨을 변환한다. 이 방법은 구조가 간단하지만 출력을 얻는 데 시간이 걸린다(최악의 경우

2^n -1

 
개의 클럭이 필요하다 ; n은 ADC의 비트 수).

(2) 추적형 ADC(tracking ADC)


그림 17-5(a)는 그림 17-4(a)의 UP카운터를 UP/DOWN 카운터로 대치한 것으로써 이 그림에서 알 수 있듯이 작은 변화를 추적해가는 데 유용하다. 먼저와 같이 t=0에서 카운터는 0으로 세트된다. 따라서 DAC 출력전압

V_A

 
는 "0"이다.

V_i > V_A

 
일 때 먼저와 마찬가지로 카운터는 클럭에 따라 1씩 카운트 UP한다. <그림 17-5(b) 참고>.

V_A

 

V_i~

 
를 넘으면 비교기 출력의 부호가 바뀌어지고 이번에는 카운터가 1씩 카운트 DOWN 한다. 결과적으로 얻어지는 디지탈출력은 정확한 값에서 ±1LSB만큼 오차를 가진다. 그림에 표시한 대로

V_i1

 
에 대해서는 디지탈출력=1000,

V_i2

 
에 대해서는 1011,

V_i3

 
에 대해서는 1001이다. 이와 같이 입력 신호의 작은 변화를 계속 추적해 간다.

(3) 축차근사 ADC(successive approximation ADC)


이것은 카운터 대신 더 복잡한 디지탈회로를 포함한다. 처음에 모든 비트를 0으로 세트한다. MSB부터 시작하여 각 비트를 차례로 1로 세트한다. DAC의 출력은 비교기에서 입력신호

V_i~

 
와 비교된다. 만일

V_A

 

V_i~

 
를 넘지 않으면 대응하는 비트는 1로 그대로 두고 넘으면 대응하는 비트를 다시 0으로 세트한다. n비트 ADC에서는 이와 같은 스탭을 n번 거쳐서 완전한 출력 비트가 얻어진다. 좀더 구체적으로 그림 17-6을 통해 알아보자, 처음에 비교기는 입력

V_i~

 
를 DAC출력

V_R /2

 
과 비교한다.

V_i > (V_R /2)

 
이면 비교기 출력 +, MSB는 그대로 1로 두고

V_i < (V_R /2)

 
이면 비교기 출력은 0, MSB는 0으로 다시 세트한다. 이상에서 MSB가 1인가 0인가에 따라

(V_R /2) + (V_R /4)

 
또는

0 + V_R / 4

 
이 된다. 이제는 이것이

V_i~

 
와 비교되며, 그 대소에 따라서 (MSB-1)비트가 1또는 0으로 결정된다. 이와같은 과정을 n번 반복한다. 그림 17-6은

V_o

 

V_i~

 
에 점차적으로 접근해 가는 모양을 나타낸다. 여기서 T는 테스트 기간이고 P는 테스트되어 결정된 비트를 출력으로 내보내는 기간이다.

이 형의 ADC는 구조가 간단하고 비교적 정확하고 빠르기 때문에 많이 사용된다. 현재 8∼19비트의 AD변환 시간이 10μs되는 것들이 있다.

 

잘 이해가 되지 않으시리라 봅니다...ㅎㅎㅎㅎ
대충 이런 원리로 제작이 된다고 생각하시면 될 겁니다.

첨부파일로는 0809 ADC 컨버터 칩의 데이터 시트를 올려놓았습니다.

코딩은 이렇게 하는 겁니다...
--------------------------------------------------

ADC

  1. ADC0808
  2. 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          |
                     ------------------
                           |
                           @
     

  3. 사용 방법
    1. Clock은 외부에서 TTL 신호(최대 8 kHz)를 연결한다. Ref+ = 5 V. Ref- = 0을 연결한다.
    2. Adr Enable, Output Enable, Start를 0으로 한다.
    3. Adr A0, A1, A2는 8 개의 입력 channel을 선택하기 위한 것이다. 선택한 AIx에 analog 신호 (0 ~ 5 V)를 연결한다.
    4. Adr Enable울 1로 하고, Start를 1 로 하였다가 0으로 바꾼다.
    5. 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
    

  4. program 예제
  5.    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로 바꾼다.