4. ADC 충북인력개발원 전자과 공학박사 강원찬
ADC1=THERMO ADC2=CDS ADC3=TEMP ADC4=PERSON ADC5=VR ADC6=x ADC7=x ADC8=x
PORTA=J29(LED) PORTB=J65(LED) ADC=J64(ADC sensor)
새 프로젝트 생성(File->New)
ADC 예제1 #include <mega128.h> unsigned char result=0xff; interrupt[ADC_INT] void adc(void) { #asm("cli"); result=ADCL; //좌측 정렬 후 하위값 먼저 읽고 result=ADCH; // 상위 값을 읽는다. #asm("sei"); } void main( void ) { DDRB=0xff; // 포트 B 출력 PORTB=0xFF; // LED off DDRF |= 0xfd; //ADC1(PF1)입력, DDRF_1=0; ADMUX=0x21; //0010 0001 외부 AREF, 좌정렬 채널 1번 (0x21=CdS임) ADCSRA=0xA7; //1010 0111 ADC enable, adc free running select, 128분주 ADCSRA |= 0x08; //ADC interrupt enable ADCSRA |= 0x40; //ADC start conversion #asm("sei"); while(1) { if(result>0x80) PORTB=0x00; // PORTB=result; else PORTB=0xff; }; }
ADC 예제2(10bit) #include <mega128.h> #include <delay.h> #define ADC_VREF_TYPE 0x00 typedef unsigned char BYTE; typedef unsigned int WORD; typedef unsigned long DWORD; BYTE adc_flagg; BYTE AD_L; BYTE AD_H; // ADC interrupt service routine interrupt [ADC_INT] void adc_isr(void) { AD_L = ADCL; AD_H = ADCH; adc_flagg = 1; } void adc_init(void) { ADCSRA = 0x00; //disable adc ADMUX = 0x00; //select adc input 0 ADCSRA = 0x00; void ADC_PROCESS(BYTE SELE) { // WORD TEMP_DATA = 0x0000; ADCSRA = 0x9E; ADMUX = SELE; #asm("sei"); adc_flagg = 0; ADCSRA|=0x40; while(!(adc_flagg)); ADCSRA = 0x00; //ADCSRA&=0xBF; #asm("cli"); }
void main(void) { WORD TEMPD1; WORD TEMPD2; WORD LOW_D1; PORTA=0x00; DDRA=0xff; PORTB=0x00; DDRB=0xff; PORTE=0x00; DDRE = 0x0E; PORTF=0x00; DDRF=0x00; PORTG=0x00; DDRG=0x00; ACSR=0x80; SFIOR=0x00; adc_init(); #asm("sei"); while (1) { // PT100 0X41 // KTYPE 0X40 // ADC 채널을 지정하시오 ADC_PROCESS(0x41); TEMPD1 = AD_H; TEMPD2 = TEMPD1 << 8; TEMPD1 = TEMPD2 + AD_L; LOW_D1 = TEMPD1 - 250;// 16비트로가공 PORTA=AD_H; //상위출력 PORTB=AD_L; //하위출력 delay_ms(300); }; }
연습문제 1) 다양한 센서의 입력을 받아 LED(PORTB) 표 표시하시오. 10비트 A/D변환 5종 센서 입력 LED 를 레벨로 표시 10비트 A/D변환 Lcd 에 검출값을 표기하시오.
-끝-