Daftar Isi:

Sentuhan Kapasitif Dengan Mikrokontroler PIC16F886: 3 Langkah
Sentuhan Kapasitif Dengan Mikrokontroler PIC16F886: 3 Langkah

Video: Sentuhan Kapasitif Dengan Mikrokontroler PIC16F886: 3 Langkah

Video: Sentuhan Kapasitif Dengan Mikrokontroler PIC16F886: 3 Langkah
Video: Capasitive Touch Demo 2024, November
Anonim
Sentuhan Kapasitif Dengan Mikrokontroler PIC16F886
Sentuhan Kapasitif Dengan Mikrokontroler PIC16F886

Dalam tutorial ini kita akan membahas bagaimana Anda dapat menggunakan mikrokontroler PIC16F886 untuk mendeteksi perbedaan kapasitansi, ini nantinya dapat digunakan untuk mengetahui apakah touch pad sedang ditekan. Ada baiknya untuk mengenal mikrokontroler pic sebelum membuat proyek ini.

Langkah 1: Hubungkan Sirkuit Anda

Hubungkan Sirkuit Anda
Hubungkan Sirkuit Anda

Pertama, mari kita mulai dengan memasang rangkaian sesuai dengan skema di atas. Untuk membuat panel sentuh, Anda dapat melipat aluminium foil menjadi persegi dan menempelkannya pada kawat. Anda dapat bereksperimen dengan nilai yang berbeda untuk resistor 100k, saya menemukan 100k bekerja dengan baik untuk saya.

Pin RC4 digunakan untuk memulai pengisian/pengosongan kapasitansi yang akan diukur. C12IN0 terhubung ke - sisi komparator internal dan pin C1IN terhubung ke + sisi komparator yang sama. Mikrokontroler melihat kapasitansi sebagai terisi penuh ketika tegangan C12IN0 mencapai di atas tegangan C1IN. Pembagi tegangan resistif memastikan C1IN mendekati 5 volt.

Karena panel sentuh bergantung pada kapasitansi yang signifikan antara Anda dan ground sirkuit, ada kemungkinan baterai tidak berfungsi.

Langkah 2: File Header

File Header
File Header

Selesai dengan semua koneksi? Baik, kita akan melanjutkan dengan file header. Kami akan menggunakan kompiler XC8 dan seperti yang disarankan oleh judulnya, Anda sekarang harus membuat file header baru di proyek Anda dan menyalin-tempel kode berikut. Anda juga dapat menyalin-menempelnya di atas kode utama Anda tanpa file header apa pun.

#define CALIBRATION_SAMPLE 20#define TOUCH_SAMPLE 10 #define DISCHARGE_TIME 5

jumlah int;

int kalibrasiValue, maxCalibrationValue, minCalibrationValue;

int getChargeTime(){

int penghitung waktu Hitung = 0; int overflowCount = 0; //pengosongan kapasitansi yang akan diukur RC4 = 0; _delay_ms(DISCHARGE_TIME); //memberikan penundaan yang cukup untuk sepenuhnya (hampir sepenuhnya benar-benar) melepaskan "kapasitor" //menghapus flag overflow timer T0IF = 0; //tunggu timer overflow, mulai hitung dari 0 while(!T0IF); T0IF = 0; //mulai pengisian kapasitansi yang akan diukur RC4 = 1; //tunggu kapasitansi mengisi hingga tegangan referensi while(C1OUT){ timerCount = TMR0; if(T0IF){ overflowCount++; T0IF = 0; } } count = (256 * overflowCount) + timerCount; //reset timerCount timerCount = 0; overflowCount = 0; jumlah pengembalian; }

int isTouching(toleransi int){

//rata-rata beberapa sampel rata-rata ganda = 0; for(int i = 0; i kalibrasiNilai + toleransi) rata-rata++; } rata-rata /= TOUCH_SAMPLE; //rata-rata akan menjadi angka antara 0 dan 1 jika(rata-rata > 0.2) mengembalikan 1; kembali 0; }

batal kalibrasi(){

int rata-rata = 0; int sampel[CALIBRATION_SAMPLE]; //mendapatkan nilai rata-rata untuk(int i = 0; i < CALIBRATION_SAMPLE; i++){ sampel = getChargeTime(); rata-rata += sampel; } rata-rata /= CALIBRATION_SAMPLE; kalibrasiNilai = rata-rata; //mendapatkan nilai maks/min maxCalibrationValue = sampel[0]; minCalibrationValue = sampel[0]; for(int i = 0; i maxCalibrationValue) maxCalibrationValue = sampel; if(sampel < minCalibrationValue) minCalibrationValue = sampel; } }

batalkan pengaturanCapacitiveTouch(){

//mengatur pin charge/discharge sebagai output, dalam hal ini adalah RC4 TRISCbits. TRISC4 = 0; //menyetel timer0 T0CS = 0; PSA = 1; //menyiapkan komparator C1CH0 = 0; C1CH1 = 0; C1R = 0; C1ON = 1; C1POL = 0; //menghapus nilai hitungan count = 0; //menghapus nilai kalibrasi kalibrasiValue = 0; maxCalibrationValue = 0; minCalibrationValue = 0; //jalankan kalibrasi saat mulai kalibrasi(); }

Langkah 3: Menulis Kode Utama

Dimulai dengan kode utama, Anda harus menyertakan file header yang dibuat pada langkah sebelumnya. Kode berikut adalah contoh bagaimana Anda dapat menggunakan fungsi isTouching sebagai sakelar. Dalam kasus saya, saya memberi header nama capacitiveTouch.h.

#termasuk

#sertakan "capacitiveTouch.h"

// variabel ini memberitahu apakah tombol sudah atau belum ditekan

int keadaan terakhir = 0;

batal utama(){

//mengatur RC5 sebagai output TRISCbits. TRISC5 = 0; //Anda perlu memanggil fungsi ini pada awal program setupCapacitiveTouch(); _delay_ms(1000); //kalibrasi setelah pengaturan yang tepat kalibrasi(); while(1){ //memeriksa apakah tombol ditekan if(isTouching(15) && lastState == 0){ if(RC5) RC5 = 0; lain RC5 = 1; keadaan terakhir = 1; } //memeriksa apakah tombol dilepaskan else if(lastState == 1 && !isTouching(15)) lastState = 0; _delay_ms(20); } }

menyesuaikan:

Saat fungsi ini dipanggil variabel kalibrasiValue, maxCalibrationValue dan minCalibrationValue akan diperbarui. kalibrasiValue digunakan oleh fungsi isTouching. Ingatlah bahwa panel sentuh harus dibiarkan sendiri selama kalibrasi.

setupCapacitiveTouch:

Perlu dipanggil di awal program Anda. Ini mengatur bit yang diperlukan yang digunakan oleh fungsi lain. Ini juga menjalankan kalibrasi. Namun saya mendapatkan hasil yang lebih baik dengan menunggu sebentar dan menjalankan kalibrasi lagi secara terpisah.

menyentuh:

Fungsi ini mengembalikan 1 jika mendeteksi peningkatan kapasitansi pada C12IN0 dan mengembalikan 0 jika kapasitansi dekat dengan kapasitansi selama kalibrasi. Sederhananya, jika seseorang menyentuh pad, fungsi isTouching akan kembali 1. Fungsi tersebut juga menginginkan parameter sebagai input, ini adalah toleransi untuk memicunya. Semakin tinggi nilai toleransi maka semakin tidak sensitif. Dalam pengaturan saya, saya menemukan 15 bekerja dengan baik, tetapi karena ini tergantung pada frekuensi osilator dan berapa banyak kapasitansi yang ditambahkan ketika Anda menekannya, Anda harus bereksperimen dengan nilai ini sampai Anda menemukan sesuatu yang sesuai untuk Anda.

getChargeTime:

Bila Anda ingin mengetahui berapa lama waktu yang dibutuhkan untuk mengisi kapasitansi ke tegangan CVREF, fungsi ini akan mengujinya dan mengembalikan bilangan bulat. Untuk mendapatkan waktu dalam detik gunakan rumus ini: (4 * getChargeTime) / oscillatorFrequency = chargeTimeInSeconds Rumus ini juga dapat digunakan untuk mendapatkan input toleransi dari fungsi isTouching ke detik.

Direkomendasikan: