Senin, 27 Juni 2011

ANALOG TO DIGITAL CONVERTER (ADC)

Mikrokontroler ATmega8535 memiliki fasilitas analog yang sudah build in didalam chip. Fitur internal ADC inilah yang menjadi salah satu kelebihan mikrokontroler ini jika dibandingan dengan beberapa jenis mikrokontroler lainnya.

Atmega memiliki resolusi ADC 10 bit (dapat juga menggunakan ADC 8 bit) dengan 8 channel (PA0-PA7) input ADC dan mendukung 16 macam penguat beda. ADC ini bekerja dengan teknik succecive approximation. Rangkaian internal ADC memiliki catu daya tersendiri yaitu pin AVCC. Untuk lebih jelasnya silakan download datasheet ATmega8535 disini.

Data hasil konversi ADC 10 bit (1024) adalah:
ADC=(Vin*1024)/Vref

Jika menggunakan compiler Codevision, kita dapat dengan mudah menggunakan CodeWizardAVR, berikut adalah cara mensetting ADC pada codevision AVR.


Jika ingin menggunakan ADC 8 bit maka tinggal meng-klik saja pada “use 8 bit“. “Volt Ref” merupakan sumber pemilihan tegangan referensi ADC, sedangkan “Clock” adalah banyaknya frekuensi sampling ADC. Dan “Auto Trigger Source” merupakan mode ADC yang akan digunakan.

Sedangkan instruksi untuk pembacaan ADC pada program CodeVision AVR adalah sebagai berikut:
int ADC;//variabel ADC dengan tipe data integer
ADC=read_adc(0);//baca data ADC dari channel 0 (ADC0/PA1)

Berikut adalah contoh program ADC 10 bit, dengan tegangan input berasal dari potensiometer yang difungsikan sebagai pembagi tegangan. Cara kerjanya adalah terdapat tiga buah potensiometer dan nilai ADC dari ketiganya ditampilkan pada LCD. Jika salah satu potensio tersebut mempunyai nilai yang paling besar maka LED akan menyala sesuai dengan potensio tersebut.

Berikut adalah listing program lengkapnya:

#include <mega16.h>
#include <stdlib.h>
#include <lcd.h>
#include <delay.h>

int potensio1, potensio2, potensio3;
char temp[6];

// Alphanumeric LCD Module functions
#asm
.equ __lcd_port=0×15 ;PORTC
#endasm

#define ADC_VREF_TYPE 0×00
// Read the AD conversion result
unsigned int read_adc(unsigned char adc_input)
{
ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);
// Delay needed for the stabilization of the ADC input voltage
delay_us(10);
// Start the AD conversion
ADCSRA|=0×40;
// Wait for the AD conversion to complete
while ((ADCSRA & 0×10)==0);
ADCSRA|=0×10;
return ADCW;
}

void main(void)
{
PORTD=0xff;
DDRD=0×07; //Bit PD2-0 sebagai output untuk menghidupkan LED

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0×80;
SFIOR=0×00;

// ADC initialization
// ADC Clock frequency: 750.000 kHz
// ADC Voltage Reference: AREF pin
// ADC Auto Trigger Source: None
ADMUX=ADC_VREF_TYPE & 0xff;
ADCSRA=0×84;

// LCD module initialization
lcd_init(16);

while (1)
{
potensio1=read_adc(0);//baca ADC channel 0 (ADC0 atau PA0)
potensio2=read_adc(1);//baca ADC channel 1 (ADC1 atau PA1)
potensio3=read_adc(2);//baca ADC channel 2 (ADC2 atau PA2)

if (potensio1>potensio2 && potensio2>potensio3)
{PORTD=0b11111110;}//jika paling besar nilai potensio 1, nyalakan led1
if (potensio2>potensio1 && potensio2>potensio3)
{PORTD=0b11111101;}//jika paling besar nilai potensio 2, nyalakan led2
if (potensio1<potensio2 && potensio2<potensio3)
{PORTD=0b11111011;}//jika paling besar nilai potensio 3, nyalakan led3

lcd_clear( );
lcd_gotoxy(0,0);
lcd_putsf(“ElectrO-cOntrOl”);
itoa(potensio1,temp);//menampilkan nilai ADC potensio1
lcd_gotoxy(0,1) ;
lcd_puts(temp);
itoa(potensio2,temp);//menampilkan nilai ADC potensio2
lcd_gotoxy(5,1) ;
lcd_puts(temp);
itoa(potensio3,temp);//menampilkan nilai ADC potensio3
lcd_gotoxy(10,1) ;
lcd_puts(temp);
delay_ms(300);
};
}

8 komentar:

  1. wah makasih udah berbagi ilmunya mas.. :)
    saya mau tanya, ketika saya mencoba untuk membuat program dg bantuan codewizard untuk ADC 10 bit menggunakan ATMega8535 (menampilkan hasil ADC ke LCD), saat di run di ISIS mengapa di simulasi itu yg tertampil adalah bilangan dari 0 hingga 255 dan itu berulang hingga 4x dalam sebuah rangkaian pembagi tegangan menggunakan trimpot? bukan tertampil bilangan 0 - 1023.. mohon bantuannya mas..
    Terma kasih..

    BalasHapus
  2. klo munculnya 0-255 itu berarti anda menggunakan ADC 8 bit... coba dicek lagi saat meng-generate menggunakan codewizard codevision AVR

    BalasHapus
  3. mas kalo punya saya kog kodingannya seperti ini kira2
    lcd_clear();
    lcd_gotoxy(0,0);
    sprintf(temp,"adc=%d",read_adc(0));
    lcd_puts(temp);
    delay_ms(500);

    nah kenapa yang tampil di lcd tidak di kolom 0 baris 0, malahan tulisan yang keluar seperti gambar bergerak, selain itu harusnya adc=.., nah malah terkadang tumpang tindih tulisan yg muncul
    saya pake lcd bawaan di modul gsm staterkit, apakah ada settingan yg perlu dibenahi?

    BalasHapus
  4. mas..mau nanya klo rumus buat ubah ke satuan ppm bgmn y?? soalnya ak buat rangkaian pendeteksi asap dengan sensor tgs 2600 dgn mikrokontroller 8535 trus outpunya ke lcd dan buzzer..

    BalasHapus
  5. mas yang dibaca itu satuan apa hambatan, arus ato tegangan..mas klo saya 8 karakter dibris pertama trus 8 karakter dibari kedua ko beda tampilanya..saya pakai proteus 7.4 sp3 portebel

    BalasHapus
  6. mas bisa bantu membuat sebuah program dengan code vision avr untuk menampilkan selisih data digital hasil konversi ADC mode 8 bit ATMEGA8535

    misal kita Gunakan input channel 2 dan 3 dengan rumus perhitungan channel 2 - channel 3 + 10 (input analog CH2 harus lebih besar dari CH3).
    tetapi menggunakan interupsi adc !
    dan Tampilan hasil perhitungan menggunakan penampil Led...kebingungan nich..thanks

    BalasHapus
  7. excellent job I hope learn more about CodeVision

    BalasHapus