UC ATMega328 diperlengkapi dengan Pembanding Analog (Analog
Comparator). Pin AIN0 (PORTD6) berfungsi sebagai masukan tak
membalik (non inverting input) dan pin AIN1 (PORTD7) berfungsi
sebagai masukan membalik (inverting input). Selain PORTD7,
pin ADC (ADC0 s/d ADC5) dapat difungsikan sebagai masukan membalik.
Jika tegangan yang diterapkan pada pin AIN0 lebih besar dari tegangan
pada pin AIN1 (masukan membalik) maka ACO (Analog Comparator
Output) akan menjadi set (berlogika satu).
Memfungsikan ADC sebagai masukan membalik (inverting input) analog
comparator maka ADC harus dinonaktifkan (switch off).
Menonaktifkan ADC dengan menset bit ACME (Analog Comparator
Multiplexer Enable) yang terdapat pada register ADCSRB dan
menclearkan bit ADEN (ADC Enable) yang terdapat pada register ADCSRA.
Pemilihan pin ADC sebagai inverting input ditentukan oleh combinasi
bit ACME, bit ADEN dan bit MUX0 s/d bit MUX2 diperlihatkan tabel 1.
Tabel 1. Pemilihan non inverting input
Register
Register Analog Comparator
Bit 6 – ACME: Analog Comparator Multiplexer Enable
Ketika bit ACME diset dan ADC dinonaktifkan (bit ADEN, yg terdapat
pd register ADCSRA, diclearkan) maka ADC0 s/d ADC5 berfungsi sebagai
inverting input dari analog comparator. Jika bit ACME dalam keadaan
clear maka yang bertindak sebagai inverting input adalah pin AIN1.
Untuk
alasan penghematan daya, maka analog comparator harus dinonaktifkan
(switch off)
dengan cara menset bit ACD. Begitu juga bit ACIE harus diclearkan
agar tidak terjadi interrupt ketika terjadi perubahan logika pada
bit.
Bit 6 – ACBG: Analog Comparator Bandgap Select
Jika
bit ini diset, maka AIN0 tidak lagi berfungsi sebagai non inverting
input dari comparator. Non inverting input diambil alih oleh tegangan
referensi.
Bit 5 – ACO: Analog Comparator Output
Hasil perbandingan masukan membalik dan masukan tak membalik dari
analog comparator dapat dilihat pada bit ini.
Bit 4 – ACI: Analog Comparator Interrupt Flag
Bit ini diset secara hardware ketika kejadian output comparator
mentrigger mode interrupt yang ditentukan oleh bit ACIS1 dan bit
ACIS0. Interrupt routine dari analog comparator akan dijalankan jika
bit ACIE dan global interrupt, yang terdapat pada register SREG,
keduanya dalam keadaan set. ACI akan diclearkan secara hardware
ketika vektor interrupt dilaksanakan.
Bit 3 – ACIE: Analog Comparator Interrupt Enable
Untuk mengaktifkan interrupt pada analog comparator maka bit ACIE
dan bit-I (global interrupt) harus dalam keadaan set.
Bit 2 – ACIC: Analog Comparator Input Capture Enable
Jika
bit ini diset, maka input capture function pada Timer/counter1 dapat
ditrigger oleh analog comparator. Agar Analog Comparator dapat
mentrigger interrupt Timer/Counter1 input Capture, maka bit ICIE1
pada register TIMSK1 harus diset.
Bits 1, 0 – ACIS1, ACIS0: Analog Comparator Interrupt Mode Select
kedua
bit ini menetukan jenis trigger untuk interrupt analog comparator.
Tabel 2 memperlihatkan setting dari kedua bit ini. Ketika
pengubahan kedua bit ini, Analog Comparator Interrupt harus di
disable dengan menclearkan bit ACIE. Jika tidak diclearkan bit ACIE
maka interrupt akan terjadi pada saat bit bit ini berubah.
Tabel
2. Setting dari bit ACIS1 dan ACIS0
Bit 1, 0 – AIN1D, AIN0D: AIN1, AIN0 Digital Input Disable
Jika
hanya tegangan analog diterapkan pada kaki AIN0 dan kaki AIN1 atau
digital input tidak diperlukan pada kedua pin tersebut, maka bit
tersebut harus di set agar mengurangi komsumsi daya. Jadi jika bit
ini ( AIN1D dan AIN0D) di set maka digital input menjadi disable.
Contoh.
//
Program mempergunakan Analog comparator
//
Mempergunakan UC ATMega328
//
Tegangan analog diterapkan pada kaki AIN0 dan kaki AIN1
#include
<avr/io.h>
#include
<avr/interrupt.h>
int
main(void)
{
//
Mempergunakan pin AIN1 sebagai inverting input analog comparator.
//
Pemilihan AIN1 sebagai inverting input
ADCSRB
&= ~(1<<ACME); // Hanya penegasan, default bit ACME = 0
//
mendisablekan digital input (PORTD6 dan PORTD7)
DIDR1
|=
(1<<AIN0D) | (1<<AIN1D);
//Menaktifkan
analog comparator.
ACSR
&= ~(1<<ACD); // Default
value ACD=0
DDRB
|= (1<<DDB4); // PB4 sebagai output
PORTB
&= ~(1<<PORTB4); //PB4 low
while(1)
{
if(bit_is_set(ACSR,
ACO))
{
//
tegangan
analog pada pin AIN0 > pin AIN1
PORTB
&= ~(1<<PORTB4);
}
else
{
//tegangan
analog pada pin AIN0 < pin AIN1
PORTB
|= (1<<PORTB4);
}
}
}
Tidak ada komentar:
Posting Komentar