adc

13
« Rangkaian Sound Sensor Untuk Aktifator robot KRCI Rotary Encoder » ADC 10bit ATMEGA8535 dan LM35 dengan akuisi data Temp. Penggunaan Analog to-Digital Converter, atau yg lebih dikenal dengan sebutan ADC, banyak sekali aplikasi yang membutuhkan ADC, biasanya untuk pembacaan sensor. kebutuhan Akan ADC bervariasi tergantung sensor yg digunakan, jika ingin lebih akurat bisa menggunakan ADC 10bit atau lebih, dan bisa juga menggunakan ADC 8 bit, ini yg sering sekali digunakan, dan sudah tersedia pada microkontroller berseri ATMega, pada ATMega sudah menyediakan ADC 8 bit dan 10 bit dengan 8 channel input. ADC 8 bit atau 2^8 = 256 artinya data digital yg dihasilkan dari conversi ADC 8 bit adalah 0-255 dan untuk ADC 10bit atau 2^10 =1024 artinya data digital yg dihasilkan dari conversi adalah 0-1023. Untuk yg menggunakan CodeVisionAVR atau disingkat CVAVR bisa langsung menggunakan fasilitas CodeWizard seperti gambar dibawah ini.

Upload: faisal-rahman

Post on 25-Nov-2015

35 views

Category:

Documents


7 download

DESCRIPTION

analog to digital

TRANSCRIPT

Rangkaian Sound Sensor Untuk Aktifator robotKRCIRotaryEncoder ADC 10bit ATMEGA8535 dan LM35 dengan akuisi dataTemp.Penggunaan Analog to-Digital Converter, atau yg lebih dikenal dengan sebutan ADC, banyak sekali aplikasi yang membutuhkan ADC, biasanya untuk pembacaan sensor. kebutuhan Akan ADC bervariasi tergantung sensor yg digunakan, jika ingin lebih akurat bisa menggunakan ADC 10bit atau lebih, dan bisa juga menggunakan ADC 8 bit, ini yg sering sekali digunakan, dan sudah tersedia pada microkontroller berseri ATMega, pada ATMega sudah menyediakan ADC 8 bit dan 10 bit dengan 8 channel input. ADC 8 bit atau 2^8 = 256 artinya data digital yg dihasilkan dari conversi ADC 8 bit adalah 0-255 dan untuk ADC 10bit atau 2^10 =1024 artinya data digital yg dihasilkan dari conversi adalah 0-1023. Untuk yg menggunakan CodeVisionAVR atau disingkat CVAVR bisa langsung menggunakan fasilitas CodeWizard seperti gambar dibawah ini.

Jika ingin menggunakan ADC 8 bit maka tinggal meng-klik saja pada use 8 bit. Volt Ref merupakan sumber pemilihan tegangan referensi ADC, tegangan refrensi yg digunakan untuk pemilihan penggunaan tegangan ref ADC, antara AVCC dan VREF, sedangkan Clock adalah banyaknya frekuensi sampling ADC. Dan Auto Trigger Source merupakan mode ADC yang akan digunakan.Seperti kita tahu bahwa LM35, sensor suhu yg memiliki output yang linear sebesar 10mV/oCelcius. Jadi tiap kenaikkan 10mV, maka suhu bertambah 1 oC. Dengan tingkat akurasi 0.5 oC. Memiliki range pengukuran antara -55 s/d 150 oC.Dengan menggunakan rangkaian dasar, atau yang disebut Basic Centigrade Temperature Sensor, maka si LM35 memiliki range pengukuran 0mV 10mV/oC. Jika dibuatkan kesetaraaan antara voltage dengan suhu, maka akan terlihat sbb :0V = 0 oC10mv = 1 oC100mV = 10 oC1000mV = 100 oC1500mV = 150 oCJika menggunakan rangkaian Full-Range Centigrade Temperature Sensor, lain lagi range pengukurannya.Dengan melihat karakteristik tersebut, maka dengan teknik ADC (Analog to Digital Convertion) kita bisa melakukan konversi dari tegangan ke suhu.Karena yang didiskusikan kali ini menggunakan mikrokontroler ATMEGA8535. Maka secara internal dia sudah memiliki ADC yang berjumlah 8 channel 10 bit. Range voltage dari 0 s/d volt_max sama dengan nilai 0 s/d 1024 (n10).Secara internal, si uC menggunakan rumus sebagai berikut untuk mengeluarkan output ADC :Hasil Konversi ADC = (Vin * 1024) / Vref Dimana Vin adalah output LM35.Jika Vref diberi tegangan 5 V (5000 mV). Dan LM35 tidak mengeluarkan tegangan, maka0 * 1024 / 5000 = 0Jika LM35 mengeluarkan tegangan sebesar 1 mV, maka uC akan mengeluarkan angka digital:1 * 1024 / 5000 = 0.2048 => 0Jika LM35 mengeluarkan tegangan sebesar 10 mV, maka uC akan mengeluarkan angka digital :10 * 1024 / 5000 = 2.048 => 2Jika LM35 mengeluarkan tegangan sebesar 1 V (1000 mV), maka uC akan mengeluarkan angka digital1000 * 1024 / 5000 = 204.8 => 205Sekarang cara membacanya dibalik. Setiap kita mendapatkan output digital dari uC, berapa hasil konversinya dalam bentuk tegangan?. Dari pertanyaan tersebut dihasilkan kesimpulan, bahwa setiap satu digit LSB yang dikeluarkan ADC uC akan bernilai sebesar :1 LSB = Vref / (2n 1)Jika Vref adalah 5000 mV, maka : 1 LSB-nya kurang lebih = 4.9 mV (pembulatan)Sehingga rumus konversinya adalah :SUHU = Ouput_ADC * Kenaikan_satu_LSB / Volt_per_Celciusdimana :Output_ADC = adalah hasil pembacaan ADC uCKenaikan_satu_LSB = 4.9 (jika Vref = 5V)Volt_per_celcius = 10 (karakteristik LM35, 10mV/oC)

/****************************************************Project : sensor Temp LM35Version : V_1Date : 6/7/2011Author : yogi Company : CERC Comments:

Chip type : ATmega8535Program type : ApplicationClock frequency : 4.000000 MHzMemory model : SmallExternal SRAM size : 0Data Stack size : 128*****************************************************/

#include #include #include #include

int Temp, dataADC; // sensor menggunakan LM35 Pin output terhubung dengan PINA.0 (pada mikrokontroller)

// Alphanumeric LCD Module functions#asm .equ __lcd_port=0x15 ;PORTC#endasm#include

#define ADC_VREF_TYPE 0x40

// Read the AD conversion resultunsigned int read_adc(unsigned char adc_input){ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);// Start the AD conversionADCSRA|=0x40;// Wait for the AD conversion to completewhile ((ADCSRA & 0x10)==0);ADCSRA|=0x10;return ADCW;}void tampil (unsigned int dat) // rutin untuk menampilkan di LCD{unsigned int data;//lcd_gotoxy(0,0); data = dat / 1000;data+=0x30;lcd_putchar(data);

dat%=1000;data = dat / 100;data+=0x30;lcd_putchar(data);

dat%=100;data = dat / 10;data+=0x30;lcd_putchar(data);

dat%=10;data = dat + 0x30;lcd_putchar(data);} // Declare your global variables here

void main(void){// Declare your local variables here

PORTA=0x00;DDRA=0x00;

PORTB=0x00;DDRB=0x00;

PORTC=0x00;DDRC=0x00;

PORTD=0x00;DDRD=0x00;

// Analog Comparator initialization// Analog Comparator: Off// Analog Comparator Input Capture by Timer/Counter 1: OffACSR=0x80;SFIOR=0x00;

// ADC initialization// ADC Clock frequency: 1000.000 kHz// ADC Voltage Reference: AVCC pin// ADC High Speed Mode: Off// ADC Auto Trigger Source: NoneADMUX=ADC_VREF_TYPE & 0xff;ADCSRA=0x82;SFIOR&=0xEF;

// LCD module initializationlcd_init(16);

while (1) { // Place your code here dataADC=read_adc(0); //pembacaan ADC pada PINA.0 (no1) lcd_gotoxy(0,0); //menentukan kordinat huruf pada LCD 2x16 (x,y) = (0,0) //artinya kolom ke 0 dan baris ke0 (no2) lcd_putsf("view data sensor"); //menampilkan tulisan string "view data sensor" (jangan //lebih dari 16 character) (no3) lcd_gotoxy(0,1); //menentukan kordinat huruf pada LCD 2x16 (x,y) = (0,1) //artinya kolom ke 0 dan baris ke1 (no4) tampil(dataADC); //panggil program rutin penampil LCD yg diatas, untuk //menampilkan "dataADC" dari no 1 (no5) // dataADC yg ditampilkan belum berupa nilai dalam //suhu/temp (derajat celcius) (no6) Temp=(dataADC*4.9/10); //conversi nilai ADC ke nilai Temperatur (no7) lcd_gotoxy(7,1); //menentukan kordinat huruf pada LCD 2x16 (x,y) = (7,1) //artinya kolom ke 7 dan baris ke1 (no8) tampil(Temp); //menampilkan nilai temp hasil dari no7 (no9) };}

ADC SUHUint SUHU;char temp[8];float suhu_celcius;#include #include #include #include // Alphanumeric LCD Module functions#asm .equ __lcd_port=015 ;PORTC#endasm#define ADC_VREF_TYPE 040// Read the AD conversion resultunsigned int read_adc(unsigned char adc_input){ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);// Delay needed for the stabilization of the ADC input voltagedelay_us(10);// Start the AD conversionADCSRA|=040;// Wait for the AD conversion to completewhile ((ADCSRA & 010)==0);ADCSRA|=010;return ADCW;}void main(void){// Analog Comparator initialization// Analog Comparator: Off// Analog Comparator Input Capture by Timer/Counter 1: OffACSR=080;SFIOR=000;// ADC initialization// ADC Clock frequency: 750.000 kHz// ADC Voltage Reference: AVCC pin// ADC Auto Trigger Source: NoneADMUX=ADC_VREF_TYPE & 0xff;ADCSRA=084;// LCD module initializationlcd_init(16);lcd_clear();lcd_gotoxy(0,0);lcd_putsf(ElectrO-cOntrOl);lcd_gotoxy(0,1);lcd_putsf(SENSOR SUHU LM35);delay_ms(1000);while (1) { lcd_clear( ); SUHU = read_adc(0); suhu_celcius = (float)SUHU*500/1023;//rumus untuk mengubah kedalam derajat celcius SET = read_adc(1);data_set = (float)SET*10; lcd_gotoxy(0,0); lcd_putsf(ElectrO-cOntrOl); ftoa(suhu_celcius,1,temp);//float to array, mengubah tipedata float k tipe data array yg kan ditampilkan di LCD lcd_gotoxy(0,1); lcd_puts(temp); lcd_gotoxy(5,1); lcd_putchar(0xdf);//menampilkan karakter derajat lcd_putsf(C); delay_ms(500); };

}Aplikasi ini dapat menampilkan suhu dan jam digital. Dimana sensor suhu yang digunakan adalah LM35. Aplikasi ini merupakan gabungan dari aplikasi yang telah saya buat sebelumnya yaitu thermometer dengan LM35 dan jam digital menggunakan LCD. Berikut adalah shematic dan setting CodeWizard CodeVision. Untuk listing program dan file simulasi proteus dapat didownload pada akhir artikel ini.

Aplikasi ini hampir sama dengan aplikasi jam digital menggunakan penampil LCD, hanya saja pada postingan ini saya tampilkan menggunakan display Seven Segment CA (common anoda) karena terlihat lebih menarik. Untuk mendapatkan datasheet penampil seven segment silakan download disini.Jam digital menggunakan seven segment common anoda (CA) ini saya berikan 3 buah input berupa push button yang digunakan untuk menset nilai dari jam tersebut yaitu MENU, UP dan DOWN. Untuk lebih jelasnya mengenai cara kerja aplikasi ini dapat membaca postingan saya mengenai jam digital menggunakan penampil LCD. Sedangkan untuk dasar teori seven segment dapat membaca pada tutorial AVR mengenai seven segment dan untuk cara kerja Timer dapat membacanya pada tutorial Timer dan Counter.Berikut adalah schematic jam digital menggunakan penampil seven segment. Sedangkan untuk listing program lengkapnya dapat didownload pada link diakhir postingan ini.