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.
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
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 decimal
= 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 ADCbit ADLAR. Lihat formatnya pada register
ADCH & ADCL
3. Memilih tegangan referensi ADC
bit REFS0 dan REFS1 (lihat tabel 2).
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…
}
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.
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.
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>
int main(void)
{
DDRC = 0xFF; // PortC sebagai output
DDRA = 0x00; // PortA sebagai input
// PA0 is ADC0 input
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
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