Xedi.Xermawan's Blog

personal-technical blog

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

with 15 comments

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:


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

Pada rutin Interrupt:

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
}
}
}

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 16×2 yang terhubung pada PORT C.hasilnya cukup teliti,error 0,02 %.(dibandingkan dengan Voltmeter Asli).
-eof-

Written by XediXermawan

December 30, 2007 at 9:39 am

Posted in elektronics design

15 Responses

Subscribe to comments with RSS.

  1. slmt sore. mhn maaf
    saa sudah coba menggunakan rutin codewizard untuk lcd dan adc…tai bgmn menggunakan rutin tsb???
    saya saat sedang belajar mengakses adc dan ditampilkan di lcd. mhn pencerahan

    dian

    June 16, 2008 at 10:29 am

  2. slmat siang juga 😛
    yang perlu diperhatikan adalah pemilihan Vreferensinya,internal atau eksternal,lalu bagaimana menampilkannya,seperti yang ada di tlisan saya diatas,saya menggunakan sprintf,untuk mengubah data ADC(type datanya unsigned int yang sudah di ubah ke float) menjadi tipe char yang disimpan dalam variabel lcd_buffer.yang bisa tampilkan dengan lcd_puts

    oth3rside

    June 17, 2008 at 5:55 am

  3. mas saya br belajar mikrokontroler mau nanya di program adc yg mas tulis diatas kan memakai 2 port adc, berarti input tegangannya jg 2 y?

    thanks atas bantuannya

    dementor

    August 21, 2008 at 7:31 pm

  4. ya.

    edie

    August 22, 2008 at 2:32 am

  5. mas mau tanya gimana cara nampilin ADC ke serial (hyperterminal)tapi menggunakan interrupt adc.
    pin adc 8 pin dipake semua.
    klo ada codingnya bisa diemail mas.
    prima_ardiyanto@yahoo.com

    makasih banyak..

    prima

    May 6, 2010 at 4:49 am

  6. #prima:
    mudah sekali, masukkan saja rutin kirim data serial ke dalam rutin interrupt ADC diatas

    oth3rside

    May 7, 2010 at 2:49 am

  7. sudah bisa nampilin mas ADC ke serial menggunakan interrupt ADC. tapi permasalahannya saya baru bisa nampilin satu pin saja.Misal 8pin mau saya tampilin sekaligus gmn mas? dan bagaimana cara tau itu yang dikirim ke serial pinA.1 Atau pinA.2 dst..

    prima

    May 7, 2010 at 9:00 am

  8. #prima
    untuk menggunakan 8 kanal ADC sekaligus melalui interupt, dapat dilakukan dengan mengubah nilai register ADMUX. di contoh program diatas menggunakan 2 kanal bergantian dengan interupt. pengubahan ADMUX dilakukan setiap terjadi interupt ADC.

    oth3rside

    May 10, 2010 at 2:02 am

  9. Tanya mas, LCD di portC gak mau tampil, kenapa ya??

    linkga

    May 15, 2010 at 10:12 pm

  10. banyak kemungkinannya: lcd,portnya,kabelnya,power supplynya, atau program mu yang masih error.lakukan test saja satu persatu-satu.

    oth3rside

    May 17, 2010 at 8:52 am

  11. mas,,knpa ya klo pada atmega8535 klo d coba bwt program di atas g bsa.. krena data stack size mlebihi batas dri atmega8535 trsebut…
    trus gmn mas cra nylesain mslah trsebut??….

    sahili

    May 21, 2010 at 4:05 pm

  12. Data Stack size dari micro AVR bisa disetting, coba diperbesar

    oth3rside

    May 22, 2010 at 9:08 am

  13. ttp sja gk bisa mas.. trus d apakn ya mas??…

    sahili

    May 27, 2010 at 5:09 pm

  14. sore mas..
    mau tanya. saya sudah punya programnya disini :
    http://courses.cit.cornell.edu/ee476/FinalProjects/s2005/ww56_ws62/Final%20Project%20Web/code.c

    nah dari program itu, saya kurang tau apakah itu menggunakan tegangan referensi yang seperti apa? mohon penjelasannya 🙂

    yazid

    July 30, 2010 at 8:48 am

  15. mas saya mau tanya saya menggunakan sensor gas agar terbaca ADC oleh atmega16 gimana caranya kemudian di tampilkan ke lcd 16×2 bahwa gas bocor

    agus

    January 2, 2012 at 5:51 am


Leave a reply to yazid Cancel reply