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 개요
- Analog to Digital Converter Block Schematic
- A/D Conversion Starting 하기
- ADC Prescaler
- ADC Conversion Time
- ADC Conversion 결과
- ATmega2560 ADC 레지스터 요약
- ADMUX - ADC Multiplexer Selection Register
- ADCSRA – ADC Control and Status Register A
- ADC Data Register
- ADCSRB – ADC Control and Status Register B
- DIDR0 – Digital Input Disable Register 0
- DIDR2 – Digital Input Disable Register 2
- Analog/Digital Converter 응용 프로그램 예
- 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 하기
- 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
- 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
- 이 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
- 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
- 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
- cho_adc_basic_uart_2560_adc_c.txt
- 실험을 위한 회로 구성
- 실험을 위한 회로 구성 예를 참고하여 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를 연결한다.
- 입력전압을 발생 시키는 가변저항 회로
- 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
- 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
- 실험을 위한 회로 구성
- 실험을 위한 회로 구성 예를 참고하여 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)를 연결한다.
- 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를 변경 하며 실험 한다.
ADC Auto Trigger Logic
A/D 변환기의 아날로그 입력채널 선택, A/D 변환의 기준 전압을 설정하거나 변환결과의 저장 형식을 지정
MUX5 Bit는 ADCSRB Rg에 포함 되어 있다.
A/D변환 Enable 제어 신호 이다.
XTAL frequency 과 ADC Input clock의 Division factor
이 File에는 ADC와 Timer 초기화 및 제어에 관한 부분만 포함 됨. 전체 프로그램은 위에있는 .zip File를 참조 바람.
A/D 변환 프로그램 실험을 위한 회로 구성 예
주: UART1은 "USB --> UART(RS232) 변환 모듈"를 사용(USB Port를 Serial Port로 변환)하여 연결한다. Mega board의 UART0는 개발 Tool에서 사용하기 때문에 이 예서는 UART 통신 실험에 UART1을 사용한다.
참고자료: USB - Serial 변환 모듈
이 File에는 ADC와 Timer 초기화 및 제어에 관한 부분만 포함 됨. 전체 프로그램은 위에있는 .zip File를 참조 바람.
A/D 변환 결과를 UART를 이용하여 모니터에 그래프로 표시하는 실험을 위한 회로 구성 예
주: Timer3(OC3A) PWM Mode를 이용 하여 피측정 신호를 발생 시킨다.