Interface ADC Menggunakan PIC16F877A




1. Tujuan [Kembali]

Mempelajari bagaimana cara merangkai suatu rangkaian ADC menggunakan mikrokontroler PIC dengan programnya.


2. Alat [Kembali]


2.1 Mikrokontroler PIC16F877A.


2.2 LCD

2.3 Potensiometer

3. Teori [Kembali]


3.1. Pengertian Mikrokontroler PIC 16F877A

PIC yang merupakan produk dari Microchip Technology, merupakan kepanjangan dari Peripheral Interface Controller memiliki arsitektur Harvard dan merupakan jenis RISC (Reduced Instruction Set Computing). Salah satu jenis mikrokontroler ini adalah PIC16F877A.

3.1.1 Fitur-Fitur PIC16F877A.

a. Memiliki Instruksi sebanyak 35 buah.
b. Masing-masing instruksi dieksekusi dalam satu siklus mesin kecuali untuk instruksi percabangan yaitu dua siklus.
c. Kecepatan operasi masukan clock dari DC hingga 20MHz.
d. Kapasitas memori program berukuran 8k x 14 words.
e. Kapasitas RAM 268 byte.
f. Kapasitas memory EEPROM berukuran 256 byte.

3.1.2 Pin Out PIC16F877A.


-Memiliki 5 PORT I/O (PORTA 6 pin, PORTB 8 pin, PORTC 8 pin, PORTD 8 pin, PORTE 3 pin).
-Memiliki 3 buat timer
-Memiliki 2 buah keluaran PWM.
-Komunikasi serial singkron menggunakan SPI dan I2C.
-Komunikasi USART.

3.1.3 Pemograman PIC16F877A.



Pemograman PIC ini diprogram menggunakan bahasa C dan dapat menggunakan kompiler MikroC for PIC yang dapat didownload di situs resminya.

3.1.4 Rangkaian Dasar Sistem Mikrokontroler PIC16F877A.



Di gambar dapat dilihat bahwa rangkaian dasar dari sistim mikrokontroler biasanya menggunakan rangkaian crystal sebagai clock atau oscilator eksternal sebagai jantung untuk memberikan kecepatan eksekusi dari mikrokontroler tersebut. Pada gambar juga terdapat rangkaian reset yang digunakan untuk memulai dari awal kembali program yang kita jalankan pada mikrokontroler ini.

3.2. Pengertian ADC

Analog To Digital Converter (ADC) adalah pengubah input analog menjadi kode – kode digital. ADC banyak digunakan sebagai pengatur proses industri, komunikasi digital dan rangkaian pengukuran/pengujian. Umumnya ADC digunakan sebagai perantara antara sensor yang kebanyakan analog dengan sistim komputer seperti sensor suhu, cahaya, tekanan/berat, aliran dan sebagainya kemudian diukur dengan menggunakan sistim digital (komputer).

3.2. Pengertian ADC pada PIC 16F877A

Hanya ada EMPAT register yang perlu Anda pahami untuk mengkonfigurasi ADC. Mereka adalah ADCON0, ADCON1, ADRESH dan ADRESL. Dua yang paling penting adalah ADCON0 dan ADCON1 . ADRESH dan ADRESL hanyalah register dimana ADC menyimpan hasil konversi.

Register ADCON0


Bit-ADCS0-ADCS1-ADCS2
Bit ini untuk menentukan kecepatan clock bitnya.



Bit-CHS
Bit ini digunakan untuk menentukan channel analog yang digunakan.




Register ADCON1





3.3. Pengertian Potensiometer

Potensiometer merupakan komponen elektronika yang memiliki nilai resistansi yang dapat diubah nilai resistansinya sesuai range yang berbeda beda seperti 1k,10k,100k dst.Potensiometer memiliki 3 kaki seperti di bawah ini :




Fungsi Potensiometer :

Pada gambar di atas dapat disimpulkan bahwa fungsi potensiometer adalah untuk menghasilkan nilai resistansi yang bervariasi tergantung dari putaran penyapu/wiper .Karena kelebihan itulah maka transistor banyak digunakan untuk pengatur volume,pengatur tegangan,switch triac dll.

Cara kerja potensiometer :

Jika yang digunakan hanya 2 terminal,1 ujung dan 1 nya wiper maka ia bekerja sebagai resistor variabel atau rheostat.Jika digunakan 3 terminal maka kaki no 2 bekerja sebagai V out sebagai sinyal keluaran.

3.4. Pengertian LCD

Untuk teori dari LCD dapat dilihat atau dipelajari pada postingan Interface LCD Menggunakan PIC 16F877A


4. Rangkaian [Kembali]



 Rangkaian diatas merupakan rangkaian sederhana dari pengunaan PIC untuk penggunaan sebagai ADC. Pada rangkaian tersebut input ADCnya digunakan potensiometer dan nilai analognya ditampilkan pada layar LCD


5. Program [Kembali]

//Penyambungan Modul LCD
sbit LCD_RS at RB7_bit;
sbit LCD_EN at RB5_bit;
sbit LCD_D7 at RB3_bit;
sbit LCD_D6 at RB2_bit;
sbit LCD_D5 at RB1_bit;
sbit LCD_D4 at RB0_bit;

// Pin direction
sbit LCD_RS_Direction at TRISB7_bit;
sbit LCD_EN_Direction at TRISB5_bit;
sbit LCD_D7_Direction at TRISB3_bit;
sbit LCD_D6_Direction at TRISB2_bit;
sbit LCD_D5_Direction at TRISB1_bit;
sbit LCD_D4_Direction at TRISB0_bit;

void PrintToDisplay(char x, char y, float in1)   //fungsi cetak ke LCD
{
     char ch;                                    // deklarasi variabel ch
     int tint;                                   // deklarasi variabel tint
     tint=(int)(in1*1000);                       // mendapatkan nilai integer dari input analog
     ch=tint/1000;                               // mendapatkan bilangan pertama dari nilai analog
     Lcd_Chr(x,y,ch+48);                         // cetak bilangan pertama ke LCD
     Lcd_Chr_Cp('.');                            // cetak titik yang menjadi koma desimal
     ch=(tint%1000)/100;                         // mendapatkan bilangan kedua dari nilai analog
     Lcd_Chr_Cp(ch+48);                          // cetak bilangan kedua ke LCD
     ch=((tint%1000)%100)/10;                    // mendapatkan bilangan ketiga dari nilai analog
     Lcd_Chr_Cp(ch+48);                          // cetak bilangan ketiga ke LCD
     ch=((tint%1000)%100)%10;                    // mendapatkan bilangan keempat nilai analog
     Lcd_Chr_Cp(ch+48);                          // cetak bilangan keempat ke LCD
     Lcd_Out_Cp("Volt");                         // cetak satuan Volt ke LCD
     Delay_ms(10);                               // delay 10 ms
     }

     int vadc;                                   // deklarasi variabel vadc
     float vin, vinb;                            // deklarasi variabel vin dan vinb

void main() {
TRISB=0x00;                                      // PORTB sebagai output
TRISA=0xff;                                      // PORTA sebagai Input

Lcd_Init();                                      // Inisialisasi LCD
Lcd_Cmd(_LCD_CLEAR);                             // bersihkan layar LCD
Lcd_Cmd(_LCD_CURSOR_OFF);                        // matikan cursor LCD

ADCON0.ADCS0=0;                                  // ADCS0, ADCS1 & ADCS2 bersama sama menentukan kecepatan clock
ADCON0.ADCS1=1;                                  // jika 0 1 1 maka kecepatannya  Fosc/64
ADCON1.ADCS2=1;
ADCON0.CHS0=0;                                   // CHS0, CHS1 & CHS2 bersama-sama menentukan pin
ADCON0.CHS1=0;                                   // jika 0 0 0  maka pin yang digunakan adalah RA0/AN0
ADCON0.CHS2=0;
ADCON0.ADON=1;                                   // mengaktifkan konverter A/D
ADCON1.ADFM=1;                                   // menyatakan 10 bit terdiri dari 8 bit ADRESL dan 2 bit ADRESH
ADCON1.PCFG0=0;                                  // PCFG0, PCFG1, PCFG2 & PCFG3 bersama sama menetukan
ADCON1.PCFG1=0;                                  // apakah pin digunakan sebagai input analog atau input digital
ADCON1.PCFG2=0;                                  // jika 0000 maka semua pin sebagai input Analog
ADCON1.PCFG3=0;

for(;;) {                                        // looping
        ADCON0.Go_Done=1;                        // melakukan pengukuran konversi A/D
        while(ADCON0.Go_Done)                    // memastikan konversi aktif
        { }
        vadc=ADRESL+(ADRESH*256);


    /* Mengambil nilai digital, dengan ADRESL bit low hanya dapat menghitung
                                    hingga 256 dan meluap. sehingga jika 256 telah terpenhui maka nilai
                                    ADRESH akan bertambah 1 point. sehingga hasil digital yang didapatkan
                                    dapat dicari dengan ADRESL terakhir ditambah dengan ADRESH*256. dengan
                                    kolaborasi ini ADC dapat menghitung hingga 10bit.
                                 */

        vin=vadc*5/1024;                       // konversi nilai digital yang didapat ke nilai analog
                                               // dengan tegangan maksimum 5 volt
        PrintToDisplay(1,1,vin);                 // panggil fungsi  untuk mencetak ke layar LCD
        delay_ms(50);                                         // delay 50ms
        Lcd_Cmd(_LCD_CLEAR);                   // bersihkan layar LCD
        }

}


6. Flowchart [Kembali]



7. Video Simulasi [Kembali]






           


          






Share
Tweet
Pin
Share