ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [AVR] ADC 내부 블럭도 및 관련 레지스터
    AVR study 2013. 2. 10. 00:40
    반응형

    다음은 ATmega128 datasheet에 있는 ADC의 블럭다이어그램입니다. 

    위쪽에 보시면 Data Line과 직접 통신을 하는 3개의 레지스터가 있습니다. 

    ADC 멀티플렉서 선택 레지스터 (ADMUX), ADC제어 및 상태 레지스터(ADCSRA), ADC 데이터 레지스터(ADCH, ADCL)

    이 세가지의 레지스터에 대해서 정확하게 파악하고 있어야 ADC를 사용할 수 있습니다.


    1.  ADMUX (ADC Multiplexer Selection Register) : ADC 멀티플렉서 선택 레지스터

    ◎ 비트 7:6 - REFS1:0 : 기준 설정 비트

    이 비트 설정에 따라 아래 표와 같이 ADC 변환에 사용하는 기준 전압을 선택한다. ADC 변환 중에 이 비트들을 바꾸면 변환이 완료될 때까지 영향을 미치지 않는다. AREF 핀에 외부 기준 전압을 가하면 내부 기준 전압 옵션을 사용할 수 없다.

    ◎ 비트 5 - ADLAR : ADC 설과의 정렬

    이 비트를 1로 설정하면 ADC 결과는 왼쪽 정렬로 ADC 데이터 레지스터에 저장되고, 0으로 설정하면 오른쪽 정렬로 ADC 데이터 레지스터에 저장된다. 이 비트의 설정은 ADC 변환 중이더라도 즉시 영향을 미친다.


    ◎ 비트 4:0 - MUX4:0 : 아날로그 채널 및 이득 선택 비트

    이 비트의 설정으로 아날로그 채널을 선택할 수 있다. 아래표와 같이 PORTF를 GIFO로 사용하지 않고 해당하는 ADC 채널로 사용할 수 있다. ADC 변환 중에는 이 비트의 변경이 영향을 미치지 않는다.



    2. ADC 제어 및 상태 레지스터(ADC Control and Status Register) : ADCSRA


    ◎ 비트 7 - ADEN : ADC 가능 (ADC Enable)

    ADC를 사용하기 위해서는 이 비트에 1을 써야 한다. 0을 쓰게 되면 ADC 기능이 꺼진다.

     

    ◎ 비트 6 - ADSC : ADC 변환 시작 (ADC Start Conversion)

    단일 변환 모드에서는 이 비트에 1을 쓰면 ADC 변환이 시작된다. Free Running Mode 에서는 이 비트에 1을 쓰면 첫 변환을 시작한다. 이 비트는 ADC 변환 중에는 1로 SET 되어 있고, 변환이 종료됨과 동시에 0으로 SET 된다.

     

    ◎ 비트 5 - ADFR : ADC Free Running Select

    이 비트에 1을 쓰면 ADC는 Free Running Mode로 동작한다. 이 모드에서는 ADC는 계속해서 입력을 샘플링하고 결과를 데이터 레지스터에 저장한다.

     

    ◎ 비트 4 - ADIF : ADC 인터럽트 플래그 ( ADC Interrupt Flag)

    ADC 변환이 완료되고 결과가 데이터 레지스터에 저장되면 이 비트가 세트된다. ADIE 비트와 레지스터 SREG의 I 비트가 SET 되어 있으면 ADIF 비트가 SET 될 때 인터럽트가 CPU에 걸린다. ADIF 비트는 해당 인터럽트 서비스루틴이 수행될 때 자동적으로 리셋된다.

     

    ◎ 비트 3 - ADIE : ADC 인터럽트 허용 (ADC Interrupt Enable)

    이 비트와 레지스터 SREG의 I 비트가 SET되어 있으면 ADIF 비트가 SET 될때 인터럽트가 CPU에 걸린다.

     

    ◎ 비트 2:0 - ADPS 2:0 : ADC 프리스케일러 선택 비트

    이 비트로 XTAL 주파수와 ADC에 공급되는 클록 간의 나눗셈 인자를 선택한다.

     

    3. ADC 데이터 레지스터(ADC Data Register) : ADCL, ADCH

     

    ◎ ADMUX 레지스터의 비트 ADLAR = 0 일때 (오른쪽 정렬)

     

     

    ◎ ADMUX 레지스터의 비트 ADLAR = 1 일때 (왼쪽정렬)

     

     

    ATmega 128의 ADC는 10bit의 분해능을 가지고 있다. 따라서 A/D 변환된 데이터는 10bit의 레지스터 공간을 필요로 한다. 그러나 우리가 알고 있듯이, ATmega128은 8bit 마이크로컨트롤러이다. 따라서 8bit 데이터 레지스터가 2개 필요하다.

     

    ADLAR bit가 0일 경우 오른쪽 정렬일 때를 예로 들어보자.

     

    ADCL은 하위비트 레지스터이고 ADCH는 상위비트 레지스터이다. 우측 정렬인 경우에는 하위비트 레지스터에 0부터 7까지 8개의 bit가 채워지게 되고, 상위비트 레지스터 ADCH에는 오른쪽부터 9, 10번째 bit가 정렬되서 채워지게 된다.

     

    그렇다면 2개의 레지스터로 구성된 10개의 비트를 어떻게 해서 A/D 변환된 10진수로 바꿀 수 있을까.

     

    ADCH에 2번째 비트에 ADC9 (A/D 변환 데이터의 최상위 비트)가 있다. 이 비트는 10 bit 중에 최상위 비트가 되어야 하므로 좌측으로 8번 Shift 되어야 한다. 마찬가지로 ADC8 비트도 똑같이 좌측으로 8번 Shift되어야 한다. 즉 다음과 같다.

     

    ADC9 

     ADC8

     ADC7

     ADC6

    ADC5

    ADC4

    ADC3

    ADC2

    ADC1

    ADC0

     

    위와 같은 식으로 정렬이 되는 것이다.

     

    이 레지스터 부분의 코딩은 다음과 같이 해주면 된다.

     

    unsigned short int = 0x0000;

    temp = ADCL | (ADCH << 8); // 또는 ADCL + (ADCH*256);

     

    정수형 변수를 선언한 이유는 크기가 1byte를 넘어가기 때문이다. 2바이트를 넘어가지는 않으므로 short로 해도 무방하다. 그러나 char형은 절대로 사용할 수가 없다.

     

    그런데 매번 이렇게 하기가 귀찮을 수도 있다. 따라서 AVR Studio나 Codevision 같은 개발툴이나 컴파일러에서는 편의를 위해서 ADCW 라는 레지스터를 따로 정의한다. 이것은 실제로 존재하는 레지스터가 아니기 때문에 ATmega128의 Datasheet 어디를 찾아봐도 나와있지 않다. 그러나 컴파일러 자체적으로 제공하는 기능이기 때문에 그냥 사용해도 무방하다.

     

    A/D 변환된 값을 그냥 바로 ADCW라는 변수에 넣기만 하면 된다. 오른쪽, 왼쪽 정렬은 구분하지 않는다.

    반응형
Designed by Tistory.