Selasa, 01 Juni 2010

HOW TO USE 10 BIT ADC IN MIKROKONTROLLER WITH CODEVISION AVR??

Ya...pertanyaan tersebut sering kali ditanyakan orang orang yang suka menggunkan codevisionAVR sebagai developer mereka. Seperti yang ente tau,,, codevision kan ada wizard yang memudahkan kita dalam pembuatan script program, tapi jeleknya, kita yang males baca buku jadi ngga tau isi register register yang ada di codevionAVR.

cukup pembukaannya, langsung saja >> menampilkan data adc 10 bit dengan codevisionAVR

seperti yang kita ketahui, untuk menggunakan ADC di mikrokontroller dengan menggunakan wizardcodevision AVR, langkahnya adalah sebagai berikut, (ane masang adc sebagai interrupt):


oke dari wizard tersebut, kita akan dibuatkan potongan program kaya dibawah ini:

#define FIRST_ADC_INPUT 0
#define LAST_ADC_INPUT 7
unsigned char adc_data[LAST_ADC_INPUT-FIRST_ADC_INPUT+1];
#define ADC_VREF_TYPE 0x20

// ADC interrupt service routine
// with auto input scanning
interrupt [ADC_INT] void adc_isr(void)
{
register static unsigned char input_index=0;
// Read the 8 most significant bits
// of the AD conversion result
// untuk bagian ini, terlihat bahwa register ADCH adalah register adc yang berisi 8 bit data dari //adc, makanya adc_data[] bertipe char (0-255)
adc_data[input_index]=ADCH;
// Select next ADC input
if (++input_index > (LAST_ADC_INPUT-FIRST_ADC_INPUT))
input_index=0;
ADMUX=(FIRST_ADC_INPUT | (ADC_VREF_TYPE & 0xff))+input_index;
// Delay needed for the stabilization of the ADC input voltage
delay_us(10);
// Start the AD conversion
ADCSRA|=0x40;
}

oke, dari potongan program diatas, kita sudah bisa mendapatkan akses data ADC dari register ADCH dengan besaran 0-255 alias 8 bit. Kegunaan dari script lannya silakan dibaca sendiri (wes jelas cung). nah....masalahnya yang kita mau adalah pembacaan adc 10 bit dengan besaran 0-1024 yang jika diaplikasikan untuk beberapa hal bisa kita dapatkan kepresisian yang lumayan bagus.

maka dari itu kita harus membaca register lain yang berisi data adc 10 bit. data 10 bit bisa didapat dari register ADCH dan ADCL yang dalam codevision (atau developer lain berbasis bahasa C) dipermudah dalam mengakses pasangan register ADC (ADCH dan ADCL) sebagai data integer di register ADCW.
dan karena register yang kita baca bertipe integer, maka variable adc_data[] harus juga diinisialisasikan dalam tipe integer. untuk jelasnya , pelototin potongan program dibawah ini:

#define FIRST_ADC_INPUT 0
#define LAST_ADC_INPUT 7
unsigned int adc_data[LAST_ADC_INPUT-FIRST_ADC_INPUT+1];
#define ADC_VREF_TYPE 0x20

// ADC interrupt service routine
// with auto input scanning
interrupt [ADC_INT] void adc_isr(void)
{
register static unsigned char input_index=0;
// Read the 8 most significant bits
// of the AD conversion result
// di sini register yang dibaca oleh adc_data[] adalah register 10 bit ADCW
adc_data[input_index]=ADCW;
// Select next ADC input
if (++input_index > (LAST_ADC_INPUT-FIRST_ADC_INPUT))
input_index=0;
ADMUX=(FIRST_ADC_INPUT | (ADC_VREF_TYPE & 0xff))+input_index;
// Delay needed for the stabilization of the ADC input voltage
delay_us(10);
// Start the AD conversion
ADCSRA|=0x40;
}

oke sekarang kita buat simulasnya di ISIS , disini ane make potensio sebagi input analog buat adc, dengan tengan referensi sama dengan Vcc (makanya Vreff sama Vcc disambungin), cekiprot bro :



simulasinya di proteus bisa kaya gini , cekidot gan:


cek disitu bisa diambil hasil dari pembagi tegangan dari potensio sebanyak 6 biji.
jika referensi tegangan yg kita pake 5 volt dan dengan menggunakan ADC 10 bit, maka kita bisa mendapat kepresisian data hingga 5 volt/1023=0.00488 v atau 4 milivolt tiap kenaikan 1 bit.

lumayan kan,untuk keperluan sensor sederhana kaya lm35, adc 10 bit tersebut sudah cukup mumpuni(walaupun g presisi, yang eror bukan softwarenya, tapi emang lm35 nya yang kacangan)

sekian dulu...
^_^

2 komentar:

Manufactur-ink mengatakan...

salam kenal sebelumnya thanks juga atas blog nya,he9
saya mw tanya klo gunain ADC tapi pembacaan rutin tiap 1 menit gimana ya tanpa delay_ms() klo bisa klo gunain interrupt dan noise canceler itu pa pengaruh nya. maklum baru belajar avr.

Manufactur-ink mengatakan...

alam kenal sebelumnya thanks juga atas blog nya,he9
saya mw tanya klo gunain ADC tapi pembacaan rutin tiap 1 menit gimana ya tanpa delay_ms() klo bisa klo gunain interrupt dan noise canceler itu pa pengaruh nya. maklum baru belajar avr.
mail@
dimas_ink@yahoo.com