8. A/D 변환기 순천향대학교 컴퓨터학부 이 상 정 학습 내용 ATmega28 ADC ADC 개요 ADC 레지스터 ADC 프로그램 온도센서 프로그램 순천향대학교 컴퓨터학부 이 상 정 2
ATmega28 ADC 순천향대학교 컴퓨터학부 이 상 정 3 A/D 변환기 개요 물리적인 현상(전압, 전류,온도,속도,조도,습도,압력,속,,습,압력 )들은 아날로그 값이므로 이를 컴퓨터에서 입력 받아 처리하려면 디지털값으로변환필요 물리현상은 센서(sensor)에 의해 검출되어 전압, 전류 등 전기신호로 변환 A/D 변환기(ADC, Analog to Digital Converter) 아날로그의 전기신호(전압)를 디지털 신호로 변환해 주는 장치 분해능(resolution) 아날로그 변화 값을 표시할 수 있는 단계의 수 0비트의 분해능은 024, 즉 입력값이 024 단계로 표시 분해능이 높을 수록 더 정확하게 변환 순천향대학교 컴퓨터학부 이 상 정 4
ATmega28 ADC 개요 ATmega28 ADC 특성 0비트 분해능 8개의 단극성 입력 0 ~ V REF 입력 전압 공급, 0~0x3FF (0~023) 기준전압 V REF 는 A/D 변환되는 전압의 범위 22 종류의 차동입력(differential input) -V REF ~ + V REF의 입력 전압 공급, 0x200~0xFF (-52~5) 0배또는200배증폭가능 8채널의 아날로그 입력은 포트 F로 입력 V REF 값 AVCC(핀 64), 내부 2.56V, AREF 단자(핀 62) 중 선택 순천향대학교 컴퓨터학부 이 상 정 5 ADC CONVERSION COMPLETE IRQ 8-BIT DATA BUS ADC MULTIPLEXER SELECT (ADMUX) ADC CTRL & STATUS REGISTER (ADCSRA) 5 0 ADC DATA REGISTER (ADCH:ADCL) REFS S REFS S0 ADLA AR MUX 5 MUX 3 MUX 2 0 N C R F S2 S S0 ADIF ADIE MUX MUX ADEN ADSC ADFR ADIF ADPS ADPS ADPS ADC[9:0] MUX DECODER PRESCALER AVCC INTERNAL 2.56V REFERENCE N CHANNEL SELECTION N GAIN SELECTION CONVERSION LOGIC AREF 0-BIT DAC - + AGND BANDGAP REFERENCE SINGLE ENDED/DIFFERENTIAL SELECTION ADC7 ADC6 ADC5 ADC4 ADC3 POS. INPUT MUX + GAIN AMPLIFIER ADC MULTIPLEXER OUTPUT ADC2 - ADC ADC0 NEG. INPUT MUX 순천향대학교 컴퓨터학부 이 상 정 6
64 63 62 6 60 59 58 57 56 55 54 53 52 5 50 49 AVCC AGND AREF PF0 (ADC0) PF (ADC) PF2 (ADC2) PF3 (ADC3) PF4 (ADC4/TC PF5 (ADC5/TM PF6 (ADC6/TD PF7 (ADC7/TD GND VCC PA0 (AD0) PA (AD) PA2 (AD2) K) S) O) I) PEN 48 PA3 (AD3) (RXD0/PDI)PE0 2 47 PA4 (AD4) (TXD0/PDO) PE 3 46 PA5 (AD5) (XCK0/AIN0) PE2 4 45 PA6 (AD6) (OC3A/AIN) PE3 5 44 PA7 (AD7) (OC3B/INT4) PE4 6 43 PG2 (ALE) (OC3C/INT5) PE5 7 42 PC7 (A5) (T3/INT6) PE6 (IC3/INT7) PE7 8 9 ATmega28 4 40 PC6 (A4) PC5 (A3) (SS) PB0 0 39 PC4 (A2) (SCK) PB 38 PC3(A) (MOSI) PB2 2 37 PC2 (A0) (MISO) PB3 3 36 PC (A9) (OC0) PB4 4 35 PC0 (A8) (OCA) PB5 5 34 PG (RD) (OCB) PB6 6 33 PG0 (WR) ) PB7 TOSC2/ PG3 TOSC /PG4 ESET 7 8 9 20 2 22 23 24 25 26 27 28 29 30 3 32 순천향대학교 컴퓨터학부 이 상 정 7 (OC2/OCC R VCC GND XTAL2 X XTAL X ) PD0 (SCL/INT0 ) PD (SDA/INT ) PD2 (RXD/INT2 ) PD3 (TXD/INT3 ) PD4 (IC ) PD5 (XCK ) PD6 (T ) PD7 (T2 ATmega28 ADC 레지스터 ADCMUX (ADC Multiplexer Selection Register) ADC 기준전압(reference voltage) 선택 ADC 변환 값 정렬 방법 지정 ADC 입력채널 지정 ADCSRA (ADC Control and Status Register A) ADC 인에이블/디스에이블 ADC 변환 시작 ADC 동작모드 선택 ADC 인터럽트 플래그 ADC 인터럽트 인에이블/디스에이블 ADC 클럭 분주비 ADCL, ADCH (ADC Data Register) ADC 변환값 저장 순천향대학교 컴퓨터학부 이 상 정 8
ADCMUX () ADC Multiplexer Selection Register RFS, RFS0 (Reference Selection) ADC 기준전압(reference voltage) 선택 RFS RFS0 기준전압 0 0 AREF 단자전압 이용 0 AREF 단자전압을 이용하며, AREF 단자와 GND 사이를 콘덴서로 접속 0 - 내부 2.56V를 이용하며, AREF 단자와 GND 사이를 콘덴서로 접속 ADLAR (ADC Left Adjust Result) A/D 변환된 결과를 ADCH:ADCL에 저장하는 형식을 지정 0이면 하위부터 0비트를 사용, 이면 상위부터 0비트를 사용 순천향대학교 컴퓨터학부 이 상 정 9 MUX4~0 단극성 입력 + 차동 입력 - 차동 입력 이득 00000 ADC0 0000 ADC ADCMUX (2) 0000 ADC2 000 ADC3 0000 ADC4 000 ADC5 단일 변환모드 000 ADC6 MUX4~0 00 ADC7 0000 ADC0 ADC0 0x (Analog Channel and Gain 000 ADC ADC0 0x Selection Bits) 000 ADC0 ADC0 200x 00 ADC ADC0 200x A/D 변환기에 연결되는 아날로 000 ADC2 ADC2 0x 그 입력채널과 차동 입력 채널에 00 ADC3 ADC2 0x 대한 이득을 선택 00 ADC2 ADC2 200x 0 ADC3 ADC2 200x 0000 ADC0 ADC x 000 차동 ADC ADC x 000 ADC2 ADC x 00 입력 ADC3 ADC x 000 모드 ADC4 ADC x 00 ADC5 ADC x 00 ADC6 ADC x 0 ADC7 ADC x 000 ADC0 ADC2 x 00 ADC ADC2 x 00 ADC2 ADC2 x 0 ADC3 ADC2 x 00 ADC4 ADC2 x 0 ADC5 ADC2 x 0.23V 순천향대학교 컴퓨터학부 0V(GND) 이 상 정 0
ADCSRA () ADC Control and Status Register A ADEN (ADC Enable) 이면 A/D 변환기의 동작 인에이블, 0이면 동작 디스에이블 ADSC (ADC Start Conversion) 단일 변환 모드에서 이 비트를 로 하면 A/D 변환이 시작, 변환완료 시 0으로 리셋 프리 러닝(Free Running)모드에서 이 비트를 로 하면 첫 번째 A/D 변환 이 시작되고, 그 다음부터는 자동적으로 변환이 반복 ADFR (ADC Free Running Select) 이 비트를 로 하면 A/D 변환기는 프리 러닝 모드로 동작하며, 이 모드에 서A/D 변환기는반복적으로A/D 변환을수행 순천향대학교 컴퓨터학부 이 상 정 ADCSRA (2) ADIF (ADC Interrupt Flag) A/D 변환이 완료되면 세트 인터럽트 인에이블(ADIE=)이면 인터럽트 요청 플래그 ADIE (ADC Interrupt Enable) A/D 변환기 인터럽트 인에이블 비트 ADPS2~0 (ADC Prescaler Select Bits) A/D 변환기에 입력되는 시스템 클럭에 대한 분주비를 선택 ADPS2 ADPS ADPS0 분주비 0 0 0 2 0 0 2 0 0 4 0 8 0 0 6 0 32 0 64 28 순천향대학교 컴퓨터학부 이 상 정 2
ADCL, ADCH () ADC Data Register A/D 변환된 결과를 저장하는 레지스터로서 ADMUX 레지스터의 ADLAR 비트 값에 따라 다음과 같이 저장 순천향대학교 컴퓨터학부 이 상 정 3 ADCL, ADCH (2) 단일 변환모드 0 ~ 0x3FF (0~023) V IN : 입력 전압 IN V REF : 기준 전압 차동입력 모드 0x200~0xFF (-52~5) V POS : 양의 입력전압 V NEG : 음의 입력전압 GAIN: 이득 V REF : 기준 전압 순천향대학교 컴퓨터학부 이 상 정 4
ADC 프로그램 순천향대학교 컴퓨터학부 이 상 정 5 ADC 설정 예 () 단일 변환모드의 ADC0(PORTF.0) 0) 아날로그 입력 채널과AREF 단자의 기준전압을 사용하며 하위 0비트에 변환 결과가 저장되고, 시스템 클럭 의 28분주 클럭에 폴링으로 동작되는 A/D 변환기 설정 예 ADCMUX = 0 단일 변환모드의 ADC0(PORTF.0) 아날로그 입력 채널 MUX4 MUX3 MUX2 MUX MUX0 = 00000 하위 0비트에 변환 결과가 저장 ADLAR = 0 AREF 단자의 기준전압 REFS REFS0 = 00 순천향대학교 컴퓨터학부 이 상 정 6
ADC 설정 예 (2) ADCSRA = 0x87 시스템 클럭의 28 분주 동작 ADPS2 ADPS ADPS0 = 폴링 방식 변환 (인터럽트 디스에이블) ADIE = 0 A/D 변환기 동작 인에이블 ADEN = 순천향대학교 컴퓨터학부 이 상 정 7 프로그램 예제 8- () ADC0(PORTF.0) 아날로그 입력 채널에 가변저항이 연결된 5V를 입력하 고, 가변저항이 변경해 가며 ADC 값과 전압 값을 LCD에 위와 같이 출력 하는 프로그램 시스템 클럭의 28분주 클럭에 폴링으로 동작되는 A/D 변환기 가변저항 (potentiometer) TOCOS GF063 시리즈 : 0~2M Ohm http://www.tocos-j.co.jp/e/catalog/trim/gf063/gf063.html t j / / t /t / l 핀 3과 핀 2를 연결: 가변저항의 최대 저항 값연결 2 2 3 3 VCC VCC *핀 3과 핀 을 연결, 핀 2는 접지 : 가변저항 동작 (시계 방향으로 돌릴수록 저항 증가) *핀2와 핀 을 연결해도 가변저항이 동작하며 (시계 반대 방향으로 돌릴수록 저항 증가) 순천향대학교 컴퓨터학부 이 상 정 8
프로그램 예제 8- (2) PORTF.0 (ADC0)에 가변저항 연결 GND 2 PORTF.0 3 <BOTTOM VIEW> 5V 가변저항을 브레드보드(bread board)에 연결 순천향대학교 컴퓨터학부 이 상 정 9 프로그램 예제 8- (3) ADC 설정 ADCMUX = 0 // 단일 변환모드의 ADC0 입력, AREF 기준전압 ADCSRA = 0x87 // 28분주, 폴링, ADC 인에이블 폴링 방법 A/D 변환 시작 ADCSRA = 0xC7 // 28분주, 폴링, ADC 인에이블, ADSC = A/D 변환 종료 되면 ADC 값 읽기 while ((ADCSRA & 0x0) == 0) ; // ADIF=(변환완료)일 때까지 기다림 ad_val = (int)adcl + ((int)adch << 8) ; // A/D 변환값 읽기 전압계산 V IN = (5*ADC) / 024 순천향대학교 컴퓨터학부 이 상 정 20
#include <mega28.h> #include <delay h> 프로그램 예제 8- (4) #include <delay.h> #include <stdlib.h> /// LCD 포트 #define LCD_RS PORTA.0 #define LCD_RW PORTA. #define LCD_E PORTA.2 #define LCD_DATA PORTC #include "lcd.c" void init(); void AD_disp(int val); void main() int ad_val; init(); //포트초기화 함수 호출 delay_ms(5); //LCD 초기화 후 시간지연 lcd_init(); //LCD 초기화 함수 호출 delay_ms(5); //LCD 초기화 후 시간지연 순천향대학교 컴퓨터학부 이 상 정 2 while () ADCSRA = 0xC7; // 28분주, 폴링, // ADC 인에이블, ADSC = while ((ADCSRA & 0x0) == 0); // ADIF=(변환완료)일 때까지 기다림 ad_val = (int)adcl+((int)adch << 8); // A/D 변환값 읽기 AD_disp(ad_val); // A/D 변환 값 표시 delay_ms(20); void init(void) // LCD 포트 출력 DDRA=0xff; DDRC=0xff; // ADC 초기화 DDRF = 0; // 포트 F 입력 ADMUX = 0; // 단일 변환모드의 ADC0 입력, // AREF 기준전압 ADCSRA = 0x87; // 28분주, 폴링, ADC 인에이블 프로그램 예제 8- (4) void AD_disp(int adcval) float voltage; char buf[0]; // output voltage voltage = (5*adcval)/024.; ftoa(voltage, 2, buf); // 소수점이하 2자리 문자열 lcd_command(0xc0); command(0xc0); // 2행 출력 lcd_strf("vol.="); lcd_str(buf); lcd_strf("v"); // output ADC converted value itoa(adcval, buf); lcd_command(0x80); // 행 출력 lcd_strf("adc="); lcd_str(buf); 순천향대학교 컴퓨터학부 이 상 정 22
실습과제 8- ADC3(PORTF.3) 3) 아날로그 입력 채널에 가변저항이 연결된 5V를입력하고, 가변저항이변경해가며ADC 값과전압값 을 LCD에 위와 같이 출력하면서, 전압의 범위가 홀수 볼트 범위(, 3, 5V)이면 모든 LED가 켜지는 프로그램 시스템 클럭의 28분주 클럭에 폴링으로 동작되는 A/D 변환기 순천향대학교 컴퓨터학부 이 상 정 23 프로그램 예제 8-2 () ADC0(PORTF.0) 0) 아날로그 입력 채널에 가변저항이 연결된 5V를입력하고, 가변저항이변경해가며ADC 값과전압값 을LCD에출력하는프로그램 시스템 클럭의 28분주 클럭에 인터럽트로 동작되는 A/D 변환기 ADC 설정 ADCMUX = 0 // 단일 변환모드의 ADC0 입력, AREF 기준전압 ADCSRA = 0x8f // 28분주, 인터럽트 인에이블, ADC 인에이블 인터럽트 루틴 interrupt t [ADC_INT] void adc_int(void) id) 순천향대학교 컴퓨터학부 이 상 정 24
#include <mega28.h> #include <delay h> 프로그램 예제 8-2 (2) #include <delay.h> #include <stdlib.h> /// LCD 포트 ADCSRA = 0xCF; // 28분주, 인터럽트 인에이블, #define LCD_RS PORTA.0 #define LCD_RW PORTA. // ADC 인에이블, ADSC = // 무한루프 #define LCD_E PORTA.2 while () ; #define LCD_DATA PORTC #include "lcd.c" void init(); void AD_disp(int val); void main() int ad_val; init(); //포트초기화 함수 호출 delay_ms(5); //LCD 초기화 후 시간지연 lcd_init(); //LCD 초기화 함수 호출 delay_ms(5); //LCD 초기화 후 시간지연 순천향대학교 컴퓨터학부 이 상 정 25 interrupt [ADC_INT] void adc_int(void) int ad_val; ad_val = (int)adcl + ((int)adch << 8); // A/D 변환값 읽기 AD_disp(ad_val); // A/D 변환 값 표시 delay_ms(20); ADCSRA = 0xCF; // 28분주, 인터럽트, // ADC 인에이블, ADSC = void init(void) // DDRA=0xff; DDRC=0xff; // ADC 초기화 DDRF = 0; // 포트 F 입력 ADMUX = 0; // 단일 변환모드의 ADC0 입력, // AREF 기준전압 ADCSRA = 0x8F; // 28분주, 인터럽트 인에이블, ADC 인에이블 SREG = 0x80; // 전역 인터럽트 인에이블 // LCD 포트 출력 프로그램 예제 8-2 (3) void AD_disp(int adcval) float voltage; char buf[0]; // output voltage voltage = (5*adcval)/024.; ftoa(voltage, 2, buf); // 소수점이하 2자리 문자열 lcd_command(0xc0); command(0xc0); // 2행 출력 lcd_strf("vol.="); lcd_str(buf); lcd_strf("v"); // output ADC converted value itoa(adcval, buf); lcd_command(0x80); command(0x80); // 행 출력 lcd_strf("adc="); lcd_str(buf); 순천향대학교 컴퓨터학부 이 상 정 26
실습과제 8-2 ADC2(PORTF.2) 2) 아날로그 입력 채널에 가변저항이 연결된 5V를입력하고, 가변저항이변경해가며ADC 값과전압값 을 LCD에 위와 같이 출력하면서, 전압이 3V 이상이면 모든 LED가 켜지는 프로그램 시스템 클럭의 28분주 클럭에 인터럽트으로 동작되는 A/D 변환기 순천향대학교 컴퓨터학부 이 상 정 27 온도센서 프로그램 순천향대학교 컴퓨터학부 이 상 정 28
실습보드 온도센서 온도센서 LM35와 OP AMP(신호 증폭)가 온도를 전압으로 변환 변환된 전압의 출력은 터미널(OUT, GND)와 연결되어있음 출력 터미널 OUT을 ADC의 아날로그 입력채널에 연결하여 A/D 변환 LM35 온도센서 -55 C ~ +50 C 선형 0mV/ C 4V-20V 동작 온도변환식 T = ((50+55)/023)*ADC-55 순천향대학교 컴퓨터학부 이 상 정 29 프로그램 예제 8-3 () ADC0(PORTF.0) 0) 아날로그 입력 채널에 온도센서의 출력 (OUT)을 입력하여 ADC, 전압, 온도 값을 LCD에 출력하는 프 로그램 시스템 클럭의 28분주 클럭에 폴링으로 동작되는 A/D 변환기 ADC 설정 ADCMUX = 0 // 단일 변환모드의 ADC0 입력, AREF 기준전압 ADCSRA = 0x87 // 28분주, 폴링, ADC 인에이블 폴링 방법 A/D 변환 시작 ADCSRA = 0xC7 // 28분주, 폴링, ADC 인에이블, ADSC = A/D 변환 종료 되면 ADC 값 읽기 while ((ADCSRA & 0x0) == 0) ; // ADIF=(변환완료)일때까지기다림 ad_val = (int)adcl + ((int)adch << 8) ; // A/D 변환값 읽기 순천향대학교 컴퓨터학부 이 상 정 30
#include <mega28.h> #include <delay h> 프로그램 예제 8-3 (2) #include <delay.h> #include <stdlib.h> /// LCD 포트 #define LCD_RS PORTA.0 #define LCD_RW PORTA. #define LCD_E PORTA.2 #define LCD_DATA PORTC #include "lcd.c" void init(); void AD_disp(int val); void main() int ad_val; init(); //포트초기화 함수 호출 delay_ms(5); //LCD 초기화 후 시간지연 lcd_init(); //LCD 초기화 함수 호출 delay_ms(5); //LCD 초기화 후 시간지연 순천향대학교 컴퓨터학부 이 상 정 3 while () ADCSRA = 0xC7; // 28분주, 폴링, // ADC 인에이블, ADSC = while ((ADCSRA & 0x0) == 0); // ADIF=(변환완료)일 때까지 기다림 ad_val = (int)adc+((int)adch << 8); // A/D 변환값 읽기 AD_disp(ad_val); // A/D 변환 값 표시 delay_ms(20); void init(void) // LCD 포트 출력 DDRA=0xff; DDRC=0xff; // ADC 초기화 DDRF = 0; // 포트 F 입력 ADMUX = 0; // 단일 변환모드의 ADC0 입력, // AREF 기준전압 ADCSRA = 0x87; // 28분주, 폴링, ADC 인에이블 프로그램 예제 8-3 (3) void AD_disp(int adcval) float voltage, temp; char buf[0]; // output ADC converted value itoa(adcval, buf); lcd_command(0x80); // 행 출력 lcd_strf("adc="); lcd_str(buf); 순천향대학교 컴퓨터학부 이 상 정 32 // output voltage voltage = (5*adcval)/024.; ftoa(voltage, 2, buf); // 소수점이하 2자리 문자열 lcd_strf( strf(",v= V="); lcd_str(buf); lcd_strf("v"); // output temperature temp = ((50+55)/023.)*adcval-55; // 온도 변환 ftoa(temp, 2, buf); lcd_command(0xc0); // 2행 출력 lcd_strf("temp.= "); lcd_str(buf); lcd_strf(" C");
실습과제 8-3 ADC3(PORTF.3) 3) 아날로그 입력 채널에 온도센서를 입력하 고, 온도가 25 C 이상이면 LED를 깜빢거리면서 LCD에 Fire!!를 출력하는 프로그램 시스템 클럭의 28분주 클럭에 폴링으로 동작되는 A/D 변환기 순천향대학교 컴퓨터학부 이 상 정 33