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 개요
- Analog to Digital Converter Block Schematic
- A/D Conversion Starting 하기
- ADC Prescaler
- ADC Conversion Time
- ADC Conversion 결과
- ATmega128 ADC 레지스터 요약
- ADMUX - ADC Multiplexer Selection Register
- ADC Control and Status Register A
- ADC Data Register
- Analog/Digital Converter 응용 프로그램 예
- 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
- 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
- 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 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)
- 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
- 실험을 위한 회로 구성
- 실험을 위한 회로 구성 예를 참고하여 PC와 AVR 사이에 UART 통신선을 연결한다.
- 컴퓨터(USB --> UART(RS232) 변환 모듈)의 RXD와 Atmega128의 TXD0(PE1)를 연결한다.
- 컴퓨터(USB --> UART(RS232) 변환 모듈)의 TXD와 Atmega128의 RXD0(PE0)를 연결한다.
- 컴퓨터(USB --> UART(RS232) 변환 모듈)의 GND와 Atmega128의 GND를 연결한다.
- 입력전압을 발생 시키는 가변저항 회로
- 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
- 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
- 실험을 위한 회로 구성
- 실험을 위한 회로 구성 예를 참고하여 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)를 연결한다.
- 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를 변경 하며 실험 한다.
A/D 변환기의 아날로그 입력채널 선택, A/D 변환의 기준 전압을 설정하거나 변환결과의 저장 형식을 지정
A/D변환 Enable 제어 신호 이다.
이 Bit에 1을 Write 하면 Free Running mode로 동작 한다. A/D 변환기는 이 Bit가 Clear 될 때 까지 계속 입력 신호를 Sample하고 변환 결과를 Data Rg에 Update 한다.
XTAL frequency 과 ADC Input clock의 Division factor
Microchip Studio 개발 환경을 이용한 프로그램 예: ms7_adc_basic_uart.zip
cho_adc_basic_uart.pdf: 이 PDF File에는 ADC와 Timer 초기화 및 제어에 관한 부분만 포함 됨. 전체 프로그램은 위에있는 .zip File를 참조 바람.
A/D 변환 프로그램 실험을 위한 회로 구성 예
주: 컴퓨터에 Serial Port가 없는 경우 "USB --> UART(RS232) 변환 모듈"를 사용(USB Port를 Serial Port로 변환)하여 연결한다. 개발보드에 따라서는 "USB --> UART(RS232) 변환 모듈"을 내장하고 있는 경우가 많기 때문에 본인이 사용하는 개발보드에서 확인 하여야 한다.
참고자료: USB - Serial 변환 모듈
Microchip Studio 개발 환경을 이용한 프로그램 예: ms7_adc_basic_interrupt_uart.zip
이 PDF File에는 ADC와 Timer 초기화 및 제어에 관한 부분만 포함 됨. 전체 프로그램은 위에있는 .zip File를 참조 바람.
Microchip Studio 개발 환경을 이용한 프로그램 예: ms7_adc_wave_display_console_uart.zip
A/D 변환 결과를 UART를 이용하여 모니터에 그래프로 표시하는 실험을 위한 회로 구성 예
주: Timer1(OC1A) PWM Mode를 이용 하여 피측정 신호를 발생 시킨다.