Seri AVR yg memiliki ADC yg ada dipasaran adalah : ATtiny26, Mega8/8535/16/32 etc . Umumnya seri yg umum dipasaran memiliki lebih dari satu port ADC dengan resolusi 10bit
sebelumnya kita bahas dulu ADC....ADC dulunya terpisah dari micro, biasanya jaman tahun 2000 kebawah kita harus menggunakan ADC terpisah (contoh ADC 0808) yg selanjutnya akan diolah oleh kontroller. contoh rangkaiannya seperti ini, TS inget dulu pernah praktikum bikin voltmeter trus dibaca melalui paralel port PC
ADC 0808 ini memiliki resolusi 8 bit, jadi hasil pengukuran secara digital 0-254
jika AVR memiliki resolusi 10 bit, jadi biner pengukuran 0-1023.
Jadi resolusi menentukan kepekaan dari pembacaan ADC, semisal jika 8 bit dan range pengukuran 0-5V maka perubahan 1bit = 5/253 = 19,6 mV. Jika ADC 10 bit maka perubahan 1bit = 5/1023 = 4,9 mV
ADC akan meminta untuk diberikan tegangan Vref, yg merupakan tegangan cuplik referensi dari analog input. Seinget saya ADC 0808 membutuhkan tegangan referensi Vmax/2 , jadi jika range tegangan 0-5v maka perlu dikasi Vref 2.5 V.
Untuk AVR dapat dipilih tegangan Vref internal (2.56v), VCC sebagai Vref atau Vref external. Kali ini kita menggunakan mode yg paling sederhana yaitu Vref=Vcc , mode pembacaan sekali dan IC yg dipilih adalah ATMEGA 8. Vref merupakan suatu tegangan yang menunjukkan nilai maximum dari pembacaan ADC sehingga mewakili resolusinya. Jadi ADC akan mengeluarkan data binner yang mewakili nilai 0 - Vref dan diperlukan nilai tegangan yang stabil, maka apabila menggunakan baterai atau supply yg dapat naik turun maka diperlukan nilai vref yang stabil dengan regulator tegangan.
Pin ADC pada microcontroller seri AVR memiliki keterbatasan input tegangan yang hanya maximum 6volt, sehingga jika memerlukan pengukuran tegangan (DC) yang lebih tinggi dapat dilakukan pembagian tegangan sederhana menggunakan resistor sehingga tegangan max yg masuk ke ADC tidak melebihi spesifikasi datasheet. Rangkaian buffer atau voltage follower menggunakan op-amp mungkin akan menstabilkan tegangan input sebelum masuk ke pin ADC.
Untuk rangkaian pertama, kita akan mencoba mebuat pembacaan tegangan pada TRIMPOT 10K, dimana berfungsi sebagai voltage divider dan dibaca oleh ADC port 0. Tampilannya akan dikirim menuju LCD 2x16 baris
INGAT karena memakai LCD, maka sebaiknya baca terlebih dulu pembahasan menulis di LCD
Siapkan rangkaian berikut (klik buat gambar lebih jelas)
selanjutnya kita bahas satu persatu codingnya :
I. Insialisai
Code:
#define F_CPU 1000000UL //clock mega8 internal default
#include <string.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include <avr/eeprom.h>
#include "lcd.h" //library lcd milik pfleury
void initADC() //inisialisasi mode ADC dari mega8
{
ADMUX=(1<<REFS0);// Aref=AVcc;
ADCSRA=(1<<ADEN)|(7<<ADPS0);
}
II. Pembacaan data ADC
Code:
uint16_t ReadADC(uint8_t ch)
{
//pemilihan Ch ADC 0-7
ch=ch&0b00000111;
ADMUX|=ch;
//mulai konversi
ADCSRA|=(1<<ADSC);
//tunggu sampai konversi selesai
while(!(ADCSRA & (1<<ADIF)));
//bersihkan ADIF untuk pembacaan selanjutnya
ADCSRA|=(1<<ADIF);
//kembalikan nilai pembacaan ADC
return(ADC);
}
karena pembacaan ADC berupa binner, maka perlu dirubah menjadi ASCII dan dapat langsung ditampilkan ke LCD. Sebenernya WinAVR string.h memiliki fungsi "itoa" / integer to ascii, tetapi memakan memory yg lebih dan mubazir karena konversinya hanya 1 digit saja
Code:
void reverse(char s[])
{
int c, i, j;
for (i = 0, j = strlen(s)-1; i < j; i++, j--){
c = s[i];
s[i] = s[j];
s[j] = c;
}
}
void itoa(int n, char s[])
{
int i, sign;
if ((sign = n) < 0) // record sign
n = -n; // make n positive
i = 0;
do { // generate digits in reverse order
s[i++] = n % 10 + '0'; // get next digit
} while ((n /= 10) > 0); // delete it
if (sign < 0)
s[i++] = '-';
s[i] = '\0'; // add null terminator for string
reverse(s);
}
Code:
int main(void)
{
uint16_t baca,decimal,pecahan;
char dum;
//Inisialisasi LCD (dibahas di tutorial laen)
lcd_init(LCD_DISP_ON);
lcd_clrscr();
lcd_gotoxy(0,0);
lcd_puts("TEST ADC ATMEGA8");
initADC(); //panggil inisialisai ADC
while(1)
{
baca=ReadADC(0); // baca ADC di port 0 , putar-putar trimpot
// mencari nilai decimal dan pecahan
// range 0-5V dengan resolusi 10 bit = 1023 step
// jadi tiap step = 4,9 mili volt
//kalibrasikan dengan nilai VCC yg sebenarnya
decimal= (baca * 4.9)/1000 ;
pecahan= ( ((baca * 4.9) - (decimal * 1000) ) /10);
//tampilkan di LCD
lcd_gotoxy(0,1);
lcd_puts("Nilai=");
itoa(decimal,&dum);
lcd_puts(&dum);
lcd_putc(',');
if(pecahan <10) lcd_putc('0');
itoa(pecahan,&dum);
lcd_puts(&dum);
lcd_puts(" V ");
_delay_ms(100); //kasi delay sebentar
}
return 0;
}
hasil dari skematik & coding diatas dapat dilihat pada gambar berikut :
mas bro bisa mina emailnya
BalasHapusmaaf mas, mau nanya, punya modul untuk buat volmeter digital ini gak mas?
BalasHapus