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

atmega2560-ad-converter

ATmega2560 A/D Converter
  ATmega2560 A/D Converter

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

    ATmega2560의 A/D 변환기는 10Bits 해상도에, ADC 신호는 16-channel Analog Multiplexer를 사용 하여 16 Multiplexed Single Ended Input Channels, 14 Differential input channels과 이득을 선택(10배, 200배) 할 수 있는 4 Differential Input Channel을 사용 할 수 있다. 또한 Differential Input Mode에서는 1x, 10x, 200x 배의 이득을 선택 할 수 있다.




  • A/D Converter 개요
    • 10-bit Resolution
    • 13 - 260 μs Conversion Time
    • 16 Multiplexed Single Ended Input Channels
    • 14 Differential Input Channels
    • 4 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.56V or 1.1V ADC Reference Voltage
    • Free Running or Single Conversion Mode
    • Interrupt on ADC Conversion Complete
  • Analog to Digital Converter Block Schematic
    • 16채널 아날로그 입력은 PORT F와 PORT K를 통해 입력되며, Analog Multiplexer에 의해 A/D 변환기에 연결된다.
    • 16 개 채널은 8 개 채널의 두 섹션으로 나뉘며 각 섹션에서 7 개의 차동 아날로그 입력 채널은 공통 음극 터미널 (ADC1 / ADC9)을 공유 한다. 1배 또는 10배 게인을 사용하면 8 비트 해상도를 기대할 수 있고, 200x 이득이 사용하면 7 비트 해상도를 기대할 수 있다.
    • 변환 시간 동안 아날로그 입력전압을 일정하게 하는 Sample/Hold회로를 내장 하고 있다.
    • ADC에 사용 되는 기준 전압
      • ADC는 별도의 Analog supply voltage 입력 Pin(AVCC)과 내부 기준 전압 2.56V를 갖고 있다.
      • VREF는 AVCC, 내부 1.1V, 2.56V, 외부 AREF 단자에 공급되는 전압 중에서 선택 한다.
      • 기준전압 VREF는 A/D 변환되는 전압의 범위를 나타내며, 단 극성 모드에서 VREF는 0x3FF로 변환된다.
      • 단 극성인 경우 0 - VREF의 입력전압이 공급되어 0x000~0x3FF(0~1023)의 디지털 값으로 변환되며,
      • 차동입력의 경우 차동 입력전압이 2의 보수 0x200~0x1FF(-512~511)로 변환 된다.
    • 변환결과는 16비트 A/D변환기 데이터 레지스터에 좌측 또는 우측으로 정렬되어 저장 된다.
    • ADC는 ADCSRA Rg의 ADEN(ADC Enable 비트)을 Set 하면 활성화 된다. ADEN이 Cleared 되면 ADC는 비 활성화 되어 전력을 소비하지 않으므로 절전 모드로 들어가기 전에 ADEN을 Cleare 하는 것이 좋다.
    • ADC는 변환이 완료되면 Interrupt 가 트리거 된다.

  • A/D Conversion Starting 하기
  • ADC Auto Trigger Logic

    • 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이 선택 된다.
    • ADC Auto Trigger
      • ATmega2560 ADC는 다양한 소스에서 자동으로 트리거 될 수 있다.
      • Auto Triggering은 ADCSRA Rg에 있는 ADATEADC Bit를 Set 하면 Enable 된다. 트리거 소스는 ADCSRB Rg의 ADTS를 설정하여 선택한다.
      • 선택된 Trigger signal에서 Positive edge가 발생 하면 ADC Prescaler 가 Reset 되고 A/D 변환이 시작 된다. 이 방법은 Timer을 이용 하여 Trigger signal을 일정한 간격으로 발생 시키고, 그 결과 일정한 간격으로 A/D 변환을 할 수 있게 한다.
      • 변환이 완료 될 때 까지 Trigger signal이 Set 되어 있으면 새 전환이 시작되지 않는다. 변환 중에 Trigger signal에서 또 하나의 Positive edge가 발생하면, 새로 발생한 Positive edge는 무시 된다.
      • 변환 중에 A/D 변횐기의 Interrupt를 Disable 하거나 SREG Rg 내의 Global Interrupt Bit를 Clear 하여도 변환이 완료 되면 Interrupt Flag가 Set 된다. 그러므로 새로운 변환 결과에 의하여 다음 Interrupt 가 발생 하기를 원하는 경우 이전의 Interrupt Flag를 Clear 하여야 한다.
      • ADC 인터럽트 플래그를 트리거 소스로 사용하는 경우 변환이 완료되면 바로 새로운 변환이 시작 돤다. 이 경우 ADC는 Free Running 모드로 동작한다. Free Running 모드로 동작하는 경우 첫 번째 변환은 ADCSRA Rg의 ADSC 비트에 논리 값 1을 쓰는 것으로 시작 할 수 있다.
      • ADSC Bit는 A/D 변환이 진행 중인지 확인 하는데 사용 할 수 있다. 변환이 진행 중인 경우 ADSC Bit는 1 값을 갖는다.
  • 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를 선택 하면 변환 속도는 빨라지고 정확도는 떨어지기 때문에 변환 속도와 정확도를 고려 하여 적당한 주파수를 선택 하여야 한다.
    • Prescaler는 ADCSRA Rg 내의 ADEN Bit 가 Set 되면 Start 된고, ADEN Bit 가 Clear 되면 Reset 된다.
    • ADCSRA에서 ADSC Bit를 Set 하여 Single ended 변환을 시작하면 ADC 클럭 사이클의 다음 Rising edge에서 변환이 시작된다.
    • 정상 상태에서의 변환은 13 ADC 클록 사이클을 필요로한다. ADC가 켜진 후 첫 번째 변환(ADCSRA Rg 내의 ADEN Bit 가 Set 된 다음 첫 번째 변환)은 아날로그 회로를 초기화하기 위해 25ADC 클럭 사이클을 필요로 한다.
    • 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))로 출력 된다.
  • ATmega2560 ADC 레지스터 요약
    • ADMUX – ADC Multiplexer Selection Register
    • ADCSRA – ADC Control and Status Register A
    • ADCSRB – ADC Control and Status Register B
    • ADCL and ADCH – The ADC Data Register
    • DIDR0 – Digital Input Disable Register 0
    • DIDR2 – Digital Input Disable Register 2
  • ADMUX - ADC Multiplexer Selection Register
  • A/D 변환기의 아날로그 입력채널 선택, A/D 변환의 기준 전압을 설정하거나 변환결과의 저장 형식을 지정

    • Bit 7:6 – REFS1:0: Reference Selection Bits
      • ADC 기준 전압을 설정하는 비트, 만약 이 Bit(7:6) 값들이 ADC 변환 도중에 변경된다면, 그 변환이 끝난 이후부터 변경된 값이 적용된다.
      • 외부 기준 전압(AREF Pin)이 선택 되면(REFS1=0, REFS0=0) 내부 기준 전압은 사용 되지 않는다.
    • 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
    • MUX5 Bit는 ADCSRB Rg에 포함 되어 있다.

      • 이 Bits는 A/D변환기 Input 신호를 결정 하는 조합과,
      • Differential channel의 이득을 선택 한다.
      • A/D변환 중 이 Bits가 변경 되어도 현재 진행 중인 변환에는 영향을 미치지 않는다.
      • Table에 있는(1)표시 MUX 선택은 전원 전압이 2.7V 이하인 경우 사용 할 수 없다.
  • ADCSRA – 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 – ADATE: ADC Auto Trigger Enable
      • 이 비트가 1이 쓰여지면 ADC의 Auto Triggering이 활성화 되고,
      • 선택된 Trigger signal의 Positive edge에서 ADC이 시작 된다.
      • Trigger source는 ADCSRB Rg에 있는 ADTS bits에 의하여 설정 된다.
    • 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)
      • 변환결과가 10비트 양의 정수(0~1023)로 표시 된다.
    • 차동입력 사용 시(Differencial Input)
      • 변환 결과가 10비트 2의 보수로 표현(-512~+511) 된다.
  • ADCSRB – ADC Control and Status Register B
    • Bit 7,5,4 – Res: Reserved Bit
    • Bit 2:0 – ADTS2:0: ADC Auto Trigger Source
      • ADCSRA Rg의 ADATE Bit가 1로 Set 되면 ADTS2:0 Bits 값은 ADC 변환을 트리거 할 source를 선택합니다. ADATE Bit가 Clear 되면 ADTS2:0 Bits의 설정은 무시 된다.
      • ADC은 선택된 Trigger signal의 Rising edge에서 Trigger 된다(Trigger signal 이 1 상태를 유지 하고 있으면 Trigger 되지 않는다. Trigger source를 변경 하면 변경된 Trigger source 가 Cleard 되었다가 Set 될 때(Trigger signal의 Rising edge) 새로운 ADC이 Trriger 된다.
      • Free Running Mode로 동작 할 때는 ADSC에 1을 Write 하여 첫 번째 변환이 시작 하도록 하고, ADTS2:0 Bits를 000 으로 선택 하여 변환이 완료 될 때 발생 한 Interrupt Falg의 Rising edge를 새로운 Trigger로 사용 하여 ADC이 계속 지속(Free Running) 하도록 한다.
  • DIDR0 – Digital Input Disable Register 0
    • Bit 7:0 – ADC7D:ADC0D: ADC7:0 Digital Input Disable
      • 이 Bit에 1이 쓰여지면 대응 하는 ADC Pin의 Input Buffer는 Disable 된다.
      • 이 Bit가 Set되면 대응 Pin Rg는 항상 0로 읽혀 진다.
      • ADC7:0 Pin의 Digital input이 필요 하지 않은 경우 전력 손실을 줄이기 위하여 이 Bits의 대응 히는 Bit에 1을 Write 하는 것이 좋다.
  • DIDR2 – Digital Input Disable Register 2
    • Bit 7:0 – ADC15D:ADC8D: ADC15:8 Digital Input Disable
      • 이 Bit에 1이 쓰여지면 대응 하는 ADC Pin의 Input Buffer는 Disable 된다.
      • 이 Bit가 Set되면 대응 Pin Rg는 항상 0로 읽혀 진다.
      • ADC15:8 Pin의 Digital input이 필요 하지 않은 경우 전력 손실을 줄이기 위하여 이 Bits의 대응 히는 Bit에 1을 Write 하는 것이 좋다.

  • ATmega2560 A/D 컨버터의 동작 설정 순서 요약
    • ADMUX로 A/D 신호를 입력받을 채널을 선택 한다.
    • 동작 모드를 설정(ADCSRA, ADCSRB) 한다.
    • 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 변환 프로그램(입력 신호는 가변저항을 사용 하고 A/D 변환 결과는 UART를 이용하여 모니터에 출력 함) 예: cho_adc_basic_uart_2560.zip
      • 이 File에는 ADC와 Timer 초기화 및 제어에 관한 부분만 포함 됨. 전체 프로그램은 위에있는 .zip File를 참조 바람.

      • cho_adc_basic_uart_2560_adc_c.txt

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


      • 실험을 위한 회로 구성
        • 실험을 위한 회로 구성 예를 참고하여 PC와 Mega 보드 사이에 UART 통신선을 연결한다.
          • 컴퓨터(USB --> UART(RS232) 변환 모듈)의 RXD와 Mega board의 TXD1(PD3)를 연결한다.
          • 컴퓨터(USB --> UART(RS232) 변환 모듈)의 Mega board의 RXD1(PD2)를 연결한다.
          • 컴퓨터(USB --> UART(RS232) 변환 모듈)의 GND와 Mega board의 GND를 연결한다.
          • 주: UART1은 "USB --> UART(RS232) 변환 모듈"를 사용(USB Port를 Serial Port로 변환)하여 연결한다. Mega board의 UART0는 개발 Tool에서 사용하기 때문에 이 예서는 UART 통신 실험에 UART1을 사용한다.

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

        • 입력전압을 발생 시키는 가변저항 회로
          • Mega 보드 ADC0(PF0: Analog pin 0) <-> 입력전압을 발생 시키는 가변저항의 가운데 단자를 연결한다.
          • AREF는 AVCC(Mega Board: VCC)를 사용한다.
          • 위 실험을 위한 회로 구성 예를 참고하여 입력전압을 발생 시키는 가변저항에 5V를 연결한다.
          • 위 실험을 위한 회로 구성 예를 참고하여 입력전압을 발생 시키는 가변저항에 GND를 연결한다.
      • 실험 방법
        • cho_adc_basic_uart_2560.zip 파일을 Download하여 압축을 해제한다.
        • cho_adc_basic_uart_2560.hex를 개발 보드에 Upload 한다.
        • 모니터 프로그램(예: OC-Console, Tera Term)을 설치(이미 설치되어 있는 경우에는 실행만 하면됨)하고 실행 한다.
        • 모니터 프로그램에서 필요한 설정(Serial Port와 Baudrate(19200) 등을 설정)을 한다.
        • 실험:
          • 개발 보드의 Reset SW를 누르면 모니터에 "ADC Testing." 메세지가 출력된다.
          • 0.1 Sec 주기로 ADC0(PF0)의 전압 값이 A/D 변환되어 모니터에 출력된다.
          • 가변저항의 가운데 단자를 조정하면 변동된 전압 값이 A/D 변환되어 모니터에 출력된다.

    • Interrupt를 사용 하는 A/D 변환 프로그램(입력 신호는 가변저항을 사용 하고 A/D 변환 결과는 UART를 이용하여 모니터에 출력 함) 예: cho_adc_interrupt_basic_uart_2560.zip
      • 이 File에는 ADC와 Timer 초기화 및 제어에 관한 부분만 포함 됨. 전체 프로그램은 위에있는 .zip File를 참조 바람.

      • cho_adc_interrupt_basic_uart_2560_adc_c.txt
      • 실험을 위한 회로 구성과 실험 방법은 위 "A/D 변환 프로그램"과 동일하다. A/D 변환 종료를 알리는 Interrupt를 사용하는 것만 다름.

    • A/D 변환 프로그램(입력 신호는 Timer3의 PWM 신호를 이용하고 A/D 변환 결과는 UART를 이용하여 모니터에 그래프로 표시 한다.) 예: cho_adc_wave_display_uart_2560.zip
    • A/D 변환 결과를 UART를 이용하여 모니터에 그래프로 표시하는 실험을 위한 회로 구성 예

      • 실험을 위한 회로 구성
        • 실험을 위한 회로 구성 예를 참고하여 PC와 Mega 보드 사이에 UART 통신선을 연결한다.
          • 컴퓨터(USB --> UART(RS232) 변환 모듈)의 RXD와 Mega board의 TXD1(PD3)를 연결한다.
          • 컴퓨터(USB --> UART(RS232) 변환 모듈)의 Mega board의 RXD1(PD2)를 연결한다.
          • 컴퓨터(USB --> UART(RS232) 변환 모듈)의 GND와 Mega board의 GND를 연결한다.
        • Timer3(OC3A)의 PWM 신호를 피측정 신호로 사용하기 위한 회로 연결
          • Mega 보드 ADC0(PF0: Analog pin 0) <-> Mega 보드 OC3A(PE3: Pin5)를 연결한다.
          • 주: Timer3(OC3A) PWM Mode를 이용 하여 피측정 신호를 발생 시킨다.

          • AREF는 AVCC(Mega Board: VCC)를 사용한다.
      • 실험 방법
        • cho_adc_wave_display_uart_2560.zip 파일을 Download하여 압축을 해제한다.
        • cho_adc_wave_display_uart_2560.hex를 개발 보드에 Upload 한다.
        • 모니터 프로그램(예: OC-Console, Tera Term)을 설치(이미 설치되어 있는 경우에는 실행만 하면됨)하고 실행 한다.
        • 모니터 프로그램에서 필요한 설정(Serial Port와 Baudrate(19200) 등을 설정)을 한다.
        • 실험:
          • 개발 보드의 Reset SW를 누르면 모니터에 실험을 위한 명령을 설명하는 Command 메세지가 출력된다.
          • 모니터에 출력된 Command 메세지를 참고하여 명령을 입력한다. "main.c" 프로그램을 참고요.
          • 모니터에 입력한 명령이 실행되고 결과가 모니터에 출력된다.
          • Command 메세지를 참고 하여 Sampling Frequency, Signal Frequency, Pulse Width를 변경 하며 실험 한다.