- ADC dalam PIC Microcontroller PIC16F877A:
- Pengaturcaraan untuk ADC:
- Penyediaan dan Ujian Perkakasan:
Ini adalah tutorial ke-9 kami untuk belajar mikrokontroler PIC menggunakan MPLAB dan XC8. Hingga kini, kami telah membahas banyak tutorial asas seperti memulakan MPLABX, LED berkedip dengan PIC, Timer di PIC, interfacing LCD, interfacing 7-segmen dll. Sekiranya anda seorang pemula mutlak, sila lawati senarai lengkap tutorial PIC di sini dan mula belajar.
Dalam tutorial ini, kita akan belajar Cara Menggunakan ADC dengan mikrokontroler PIC kami PICF877A. Sebilangan besar projek Mikrokontroler akan melibatkan ADC (Analog to Digital converter) di dalamnya, kerana 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 voltan, giroskop, akselerometer, sensor jarak, dan hampir setiap sensor atau transduser yang diketahui menghasilkan voltan analog dari 0V hingga 5V berdasarkan bacaan sensor. Sensor suhu misalnya dapat memberikan 2.1V ketika suhu 25C dan naik ke 4.7 ketika suhu 60C. Untuk mengetahui suhu dunia nyata, MCU hanya perlu membaca voltan output sensor suhu ini dan mengaitkannya dengan suhu dunia nyata. Oleh itu, ADC adalah alat kerja yang penting untuk projek MCU dan mari kita pelajari bagaimana kita dapat menggunakannya di PIC16F877A kami.
Lihat juga artikel kami sebelumnya mengenai penggunaan ADC dalam pengawal mikro lain:
- Bagaimana Menggunakan ADC di Arduino Uno?
- Tutorial ADP Raspberry Pi
- Memadankan ADC0808 dengan Mikrokontroler 8051
ADC dalam PIC Microcontroller PIC16F877A:
Terdapat banyak jenis ADC yang tersedia dan masing-masing mempunyai kelajuan dan resolusi tersendiri. Jenis ADC yang paling biasa adalah kilat, penghampiran berturut-turut, dan sigma-delta. Yang jenis ADC digunakan dalam PIC16F877A dipanggil sebagai ADC penghampiran berturut-turut atau SAR di pendek. Oleh itu, mari kita pelajari sedikit mengenai SAR ADC sebelum kita mula menggunakannya.
ADC Pendekatan Berturut-turut: ADC SAR berfungsi dengan bantuan pembanding dan beberapa perbualan logik. Jenis ADC ini menggunakan voltan rujukan (yang berubah-ubah) dan membandingkan voltan masukan dengan voltan rujukan menggunakan pembanding dan perbezaan, yang akan menjadi output digital, disimpan dari bit Paling ketara (MSB). Kelajuan perbandingan bergantung pada frekuensi Jam (Fosc) di mana PIC beroperasi.
Setelah mengetahui beberapa asas mengenai ADC, mari buka lembaran data kami dan pelajari cara menggunakan ADC pada PIC16F877A MCU kami. PIC yang kami gunakan mempunyai ADC 8-saluran 10-bit. Ini bermaksud nilai output ADC kami adalah 0-1024 (2 ^ 10) dan terdapat 8 pin (saluran) pada MCU kami yang dapat membaca voltan analog. Nilai 1024 diperoleh oleh 2 ^ 10 kerana ADC kami adalah 10 bit. Lapan pin yang dapat membaca voltan analog disebutkan dalam lembar data. Mari lihat gambar di bawah.
Saluran analog AN0 hingga AN7 diserlahkan untuk anda. Hanya pin ini yang dapat membaca voltan analog. Oleh itu, sebelum membaca voltan masukan, kita harus menentukan dalam kod kita saluran mana yang harus digunakan untuk membaca voltan input. Dalam tutorial ini kita akan menggunakan saluran 4 dengan potensiometer untuk membaca voltan analog pada saluran ini.
Modul A / D mempunyai empat register yang harus dikonfigurasi untuk membaca data dari pin Input. Daftar ini adalah:
• Daftar Tinggi Hasil A / D (ADRESH)
• Daftar Rendah Hasil A / D (ADRESL)
• Daftar Kawalan A / D 0 (ADCON0)
• Daftar Kawalan A / D 1 (ADCON1)
Pengaturcaraan untuk ADC:
The program untuk menggunakan ADC dengan PIC Microcontroller adalah sangat mudah, kita hanya perlu memahami empat daftar dan kemudian membaca mana-mana voltan analog akan menjadi mudah. Seperti biasa mulakan bit konfigurasi dan mari kita mulakan dengan kekosongan utama ().
Di dalam kekosongan utama () kita harus memulakan ADC kita dengan menggunakan register ADCON1 dan ADCON0. Daftar ADCON0 mempunyai bit berikut:
Dalam daftar ini kita harus menghidupkan modul ADC dengan membuat ADON = 1 dan menghidupkan Jam Penukaran A / D dengan menggunakan bit ADCS1 dan bit ADCS0, selebihnya tidak akan ditetapkan buat masa ini. Dalam program kami jam penukaran A / D dipilih sebagai Fosc / 16, anda boleh mencuba frekuensi anda sendiri dan melihat bagaimana hasilnya berubah. Maklumat lengkap terdapat di lembar data halaman 127. Oleh itu, ADCON0 akan dimulakan seperti berikut.
ADCON0 = 0b01000001;
Sekarang daftar ADCON1 mempunyai bit berikut:
Dalam daftar ini kita harus membuat Format Keputusan A / D Pilih sedikit tinggi dengan ADFM = 1 dan buat ADCS2 = 1 untuk memilih Fosc / 16 sekali lagi. Bit lain tetap sifar kerana kami telah merancang untuk menggunakan voltan rujukan dalaman. Maklumat lengkap tersedia di lembar data halaman 128. Oleh itu, ADCON1 akan kami tetapkan seperti berikut.
ADCON1 = 0x11000000;
Sekarang setelah memulakan modul ADC di dalam fungsi utama kami, mari masuk ke loop sementara dan mula membaca nilai-nilai ADC. Untuk membaca nilai ADC langkah berikut mesti diikuti.
- Memulakan Modul ADC
- Pilih saluran analog
- Mulakan ADC dengan menjadikan Go / Done sedikit tinggi
- Tunggu bit Go / DONE untuk menjadi rendah
- Dapatkan hasil ADC dari daftar ADRESH dan ADRESL
1. Memulakan Modul ADC: Kami telah belajar bagaimana memulakan ADC jadi kami hanya memanggil fungsi di bawah ini untuk menginisialisasi ADC
Fungsi void ADC_Initialize () adalah seperti berikut.
batal ADC_Initialize () {ADCON0 = 0b01000001; // ADC ON dan Fosc / 16 dipilih ADCON1 = 0b11000000; // Voltan rujukan dalaman dipilih}
2. Pilih saluran analog: Sekarang kita harus memilih saluran mana yang akan kita gunakan untuk membaca nilai ADC. Mari buat fungsi untuk ini, supaya mudah bagi kita untuk beralih antara setiap saluran di dalam loop sementara .
ADC_Read int yang tidak ditandatangani (saluran char yang tidak ditandatangani) {// **** Memilih saluran ** /// ADCON0 & = 0x11000101; // Membersihkan Bit Pemilihan Saluran ADCON0 - = saluran << 3; // Menetapkan Bits yang diperlukan // ** Seleksi saluran selesai *** ///}
Kemudian saluran yang akan dipilih diterima di dalam saluran pemboleh ubah. Dalam barisan
ADCON0 & = 0x1100101;
Pemilihan saluran sebelumnya (jika ada) dibersihkan. Ini dilakukan dengan menggunakan bitwise dan operator "&". Bit 3, 4 dan 5 dipaksa 0 sementara yang lain dibiarkan berada dalam nilai sebelumnya.
Kemudian saluran yang diinginkan dipilih dengan menggeser kiri nombor saluran tiga kali dan menetapkan bit menggunakan bitwise atau operator "-".
ADCON0 - = saluran << 3; // Menetapkan Bits yang diperlukan
3. Mulakan ADC dengan menjadikan Go / Done sedikit tinggi: Setelah saluran dipilih, kita harus memulakan penukaran ADC hanya dengan membuat GO_nDONE sedikit tinggi:
GO_nDONE = 1; // Memulakan Penukaran A / D
4. Tunggu bit Go / DONE menjadi rendah: Bit GO / DONE akan tetap tinggi sehingga penukaran ADC selesai, oleh itu kita harus menunggu sehingga bit ini kembali rendah. Ini dapat dilakukan dengan menggunakan loop sementara .
semasa (GO_nDONE); // Tunggu Penukaran A / D selesai
5. Dapatkan hasil ADC dari daftar ADRESH dan ADRESL: Apabila bit Go / DONE menjadi rendah lagi ini bererti bahawa penukaran ADC selesai. Hasil ADC akan menjadi nilai 10-bit. Oleh kerana MCU kami adalah MCU 8-bit, hasilnya dibahagikan kepada 8-bit atas dan 2-bit lebih rendah. Hasil 8-bit atas disimpan dalam register ADRESH dan 2-bit yang lebih rendah disimpan dalam daftar ADRESL. Oleh itu kita harus menambahkannya ke daftar untuk mendapatkan nilai ADC 10-bit kita. Hasil ini dikembalikan oleh fungsi seperti yang ditunjukkan di bawah:
kembali ((ADRESH << 8) + ADRESL); // Keputusan Pengembalian
Fungsi lengkap yang digunakan untuk memilih saluran ADC, mencetuskan ADC dan mengembalikan hasilnya ditunjukkan di sini.
ADC_Read int yang tidak ditandatangani (saluran char yang tidak ditandatangani) {ADCON0 & = 0x11000101; // Membersihkan Bit Pemilihan Saluran ADCON0 - = saluran << 3; // Menetapkan Bits yang diperlukan __delay_ms (2); // Masa pemerolehan untuk mengisi kapasitor tahan GO_nDONE = 1; // Memulakan Penukaran A / D semasa (GO_nDONE); // Tunggu Penukaran A / D untuk menyelesaikan pengembalian ((ADRESH << 8) + ADRESL); // Keputusan Pengembalian}
Sekarang kita mempunyai fungsi yang akan menjadikan pemilihan saluran sebagai input dan mengembalikan nilai ADC kepada kita. Oleh itu, kita boleh memanggil fungsi ini secara langsung dalam gelung sementara kita, kerana kita membaca voltan analog dari saluran 4 dalam tutorial ini, panggilan fungsi adalah seperti berikut.
i = (ADC_Read (4)); // simpan hasil iklan di “i”.
Untuk memvisualisasikan output ADC kami, kami memerlukan beberapa jenis modul paparan seperti LCD atau segmen 7. Dalam tutorial ini kita menggunakan paparan 7 segmen untuk mengesahkan hasilnya. Sekiranya anda ingin mengetahui cara menggunakan 7-segmen dengan pic ikuti tutorial di sini.
The kod lengkap adalah seperti di bawah dan proses ini juga dijelaskan dalam Video pada akhir.
Penyediaan dan Ujian Perkakasan:
Seperti biasa simulasi kod menggunakan Proteus sebelum benar-benar menggunakan perkakasan kami, skema projek ditunjukkan di bawah:
Sambungan modul paparan tujuh segmen 4 digit dengan mikrokontroler PIC sama seperti projek sebelumnya, kami baru saja menambah potensiometer ke pin 7 yang merupakan saluran analog 4. Dengan mengubah pot, voltan berubah akan dihantar ke MCU yang akan dibaca oleh modul ADC dan dipaparkan pada Modul paparan 7 segmen. Lihat tutorial sebelumnya untuk mengetahui lebih lanjut mengenai paparan 7-segmen 4-digit dan hubungannya dengan PIC MCU.
Di sini kami telah menggunakan papan Mikrokontroler PIC yang sama yang telah kami buat dalam Tutorial berkedip LED. Setelah memastikan sambungan memuat naik program ke PIC dan anda akan melihat output seperti ini
Di sini kita telah membaca nilai ADC dari periuk dan mengubahnya menjadi voltan sebenar dengan memetakan output 0-1024 sebagai 0-5 volt (seperti yang ditunjukkan dalam program). Nilai kemudian dipaparkan pada segmen 7 dan disahkan menggunakan multimeter.
Sekian, sekarang kami sudah siap menggunakan semua Sensor Analog yang ada di pasaran, teruskan dan cubalah ini dan jika anda mempunyai masalah seperti biasa gunakan bahagian komen, kami dengan senang hati akan membantu anda.