Sadržaj:

Kapacitivni dodir sa mikrokontrolerom PIC16F886: 3 koraka
Kapacitivni dodir sa mikrokontrolerom PIC16F886: 3 koraka

Video: Kapacitivni dodir sa mikrokontrolerom PIC16F886: 3 koraka

Video: Kapacitivni dodir sa mikrokontrolerom PIC16F886: 3 koraka
Video: Sony FDR-AX33 против FDR-AX53 против FDR-AX100 Что выбрать? 4k UltraHD Выбор! 2024, Novembar
Anonim
Kapacitivni dodir sa mikrokontrolerom PIC16F886
Kapacitivni dodir sa mikrokontrolerom PIC16F886

U ovom vodiču ćemo razmotriti kako možete koristiti mikrokontroler PIC16F886 za otkrivanje razlika u kapacitivnosti, što se kasnije može koristiti za utvrđivanje pritiska li se dodirna ploča. Dobro je upoznati se sa mikrokontrolerima za slike prije izrade ovog projekta.

Korak 1: Povežite svoj krug

Ožičite svoj krug
Ožičite svoj krug

Prvo, počnimo ožičenjem kruga prema gornjoj shemi. Za izradu touchpada možete saviti aluminijsku foliju u kvadrat i zalijepiti traku na žicu. Možete eksperimentirati s različitim vrijednostima za 100k otpornik, otkrio sam da mi 100k dobro funkcionira.

RC4 pin se koristi za početak punjenja/pražnjenja mjernog kapaciteta. C12IN0 je spojen na - stranu unutrašnjeg komparatora, a C1IN pin je spojen na + stranu istog komparatora. Mikrokontroler vidi da je kapacitet potpuno napunjen kada napon C12IN0 dosegne iznad napona C1IN0. Otpornički razdjelnik napona osigurava da je C1IN blizu 5 volti.

Budući da dodirna podloga ovisi o značajnom kapacitetu između vas i mase kruga, postoji mogućnost da baterija možda neće raditi.

Korak 2: Datoteka zaglavlja

Zaglavlje datoteka
Zaglavlje datoteka

Završili sa svim vezama? Dobro, nastavit ćemo s datotekom zaglavlja. Koristit ćemo XC8 kompajler i kao što naslov govori, sada ćete stvoriti novu datoteku zaglavlja u svom projektu i kopirati i zalijepiti sljedeći kod. Možete ga kopirati i zalijepiti iznad glavnog koda bez datoteke zaglavlja.

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

int count;

int calibrationValue, maxCalibrationValue, minCalibrationValue;

int getChargeTime () {

int timerCount = 0; int overflowCount = 0; // mjeriti kapacitet pražnjenja RC4 = 0; _odgoda_ms (DISCHARGE_TIME); // dati dovoljno kašnjenja za potpuno (gotovo potpuno stvarno) pražnjenje "kondenzatora" // očistiti zastavicu preljeva timera T0IF = 0; // čekati da se tajmer prelije, start count od 0 while (! T0IF); T0IF = 0; // počinje mjeriti kapacitet punjenja RC4 = 1; // čekamo da se kapacitet napuni do referentnog napona dok (C1OUT) {timerCount = TMR0; if (T0IF) {overflowCount ++; T0IF = 0; }} count = (256 * overflowCount) + timerCount; // resetiranje timerCount timerCount = 0; overflowCount = 0; count return; }

int isTouching (int tolerancija) {

// prosjek više uzoraka dvostruki prosjek = 0; za (int i = 0; i calibrationValue+tolerancija) prosjek ++; } prosjek /= TOUCH_SAMPLE; // prosjek će biti broj između 0 i 1 ako (prosjek> 0,2) vrati 1; return 0; }

void calibrate () {

int prosjek = 0; int uzorci [CALIBRATION_SAMPLE]; // dobivamo prosječnu vrijednost za (int i = 0; i <CALIBRATION_SAMPLE; i ++) {uzorci = getChargeTime (); prosjek += uzorci ; } prosjek /= CALIBRATION_SAMPLE; calibrationValue = prosjek; // dobivamo max/min vrijednosti maxCalibrationValue = uzorci [0]; minCalibrationValue = uzorci [0]; za (int i = 0; i maxCalibrationValue) maxCalibrationValue = uzorci ; if (uzorci <minCalibrationValue) minCalibrationValue = uzorci ; }}

void setupCapacitiveTouch () {

// postavljanje pina za punjenje/pražnjenje kao izlaza, u ovom slučaju to je RC4 TRISCbits. TRISC4 = 0; // postavljanje tajmera0 T0CS = 0; PSA = 1; // postavljanje komparatora C1CH0 = 0; C1CH1 = 0; C1R = 0; C1ON = 1; C1POL = 0; // brisanje vrijednosti računa count = 0; // brisanje kalibracijskih vrijednosti calibrationValue = 0; maxCalibrationValue = 0; minCalibrationValue = 0; // pokreni kalibraciju pri pokretanju calibrate (); }

Korak 3: Pisanje glavnog koda

Počevši od glavnog koda, morat ćete uključiti datoteku zaglavlja stvorenu u prethodnom koraku. Sljedeći kôd je primjer kako možete koristiti funkciju isTouching kao prekidač. U mom slučaju zaglavlju sam dao naziv capacitiveTouch.h.

#include

#include "capacitiveTouch.h"

// ova varijabla govori je li dugme već pritisnuto ili nije

int lastState = 0;

void main () {

// postavljanje RC5 kao izlaznog TRISCbits. TRISC5 = 0; // morate pozvati ovu funkciju pri pokretanju programa setupCapacitiveTouch (); _delay_ms (1000); // kalibrirati nakon vašeg tačnog postavljanja calibrate (); while (1) {// provjerava se pritiska li se dugme if (isTouching (15) && lastState == 0) {if (RC5) RC5 = 0; drugo RC5 = 1; lastState = 1; } // provjeravamo otpuštamo li gumb else if (lastState == 1 &&! isTouching (15)) lastState = 0; _odgoda_ms (20); }}

kalibrirati:

Kada se ova funkcija pozove varijable calibrationValue, maxCalibrationValue i minCalibrationValue će biti ažurirane. calibrationValue koristi isTouching funkcija. Imajte na umu da dodirnu ploču treba ostaviti na miru tijekom kalibracije.

setupCapacitiveTouch:

Potrebno je pozvati na početku vašeg programa. Postavlja potrebne bitove koje koriste druge funkcije. Pokreće i kalibraciju. Međutim, ja sam postigao bolje rezultate tako što sam čekao sekundu i ponovo izvršio kalibraciju zasebno.

isTouching:

Ova funkcija vraća 1 ako detektira povećanje kapaciteta na C12IN0 i vraća 0 ako je kapacitet blizu onog koji je bio tijekom kalibracije. Jednostavno rečeno, ako netko dodirne jastučić, funkcija isTouching će se vratiti 1. Funkcija također želi parametar kao ulaz, to je tolerancija za aktiviranje. Što je veća tolerancija, to postaje manje osjetljiva. U mojim postavkama otkrio sam da 15 radi dobro, ali budući da to ovisi o frekvenciji oscilatora i kolikom se kapacitetu dodaje kad ga pritisnete, trebali biste eksperimentirati s ovom vrijednošću dok ne pronađete nešto što vam odgovara.

getChargeTime:

Ako želite znati koliko će vremena trebati da se kapacitet napuni na CVREF napon, ova funkcija će ga testirati i vratiti cijeli broj. Da biste dobili vrijeme u sekundama koristite ovu formulu: (4 * getChargeTime) / oscillatorFrequency = chargeTimeInSeconds Ova formula se također može koristiti za unos tolerancije iz funkcije isTouching u sekunde.

Preporučuje se: