- ADC dalam Mikrokontroler PIC PIC16F877A:
- Pemrograman untuk ADC:
- Penyiapan dan Pengujian Perangkat Keras:
Ini adalah tutorial ke-9 kami mempelajari mikrokontroler PIC menggunakan MPLAB dan XC8. Sampai saat ini, kami telah membahas banyak tutorial dasar seperti memulai MPLABX, LED berkedip dengan PIC, Timer di PIC, antarmuka LCD, antarmuka 7-segmen, dll. Jika Anda benar-benar pemula, silakan kunjungi daftar lengkap tutorial PIC di sini dan mulai belajar.
Dalam tutorial ini, kita akan mempelajari Cara Menggunakan ADC dengan mikrokontroler PIC PICF877A. Sebagian besar proyek Mikrokontroler akan melibatkan ADC (Analog to Digital converter) di dalamnya, karena ini adalah salah satu cara yang paling banyak digunakan untuk membaca data dari dunia nyata. Hampir semua sensor seperti sensor suhu, sensor fluks, sensor tekanan, sensor arus, sensor tegangan, giroskop, akselerometer, sensor jarak, dan hampir setiap sensor atau transduser yang dikenal menghasilkan tegangan analog 0V hingga 5V berdasarkan pembacaan sensor. Sebuah sensor suhu misalnya dapat mengeluarkan 2.1V saat suhu 25C dan naik ke 4.7 ketika suhu 60C. Untuk mengetahui suhu dunia nyata, MCU hanya perlu membaca tegangan keluaran sensor suhu ini dan menghubungkannya dengan suhu dunia nyata. Oleh karena itu ADC adalah alat kerja penting untuk proyek MCU dan mari pelajari bagaimana kita dapat menggunakannya di PIC16F877A kita.
Juga periksa artikel kami sebelumnya tentang menggunakan ADC di mikrokontroler lain:
- Bagaimana cara menggunakan ADC di Arduino Uno?
- Tutorial ADC Raspberry Pi
- Menghubungkan ADC0808 dengan Mikrokontroler 8051
ADC dalam Mikrokontroler PIC PIC16F877A:
Ada banyak jenis ADC yang tersedia dan masing-masing memiliki kecepatan dan resolusinya sendiri. Jenis ADC yang paling umum adalah flash, aproksimasi berurutan, dan sigma-delta. The jenis ADC yang digunakan dalam PIC16F877A disebut sebagai ADC pendekatan berturut-turut atau SAR singkatnya. Jadi mari kita pelajari sedikit tentang SAR ADC sebelum kita mulai menggunakannya.
Approximation ADC Berturutan: SAR ADC bekerja dengan bantuan pembanding dan beberapa percakapan logika. Jenis ADC ini menggunakan tegangan referensi (yang variabel) dan membandingkan tegangan masukan dengan tegangan referensi menggunakan komparator dan perbedaan, yang akan menjadi keluaran digital, disimpan dari bit paling signifikan (MSB). Kecepatan perbandingan bergantung pada frekuensi Jam (Fosc) tempat PIC beroperasi.
Sekarang setelah kita mengetahui beberapa dasar tentang ADC, mari buka lembar data kita dan pelajari cara menggunakan ADC di MCU PIC16F877A kita. PIC yang kami gunakan memiliki 10-bit 8-channel ADC. Artinya nilai keluaran dari ADC kita akan menjadi 0-1024 (2 ^ 10) dan terdapat 8 pin (saluran) pada MCU kita yang dapat membaca tegangan analog. Nilai 1024 diperoleh 2 ^ 10 karena ADC kita adalah 10 bit. Delapan pin yang dapat membaca tegangan analog disebutkan dalam lembar data. Mari kita lihat gambar di bawah ini.
Saluran analog AN0 hingga AN7 disorot untuk Anda. Hanya pin ini yang dapat membaca tegangan analog. Jadi sebelum membaca tegangan input, kita harus menentukan dalam kode saluran mana yang harus digunakan untuk membaca tegangan input. Dalam tutorial ini kita akan menggunakan saluran 4 dengan potensiometer untuk membaca tegangan analog pada saluran ini.
Modul A / D memiliki empat register yang harus dikonfigurasi untuk membaca data dari pin Input. Register ini adalah:
• A / D Result High Register (ADRESH)
• A / D Result Low Register (ADRESL)
• Daftar Kontrol A / D 0 (ADCON0)
• A / D Control Register 1 (ADCON1)
Pemrograman untuk ADC:
The Program untuk menggunakan ADC dengan PIC Microcontroller sangat sederhana, kita hanya perlu memahami empat register ini dan kemudian membaca tegangan analog akan sederhana. Seperti biasa inisialisasi bit konfigurasi dan mari kita mulai dengan void main ().
Di dalam void main () kita harus menginisialisasi ADC kita dengan menggunakan register ADCON1 dan register ADCON0. Register ADCON0 memiliki bit berikut:
Pada register ini kita harus menyalakan modul ADC dengan membuat ADON = 1 dan menyalakan A / D Conversion Clock dengan menggunakan bit ADCS1 dan bit ADCS0, sisanya tidak akan disetting untuk saat ini. Dalam program kami, jam konversi A / D dipilih sebagai Fosc / 16 Anda dapat mencoba frekuensi Anda sendiri dan melihat bagaimana hasilnya berubah. Rincian lengkap tersedia di halaman lembar data 127. Oleh karena itu ADCON0 akan diinisialisasi sebagai berikut.
ADCON0 = 0b01000001;
Sekarang register ADCON1 memiliki bit berikut:
Dalam register ini kita harus membuat A / D Result Format Select bit high by ADFM = 1 dan buat ADCS2 = 1 untuk memilih Fosc / 16 lagi. Bit lainnya tetap nol karena kita telah merencanakan untuk menggunakan tegangan referensi internal. Rincian lengkap tersedia di datasheet halaman 128. Karenanya ADCON1 akan kita atur sebagai berikut.
ADCON1 = 0x11000000;
Sekarang setelah menginisialisasi modul ADC di dalam fungsi utama kita, mari masuk ke loop sementara dan mulai membaca nilai ADC. Untuk membaca nilai ADC, langkah-langkah berikut harus diikuti.
- Inisialisasi Modul ADC
- Pilih saluran analog
- Mulai ADC dengan membuat Go / Done agak tinggi
- Tunggu bit Go / DONE menjadi rendah
- Dapatkan hasil ADC dari register ADRESH dan ADRESL
1. Inisialisasi Modul ADC: Kita telah belajar bagaimana menginisialisasi ADC jadi kita panggil saja fungsi di bawah ini untuk menginisialisasi ADC
Fungsi void ADC_Initialize () adalah sebagai berikut.
batalkan ADC_Initialize () {ADCON0 = 0b01000001; // ADC ON dan Fosc / 16 dipilih ADCON1 = 0b11000000; // Tegangan referensi internal dipilih}
2. Pilih saluran analog: Sekarang kita harus memilih saluran mana yang akan kita gunakan untuk membaca nilai ADC. Mari kita buat fungsi untuk ini, sehingga akan mudah bagi kita untuk berpindah antar saluran di dalam while loop.
unsigned int ADC_Read (unsigned char channel) {// **** Memilih saluran ** /// ADCON0 & = 0x11000101; // Menghapus Pilihan Saluran Bits ADCON0 - = saluran << 3; // Menyetel Bit yang diperlukan // ** Pemilihan saluran selesai *** ///}
Kemudian saluran yang akan dipilih diterima di dalam saluran variabel. Di antrean
ADCON0 & = 0x1100101;
Pilihan saluran sebelumnya (jika ada) dihapus. Ini dilakukan dengan menggunakan bitwise dan operator "&". Bit 3, 4 dan 5 dipaksa menjadi 0 sementara yang lain dibiarkan berada di nilai sebelumnya.
Kemudian saluran yang diinginkan dipilih dengan menggeser nomor saluran tiga kali dan mengatur bit menggunakan bitwise atau operator "-".
ADCON0 - = saluran << 3; // Mengatur Bit yang dibutuhkan
3. Mulai ADC dengan membuat Go / Done bit high: Setelah channel dipilih, kita harus memulai konversi ADC cukup dengan membuat GO_nDONE bit tinggi:
GO_nDONE = 1; // Inisialisasi Konversi A / D
4. Tunggu bit Go / DONE menjadi rendah: Bit GO / DONE akan tetap tinggi sampai konversi ADC selesai, oleh karena itu kita harus menunggu sampai bit ini turun lagi. Ini dapat dilakukan dengan menggunakan loop sementara .
sementara (GO_nDONE); // Tunggu hingga Konversi A / D selesai
5. Dapatkan hasil ADC dari register ADRESH dan ADRESL: Ketika bit Go / DONE kembali rendah berarti konversi ADC telah selesai. Hasil dari ADC akan menjadi nilai 10-bit. Karena MCU kami adalah MCU 8-bit, hasilnya dibagi menjadi 8-bit atas dan 2-bit bawah. Hasil 8-bit atas disimpan dalam register ADRESH dan hasil 2-bit yang lebih rendah disimpan dalam register ADRESL. Oleh karena itu kita harus menambahkan ini ke register untuk mendapatkan nilai ADC 10-bit kita. Hasil ini dikembalikan oleh fungsi seperti yang ditunjukkan di bawah ini:
return ((ADRESH << 8) + ADRESL); // Mengembalikan Hasil
Fungsi lengkap yang digunakan untuk memilih saluran ADC, memicu ADC dan mengembalikan hasilnya ditampilkan di sini.
unsigned int ADC_Read (saluran karakter unsigned) {ADCON0 & = 0x11000101; // Menghapus Pilihan Saluran Bits ADCON0 - = saluran << 3; // Mengatur Bit __delay_ms (2) yang diperlukan; // Waktu akuisisi untuk mengisi daya kapasitor GO_nDONE = 1; // Inisialisasi Konversi A / D saat (GO_nDONE); // Tunggu hingga Konversi A / D selesai kembali ((ADRESH << 8) + ADRESL); // Mengembalikan Hasil}
Sekarang kita memiliki fungsi yang akan mengambil pilihan saluran sebagai masukan dan mengembalikan nilai ADC kepada kita. Oleh karena itu kita dapat langsung memanggil fungsi ini di dalam while loop kita, karena kita membaca tegangan analog dari saluran 4 dalam tutorial ini, pemanggilan fungsinya adalah sebagai berikut.
i = (ADC_Read (4)); // simpan hasil adc di "i".
Untuk memvisualisasikan keluaran ADC kita, kita akan membutuhkan semacam modul tampilan seperti LCD atau 7-segmen. Dalam tutorial ini kami menggunakan tampilan 7-segmen untuk memverifikasi keluaran. Jika Anda ingin tahu bagaimana menggunakan 7-segmen dengan pic ikuti tutorialnya di sini.
The kode lengkap diberikan di bawah ini dan proses ini juga menjelaskan dalam Video di akhir.
Penyiapan dan Pengujian Perangkat Keras:
Seperti biasa mensimulasikan kode menggunakan Proteus sebelum benar-benar menggunakan perangkat keras kami, skema proyeknya ditunjukkan di bawah ini:
Sambungan modul display seven segment 4 digit dengan mikrokontroler PIC sama dengan proyek sebelumnya, kita baru saja menambahkan potensiometer ke pin 7 yang merupakan channel analog 4. Dengan memvariasikan pot maka tegangan variabel akan dikirim ke MCU yang akan dibaca oleh modul ADC dan ditampilkan pada Modul tampilan 7-segmen. Periksa tutorial sebelumnya untuk mempelajari lebih lanjut tentang tampilan 4-digit 7-segmen dan interfacingnya dengan PIC MCU.
Di sini kami telah menggunakan papan Mikrokontroler PIC yang sama yang telah kami buat di Tutorial LED berkedip. Setelah memastikan koneksi, unggah program ke PIC dan Anda akan melihat keluaran seperti ini
Di sini kita telah membaca nilai ADC dari pot dan mengubahnya menjadi tegangan aktual dengan memetakan keluaran 0-1024 sebagai 0-5 volt (seperti yang ditunjukkan dalam program). Nilai tersebut kemudian ditampilkan pada 7-segmen dan diverifikasi menggunakan multimeter.
Itu saja, sekarang kami siap untuk menggunakan semua Sensor Analog yang tersedia di pasar, lanjutkan dan coba ini dan jika Anda memiliki masalah seperti biasa gunakan bagian komentar, kami akan dengan senang hati membantu Anda.