UC
ATmega328 hanya memiliki 6 multiplex saluran ADC dan seluruhnya
merupakan single ended
input. UC
ATMega32 memiliki selain memiliki
8 multiplex single ended input juga memiliki Differential input
dengan gain yang dapat diatur. UC ATTiny84 selain memiliki
differensial input juga memiliki input mode berupa unipolar atau
bipolar. ATmega328 dan ATTny84 keduanya dapat dipergunakan sebagai
sensor
temperatur (diperlangkapi dengan sensor suhu). Ketiga UC tersebut
dapat
dikonfigurasi sebagai
10
bit atau 8 bit resolution pada proses konversi ADC. UC ATMega328
memiliki default hasil konversi ADC sebagai 10 bit resolution dengan
format hasil Left
Adjustment. Disini
yang akan dibahas hanya UC328 saja,
ADC
pada UC ATMega328
mengubah tegangan input analog menjadi 10 bit digital dengan metode
successive
approximation. Frekuensi
clock untuk proses successive
approximation
adalah
diantara 50 kHz s/d 200 kHz untuk 10 bit resolution. Frekuensi clock
ADC dapat lebih tinggi dari 200
kHz jika hasil konversi ADC kurang dari 10 bit (8 bit resolution).
Frekuensi clock ADC adalah tidak sama dengan frequency clock CPU.
Frekuensi clock adalah hasil prescaling dari frekuensi clock CPU,
yaitu 2, 4, 8, 16, 32, 64 dan 128.
Harga
minimum tegangan
ADC merupakan
GND dari UC tersebut sedangkan harga maksimum merepresentasikan harga
AREF pin (pin no. 21) jika mempergunakan eksternal referensi, tetapi
jika mempergunakan internal referensi maka harga maksimum merupakan
harga internal referensi dalam hal ini sebesar 1,1V.
Pemilihan
tegangan referensi (eksternal atau internal) untuk ADC ditentukan
oleh register ADMUX. Perhitungan
untuk harga ADC 10 bit dengan mempergunakan referensi eksternal
adalah :
Hasil
konversi ADC tersebut terdapat pada register ADCL dan register ADCH.
Kedua register tersebut (ADCL dan ADCH) menampung hasil konversi
setelah konversi selesai ditandai dengan ADIF (ADC
Interrupt Flag)
menjadi set.
Default
format hasil dari ADC 10 bit adalah berbentuk Left
Adjustment.
Hal
ini mengindikasikan bahwa Register ADLAR = 0. Hasil konversi ADC
disimpan dalam register ADCL dan register ADCH. Register ADCL tidak
perlu dirubah lagi karena format register ADCL seperti ditunjukkan
pada gambar 1, sedangkan regsiter ADCH perlu digeser 8 bit kekiri
(ADCH
<< 8)
karena format ADCH ditunjukkan seperti gambar 2a, hasil pengeseran 8
bit tersebut ditunjukkan pada gambar 2b. Untuk melihat hasil konversi
10 bit tersebut maka perlu menggabungkan ADCL dengan ADCH yang telah
digeser 8 bit (hasil
|= (ADCH << 8) | ADCL).
Gambar
3 menampilkan bentuk hasil pengabungan tersebut.
bit7
|
bit6
|
bit5
|
bit4
|
bit3
|
bit2
|
bit1
|
bit0
|
----
|
----
|
----
|
----
|
----
|
----
|
bit9
|
bit8
|
---- |
----
|
----
|
----
|
----
|
----
|
bit9
|
bit8
|
----
|
----
|
----
|
----
|
----
|
----
|
----
|
----
|
---- |
----
|
----
|
----
|
----
|
----
|
bit9
|
bit8
|
bit7
|
bit6
|
bit5
|
bit4
|
bit3
|
bit2
|
bit1
|
bit0
|
Jika
ADLAR diset atau ADLAR = 1, maka format hasil ADC 10 bit ditunjukan
oleh gambar 4. Register ADCL perlu digeser kekanan sebesar 6 bit (ADCL
>> 6), sedangkan register ADCH digeser 2 bit kekiri (ADCH
<< 2).
Hasil ADC 10 bit tersebut merupakan penggabungan keduanya
(hasil|=(ADCH << 2)| (ADCL >> 6)). Gambar 4 memperlihatkan proses dengan ADLAR = 1.
(hasil|=(ADCH << 2)| (ADCL >> 6)). Gambar 4 memperlihatkan proses dengan ADLAR = 1.
Format
register ADCL dengan ADLAR = 1.
bit1
|
bit0
|
----
|
----
|
----
|
----
|
----
|
----
|
Format
register ADCH dengan ADLAR = 1.
bit9
|
bit8
|
bit7
|
bit6
|
bit5
|
bit4
|
bit3
|
bit2
|
Perintah geser kanan 6 bit pada register ADCL (ADCL >> 6);
---- |
----
|
----
|
----
|
----
|
----
|
----
|
----
|
----
|
----
|
----
|
----
|
----
|
----
|
bit1
|
bit0
|
Register ADCH hanya perlu digeser 2 bit kekiri mengisi kekosongan. (ADCH<<2 i="">2>). Hasil konversi 10 bit dari ADC adalah (hasil |= (ADCH<<2>>62>)
---- |
----
|
----
|
----
|
----
|
----
|
bit9
|
bit8
|
bit7
|
bit6
|
bit5
|
bit4
|
bit3
|
bit2
|
bit1
|
bit0
|
Register
Register pada ADC
Bit
7:6 – REFS1:0: Reference Selection Bits
Kedua
bit menetukan pemilihan referensi untuk ADC. Jika pin AREF (pin no.
21) diberi tegangan maka referensi tegangan internal UC tidak boleh
dipergunakan. Tabel 1, memperlihatkan pemilihan tegangan referensi
untuk UC ATMega328. Ada tiga pemilihan tegangan referensi pada UC
ATMega328, yaitu AREF (pin no. 21), AVCC (pin no. 20) dan
tegangan internal sebesar 1,1V.
Tabel 1. Pemilihan Tegangan Referensi untuk ATMega328
Bit
5 – ADLAR: ADC Left Adjust Result
Bits
3:0 – MUX3:0: Analog Channel Selection Bits
Keempat
bit ini menentukan pemilihan channel ADC ditunjukkan pada tabel berikut.
Bit
7 – ADEN: ADC Enable.
Menclearkan
bit ADEN maka ADC akan berhenti bekerja meskipun dalam keadaan sedang
proses pengkonversian. ADC akan melakukan konversi jika bit ADEN di
set.
Bit 6 – ADSC: ADC Start Conversion
Bit 6 – ADSC: ADC Start Conversion
Jika
bit ADCS diset maka proses konversi dimulai. Ketika proses konversi
telah selesai (conversion complete) maka bit ADSC akan diclearkan
tetapi
bit ini akan tetap berharga satu (set) selama proses konversi.
Untuk mode free running conversion maka bit harus selalu diset.
Bit 5 – ADATE: ADC Auto Trigger Enable
Bit 5 – ADATE: ADC Auto Trigger Enable
Auto
Triggering dari ADC akan menjadi enable jika bit ADATE diset. ADC
akan mulai konversi pada positive edge dari sinyal trigger. Sumber
sinyal trigger ditentukan dari bit bit ADTS yang terdapat pada
register ADCSRB.
Bit
4 – ADIF: ADC Interrupt Flag
Bit
ADIF adalah diset secara hardware ketika conversion complete.
Interrupt Vector akan dijalankan jika bit ADIE dan bit I pada
register SREG dalam keadaan set. Bit ADIF akan diclearkan oleh
hardware ketika menjalan vector interrupt dari ADC.
Bit 3 – ADIE: ADC Interrupt Enable
Bit 3 – ADIE: ADC Interrupt Enable
ADC
Conversion Complete Interrupt dapat aktif jika bit ADIE dan bit I
keduanya dalam keadaan set.
Bits 2:0 – ADPS2:0: ADC Prescaler Select Bits
Bits 2:0 – ADPS2:0: ADC Prescaler Select Bits
Ketiga
bit ini menentukan prescaler yang dipergunakan untuk frequency clock
ADC.
Ketika
konversi selesai (conversion
complete)
maka hasilnya terdapat pada kedua register ini (ADCL dan ADCH). Bit
ADLAR terdapat pada register ADMUX.
Catatan
Jika hasil ADC dalam bentuk 8 bit dengan format left
adjusted (ADMUX=0),
maka hasil ADC tersebut cukup hanya membaca isi register ADCH.

Bit 2:0 – ADTS2:0: ADC Auto Trigger Source
Jika
bit ADATE yang terdapat pada register ADCSRA diset, maka ketiga bit
ini (ADTS2:0) akan menentukan sumber untuk mentrigger ADC. Ketiga bit
ini tidak akan berfungsi jika bit ADATE dalam keadaan clear. Apabila
ADC dijalankan dalam free
running mode (ADTS
2:0 = 0) maka tidak akan menghasilkan trigger meskipun ADC interrupt
Flag di set.
Bit 5:0 – ADC5D..ADC0D: ADC5..0 Digital Input Disable
Pada
saat bit ini ditulis satu, maka digital input buffer yang terkait
dengan ADC pin tersebut menjadi disable. Untuk upaya penghematan
daya, jika digital input tidak diperlukan pada pin ini (pada pin pin
ini hanya diterapkan tegangan analog) maka bit bit tersebut,
ADC5D..ADC0D yang terdapat pada register DIDR0, harus di set.
Contoh program
//
PROGRAM DC CHOPPER
//
Duty Cycle DC Chopper ditentukan oleh pembacaan ADC (Isi Register
ADCH)
//
Frekuensi DC Chopper 5 Hz atau periode 200ms
//
Waktu nyala DC Chopper ditentukan oleh isi register ADCH
#include
<avr/io.h>
#include
<avr/interrupt.h>
#include
<util/delay.h>
#define
S_on PORTB |= (1<<PB0);
#define
S_off PORTB &= ~(1<<PB0); // Port B0 dipergunakan untuk DC
Chopper.
uint8_t
nyala; // waktu T on untuk DC
Chopper.
uint8_t
padam; // waktu T off untuk DC
Chopper.
//Menggunakan
UC Atmega328
//Frekuensi
kristal 16 MHz
//
AVCC pin 20 dihubungkan dengan sumber tegangan dalam hal ini 5V
//
AREF pin 21 dihubungkan dengan kapasitor 10nF.
//
Hasil ADC dalam 8 bit dengan format Default, yaitu ADLAR = 0;
//
Hasil ADC tersebut cukup hanya dengan membaca isi register ADCH
int
main(void)
{
DDRB
= (1<<DDB0);
// PORTB0 sebagai output
S_off;
// pada keadaan awal
//MENGKONFIGURASI
ADC
//
ATMEGA328 memiliki ADC yang bersamaan letaknya dengan PortC
//
Pemilihan port ADC ditentukan oleh bit ke-0 s/d bit ke-4 pada
Register ADMUX
//
Karena yang kita pergunakan adalah ADC port 0
//
dengan kata lain harga MUX0 = MUX1 = MUX2 = MUX3 = MUX 4 = 0.
//
Maka kita tidak perlu mensetnya.
//jika
port ADC yang digunakan adalah port 1 atau ADC1.
//
maka perintahnya ADMUX |= (1<<MUX0);
sei();
//Global interrupt di Enable
//Fungsi
Interrupt di ADC dienable. baca hal 263
ADCSRA
|= (1 << ADIE);
//
Pemilihan tegangan Referensi untuk ADC
//
Tegangan Referensi yang dipilih adalah Avcc dgn kapasitor 10nF pd
AREF pin
ADMUX
|= (1<<REFS0);
ADMUX
&= ~(1<<REFS1); //Default REFS1 = 0 jadi boleh
dihilangkan,
//Prescaler
di enable
ADCSRA
|= (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0);
//
Pemilihan ADSP2 = ADSP1 = ADSP0 = 1.
//
Dengan menganggap Input Clock ADC berkisar 50 KHz s/d 200 KHz.
//16.000.000/50.000
= 320 dan 16.000.000/200.000 = 80
//
jadi harga prescaler harus dipilih diantara 80 dan 320
//
dari data sheet, harga yang mungkin 128
//
sehingga ADSP2 = ADSP1 = ADSP0 = 1.
ADCSRA
|= (1<<ADEN); // ADC diaktifkan
ADCSRA
|= (1<<ADSC); // Start konversi ADC
//==========================================
//KONFIGURASI
ADC SELESAI
while
(1)
{
}
}
//
Interrupt routine ketika ada interrupt dari ADC yaitu ADIF bernilai
1.
ISR(ADC_vect)
{
nyala
= (200/255)*ADCH;
padam
= 200 - nyala;
S_on;
_delay_ms(nyala);
S_off;
_delay_ms(padam);
ADCSRA
|= (1<<ADSC); //start konversi ADC berikutnya.
}
Tidak ada komentar:
Posting Komentar