Welcome

Welcome to My Blog

Thursday, 12 January 2017

ANALOG TO DIGITAL CONVERTER ATMEGA8535



Data yang dapat diolah oleh mikrokontroller merupakan data digital, seperti bilangan biner atau hexa. Output dari sensor rata-rata merupakan data anlaog, sehingga tidak dapat langsung diolah mikrokontroller. Oleh sebab itu, data analog itu harus di konversi menjadi data digital menggunakan ADC. ADC (Analog Digital Converter) adalah suatu perangkat pengubah sinyal analog menjadi sinyal digital. Atmega8535 mempunyai 8 channel ADC (PA0…..PA7) dengan resolusi 8bit dan 10bit.
Untuk dapat menggunakan fitur ADC terlebih dahulu dilakukan proses inisialisasi yang meliputi penentuan clock, tegangan referensi, format output data, dan mode pembacaan. Register yang perlu diset nilainya adalah ADMUX (ADC Multiplexer Selection Register), ADCSRA (ADC Control and Status Regsiter A), dan SFIOR (Special Function IO Register)
Besarnya ketelitian ADC dapat diketahui menggunakan rumus :
       n = jumlah bit
Contoh : rangkaian ADC memiliki tegangan referensi 5V dengan resolusi 8bit.

Untuk mengetahui berapa nilai output ADC, dapat dihitung menggunakan rumus :

Contoh: rangkaian ADC mempunyai sinyal analog sebesar 2.5V, dengan tegangan referensi sebesar 5V dan resolusi ADC 8 bit. Berapakan nilai output ADC?

Output ADC ini akan disimpan pada register ADCH dan ADCL.
Karena tegangan referensinya adalah 5V, maka output ADC akan berubah setiap perubahan Vin sinyal analog sebesar 19mV.
1.     Register ADMUX (ADC Multiplexer Selection)


·       Bit 7, 6 – REFS1, 0 : Reference Selection Bits (Bit Pemilih Tegangan Referensi

·       Bit 5 – ADLAR : ADC Left Adjust Result
ADLAR merupakan bit pemilih mode data keluaran ADC. 2 bit tertinggi data hasil konversi berada pada register ADCH dan 8 bit hasil konversi berada pada register ADCL
·       Bit 4:0 – MUX4:0 : Analog Channel and Gain Selection Bits (Bit pemilih saluran ADC dan gain)


Jika bit ini diubah saat konversi berlangsung, perubahannya tidak berpengaruh sampai konversi telah selesai dilakukan.

2.     Register ADCSRA (ADC Control and Status Register A)

·       Bit 7 – ADEN : ADC Enable.
Merupakan bit pengatur aktivasi ADC. Bernilai awal 0. jika bernilai 1, maka ADC aktif
·       Bit 6 - ADSC : ADC Start Conversion
Merupakan bit penanda mulainya konversi ADC. Bernilai awal 0. selama konversi ADC bernilai 1, jika konversi telah selesai bernilai 0
·       Bit 5 - ADATE : ADC Auto Trigger Enable
Merupakan bit pengatur aktivasi picu operasi ADC
·       Bit 4 - ADIF : ADC Interrupt Flag
Merupakan bit penanda akhir konversi ADC. Bernilai awal 0. jika konversi telah selesai bernilai 1
·       Bit 3 – ADIE : ADC Interrupt Enable
Merupakan bit pengatur aktivasi interupsi yang berhubungan dengan akhir konversi ADC. Bernilai awal 0. Bernilai 1 jika konversi telah selesai
·       Bit 2:0 - ADPS2:0 : ADC Prescaler Select Bits
Merupakan bit pengatur clock ADC


3.     Register SFIOR (Special Function IO Register)
SFIOR merupakan register pengatur sumber picu konversi ADC

ADC dapat diaplikasikan pada berbagai macam sensor. Kali ini akan digunakan sensor suhu LM35 untuk membuat thermometer digital dengan tampilan output pada LCD. Berikut rangkaiannya :

Rangkaian thermometer digital dengan ATMega8535

Sensor LM35 memiliki karakteristik yaitu perubahan tegangan 10mV/C. Jadi setiap ada perubahan suhu 1C yang terdeteksi sensor maka tegangan Vout sensor juga akan berubah sebesar 10mV. Contoh, tegangan yang terdeteksi sensor adalah 30C, maka Voutnya adalah 30x10mV = 300mV. Pada program kali ini, digunakan ADC 10 bit dengan ketelitian 4,8mV. Jika menggunakan contoh diatas, maka didapatkan nilai 
Nilai ADC ini nantinya akan kita masukkan sebagai nilai yang akah ditampilkan pada LCD, maka untuk merubahnya kembali menjadi sesuai dengan suhu terbaca sebenarnya, maka dapat digunakan rumus :

Jadi jika nilai ADC = 61.38 maka dengan rumus diatas menjadi :


Angka tersebut sesuai dengan suhu sebenarnya.
Berikut merupakan program bahasa C-nya :

#include <mega8535.h>
#include <delay.h>
#include <stdio.h>

unsigned int adc1, adc2;
unsigned char adc[5];

// Alphanumeric LCD functions
#include <alcd.h>

#define ADC_VREF_TYPE 0x00
// Read the AD conversion result
unsigned int read_adc(unsigned char adc_input)
{
ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);
// Delay needed for the stabilization of the ADC input voltage
delay_us(10);
// Start the AD conversion
ADCSRA|=0x40;
// Wait for the AD conversion to complete
while ((ADCSRA & 0x10)==0);
ADCSRA|=0x10;
return ADCW;
}

void main(void)
{
// ADC initialization
// ADC Clock frequency: 1000.000 kHz
// ADC Voltage Reference: AREF pin
// ADC High Speed Mode: Off
// ADC Auto Trigger Source: Free Running
ADMUX=ADC_VREF_TYPE & 0xff;
ADCSRA=0xA2;
SFIOR&=0x0F;

// Alphanumeric LCD initialization
// Connections are specified in the
// RS - PORTB Bit 0
// RD - PORTB Bit 1
// EN - PORTB Bit 2
// D4 - PORTB Bit 4
// D5 - PORTB Bit 5
// D6 - PORTB Bit 6
// D7 - PORTB Bit 7
// Characters/line: 16
lcd_init(16);

while (1)
{
// Place your code here
lcd_gotoxy(3,0);
lcd_putsf("TERMOMETER");
adc1=read_adc(0);//hasil konversi adc dimasukkan ke dalam variabel adc1
adc2=adc1*500/1023;
sprintf(adc, "%d", adc2);//isi variabel char adc dengan integer adc2
lcd_gotoxy(6,1);
lcd_puts(adc);
lcd_putchar(0xdf);//menampilkan derajat
lcd_putsf("C");//menampilkan celcius
delay_ms(100);
}
}

No comments:

Post a Comment