Pendahuluan
Fitur ADC pada mikrokontroler AVR merupakan kemajuan yang pesat pada dunia mikrokontroler. Hal ini menyebabkan rancangan yang kompleks menjadi lebih sederhana
dan efisien. Dibutuhan juga fitur DAC pada sistem embedded utuk menghasilkan keluaran analog yang dapat diatur besarannya.
Tujuan Praktikum
1.
Praktikan dapat menjelaskan
fungsi ADC dan DAC pada mikrokontroler.
2.
Praktikan dapat membuat program ADC dan DAC pada mikrokontroler
sebagai pengubah sinyal analog sensor suhu ke digital, dan pengubah data digital ke analog.
3.
Praktikan mengusulkan suatu rancangan
sistem minimum mikrokontroler
untuk sistem akuisisi data.
Konsep ADC (Analog to Digital Converter)
Keunggulan mikrokontroler
AVR ATmega16 dibandingkan pendahulunya
ialah:
·
Sudah terintegrasinya ADC
10bit sebanyak 8 saluran.
·
13-260uS
conversion time
·
Mencapai 15kSPs pada resolusi maksimum
·
Optional
left adjustment untuk ADC result readout
·
Interupsi pada ADC Conversion Complete
·
Sleep mode noise canceler
Input ADC pada mikrokontroler dihubungkan ke sebuah 8 channel Analog multiplexer yang digunakan
untuk single
ended input channels. Jika sinyal
input dihubungkan ke masukan ADC dan 1 jalur lagi terhubung
ke ground, disebut single ended input. Jika input ADC terhubung ke 2 buah input ADC disebut sebagai differential
input, yang dapat dikombinasikan
sebanyak 16 kombinasi. 4 kombinasi terpenting antara lain kobinasi input diferensial (ADC0 dengan ADC1 dan ADC2 dengan ADC3) dengan penguatan yang dapat diatur. ADC0 dan ADC2 sebagai tegangan input negatif sedangkan ADC1 dan ADC3 sebagai tegangan input positif. Besar penguatan yang dapat dibuat yaitu 20dB (10x) atau 46dB(200x) pada tegangan input diferensial sebelum proses konversi ADC.
Secara umum, proses inisialisasi ADC meliputi proses 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 Register),
dan SFIOR (Special
Function IO Register). ADMUX merupakan register 8
bit yang berfungsi menentukan
tegangan referensi ADC,
format data output, dan saluran
ADC yang digunakan.
Gambar 7 .1 Register ADMUX
Untuk memilih channel ADC mana yang
digunakan(single ended atau diferensial), dengan mengatur nilai MUX4 :0. Misalnya channel
ADC0 sebagai input ADC, maka
MUX4 :0 diberi nilai 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.
Agar fitur ADC mikrokontroler
dapat digunakan maka ADEN (ADC Enable, dalam I/O register ADCSRA) harus diberi nilai
1.
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, maka hasil konversi ADC ialah 41. Jika menggunakan differensial channel, hasilnya ialah 40.96, yang bila digenapkan
bisa sekitar 39,40,41 karena ketelitian ADC ATmega 16 sebesar +- 2LSB. Jika yang digunakan saluran diferensial, maka hasilnya ialah :
Dimana VPOS ialah tegangan
pada input pin positif, VNEG ialah tegangan input pada pin negatif,
GAIN ialah faktor penguatan dan VREF ialah
tegangan referensi yang digunakan. Kita dapat mengkonfigurasi fasilitas ADC pada CodeVision AVR sebagai berikut :
.
Gambar 7.2 Konfigurasi ADC
Dengan mencentang
ADC Enabled akan mengaktifkan on-chip
ADC. Dengan mencentang Use
8 bits, maka hanya 8 bit terpenting yang digunakan. Hasil konversi 10 bit dapat
dibaca pada ADC Data Registers ADCH dan ADCL. Misalnya, jika hasil konversi ADC bernilai 54(36H), dalam 10 bit biner ditulis dengan
00 0011 0110B. Jika
dalam format right
adjusted (ADLAR=0), maka I/O register ADCH berisi 0000 0000B(00H) dan I/O register ADCL berisi 0011 0110B
(36H).
Konsep DAC (Digital to Analog Converter)
DAC berfungsi
mengubah data digital menjadi
sinyal analog yang biasanya dipergunakan IC DAC dan Op-Amp. DAC 0800 mempunyai
lebar data 8 bit, maka format
data maksimal ialah
256/FFH. Tegangan referensi pada IC tersebut ialah pada
pin 14, sebagai acuan konversi bit/volt.
Rumusnya ialah :
Chip DAC yang digunakan pada
praktikum ini ialah DAC 0800 produksi National
Semiconductor, dengan kemampuan
8 bit dan settling
time 100ns dan high speed current output. Kit yang digunakan
dalam bentuk lengkap dengan op-amp bernama L-DAC produksi Batara.
Gambar 7.3 DAC 0800
Karena tegangan DAC menggunakan
tegangan simetris(dari minus hingga positif), maka keluaran pada
op-amp 741 akan berkisar antara -12V sampai +12V, sehingga apabila masukan data DAC=00H, maka tegangan keluarannya= - 12V,
jika masukan data DAC=FFH, maka tegangan keluarannya=
+12V
Gambar 7.4 Rangkaian DAC 0800
Penerapan
pada Program
Percobaan 1.
Menerima data ADC
Langkah-langkahnya:
1.
Siapkan Smart AVR ATmega 16 ver. 2.0, dan hubungkan dengan
kabel AVR ISP Programmer ke
PC. Hubungkan juga kabel serial dari mikrokontroler ke PC. Hubungan keluaran sensor suhu LM35DZ di PA.0, dengan susunan sensor sebagai berikut:
Gambar
7.5 Sensor suhu LM35DZ
2.
Buat program yang otomatis digenerate di
bawah ini, dengan terlebih dahulu mengkonfigurasi ADC menggunakan CodeWizardAVR.
Gambar 7.6 Konfigurasi
ADC dan Serial
ADC.c:
// Percobaan 7.1,
percobaan terima data ADC dari sensor LM35DZ
// LED terhubung di Port B
#include
<mega16.h>
#include <stdio.h>
#include <delay.h>
#define
ADC_VREF_TYPE 0x60
flash unsigned char
string1[]={"data adc: %d; "};
// Baca 8 bit terpenting
unsigned char 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);
// Mulai konversi ADC
ADCSRA|=0x40;
// Tunggu konversi ADC selesai
while ((ADCSRA & 0x10)==0);
ADCSRA|=0x10;
return ADCH;
}
void main(void) {
// Inisialisasi
Port B
PORTB=0xFF;
DDRB=0xFF;
// Timer/Counter 0
initialization
// Clock source:
System Clock
// Clock value:
Timer 0 Stopped
// Mode: Normal top=FFh
// OC0 output:
Disconnected
TCCR0=0x00;
TCNT0=0x00;
OCR0=0x00;
//
Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x00;
// USART
initialization
// Communication
Parameters: 8 Data, 1 Stop, No Parity
// USART Receiver:
On
// USART
Transmitter: On
// USART Mode:
Asynchronous
// USART Baud Rate:
9600
UCSRA=0x00;
UCSRB=0x18;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x19;
// Analog
Comparator initialization
// Analog
Comparator: Off
// Analog
Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;
// ADC
initialization
// ADC Clock
frequency: 31,250 kHz
// ADC Voltage
Reference: AVCC pin
// ADC Auto Trigger
Source: Free Running
// Only the 8 most significant bits of
// the AD
conversion result are used
ADMUX=ADC_VREF_TYPE
& 0xff;
ADCSRA=0xA7;
SFIOR&=0x1F;
while (1)
{
//Panggil fungsi baca adc di sini
};
}
3. Kompilasi dan jalankan, lihat
perubahan nyala LED di port B, atau di Hyperterminal, jika sensor LM 35 dipanaskan.
4. Buat grafik linearitas sensor suhu
ini mulai dari 10 derajat hingga 100 derajat celcius.
Percobaan 2. Sensor DS1820 /DS18S20
Langkah-langkahnya:
1.
Siapkan SmartAVR
ATmega16 ver. 2.0, dan hubungkan dengan kabel AVR ISP Programmer ke PC. Hubungan keluaran sensor DS1820 pada PA6. Sensors DS18S20 ialah 1-Wire Parasite-Power Digital Thermometer
Gambar 7.7 Sensor DS1820
2.
Buat program di bawah
ini :
DS1820.c:
// Percobaan 7.2, Percobaan
1 wire bus temperature sensor
//Multipoint thermometer dengan display LCD
//Tiap devais
AVR mungkin perlu penyesuaian nilai/konfigurasi.
/* Jika menggunakan STK500
1.
Gunakan clock eksternal 3.6864MHz
STK 500
2.
Sensor DS1820/18S20 terhubung ke bit 6
dari PORTA
[DS1820/18S20] [Sistem minimum
AVR/ STK500 PORTA HEADER]
1 GND -
9 GND
2 DQ -
7 PA6
3 VDD - 10 +5V
3.
Seluruh sensor harus
terhubung paralel
4.
Resistor 4.7K pull up harus terhubng antara DQ (PA6) dan +5V
*/
#asm
.equ
__w1_port=0x1b
.equ
__w1_bit=6
#endasm
/* Konfigurasi LCD 2x16 ke
Port C:
[LCD] [Header Sistem minimum
AVR/ STK500 di Port C]
1 GND- 9 GND
2 +5V- 10 VCC
3 VLC- LCD contrast 0..1V
4 RS - 1
PC0
5 RD - 2
PC1
6 EN - 3
PC2
11 D4 - 5 PC4
12 D5 - 6 PC5
13 D6 - 7 PC6
14 D7 - 8 PC7
*/
#asm
.equ __lcd_port=0x15
#endasm
#include <mega16.h>
#include <lcd.h> //
#include <ds1820.h>
#include <delay.h>
#include <stdio.h>
char lcd_buffer[33];
/* Jumlah maksimum
sensor DS1820/DS18S20 */
#define MAX_DEVICES 8
/* DS1820/DS18S20 devices ROM code storage area */
unsigned char rom_code[MAX_DEVICES][9];
main() {
unsigned char i,j,devices;
int temp;
lcd_init(16);
lcd_putsf("Program
1820\n1 Wire Bus Demo");
delay_ms(2000);
lcd_clear();
// Mendeteksi banyaknya
ensor
devices=w1_search(0xf0,rom_code);
sprintf(lcd_buffer,"%u DS1820\nDevice detected",devices);
lcd_puts(lcd_buffer);
delay_ms(2000);
//Menampilkan ROM
codes untuk tiap devais
if (devices) {
for (i=0;i<devices;i++) {
sprintf(lcd_buffer,"Devais #%u ROM\nCode ialah :",i+1);
lcd_clear();
lcd_puts(lcd_buffer);
delay_ms(2000);
lcd_clear();
for
(j=0;j<8;j++)
{
sprintf(lcd_buffer,"%02X
",rom_code[i][j]);
lcd_puts(lcd_buffer);
if
(j==3) lcd_gotoxy(0,1);
};
delay_ms(5000);
};
}
else
while (1); /* berhenti di sini jika
devais tidak ditemukan */
/* Mengukur dan menampilkan temperatur */
while (1) {
for
(i=0;i<devices;) {
temp=ds1820_temperature_10(&rom_code[i][0]);
j='+';
if
(temp<0)
{
j='-';
temp=-temp;
};
sprintf(lcd_buffer,"t%u=%c%i.%u\xdfC",++i,j,temp/10,temp%10);
lcd_clear();
lcd_puts(lcd_buffer);
delay_ms(800);
};
};
}
3.
Jalankan Program, lihat data suhu di LCD. Panaskan sensor tersebut, dan lihat perubahan suhu di LCD.
Percobaan 3. Pemrograman
DAC
Langkah-langkahnya;
1.
Siapkan SmartAVR ATmega 16 ver. 2.0 atau yang sesuai, dan hubungkan IC DAC serta Op – Amp di port B. Hubungkan juga kabel serial mikrokontroler ke PC.
2.
Buat program di bawah
ini:
DAC.c:
// Percobaan 7.3, Percobaan
DAC 0800
#include <mega16.h> //Menyertakan library file mega16
#include <delay.h> //menggunakan
delay, jadi librarynya harus digunakan
#include <string.h>
#include <stdio.h>
#define PortDAC PORTB
flash unsigned char string1[]={"data dac: %d; "};
void main(void) {
unsigned char dac;
DDRB=0xFF;
UCSRA=0x00;
UCSRB=0x18;
UCSRC=0x86;
UBRRH=0X00; //
Baud rate 9600bps, pada kristal 4 MHz
UBRRL=0X19;
dac=0; //Nilai awal data DAC
while
(1) {
printf(string1,dac); //Tampilkan data di hyperterminal
PortDAC=dac; //Kirim nilai digital ke DAC0800
dac++;
…
};
}
3.
Amati perubahan data
yang tampil pada LED di Port B dan Hyperterminal.
Tugas Pendahuluan
1. Jelaskan cara kerja dari ADC pada Atmega16
2. Jelaskan berbagai teknik konversi pada DAC.
3. Buat program pembangkit sinyal gigi gergaji menggunakan
DAC.
Tugas Akhir Praktikum
1. Buatlah program penampil suhu LM35DZ dari PA.0, dikirim melalui pot serial dan ditampilkan di PC menggunakan VB .Net.
Miliki materi lengkap ini :
Panduan Praktikum Mikrokontroler AVR ATmega16
Terbitan Elex Media Komutindo,
Januari 2008
.png)
.png)
.png)
.png)
0 comments:
Posting Komentar