이 블로그는 임베디드 컴퓨터를 이용한 장치(시스템) 개발과 원격제어에 필요한 지식을 공유 하기 위한 블로그 입니다.
실제 개발과 프로그램 예를 위하여 Microchip 사의 ATmega128를 사용한 보드와 Arduino Mega 보드(ATmega2560), Raspberry Pi, Raspberry Pi Pico, WiFi 모듈을 사용 합니다.

atmega128-ad-converter

ATmega128 A/D Converter
  ATMega128 A/D Converter

    Analog-to-Digital Converter는 아날로그 신호를 컴퓨터가 처리 할 수 있는 디지털 데이터로 변환하여 주는 장치 이다.

    ATmega128A의 A/D 변환기는 10Bits 해상도에, ADC 신호는 8-channel Analog Multiplexer를 사용 하여 8 Single-ended voltage inputs과 16 가지 서로 다른 Differential voltage input combinations를 사용 할 수 있다. 또한 Differential Input Mode에서는 1x, 10x, 200x 배의 이득을 선택 할 수 있다.




  • A/D Converter 개요
    • 10-bit Resolution
    • 13 - 260 μs Conversion Time
    • 8 Multiplexed Single Ended Input Channels
    • 7 Differential Input Channels
    • 2 Differential Input Channels with Optional Gain of 10x and 200x
    • Optional Left Adjustment for ADC Result Readout
    • 0 - VCC ADC Input Voltage Range
    • Selectable 2.56 V ADC Reference Voltage
    • Free Running or Single Conversion Mode
    • Interrupt on ADC Conversion Complete
  • Analog to Digital Converter Block Schematic
    • 8채널 아날로그 입력은 PORTF를 통해 입력되며, Analog Multiplexer에 의해 A/D 변환기에 연결된다.
    • 변환 시간 동안 아날로그 입력전압을 일정하게 하는 Sample/Hold회로를 내장 하고 있다.
    • ADC에 사용 되는 기준 전압
      • ADC는 별도의 Analog supply voltage 입력 Pin(AVCC)과 내부 기준 전압 2.56V를 갖고 있다.
      • VREF는 AVCC, 내부 2.56V, 외부 AREF 단자에 공급되는 전압 중에서 선택 한다.
      • 기준전압 VREF는 A/D 변환되는 전압의 범위를 나타내며, 단 극성 모드에서 VREF는 0x3FF로 변환된다.
      • 단 극성인 경우 0 - VREF의 입력전압이 공급되어 0x000~0x3FF(0~1023)의 디지털 값으로 변환되며,
      • 차동입력의 경우 차동 입력전압이 2의 보수 0x200~0x1FF(-512~511)로 변환 된다.
    • 변환결과는 16비트 A/D변환기 데이터 레지스터에 좌측 또는 우측으로 정렬되어 저장 된다.
    • Single-ended voltage input
      • 8개의 Single-ended voltage input를 갖고 있고, PORTF Pin을 통하여 연결 된다.
      • Single-ended voltage input은 신호 입력 핀(PORTF Pin)과 GND(0V)를 사용 하여 연결 된다.
    • Differential voltage input
      • Differential voltage input은 다양한 입력 조합(16종)으로 사용 할 수 있다.
      • ADC0, ADC1, ADC2 신호는 Gain Amplifier의 Negative Input으로 선 택 될 수 있다.
      • ADC0 - ADC7 신호는 Gain Amplifier의 Positive Input으로 선 택 될 수 있다.
      • Gain Amplifier의 Gain은 1x, 10x, 200x 을 선택 할 수 있다.
      • Gain이 1x, 10x으로 선택 된 경우 8-bit resolution을 기대 할 수 있고, Gain이 200x으로 선택 된 경우 7-bit resolution을 기대 할 수 있다.

  • A/D Conversion Starting 하기
    • A/D Converter를 사용 하기 위하여는 ADEN(ADC Enable) Bit를 Set 하여야 한다.
    • Single conversion mode
      • ADCSRA Register의 ADSC Bit에 1을 Writing 하면 Conversion이 시작 된다.
      • ADSC Bit는 Conversion이 진행 되는 동안 1 상태를 유지 하고, Conversion이 종료 되면 Hardware 적으로 Clear 된다.
      • 만약 Conversion이 진행 되는 동안 다른 Data channel를 선택 하면, 현재 진행 중인 Conversion이 종료된 다음 다른 Data channel이 선택 된다.
    • Free Running mode
      • 연속 하여 A/D변환(Data sampling 과 변환)이 실행되고, 새로 변환된 결과가 Data Register에 Updating 된다.
      • ADCSRA Register의 ADFR Bit에 1을 Writing 하면 Free Running mode로 설정 된다.
      • 첫 번째 변환은 ADCSRA Register의 ADSC Bit에 1을 Writing 하면 시작 된다.
      • 이 Mode에서는 ADC Interrupt Flag(ADIF)의 상태(Clear or Set)에 관계 없이 변환이 계속 된다.
  • ADC Prescaler
    • 일반적인 ADC의 Clock frequency 범위는 50kHz - 200kHz 이다.
    • ADC의 Clock frequency는 CPU Clock를 1/2, 1/4, 1/8, 1/16, 1/64, 1/128의 비율로 Scale down(ADCSRA Rg의 ADPS Bit의 설정에 따라 결정 됨) 하여 결정 한다.
    • 높은 Clock frequency를 선택 하면 변환 속도는 빨라지고 정확도는 떨어지기 때문에 변환 속도와 정확도를 고려 하여 적당한 주파수를 선택 하여야 한다.
    • A/D 변환이 완료 되면 결과가 ADC Data register에 Write 되고 ADIF Bit 가 Set 된다.
    • Single conversion mode에서는 변환이 완료 되면 ADSC Bit(ADC Start Conversion Bit)는 Clear 된다. 다시 A/D 변환을 하고자 하는 경우에는 ADSC Bit를 Set 하여야 한다.
    • Free Running mode에서는 변환이 한번 시작 되면(ADSC Bit Set 되면) A/D 변환을 계속 한다. A/D 변환을 정지 하고자 하는 경우에는 하는 경우에는 ADSC Bit를 Clear 하여야 한다.
  • ADC Conversion Time
    • Sample-and-hold 시간과 A/D 변환에 걸리는 시간은 윗 Table과 같다.
    • 일반적인 ADC 변환은 13 ADC clock cycle을 필요로 한다. 그러나 첫 변환(ADCSRA Rg의 ADSC Bit가 set 될 때)은 25 ADC clock cycle을 필요로 한다.
  • ADC Conversion 결과
    • A/D 변환이 완료 되면(ADIF -> high) 결과가 ADC Data Registers(ADCL, ADCH)에 저장 된다.
    • Single Ended Conversion
      • ADC = (Vin *1024) / VREF
      • 윗 식의 결과 Vin = 0(GND) 일때 ADC는 0 이 되고, Vin = VREF 일때 ADC는 0x3ff 가 된다.
    • Differential Channel Conversion
      • ADC = ((Vpos – Vneg) * Gain * 512) / VREF
      • 윗 식에서 Vpos는 Positive input pin의 전압이고, Vneg는 Negative input pin의 전압이다.
      • GAIN은 Gain factor에서 선택(ADMUX Rg의 MUX4 - MUX0 참고 요)된 값 이다.
      • 결과는 2의 보수(0x200(-512) - 0x1FF(+511))로 출력 된다.
  • ATmega128 ADC 레지스터
    • ADCMUX (ADC Multiplexer Selection Register)
      • ADC 기준전압(reference voltage) 선택
      • ADC 변환 값 정렬 방법 지정
      • ADC 입력채널 지정
    • ADCSRA(ADC Control and Status Register)
      • ADC Enable/Disable
      • ADC Start Conversion
      • ADC Free Running Select
      • ADC Interrupt Flag
      • ADC Interrupt Enable/Disable
      • ADC Clock Division Factor
    • ADCL, ADCH ( ADC Data Register)
  • ADMUX - ADC Multiplexer Selection Register
  • A/D 변환기의 아날로그 입력채널 선택, A/D 변환의 기준 전압을 설정하거나 변환결과의 저장 형식을 지정

    • Bit 7:6 – REFS1:0: Reference Selection Bits
      • ADC 기준 전압을 설정하는 비트, 만약 이 Bit(7:6) 값들이 ADC 변환 도중에 변경된다면, 그 변환이 끝난 이후부터 변경된 값이 적용된다.
    • Bit 5 – ADLAR: ADC Left Adjust Result
      • A/D 변환결과를 ADCH:ADCL에 저장하는 형식을 지정 한다. 아래 ADC Data Register 그림을 참고 할 것.
      • 0:하위부터 10비트를 사용, 1: 상위부터 10비트를 사용
    • Bits 4:0 – MUX4:0: Analog Channel and Gain Selection Bits
      • 이 Bits는 A/D변환기 Input 신호를 결정 하는 조합과,
      • Differential channel의 이득을 선택 한다.
      • A/D변환 중 이 Bits가 변경 되어도 현재 진행 중인 변환에는 영향을 미치지 않는다.
      • Table에 있는(1)표시 MUX 선택은 offset calibration에 사용 한다.
  • ADC Control and Status Register A
    • Bit 7 – ADEN: ADC Enable
    • A/D변환 Enable 제어 신호 이다.

      • ADEN = 1: ADC Enables
      • ADEN = 0: ADC Disables
    • Bit 6 – ADSC: ADC Start Conversion
      • Single Conversion mode 일 경우
        • ADSC에 1을 Write: A/D 변환이 시작 된다. 변환 완료 시 0로 Reset 된다.
        • ADSC에 0을 Write: No effect
      • Free Running mode 일 경우
        • ADSC에 1을 Write: 첫 번째 변환이 시작 된다.
        • Free Running mode로 계속 동작 중인 경우 이 bit는 Set 상태를 지속 한다.
    • Bit 5 – ADFR: ADC Free Running Select
    • 이 Bit에 1을 Write 하면 Free Running mode로 동작 한다. A/D 변환기는 이 Bit가 Clear 될 때 까지 계속 입력 신호를 Sample하고 변환 결과를 Data Rg에 Update 한다.

    • Bit 4 – ADIF: ADC Interrupt Flag
      • 이 Flag bit는 변환이 완료되고 결과가 Data Rg에 Write 되면 Set 된다.
      • SREG Rg의 I-bit 와 ADIE bit가 Set 되어 있으면 A/D변환 완료 Interrupt 가 실행 된다.
      • 이 Bit는 A/D변환 완료 Interrupt 가 실행 되면 Hardware 적으로 Clear 된다. 또한 이 Bit에 1을 Write 하면 Clear 된다.
    • Bit 3 - ADIE: ADC Interrupt Enable
      • SREG Rg의 I-bit가 Set된 상태에서 이 Bit를 Set 하면 A/D변환 완료 Interrupt 가 Enable 된다.
    • Bits 2:0 – ADPS2:0: ADC Prescaler Select Bits
      • XTAL frequency 과 ADC Input clock의 Division factor

  • ADC Data Register
    • A/D 변환 결과를 저장하는 레지스터
    • 변환 결과를 읽을 때 ADCH(상위 데이터)를 읽어야 ADC Data Register 값이 Update 된다.
    • 변환 결과의 8Bits 값만 필요로 하는 경우 변환 결과를 좌측으로 정렬 한다음 ADCH(상위 데이터) 만 읽으면 된다.
    • 전체 변환 결과(10 Bits)를 사용 하는 경우에는 반드시 ADCL(하위 데이터)를 먼저 읽고 다음에 ADCH(상위 데이터)를 읽어야 한다.
    • 단극성 입력 사용 시 (Single Ended Input)
      • ADMUX Rg의 MUX(4:0)가 “00000”~ “ 00111” 혹은 “11110”~ “ 11111” 범위인 경우
      • 변환결과가 10비트 양의 정수(0~1023)로 표시 된다.
    • 차동입력 사용 시(Differencial Input)
      • ADMUX Rg의 MUX(4:0)가 “01000”~ “ 11101” 범위인 경우
      • 변환 결과가 10비트 2의 보수로 표현(-512~+511) 된다.
  • ATMega128 A/D 컨버터의 동작 설정 순서 요약
    • ADMUX로 A/D 신호를 입력받을 채널을 선택 한다.
    • ADCSR로 ADC Prescaler를 설정 한다.
    • 인터럽트 사용시, 전역 인터럽트 플래그를 ‘SET’하여 인터럽트 활성화하고, A/D 변환 완료 인터럽트 처리 루틴을 구성 한다.
    • ADCSRA의 ADSC Bit를 Set하여 A/D 변환을 시작 한다.
    • 변환 완료 Flag를 주기적으로 점검하거나 A/D 변환 완료 인터럽트를 이용하여 A/D 컨버전 이후의 데이터 처리 루틴을 구성 한다.
    • 변환 결과의 8Bits 값만 필요로 하는 경우 변환 결과를 좌측으로 정렬 한다음 ADCH(상위 데이터) 만 읽으면 된다.
    • 전체 변환 결과(10 Bits)를 사용 하는 경우에는 반드시 ADCL(하위 데이터)를 먼저 읽고 다음에 ADCH(상위 데이터)를 읽어야 한다.

  • Analog/Digital Converter 응용 프로그램 예
    • A/D 변환 프로그램(AvrStudio 4 개발 환경) 예(입력 신호는 가변저항을 사용 하고 A/D 변환 결과는 UART를 이용하여 모니터에 출력 함): cho_adc_basic_uart.zip
      • Microchip Studio 개발 환경을 이용한 프로그램 예: ms7_adc_basic_uart.zip

        cho_adc_basic_uart.pdf: 이 PDF File에는 ADC와 Timer 초기화 및 제어에 관한 부분만 포함 됨. 전체 프로그램은 위에있는 .zip File를 참조 바람.


      A/D 변환 프로그램 실험을 위한 회로 구성 예

    • 실험을 위한 회로 구성
      • 실험을 위한 회로 구성 예를 참고하여 PC와 AVR 사이에 UART 통신선을 연결한다.
        • 컴퓨터(USB --> UART(RS232) 변환 모듈)의 RXD와 Atmega128의 TXD0(PE1)를 연결한다.
        • 컴퓨터(USB --> UART(RS232) 변환 모듈)의 TXD와 Atmega128의 RXD0(PE0)를 연결한다.
        • 컴퓨터(USB --> UART(RS232) 변환 모듈)의 GND와 Atmega128의 GND를 연결한다.
        • 주: 컴퓨터에 Serial Port가 없는 경우 "USB --> UART(RS232) 변환 모듈"를 사용(USB Port를 Serial Port로 변환)하여 연결한다. 개발보드에 따라서는 "USB --> UART(RS232) 변환 모듈"을 내장하고 있는 경우가 많기 때문에 본인이 사용하는 개발보드에서 확인 하여야 한다.

          참고자료: USB - Serial 변환 모듈

      • 입력전압을 발생 시키는 가변저항 회로
        • AVR 보드 ADC0(PF0) <-> 입력전압을 발생 시키는 가변저항의 가운데 단자를 연결한다.
        • AREF에 ADC 기준 전압이 인가 되었는지 확인하고 필요한 경우 전압을 연결한다. 대부분의 개발보드는 AREF에 기준 전압이 연결되어 있기 때문에 별도 연결이 필요 없다.
        • 위 실험을 위한 회로 구성 예를 참고하여 입력전압을 발생 시키는 가변저항에 5V를 연결한다.
        • 위 실험을 위한 회로 구성 예를 참고하여 입력전압을 발생 시키는 가변저항에 GND를 연결한다.
    • 실험 방법
      • cho_adc_basic_uart.zip or ms7_adc_basic_uart.zip 파일을 Download하여 압축을 해제하고 Project를 Build 한다.
      • cho_adc_basic_uart.hex or ms7_adc_basic_uart.hex를 개발 보드에 Upload 한다.
      • 모니터 프로그램(예: OC-Console, Tera Term)을 설치(이미 설치되어 있는 경우에는 실행만 하면됨)하고 실행 한다.
      • 모니터 프로그램에서 필요한 설정(Serial Port와 Baudrate 등을 설정)을 한다.
      • 실험:
        • 개발 보드의 Reset SW를 누르면 모니터에 "ADC Testing." 메세지가 출력된다.
        • 0.1 Sec 주기로 ADC0(PF0)의 전압 값이 A/D 변환되어 모니터에 출력된다.
        • 가변저항의 가운데 단자를 조정하면 변동된 전압 값이 A/D 변환되어 모니터에 출력된다.
    • Interrupt를 사용 하는 A/D 변환 프로그램(AvrStudio 4 개발 환경) 예(입력 신호는 가변저항을 사용 하고 A/D 변환 결과는 UART를 이용하여 모니터에 출력 함): cho_adc_basic_interrupt_uart.zip
      • Microchip Studio 개발 환경을 이용한 프로그램 예: ms7_adc_basic_interrupt_uart.zip

        이 PDF File에는 ADC와 Timer 초기화 및 제어에 관한 부분만 포함 됨. 전체 프로그램은 위에있는 .zip File를 참조 바람.

      • cho_adc_basic_interrupt_uart.pdf
      • 실험을 위한 회로 구성과 실험 방법은 위 "A/D 변환 프로그램"과 동일하다. A/D 변환 종료를 알리는 Interrupt를 사용하는 것만 다름.
    • A/D 변환 프로그램(AvrStudio 4 개발 환경) 예(입력 신호는 Timer1의 PWM 신호를 이용하고 A/D 변환 결과는 UART를 이용하여 모니터에 그래프로 표시 한다.): cho_adc_wave_display_console_uart.zip
      • Microchip Studio 개발 환경을 이용한 프로그램 예: ms7_adc_wave_display_console_uart.zip

        A/D 변환 결과를 UART를 이용하여 모니터에 그래프로 표시하는 실험을 위한 회로 구성 예

      • 실험을 위한 회로 구성
        • 실험을 위한 회로 구성 예를 참고하여 PC와 AVR 사이에 UART 통신선을 연결한다.
          • 컴퓨터(USB --> UART(RS232) 변환 모듈)의 RXD와 Atmega128의 TXD0(PE1)를 연결한다.
          • 컴퓨터(USB --> UART(RS232) 변환 모듈)의 TXD와 Atmega128의 RXD0(PE0)를 연결한다.
          • 컴퓨터(USB --> UART(RS232) 변환 모듈)의 GND와 Atmega128의 GND를 연결한다.
        • Timer1의 PWM 신호를 피측정 신호로 사용하기 위한 회로 연결
          • AVR 보드 ADC0(PF0) <-> AVR 보드 OC1A(PB5)를 연결한다.
          • 주: Timer1(OC1A) PWM Mode를 이용 하여 피측정 신호를 발생 시킨다.

          • AREF에 ADC 기준 전압이 인가 되었는지 확인하고 필요한 경우 전압을 연결한다. 대부분의 개발보드는 AREF에 기준 전압이 연결되어 있기 때문에 별도 연결이 필요 없다.
      • 실험 방법
        • cho_adc_wave_display_console_uart.zip or ms7_adc_wave_display_console_uart.zip 파일을 Download하여 압축을 해제하고 Project를 Build 한다.
        • cho_adc_wave_display_console_uart.hex or ms7_adc_wave_display_console_uart.hex를 개발 보드에 Upload 한다.
        • 모니터 프로그램(예: OC-Console, Tera Term)을 설치(이미 설치되어 있는 경우에는 실행만 하면됨)하고 실행 한다.
        • 모니터 프로그램에서 필요한 설정(Serial Port와 Baudrate 등을 설정)을 한다.
        • 실험:
          • 개발 보드의 Reset SW를 누르면 모니터에 실험을 위한 명령을 설명하는 메세지가 출력된다.
          • 모니터에 출력된 Command 메세지를 참고하여 명령을 입력한다. "cho_adc_wave_display_console_uart.c" 프로그램을 참고요.
          • 모니터에 입력한 명령이 실행되고 결과가 모니터에 출력된다.
          • Command 메세지를 참고 하여 Sampling Frequency, Signal Frequency, Pulse Width를 변경 하며 실험 한다.