Chapter. 9 A/D 컨버터 HBE-MCU-Multi AVR Jaeheug, Lee
목차 1. A/D 컨버터개요 2. ATMega128 의 A/D 컨버터기능 3. A/D 컨버터로광센서읽기
A/D 컨버터개요 A/D 컨버터 (Aalog-to-Digital Coverter) 아날로그신호를컴퓨터가읽을수있는병렬또는직렬의디지털데이터로변환하여주는장치 측정하려는아날로그물리량의범위및시스템의응용목적에따라분해능이나정밀도가적합한것을사용. 변환시간 (coversio time) A/D 변환을수행하는데필요한시간 초당샘플링속도 (samplig rate) 로나타냄 분해능 (resolutio) 디지털출력값을한등급만큼변화시키기위한아날로그입력의최소변화 (A/D 컨버터가표현할수있는최소아날로그량 ) 비트 A/D 컨버터의경우출력의데이터범위는 1/2
ATMega128 의 A/D 컨버터기능 ATmega128 의 A/D 컨버터특징 10 비트분해능 0.5 LBS Itegral No-liearity( 적분비선형성 ) ±2 LBS 정확도 13~260usec 변환시간 (50KHz~200KHz), 15kSPS 의최대분해능, 8 채널의멀티플렉스된단일입력 (A/D 컨버터는한개이며채널을바꿔가며아날로그신호를입력받음 ) 7 채널의차동입력, 10 배또는 200 배의증폭률을가진 2 채널의차동입력, ADC 결과값의좌정렬. 0~Vcc ADC 입력전압범위, 선택가능한 2.56V 의 ADC 레퍼런스전압. 안정된동작을위한 MCU 의디지털전원과별도의아날로그회로전원단자 A VCC 를가지며, A/D 변환에필요한기준전압 AREF 단자지원 Free ruig 또는 Sigle Coversio Mode, ADC 변환완료인터럽트, Sl eep Mode Noise Caceler
ATMega128 의 A/D 컨버터기능 ATMega128 A/D 컨버터레지스터 ADMUX (ADC Multiplexer Selectio Register) A/D 컨버터멀티플렉서선택레지스터 ADCSRA(ADC Cotrol ad Status Register A) A/D 컨버터제어및상태레지스터 A ADCH, ADCL A/D 컨버터데이터레지스터
ATMega128 의 A/D 컨버터기능 ADMUX (ADC Multiplexer Selectio Register) A/D 컨버터멀티플렉서선택레지스터 ADC모듈의아날로그입력채널선택 ADC모듈의기준전압선택 변환결과레지스터의데이터저장형식지정 7 6 5 4 3 2 1 0 REFS1 REFS0 ADLAR MUX4 MUX3 MUX2 MUX1 MUX0
ATMega128 의 A/D 컨버터기능 ADMUX (ADC Multiplexer Selectio Register) 비트 7,6 : REFS1,0 (Referece Selectio Bit) ADC 모듈에서사용하는기준전압을선택하는비트 ADC 에대한 Voltage Referece 선택표 REFS1 REFS0 Voltage Referece 0 0 AREF, Iteral Vref tured off 0 1 AVCC with exteral capacitor at AREF pi 1 0 예약 1 1 Iteral 2.56V Voltage Referece with exteral capacitor at AREF pi
ATMega128 의 A/D 컨버터기능 ADMUX (ADC Multiplexer Selectio Register) 비트 5 : ADLAR (ADC Left Adjust Result) 이비트를 1 로설정하면변환결과가 ADC 데이터레지스터에저장될때 ADC Data Register 의좌측으로끝을맞추어저장 비트 4~0 : MUX4~0 (Aalog Chael ad Gai Selectio Bit) ADC 모듈의아날로그입력채널을선택하는비트 MUX 비트에의한아날로그입력채널선택표 MUX4~0 Sigle Eded Iput 00000 ADC0 00001 ADC1 00010 ADC2 00011 ADC3 00100 ADC4 00101 ADC5 00110 ADC6 00111 ADC7 Positive Differetial Iput Negative Differetial Iput N/A Gai
ATMega128 의 A/D 컨버터기능 MUX 비트에의한아날로그입력채널선택표 MUX4~0 Sigle Eded Iput Positive Differetial Iput Negative Differetial Iput 01000 ADC0 ADC0 10x 01001 ADC1 ADC0 10x 01010 ADC0 ADC0 200x 01011 ADC1 ADC0 200x 01100 ADC2 ADC2 10x 01101 ADC3 ADC2 10x 01110 ADC2 ADC2 200x 01111 ADC3 ADC2 200x 10000 ADC0 ADC1 1x 10001 ADC1 ADC1 1x 10010 N/A ADC2 ADC1 1x 10011 ADC3 ADC1 1x 10100 ADC4 ADC1 1x 10101 ADC5 ADC1 1x 10110 ADC6 ADC1 1x 10111 ADC7 ADC1 1x 11000 ADC0 ADC2 1x 11001 ADC1 ADC2 1x 11010 ADC2 ADC2 1x 11011 ADC3 ADC2 1x 11100 ADC4 ADC2 1x 11101 ADC5 ADC2 1x 11110 1.22V(VBG) 11111 0V(GND) N/A Gai
ATMega128 의 A/D 컨버터기능 ADCSRA(ADC Cotrol ad Status Register A) A/D 컨버터제어및상태레지스터 A ADC 모듈의동작설정 ADC 모듈의동작상태표시 7 6 5 4 3 2 1 0 ADEN ADSC ADFR ADIF ADIE ADPS2 ADPS1 ADPS0 비트 7 : ADEN (ADC Eable) A/D 컨버터작동유무지정 1로설정하면 ADC 모듈 eable 0으로설정하면 ADC 모듈 disable.
ATMega128 의 A/D 컨버터기능 ADCSRA(ADC Cotrol ad Status Register A) 비트 6 : ADSC(ADC Start Coversio) A/D 컨버터변환시작 이비트에 1 을설정하면 ADC 변환이시작 ADEN이 1로설정되고난후첫번째변환에 25개의 ADC 클록주기가필요다음변환부터는 13 클록이요구 AD 변환이종료되고난후자동적으로 0으로변환 비트 5 : ADFR(ADC Free Ruig Select) 프리런닝모드설정 1 : Free ruig 모드로설정 자동으로계속해서 AD 변환실행 0 : 단일변환모드 (Sigle coversio mode) 로설정 사용자가시작하면한번만 AD 변환을실행
ATMega128 의 A/D 컨버터기능 ADCSRA(ADC Cotrol ad Status Register A) 비트 4 : ADIF(ADC Iterrupt Flag) A/D 컨버터인터럽트플래그 A/D 변환의완료를알리는플래그 AD 변환이완료되어 ADC Data Register 값이업데이트되고나면이비트가 1 로세트되면서 AD 변환완료인터럽트를요청 이때 ADIE=1 로설정되고, SREG 레지스터의 I 비트가 1 로설정되어있으면이인터럽트가발생되어처리된다. 비트 3 : ADIE(ADC Iterrupt Eable) A/D 변환완료인터럽트허용 AD 변환완료인터럽트를개별적으로설정 SREG 레지스터의 I 비트가 1 로설정되어있어야한다.
ATMega128 의 A/D 컨버터기능 ADCSRA(ADC Cotrol ad Status Register A) 비트 2~0 : ADPS2~0(ADC Preslcaler Select Bit) A/D 컨버터프리스케일러선택 ADC 모듈에인가되는클록의분주비를선택한다. ADPS 에의한 ADC Prescaler 설정표 ADPS2 ADPS1 ADPS0 분주비 0 0 0 2 0 0 1 2 0 1 0 4 0 1 1 8 1 0 0 16 1 0 1 32 1 1 0 64 1 1 1 128
ATMega128 의 A/D 컨버터기능 ADCH, ADCL A/D 컨버터데이터레지스터 A/D 컨버터의결과를저장하는레지스터 단극성입력사용시 (Sigle Eded Iput) ADMUX 레지스터의 MUX(4:0) 가 00000 ~ 00111 혹은 11110 ~ 11111 변환결과가 10 비트양의정수로표시된다 (0~1023) 차동입력을사용시 (Differecial Iput) ADMUX 레지스터의 MUX(4:0) 가 01000 ~ 11101 변환결과가 10 비트 2 의보수로표현 (-512~+511) 한다. 반드시 ADCL( 하위데이터 ) 를먼저읽어서저장한다음에 ADCH( 상위데이터 ) 를저장한다.
ATMega128 의 A/D 컨버터기능 ADCH, ADCL ADMUX 레지스터의 ADLAR = 0 인경우 : 우정렬 ADCH 15 14 13 12 11 10 9 8 - - - - - - ADC9 ADC8 ADCL 7 6 5 4 3 2 1 0 ADC7 ADC6 ADC5 ADC4 ADC3 ADC2 ADC1 ADC0
ATMega128 의 A/D 컨버터기능 ADCH, ADCL ADMUX 레지스터의 ADLAR = 1 인경우 : 좌정렬 ADCH 15 14 13 12 11 10 9 8 ADC9 ADC8 ADC7 ADC6 ADC5 ADC4 ADC3 ADC2 ADCL 7 6 5 4 3 2 1 0 ADC1 ADC0 - - - - - -
ATMega128 의 A/D 컨버터기능 ATMega128 A/D 컨버터의동작설정 ADMUX 로 A/D 신호를입력받을채널선택 ADCSR 로컨버전프리스케일러설정 인터럽트사용시, 전역인터럽트플래그를 SET 하여인터럽트활성화하고, A/D 변환완료인터럽트처리루틴을구성 ADCSR 의 6 번비트를세트하여 A/D 변환을시작 변환완료플래그를주기적으로점검하거나아날로그디지털컨버전완료인터럽트를이용하여 A/D 컨버전이후의데이터처리루틴을구성 반드시 ADCL( 하위데이터 ) 를먼저읽어서저장한다음에 ADCH( 상위데이터 ) 를저장
ATMega128 의 A/D 컨버터기능 ATMega128 의 A/D 컨버터설정시클럭의선택 10 비트분해능으로정상적인동작을위해서는 50kHz~200kH z 범위의클럭사용 ADCSRA 레지스터의 ADPS2~0 비트에의하여 2,4,8,16,32,6 4,128 중의 1 가지로선택 프리스케일러는 ADCSRA 레지스터에서 ADEN=1 로설정한경우에만동작
실습 13 : A/D 컨버터로광센서읽기 실습개요 ATmega128 의 A/D 컨버터기능을이용하여광센서 ( 포토다이오드 ) 로부터밝기정보를읽어내어 7-Segmet FND 에출력 광다이오드 : 밝기에따라아날로그출력을냄 실습목표 ATmega128 A/D 컨버터의동작원리이해 A/D 컨버터제어방법습득 ( 레지스터설정 ) 광다이오드동작원리이해
실습 13 : A/D 컨버터로광센서읽기 광다이오드 (Photo-Diode) 광에너지를전기에너지로변환하는광센서의일종 밝기에따라아날로그출력을냄 광다이오드는 CD 재생기, 화재경보기, 비디오카세트레코더나텔레비전의리모콘수신부와같은전자제품소자에사용됨.
실습 13 : A/D 컨버터로광센서읽기 사용모듈 : MCU 모듈, Array-FND 모듈, 센서모듈 MCU 모듈포트 G MCU 모듈포트 E MCU 모듈 MCU 모듈포트 F ArrayFND 모듈 온도 / 습도센서 ArrayFND 모듈 Sigal 조도센서 (CDS) 광다이오드 센서모듈 UR_OUT Sigal 센서모듈
실습 13 : A/D 컨버터로광센서읽기 사용모듈 센서모듈의광센서회로 PHOTO_OUT 신호가모듈의 UR_OUT 에매핑되며, 포토다이오드에빛이들어오면광량에따라아날로그신호가발생.
실습 13 : A/D 컨버터로광센서읽기 모듈결선방법 MCU 모듈포트 E의 PE7~PE0를 Array FND 모듈의 A~H까지연결 MCU 모듈포트 G의 PG3~PG0는 Array FND 모듈의 C3~C0 포트에연결 MCU 모듈포트 F의 PF0를센서모듈의 UR_OUT에연결.
실습 13 : A/D 컨버터로광센서읽기 구동프로그램 : 사전지식 A/D 컨버터기능을이용하여광다이오드에서출력되는광량에대한아날로그신호를받아디지털로변환한뒤, 이를 Array-FND 에표시 타이머 / 카운터를이용하여 1 초간격으로데이터를읽어들이도록한다. A/D 컨버터의설정방법 A/D 컨버터의입력채널결정 : 0번채널사용입력데이터의정렬방법과기준전압선택 : 데이터정렬은디폴트인우정렬로하고, 기준전압을내부 2.56V 프리스케일러와인터럽트결정 : 프리스케일러는 64분주를사용하고, 인터럽트는사용하지않음. 인터럽트를사용하지않으므로설정끝 A/D 컨버팅제어 설정을마친후, ADCSR의 6번비트를세트하여 A/D 변환을시작 A/D 변환도중에는변환완료플래그를주기적으로점검하면서 A/D 데이터레지스터로부터데이터를읽어들이면된다. 이때, 반드시 ADCL( 하위데이터 ) 를먼저읽어서저장한다음에 ADCH( 상위데이터 ) 를읽어내야한다.
실습 13 : A/D 컨버터로광센서읽기 구동프로그램 : 소스분석 ADC.c 1) #iclude<avr/io.h> #iclude<util/delay.h> #iclude<avr/iterrupt.h> eum{c0,c1,c2,c3}; usiged char FND_DATA_TBL[]={0x3F,0X06,0X5B,0X4F,0X66,0X6D,0X7C,0X07,0X7F, 0X67,0X77,0X7C,0X39,0X5E,0X79,0X71,0X08,0X80}; usiged char lowvalue=0; usiged char highvalue=0; usiged it adcvalue=0; usiged char timer0ct=0; void prit_fnd(char selcx, usiged char data); SIGNAL(SIG_OVERFLOW0); //Timer0 Overflow0 ISP
실습 13 : A/D 컨버터로광센서읽기 1) it mai(){ DDRE = 0xFF; //data port PORTE = 0x00; // 0~7비트까지의모든비트를클리어한다. DDRG = 0x0F; /* cotrol port 0-3 PIN 0~4 비트까지의 register 중에서 0~3 비트까지의 register 를사용하여출력한다. */ PORTG = 0x0F; /* 0~3 비트까지의비트를 1 로세트한다. */ TCCR0 = 0x07; /* Timer/Cout0의동작을설정 WGM0(1:0) = 00 일반동작모드 COM0(1:0) = 00 OC0사용하지않음 CS0(2:0) = 111 Prescaler 1024분주 */ TCNT0 = 0xff - 80; /* (1 / (7.3728 Mhz / 1024 prescaler )) * 80 => 0.011s 0.011s를얻기위한카운트값 */ TIMSK = 1 << TOIE0; // 오버플로우인터럽트 TIFR = 1 << TOV0; // TOV0 Timer/Couter0 overflow flag 클리어
실습 13 : A/D 컨버터로광센서읽기 2) ADMUX = 0xC0; /* ADMUX 레지스터중에서 6,7 번째레지스터를세트. REFS(1:0) = 11 iteral 2.56V 전원사용 ADLAR = 0 디폴트우정렬 MUX(4:0) = 00000 ADC0 핀사용단극성입력사용 */ ADCSR = 0xA6; /* ADSCR 레지스터중에서 1,2,5,7 번째의비트를세트. ADFR = 1 프리러닝모드 ADPS(2:0) = 110 프리스케일러 64 분주 ADEN = 1 ADC 를 Eable*/ ADCSR = 0x40; sei(); while(1){ 3) prit_fnd(c0, adcvalue%10); } } _delay_ms(3); /* ADC start coversio ADSC = 1 로세트 prit_fnd(c1, (adcvalue/10)%10); _delay_ms(3); prit_fnd(c2, adcvalue/100); _delay_ms(3);
실습 13 : A/D 컨버터로광센서읽기 4) SIGNAL(SIG_OVERFLOW0){ cli(); TCNT0 = 0xff - 80; timer0ct++; if(timer0ct == 90){ // 0.011s * 90 = 1s (1초를얻기위한카운트횟수 ) timer0ct = 0; while( (ADCSR&0x10) == 0x00); //ADC 변환이끝날때까지대기 lowvalue = ADCL; highvalue = ADCH ; adcvalue = (highvalue << 8) lowvalue ; } sei(); } void prit_fnd(char selcx, usiged char data){ switch(selcx){ case C3: //4번째 FND ( 좌측기준 ) PORTG &= 0xF0; // 하나씩만입력하기위해서그전의내용을초기화시킴 PORTG = 0x0E; // 포트 G의 G0을사용하여 C3로출력 Break;
실습 13 : A/D 컨버터로광센서읽기 4) case C2: //3번째 FND PORTG &= 0xF0; // 하나씩만입력하기위해서그전의내용을초기화시킴 PORTG = 0x0D; // 포트 G의 G1을사용하여 C2로출력 break; case C1: //2번째 FND PORTG &= 0xF0; // 하나씩만입력하기위해서그전의내용을초기화시킴 PORTG = 0x0B; // 포트 G의 G2를사용하여 C1으로출력 break; case C0: //1번째 FND PORTG &= 0xF0; // 하나씩만입력하기위해서그전의내용을초기화시킴 PORTG = 0x07; // 포트 G의 G3를사용하여 C0으로출력 break; default: PORTG &= 0xF0; PORTG = 0x0F; // 포트 G의 G4를사용하지않는다. break; } PORTE = FND_DATA_TBL[data]; }
실습 13 : A/D 컨버터로광센서읽기 실행결과