Selasa, 01 Maret 2016

Analog to Digital Conversion (ADC) pada Microcontroller ATMega328

         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
Gambar 1. Format pada register ADCL dengan ADLAR = 0. 
 
----
----
----
----
----
----
bit9
bit8
Gambar 2a. Format pada register ADCH dengan ADLAR =0.


----
----
----
----
----
----
bit9
bit8
----
----
----
----
----
----
----
----
Gambar 2b. Setelah perintah geser kiri 8 bit ADCH memberikan ruang 8 bit yang kosong.

----
----
----
----
----
----
bit9
bit8
bit7
bit6
bit5
bit4
bit3
bit2
bit1
bit0
Gambar 3. Hasil dari ADC 10 bit dengan ADLAR = 0, hasil |= (ADCH<<8 span="">;

         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.

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="">). Hasil konversi 10 bit dari ADC adalah (hasil |= (ADCH<<2>>6)
----
----
----
----
----
----
bit9
bit8
bit7
bit6
bit5
bit4
bit3
bit2
bit1
bit0
Gambar 4. Proses pada ADC 10 bit dengan ADLAR = 1



 
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
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
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
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
 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