Professional Documents
Culture Documents
MODUL 8
Analog Digital Converter (ADC)
AVR ATMega16 merupakan tipe AVR yang telah dilengkapi dengan 8 saluran ADC internal
dengan resolusi 10 bit. Dalam mode operasinya, ADC dapatdi konfigurasi, baik single ended
input maupun differential input. Selain itu, ADC ATMega16 memiliki konfigurasi pewaktuan,
tegangan referensi, mode operasi, dan kemampuan filter derau (noise) yang amat fleksibel
sehingga dapat dengan mudah disesuaikan dengan kebutuhan dari ADC itu sendiri. ADC pada
ATMega16 memiliki fitur-fitu rantara lain :
Resolusi mencapai 10-bit
Akurasi mencapai } 2 LSB
Waktu konversi 13-260s
8 saluran ADC dapat digunakan secara bergantian
Jangkauan tegangan input ADC bernilai dari 0 hingga VCC
Disediakan 2,56V tegangan referensi internal ADC
Mode konversi kontinyu atau mode konversi tunggal
Interupsi ADC complete
Sleep Mode Noise canceler
Proses inisialisasi ADC meliputi proses penentuan clock, tegangan referensi, formal data
keluaran, dan modus pembacaan. Register-register yang perlu diatur adalah sebagai berikut:
Register Terkait ADC
ADC Control and Status Register A ADCSRA
ADCSRA
ADEN
ADSC
ADATE
ADIF
ADIE
R/W
R/W
R/W
R/W
R/W
R/W
R/W
R/W
R/W
Initial
Value
Keterangan
ADEN: ADC Enable
1 = adc enable, 0 = adc disable
ADSC: ADC Start Conversion
1 = mulai konversi, 0 = konversi belum dilakukan
ADATE: ADC Auto Trigger Enable
1 = auto trigger diaktifkan, trigger berasal dari sinyal yang dipilih
(set pada trigger SFIOR bit ADTS). ADC akan start konversi pada edge positif sinyal trigger.
1|P o litek nik Ja mbi
ADPS1
0
0
1
1
0
0
1
1
ADPS0
0
1
0
1
0
1
0
1
Division Factor
1
2
4
8
16
32
64
128
MUX4
MUX3
MUX2
MUX1
MUX0
R/W
R/W
R/W
R/W
R/W
R/W
R/W
R/W
R/W
Initial
Value
ADC9
ADC8
ADCH
ADC7
ADC6
ADC5
ADC4
ADC3
ADC2
ADC1
ADC0
ADCL
ADLAR = 1
ADC9
ADC8
ADC7
ADC6
ADC5
ADC4
ADC3
ADC2
ADCH
ADC1
ADC0
ADCL
ADHSM
ACME
PUD
PSR2
PSR10
ADTS[0...2] : Pemilihan trigger (pengatur picu) untuk konversi ADC, bit-bit ini akan berfungsi jika
bit ADATE pada register ADCSRA bernilai 1. Konfigurasi bit ADTS[0...2] dapat dilihat pada table
berikut:
ADTS1
0
0
1
1
0
0
1
1
ADTS0
0
1
0
1
0
1
0
1
Trigger Source
Free Running (manual)
Analog Comparator
External Interrupr Request 0
Timer/Counter0 Compare Match
Timer/Counter0 Overflow
Timer/Counter Compare Match B
Timer/Counter1 Overflow
Timer/Counter1 Capture Event
Register ADCW
merupakan register data yang menyimpan data hasil konversi ADC.
Untuk memilih channel ADC mana yang digunakan(single ended atau diferensial),dapat
dilakukan dengan mengatur nilai MUX4 :0. Misalnya channel ADC0 sebagai input ADC,
makaMUX4 :0 diberinilai 00000B, informasi lebih lengkap dapat di lihat pada datasheet.
Tegangan referensi ADC dapat dipilih antara lain pada pin AREF, pin AVCC atau menggunakan
tegangan referensi internal sebesar 2.56V.
Setelah konversi selesai (ADIF high), hasil konversi dapat diperoleh pada register hasil (ADCL,
ADCH). Untuk konversi single ended, hasilnya ialah
Dimana VIN ialah tegangan pada input yang dipilih dan VREF merupakan tegangan referensi. Jika
hasil ADC =000H, maka menunjukkan tegangan input sebesar 0V, jika hasil ADC=3FFH
menunjukkan tegangan input sebesar tegangan referensi dikurangi 1 LSB.
Sebagai contoh, jika diberikan VIN sebesar 0.2V dengan VREF 5V, makahasil konversi ADC ialah
41
RangkaianAplikasiVolmeter Digital
<mega16.h>
<delay.h>
<stdlib.h>
<string.h>
read_adc();
init_port();
init_lcd();
init_adc();
kirim_karakter(ubyte);
kirim_instruksi(ubyte);
void main()
{
Uint adc =0;
ubyte i = 0;
init_port();
init_lcd();
init_adc();
while(1){
adc = read_adc();
vin = (float)adc * vref/1024;
ftoa(vin,2,str_adc);
kirim_instruksi (0x01);
kirim_instruksi (0x80);
for(i = 0; i <strlen(str_adc);i++){
if (str_adc[i]!=0){
kirim_karakter(str_adc[i]);
}
}
kirim_karakter(' ');
kirim_karakter('v');
kirim_karakter('o');
kirim_karakter('l');
kirim_karakter('t');
delay_ms(100);
}
}
6|P o litek nik Ja mbi
uintread_adc()
{
delay_ms(5);
// Start the AD conversion
ADCSRA|=0b01000000;
// Wait for the AD conversion to complete
while ((ADCSRA & 0x10)==0);
ADCSRA|=0b00010000; //ADIF diset1 , conversion stop
return ADCW;
}
voidinit_port(){
DDRB = 0xFF;
DDRC = 0xFF;
DDRD = 0xFF;
DDRA = 0x00;
}
voidinit_adc(){
ADMUX = 0b00000000 | adc_channel ;
ADCSRA = 0b10000011;
}
voidinit_lcd(){
kirim_instruksi(0x01);
kirim_instruksi(0x38);
kirim_instruksi(0x06);
kirim_instruksi(0x0C);
kirim_instruksi(0x80);
}
voidkirim_karakter(ubyte
PORTC = RS1E0;
PORTD = karakter;
delay_ms(1);
PORTC = RS1E1;
delay_ms(1);
PORTC = RS1E0;
}
karakter){
voidkirim_instruksi(ubyte instruksi){
PORTC = RS0E0;
PORTD = instruksi;
delay_ms(1);
PORTC = RS0E1;
delay_ms(1);
PORTC = RS0E0;
}
MUX4
MUX3
MUX2
MUX1
MUX0
ADC9
ADC8
ADCH
ADC7
ADC6
ADC5
ADC4
ADC3
ADC2
ADC1
ADC0
ADCL
MUX4:MUX0 = 00000
ADC single Ended Input ADC channel 0
2. Kemudian atur nilai register ADCSRA = 0b10000011
ADEN
ADSC
ADATE
ADIF
ADIE
ADPS2
ADPS1
ADPS0
ADEN:
ADSC:
ADATE:
ADIF:
ADIE:
ADPS2-0:
3. Atur bit ADSC (bit 6)pada register ADCSRA menjadi logika 1 untuk memulai
konversi data ADC , proses ini dilakukan menggunakan perintahberikut :
ADCSRA |= 0b01000000 ( register ADCSRA di-OR kandengan 0b01000000)
4. Tunggu sampai bit ADIF (bit 4) berubah menjadi logika 1 sebagai tanda konversi
data ADC selesai.
5. Setelah itu set bit ADIF(bit 4) ke logika 1 agar konversi data berhenti (stop).
Proses ini dilakukan dengan perintahberikut:
ADCSRA |= 0b00010000 ( register ADCSRA di-OR kandengan 0b00010000)
6. Kemudian data hasil konversi (10 bit) akan tersimpan pada register ADCW
7. Nilaitegangan analog dapat diperoleh dengan menggunakan rumus berikut: