Semua Tentang Belajar Teknologi Digital Dalam Kehidupan Sehari - Hari

Senin, 03 Juni 2013

Tutorial: Penggunaan ADC dari AVR - Praktek voltmeter ATmega8

Tutorial ini pernah dibahas di forum kaskus yang juga saya asuh dan tidak ada salahnya untuk saya tulis lagi disini (untuk alasan kemudahan search). ADC yang embedded pada microcontroller seri AVR merupakan suatu nilai tambah sehingga banyak yang beralih ke jenis microcontroller ini.

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.




figure792

displaymath1978


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); 
}
III. Script Merubah Binner ke ascii

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); 
}
IV. Program Utama
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 :



Share:

2 komentar:

Kontak Penulis



12179018.png (60×60)
+628155737755

Mail : ahocool@gmail.com

Site View

Categories

555 (8) 7 segmen (3) adc (4) amplifier (2) analog (19) android (14) antares (11) arduino (28) artikel (11) attiny (3) attiny2313 (19) audio (5) baterai (5) blog (1) bluetooth (1) chatgpt (2) cmos (2) crypto (2) dasar (46) digital (11) dimmer (5) display (3) esp8266 (26) euro2020 (13) gcc (1) gsm (1) iklan (1) infrared (2) Input Output (3) iot (76) jam (7) jualan (12) kereta api (1) keyboard (1) keypad (3) kios pulsa (2) kit (6) komponen (17) komputer (3) komunikasi (1) kontrol (8) lain-lain (8) lcd (2) led (14) led matrix (6) line tracer (1) lm35 (1) lora (11) lorawan (2) MATV (1) memory (1) metal detector (4) microcontroller (70) micropython (6) mikrokontroler (2) mikrokontroller (14) mikrotik (5) modbus (9) mqtt (3) ninmedia (5) ntp (1) paket belajar (19) palang pintu otomatis (1) parabola (88) pcb (2) power (1) praktek (2) project (33) proyek (1) python (8) radio (28) raspberry pi (9) remote (1) revisi (1) rfid (1) robot (1) rpm (2) rs232 (1) script break down (3) sdcard (3) sensor (2) sharing (3) signage (1) sinyal (1) sms (6) software (18) solar (1) solusi (1) tachometer (2) technology (1) teknologi (2) telegram (2) telepon (9) televisi (167) television (28) telkomiot (5) transistor (2) troubleshoot (3) tulisan (94) tutorial (108) tv digital (6) tvri (2) vu meter (2) vumeter (2) wav player (3) wayang (1) wifi (3) yolo (7)

Arsip Blog

Diskusi


kaskus
Forum Hobby Elektronika