Home

ADC pada uC AVR ATMEGA16(dan untuk type yang lain),

· oth3rside

26/12/07, tft-LGoffice Bekasi Atmega16 (dan sejenisnya) memiliki fitur ADC sebanyak 8 channel dengan resolusi 10-bit Register yang digunakan untuk setting ADC ini adalah: +————————————————————————————————————-+ ADCSR | ADEN | ADSC | ADATE | ADIF | ADIE | ADPS2 | ADPS1 | ADPS0 | +————————————————————————————————————–+ 7 6 5 4 3 2 1 0 ADEN : 1=adc enable, 0=adc turn off ADSC : 1:mulai konversi,0:konversi belum terjadi ADATE:1:auto trigger di aktifkan ,trigger berasal; dari sinyal yang dipilih(set pada register SFIOR bit ADTS).ADC akan start konversi pada edge positip sinyal trigger. ADIF:di set ke 1,jika konversi ADC selesai dan data register ter-Update.Namun ADC Conversion Complete Interrupt di eksekusi jika bit ADIE dan bit-I dalam register SREG di set. ADIE:di set 1,jika bit-I dalam register SREG di set. ADPS0:2 ,faktor pembagi 0-7 = 2 2 4 8 16 32 64 128. +————————————————————————————————————-+ ADMUX | REFS1 | REFS0 | ADLAR | MUX4 | MUX3 | MUX2 | MUX1 | MUX0 | +————————————————————————————————————–+ 7 6 5 4 3 2 1 0 REFS 0,1 :pemilihan tegangan referensi ADC 00:vref=AREF, 01:vref=AVCC dengan eksternal capasitor pada AREF, 10:Vref= Reserved , 11: vref= internal 2.56 volt dengan eksternal kapasitor pada AREF ADLAR: Untuk setting format data hasil konversi ADC,default=0. MUX0-MUX4 :pemilihan channel ADC yang digunakan 0=channel1,1=channel 2,dst. +————————————————————————————————————-+ SFIOR | ADTS2 | ADTS1 | ADTS0 | ADHSM | ACME | PUD | PSR2 | PSR10 | +————————————————————————————————————–+ 7 6 5 4 3 2 1 0 ADTS0-ADTS2 :pemilihan trigger untuk konversi ADC.bit-bit ini berhubungan dengan bit ADATE pada register ADCSRA. ADHSM:ADC high speed mode enabled. àlebih jelas baca datasheet Contoh: Inisialisasi:

[sourcecode language=“cpp”]

ADMUX=0x00; //channel 0 ADCSRA=0x8F;//ADEN=1,pembagi XTAL =128 jadi beroperasi pada f= 93.750 kHz SFIOR&=0xEF; ADCSRA|=0x40; [/sourcecode]

Pada rutin Interrupt:

[sourcecode language=“cpp”] unsigned char chan; //nomer chanel adc char lcd_buffer[33]; float temp; // ADC interrupt service routine interrupt [ADC_INT] void adc_isr(void) { unsigned int adc_data,Rconversi; unsigned char cdata[10]; adc_data=0; // Read the AD conversion result adc_data=ADCW; //ambil data if(chan==0) { temp = ((float)ADCW * 0.0048875); //kalibrasi ke scale 5 volt lcd_gotoxy(0,0); sprintf(lcd_buffer,“volt: %0.0001f V “,temp); //1 angka di belakang koma lcd_puts(lcd_buffer); delay_ms(50); chan=1; ADMUX=0x01; ADCSRA|=0x40; //next conversion } else { if(chan==1) { temp = ((float)ADCW * 0.0048875); //kalibrasi ke scale 5 volt lcd_gotoxy(0,1); sprintf(lcd_buffer,“volt: %0.0001f V “,temp); lcd_puts(lcd_buffer); delay_ms(50); chan=0; ADMUX=0x00; ADCSRA|=0x40; //next conversion } } }

[/sourcecode]

Setting perintah sprintf() pada codevisionAVR: Project|Configure|C Compiler tab|pada (s)printf edit box->float, width, precision Program diatas menggunakan mode free running, ADC interrupt terjadi jika konversi data selesai. Data lalu di konversi ke tegangan(Range input 0 - 5 volt) . AREF di hubungkan AVCC.dipakai 2 channel,Channel 0 dan 1.Data tegangan lalu di displaykan ke LCD 16x2 yang terhubung pada PORT C.hasilnya cukup teliti,error 0,02 %.(dibandingkan dengan Voltmeter Asli). -eof-