Analog To Digital Converter (ADC) Mikrokontroler AVR ATMEGA32

robotics-university.com | Analog to Digital Converter atau ADC adalah fitur dalam mikrokontroler yang memiliki fungsi untuk menggonversi (merubah) sinyal masukan analog (dari peranti masukan eksternal) menjadi sinyal masukan digital. Pada mikrokontroler, ADC dapat digunakan untuk berkomunikasi antara mikrokontroler dengan peranti-peranti eksternal (sensor) yang memiliki gelombang sinyal keluaran berupa gelombang sinyal analog (sinus). Gambar 1 merupakan gambar diagram blok fitur ADC pada mikrokontroler AVR ATMEGA32.


Gambar 1. Diagram blok ADC mikrokontroler AVR ATMEGA32

A. Register Pengatur ADC Mikrokontroler AVR ATMEGA32
Dalam pengaturan ADC melibatkan beberapa register. Register-register tersebut antara lain sebagai berikut:
  1. ADC Multiplexer Selection Register (ADMUX)
  2. ADC Control & Status Register A (ADCSRA)
  3. ADC Data Register (ADCL dan ADCH)
  4. Special Function I/O Register (SFIOR)
B. Spesifikasi ADC Mikrokontroler AVR ATMEGA32
  1. Resolusi ADC= 10-bit
  2. Akurasi mencapai ± 2LSB
  3. Memiliki 8 kanal ADC
  4. Rentang tegangan input = 0 volt – Vcc
  5. Tegangan referensi internal = 2,56 volt
  6. Terdapat 2 mode kerja, yaitu:
    a) Konversi tunggal (single conversion)
    b) Konversi terus-menerus (free running)
  7. Konversi ADC dimulai ketika mendapat auto trigger dari sumber interupsi.
  8. Lengkapnya proses konversi ADC dapat menjadi pemicu interupsi.
  9. Nilai minimum ADC = 0 volt (GND)
  10. Nilai maksimum ADC = tegangan pada pin AREF (minus 1 LSB).
  11. Sinyal tegangan input ADC tidak boleh melebihi tegangan referensinya.
  12. Hasil konversi ADC disimpan pada pasangan register ADCH dan ADCL.

C. Kode Digital ADC
ADC mengonversi tegangan input analog menjadi bilangan (kode) digital selebar 10-bit.
Rumus kode digital ADC:

1) Resolusi 10-bit.
ADC = (Vinput/Vref) x 1024

2) Resolusi 8-bit.
ADC = (Vinput/Vref) x 256

Contoh perhitungan kode digital ADC:
Misalkan terdapat input kanal ADC beresolusi 8-bit adalah 2,5 volt dan tegangan referensi yang digunakan Vref internal sebesar 2,56 volt, sehingga kode digital ADC-nya adalah:
= (2500 mV/2560 mV) x 256
= 250 -  dalam desimal
= FA - dalam heksadesimal
= 11111010 - dalam biner

Catatan:
Akurasi ADC tidak sempurna (toleransi ±2LSB), sehingga kemungkinan kode digital ADC yang dihasilkan tidak tepat 0xFA, namun bisa di atasnya (0xFB/0xFC) atau di bawahnya (0xF8/0xF9).

D. Prosedur Pengaturan ADC
Prosedur 1: Pengaturan register ADMUX


Berfungsi untuk:
  1. Memilih kanal ADC yang akan digunakan.
    bit MUX0, MUX1, MUX2, MUX3, dan MUX4 (lihat tabel 1).
  2. Menentukan format data hasil konversi ADC
    bit ADLAR. Lihat formatnya pada register ADCH & ADCL.
  3. Memilih tegangan referensi ADC
    bit REFS0 dan REFS1 (lihat tabel 2).

Tabel 1. Memilih kanal ADC



Tabel 2. Memilih tegangan referensi ADC




Register ADCH dan ADCL berfungsi untuk menyimpan data hasil konversi ADC dengan format yang bergantung pada nilai bit ADLAR (0 atau 1) pada register ADMUX (bit ke-5).

Prosedur 2: Pengaturan register ADCSRA


Berfungsi untuk:
  1. Menentukan faktor pembagi (prescaler) frekuensi CPU yang digunakan sebagai clock ADC
    bit ADPS0, ADPS1, dan ADPS2 (Lihat tabel 3)
  2. Memilih mode operasi ADC
    bit ADATE = 1 - Mode single conversion/auto trigger
    bit ADATE = 0 - Mode free running conversion

    Mengaktifkan auto trigger ADC (bit ADATE = 1), sehingga proses pengonversian sinyal analog dimulai. Sumber trigger diatur menggunakan bit ADTS0, ADTS1, dan ADTS2 pada register SFIOR. Sumber trigger tergantung pada pengaturan bit ADATE pada register ADCSRA.
  3. Mengaktifkan ADC (bit ADEN = 1)
  4. Memulai proses konversi (start conversion) ADC (bit ADSC = 1)
    Jika mode single conversion: set ADSC tiap kali akan mengonversi.
    Jika mode free running: set ADSC untuk memulai awal konversi.
Jika ADC beroperasi dengan mode single conversion dan menggunakan interupsi, maka:
  1. Aktifkan interupsi ADC (bit ADIE = 1)
  2. Aktifkan interupsi global mikrokontroler (bit-I pada register SREG = 1) atau dengan perintah - sei ();
  3. Buat fungsi layanan interupsi:
ISR(ADC_vect)
{
   ……program yang akan dikerjakan…
 }



Gambar 2. Prescaler ADC


Tabel 3. Pengaturan prescaler frekuensi clock untuk ADC




Register SFIOR berfungsi untuk menentukan sumber auto trigger konversi ADC, yaitu dengan menentukan nilai dari bit ADTS0, ADTS1, dan ADTS2

Tabel 4. Pengaturan nilai bit-bit pemilih sumber auto trigger ADC


Catatan untuk register SFIOR:
Efek pengaturan ADTS0, ADTS1, dan ADTS2 bergantung pada pengaturan bit ADATE pada register ADCSRA (bit ke-5).

Jika ADATE = 1, maka sumber auto trigger akan menjadi pemicu otomatis proses konversi ADC.
Jika ADATE = 0, maka pengaturan bit ADTS0 – ADTS2 tidak akan berdampak apa-apa pada sistem.

E. Mode Operasi ADC

1. Mode Operasi ADC - Single Conversion
  • Konversi dilakukan untuk sekali pembacaan sampel sinyal input.
  • Jika ingin membaca lagi harus melakukan sampel sinyal input lagi, sehingga kita dapat mengonversi sinyal tegangan input ketika dibutuhkan saja.
  • Konversi tunggal akan dimulai ketika bit-ADSC pada register ADCSRA di-set. Bit tersebut akan tetap set sampai satu kali konversi selesai (complete). Setelah konversi selesai, maka secara otomatis bit-ADSC akan clear.



Gambar 3. Timing diagram ADC, first conversion (single conversion mode)




Gambar 4. Timing diagram ADC single conversion mode

2. Mode Operasi ADC - Single Conversion (Auto triggered)
  • Single conversion dengan auto trigger adalah alternatif cara aktivasi konversi ADC.
  • Pada mode auto trigger, proses konversi ADC dapat dipicu secara otomatis oleh beberapa variasi sumber pemicunya (trigger).
  • Mode ini akan aktif dan proses konversi ADC dimulai ketika:
    1) Bit ADATE pada register ADCSRA di-set.
    2) Sumber pemicu auto trigger dipilih.
        (mengatur bit ADTS0, ADTS1, dan ADTS2 pada register SFIOR)
    3) Ada transisi (edge) sinyal positif (0 ke 1) dari sumber trigger.
    4) Faktor pembagi clock (prescaler) pada register ADCSRA di atur (ADSP0/1/2).
    5) Bit ADSC pada register ADCSRA di-set.
  • Proses konversi baru tidak akan terjadi jika sinyal trigger masih set ketika proses konversi ADC selesai (complete).
  • Jika terjadi transisi (edge) sinyal positif lain saat proses konversi berlangsung, maka edge sinyal tersebut akan diabaikan.


Gambar 5. Logika auto-trigger ADC




Gambar 6. Timing diagram auto-trigger ADC

3. Mode Operasi ADC - Free Running
  • Penggunaan flag interupsi ADC sebagai sumber trigger membuat proses konversi ADC baru dimulai segera setelah proses konversi yang sedang berjalan selesai (complete).
  • Pada kondisi tersebut, ADC bekerja pada mode free running conversion.
  • Pada mode free running, konversi dilakukan secara terus-menerus (ADC membaca sample tegangan input kemudian dikonversi dan hasilnya disimpan ke dalam register ADCH-ADCL secara terus-menerus).
  • Proses konversi ADC harus dimulai dengan men-set bit ADSC pada register ADCSRA.
  • Pada mode free running, ADC bekerja secara independen (tidak bergantung) dari flag interupsi ADC. Apakah ADIF set atau clear, maka tidak akan mempengaruhi operasi ADC.


Gambar 7. Timing diagram ADC free running conversion mode

F. Contoh Program Pengaturan ADC



Gambar 8. Interface antara AVR ATMEGA32 - Vr (8x) - LED (8x)

1. Menggunakan software IDE WinAVR

Contoh:

Dengan menggunakan AVR trainer pada gambar 8, akan dibuat program yang bertujuan untuk mengatur nyala terang atau redup LED (dihubungkan pada PORTD) dengan menggunakan sebuah resistor variable (trimpot) yang dihubungkan pada PORTA.0 yang merupakan kanal ADC0 mikrokontroler AVR ATMEGA32. Program ini menggunakan interupsi ADC.

#include <avr/io.h>
#include <avr/interrupt.h>

// Rutin layanan intrupsi - fungsi interupsi ADC
// Kerjakan rutin ini ketika terjadi interupsi ADC
ISR(ADC_vect)
{
      PORTC = ADCH;           // Output ADCH pada PortC
      ADCSRA |= 1<<ADSC;      // Mulai mengonversi
}

int main(void)
{
      DDRC = 0xFF;        // PortC sebagai output
      DDRA = 0x00;        // PortA sebagai input
                          // PA0 is ADC0 input

      ADCSRA = 0x8F;      // Aktifkan ADC & fitur interupsinya
                          // pre-scale clock = clk/128
      ADMUX = 0xE0;       // Vref internal = 2.56V | format data
                          // rata kiri | ADC0 sebagai kanal ADC

      sei();              // Aktifkan global interupsi
      ADCSRA |= 1<<ADSC;  // Mulai mengonversi

      while(1);           // Tunggu konversi ADC & loop
}

2. Menggunakan software IDE BASCOM-AVR

Contoh:

Dengan menggunakan AVR trainer pada gambar 8, akan dibuat program yang bertujuan untuk mengatur nyala terang atau redup LED (dihubungkan pada PORTD) dengan menggunakan resistor variable (trimpot) yang dihubungkan pada PORTA yang merupakan kanal-kanal ADC mikrokontroler AVR ATMEGA32.

$regfile = "m32def.dat"
$crystal = 12000000
Config Porta = Input
Config Portd = Output

Config Adc = Single , Prescaler = Auto , Reference = Avcc
Start Adc

Dim Data_adc As Word
Do
   Data_adc = Getadc(0)
   Portd.0 = Data_adc

   Data_adc = Getadc(1)
   Portd.1 = Data_adc

   Data_adc = Getadc(2)
   Portd.2 = Data_adc

   Data_adc = Getadc(3)
   Portd.3 = Data_adc

   Data_adc = Getadc(4)
   Portd.4 = Data_adc

   Data_adc = Getadc(5)
   Portd.5 = Data_adc

   Data_adc = Getadc(6)
   Portd.6 = Data_adc

   Data_adc = Getadc(7)
   Portd.7 = Data_adc
Loop

Share on Google Plus

About Taufiq D.S. Suyadhi

    Blogger Comment
    Facebook Comment

1 comments:

  1. terimakasih atas info yang sangat menarik ini dan untuk referensi silahkan kunjungi http://ps-elektronika.gunadarma.ac.id/

    ReplyDelete