Pages - Menu

Sabtu, 07 April 2012

Pemrograman ADC dan DAC



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
Pesan ke Widodo@widodo.com atau desy@elexmedia.co.id

Tidak ada komentar:

Posting Komentar