Anda di halaman 1dari 5

ADC internal Atmega16 dan LM35

Posted on 11/14/2012 by aminanto Tulisan ini akan membahas penggunaan fitur A/D Converter pada Atmega16. Jika kita lihat di datasheet, spesifikasi dari A/D converter internal ini: Resolusi maksimum 10 bit Akurasi 2 LSB Waktu konversi 13-260 us Jangkauan tegangan masukan antara 0 hingga VCC Tegangan referensi internal 2,56 volt Dapat dijalankan pada mode free running atau konversi tunggal Interupsi saat ADC selesai konversi PORT A pada ATmega16 dapat menerima input analog yang merupakan masukan bagi ADC sekaligus dapat digunakan sebagai I/0. Beberapa hal yang perlu diketahui terkait ADC internal ini: Pin 40-33 yakni ADC0-ADC7 merupakan masukan 8 channel untuk ADC AREF, yakni pin 32 digunakan sebagai Analog Reference yang merupakan tegangan referensi utk ADC ketika menggunakan referensi tegangan eksternal. AVCC, digunakan untuk mensuplay ADC dan PORT A. Pin ini harus terkoneksi ke tegangan yang sama dengan VCC. Tegangan referensi diperlukan sebagai acuan rasio konversi ketika membuat program nantinya. Kita juga dapat menggunakan referensi internal di ADC, sebesar 2.56 volt. Register ADC Untuk menggunakan ADC, harus terlebih dahulu menyeting beberapa register. ADMUX register

REFS[0-1] digunakan untuk setting tegangan referensi ADC. MUX[0-4] digunakan untuk seting channel yang digunakan sebagai analog input. ADLAR digunakan untuk menentukan apakah hasil konversi disimpan pada ADCH atau ADCL. ADCSRA (register control dan status ADC)

ADEN, harus diset 1 untuk mengaktifkan ADC ADSC, set 1 untuk menginstruksikan konversi ADATE, set ADC untuk auto triggering ADIF, flag yang akan bernilai 1 jika konversi telah selesai ADIE, mengenable ADC complete interups ADPS[2:0], setting nilai pembagi untuk menentukan clock dari ADC. Dan range frekuensi ADC harus antara 50KHz 200KHz. Secara matematis, perhitungan clock.

ADCH dan ADCL (register data) Setelah selesai konversi, data akan disimpan pada ADCH dan ADCL. Metode penyimpanan akan tergantung pada nilai ADLAR pada register ADMUX. Jika ADLAR 1:

ADLAR=0

Jika kita tidak membutuhkan ketelitian yg terlalu tinggi, maka kita dapat mengeset ADLAR=1 dan

sebaliknya. Inisialisasi ADC Untuk inisialisasi, kita akan membuat sebuah fungsi dalam C. Contoh, kita menggunakan tegangan referensi eksternal 5V. Channel yang digunakan sebagai analog input adalah ADC0. dengan nilai pembagi Frek. Clock 128. Pada tahap ini kita seting register ADMUX dan ADCSRA, dalam bahasa C:

void ADC_init(void) { ADMUX|=(1<REFS0); // karena nilai default MUX0 adalah 0, tidak perlu setting lanjut untuk // menggunkan ADC0 sebagai channel input analog ADCSRA=(1<<ADEN)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0); }
Membaca input analog unsigned int ADC_read(unsigned char ch) { ch= ch & 0b00000111; // channel must be b/w 0 to 7 ADMUX |= ch; // selecting channel ADCSRA|=(1<<ADSC); // start conversion while(!(ADCSRA & (1<<ADIF))); // waiting for ADIF, conversion complete ADCSRA|=(1<<ADIF); // clearing of ADIF, it is done by writing 1 to it return (ADC); } Code diatas akan menggunakan channel ADC[0:7] sebagai analog input dengan menyeting pada register ADMUX. Konversi dimulai begitu ADSC diset 1. Ketika ADIF bernilai 0, maka ADIF kembali diset 1. Sample Code Kali ini akan dicontohkan implementasi dari ADC internal Atmega16 untuk melakukan konversi tegangan analog dari LM35, keluaran dari ADC akan menyalan LED yang disambungkan ke PORT B. #include <avr/io.h> #include <stdlib.h> #include <util/delay.h> unsigned int ADC_read(void); void ADC_init(void); void ADC_init(void) // Initialization of ADC { ADMUX=(1<<REFS0); ADCSRA=(1<<ADEN)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0); } // Read the AD conversion result unsigned int ADC_read(void) {

// faktor pembagi 128

ADCSRA|=(1<<ADSC); // start conversion while(!(ADCSRA & (1<<ADIF))); // waiting for ADIF, conversion complete ADCSRA|=(1<<ADIF); return (ADC); } int main(void) { unsigned int value, port_val, prev_val; DDRA=0xFE; DDRB=0xFF; DDRD=0xFE; //0x03; ADC_init(); // Initialization of ADC while(1) { value=ADC_read(); port_val = value; value=value*0.48828125; PORTB=value; _delay_ms(1000); } }

Paling gampang, menggunakan ISIS proteus untuk melakukan simulasi ini. Buat wiring proteus seperti berikut: Komponen yang dipakai diatas: tekan P, dan ambil komponen yang ada disamping

konversi kode diatas menggunakan CodeVision, Atmel Studio, atau software sejenis.

Semoga bermanfaat ...