Kazalo:

Kapacitivni dotik z mikrokontrolerjem PIC16F886: 3 koraki
Kapacitivni dotik z mikrokontrolerjem PIC16F886: 3 koraki

Video: Kapacitivni dotik z mikrokontrolerjem PIC16F886: 3 koraki

Video: Kapacitivni dotik z mikrokontrolerjem PIC16F886: 3 koraki
Video: Sony FDR-AX33 против FDR-AX53 против FDR-AX100 Что выбрать? 4k UltraHD Выбор! 2024, Julij
Anonim
Kapacitivni na dotik z mikrokontrolerjem PIC16F886
Kapacitivni na dotik z mikrokontrolerjem PIC16F886

V tej vadnici bomo preučili, kako lahko z mikrokrmilnikom PIC16F886 zaznate razlike v kapacitivnosti, kar lahko kasneje uporabite za ugotavljanje, ali je pritisnjena sledilna ploščica. Dobro je, da se pred izdelavo tega projekta seznanite z mikrokrmilniki pic.

1. korak: Povežite vezje

Ožičite svoje vezje
Ožičite svoje vezje

Najprej začnimo z ožičenjem vezja po zgornji shemi. Za izdelavo sledilne ploščice lahko aluminijasto folijo zložite v kvadrat in nalepite trak na žico. Lahko poskusite z različnimi vrednostmi za 100k upor. Ugotovil sem, da mi 100k dobro deluje.

Pin RC4 se uporablja za začetek polnjenja/praznjenja kapacitivnosti, ki jo je treba izmeriti. C12IN0 je priključen na - stran notranjega primerjalnika, pin C1IN pa na + stran istega primerjalnika. Mikrokrmilnik vidi, da je kapacitivnost popolnoma napolnjena, ko napetost C12IN0 doseže nad napetostjo C1IN. Uporni delilnik napetosti zagotavlja, da je C1IN blizu 5 voltov.

Ker je sledilna ploščica odvisna od velike kapacitivnosti med vami in maso vezja, obstaja možnost, da baterija ne bo delovala.

2. korak: Datoteka z glavo

Datoteka z glavo
Datoteka z glavo

Končali z vsemi povezavami? Dobro, nadaljevali bomo z datoteko z glavo. Uporabljali bomo prevajalnik XC8 in kot že naslov pove, boste zdaj v svojem projektu ustvarili novo datoteko z glavo in kopirali in prilepili naslednjo kodo. Prav tako ga lahko kopirate in prilepite nad glavno kodo brez datoteke z glavo.

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

število int;

int calibrationValue, maxCalibrationValue, minCalibrationValue;

int getChargeTime () {

int timerCount = 0; int overflowCount = 0; // izpraznjena kapacitivnost, ki jo je treba izmeriti RC4 = 0; _kasnenje_ms (DISCHARGE_TIME); // damo dovolj zamude, da popolnoma (skoraj v celoti dejansko) izpraznimo "kondenzator" // počistimo zastavico prelivanja časovnika T0IF = 0; // počakajte, da se časovnik preplavi, začni štetje od 0 while (! T0IF); T0IF = 0; // začnemo meriti kapaciteto polnjenja RC4 = 1; // počakamo, da se kapacitivnost napolni do referentne napetosti, medtem ko (C1OUT) {timerCount = TMR0; if (T0IF) {overflowCount ++; T0IF = 0; }} count = (256 * overflowCount) + timerCount; // ponastavitev timerCount timerCount = 0; overflowCount = 0; število vračil; }

int isTouching (int tolerance) {

// povprečje več vzorcev dvojno povprečje = 0; za (int i = 0; i calibrationValue+tolerance) povprečje ++; } povprečje /= TOUCH_SAMPLE; // povprečje bo število med 0 in 1, če (povprečje> 0,2) vrne 1; vrnitev 0; }

void calibrate () {

int povprečje = 0; int vzorci [CALIBRATION_SAMPLE]; // dobimo povprečno vrednost za (int i = 0; i <CALIBRATION_SAMPLE; i ++) {vzorcev = getChargeTime (); povprečje += vzorci ; } povprečje /= CALIBRATION_SAMPLE; calibrationValue = povprečje; // dobimo vrednosti max/min maxCalibrationValue = vzorci [0]; minCalibrationValue = vzorci [0]; za (int i = 0; i maxCalibrationValue) maxCalibrationValue = vzorci ; if (vzorci <minCalibrationValue) minCalibrationValue = vzorci ; }}

void setupCapacitiveTouch () {

// nastavitev polnilnega/praznilnega zatiča kot izhoda, v tem primeru je to RC4 TRISCbits. TRISC4 = 0; // nastavitev timer0 T0CS = 0; PSA = 1; // nastavitev primerjalnika C1CH0 = 0; C1CH1 = 0; C1R = 0; C1ON = 1; C1POL = 0; // brisanje vrednosti štetja count = 0; // brisanje kalibracijskih vrednosti calibrationValue = 0; maxCalibrationValue = 0; minCalibrationValue = 0; // zaženi umerjanje ob zagonu calibrate (); }

3. korak: Pisanje glavne kode

Začenši z glavno kodo, morate vključiti datoteko z glavo, ustvarjeno v prejšnjem koraku. Naslednja koda je primer, kako lahko funkcijo isTouching uporabite kot stikalo. V mojem primeru sem glavi dal ime capacitiveTouch.h.

#vključi

#include "kapacitiveTouch.h"

// ta spremenljivka pove, ali je gumb že pritisnjen ali še ni pritisnjen

int lastState = 0;

void main () {

// nastavitev RC5 kot izhodnega TRISCbits. TRISC5 = 0; // to funkcijo morate poklicati ob zagonu programa setupCapacitiveTouch (); _dey_ms (1000); // umerjanje po natančni nastavitvi calibrate (); while (1) {// preverjanje, ali se gumb pritisne if (isTouching (15) && lastState == 0) {if (RC5) RC5 = 0; drugače je RC5 = 1; lastState = 1; } // preverjanje, ali se gumb sprosti, če (lastState == 1 &&! isTouching (15)) lastState = 0; _kasnenje_ms (20); }}

umeriti:

Ko se ta funkcija pokliče spremenljivki calibrationValue, bo maxCalibrationValue in minCalibrationValue posodobljena. calibrationValue uporablja funkcija isTouching. Upoštevajte, da je treba sledilno ploščico med kalibracijo pustiti pri miru.

setupCapacitiveTouch:

Potrebno ga je poklicati na začetku programa. Določa potrebne bite, ki jih uporabljajo druge funkcije. Izvaja tudi kalibracijo. Vendar sem dobil boljše rezultate tako, da sem počakal sekundo in ločeno znova zagnal umerjanje.

se dotika:

Ta funkcija vrne 1, če zazna povečanje kapacitivnosti na C12IN0 in vrne 0, če je kapacitivnost blizu tiste, ki je bila med kalibracijo. Preprosto povedano, če se nekdo dotakne blazinice, se funkcija isTouching vrne 1. Funkcija želi tudi parameter kot vhod, to je toleranca, da se sproži. Višja kot je toleranca, manj občutljiva je. V moji nastavitvi sem ugotovil, da jih je 15 delovalo dobro, ker pa je to odvisno od frekvence oscilatorja in od tega, koliko kapacitivnosti dodamo, ko pritisnemo nanjo, bi morali eksperimentirati s to vrednostjo, dokler ne najdete nekaj, kar vam ustreza.

getChargeTime:

Če želite vedeti, koliko časa bo trajalo, da se kapacitivnost napolni na napetost CVREF, jo bo ta funkcija preizkusila in vrnila celo število. Za izračun časa v sekundah uporabite to formulo: (4 * getChargeTime) / oscillatorFrequency = chargeTimeInSeconds To formulo lahko uporabite tudi za vnos tolerance iz funkcije isTouching v sekunde.

Priporočena: