Sadržaj:

Kapacitivni dodir s mikrokontrolerom PIC16F886: 3 koraka
Kapacitivni dodir s mikrokontrolerom PIC16F886: 3 koraka

Video: Kapacitivni dodir s mikrokontrolerom PIC16F886: 3 koraka

Video: Kapacitivni dodir s mikrokontrolerom PIC16F886: 3 koraka
Video: Настройки панели управления холодильником Haier и работа ее частей 2024, Srpanj
Anonim
Kapacitivni dodir s mikrokontrolerom PIC16F886
Kapacitivni dodir s mikrokontrolerom PIC16F886

U ovom ćemo vodiču proučiti kako možete koristiti mikrokontroler PIC16F886 za otkrivanje razlika u kapacitivnosti, što se kasnije može koristiti za utvrđivanje pritiska li se dodirna podloga. Prije izrade ovog projekta dobro je biti upoznat sa mikrokontrolerima za slike.

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 presaviti aluminijsku foliju u kvadrat i zalijepiti traku na žicu. Možete eksperimentirati s različitim vrijednostima za 100k otpornik, otkrio sam da mi 100k radi dobro.

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

Budući da dodirna ploča ovisi o značajnom kapacitetu između vas i uzemljenog kruga, postoji mogućnost da baterija ne radi.

Korak 2: Datoteka zaglavlja

Datoteka zaglavlja
Datoteka zaglavlja

Završili sa svim vezama? Dobro, nastavit ćemo s datotekom zaglavlja. Koristit ćemo kompajler XC8 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 broj;

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; // čekamo da se mjerač prelije, start count od 0 while (! T0IF); T0IF = 0; // početi 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; broj povratka; }

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]; // dobiti prosječnu vrijednost za (int i = 0; i <CALIBRATION_SAMPLE; i ++) {uzorci = getChargeTime (); prosjek += uzorci ; } prosjek /= CALIBRATION_SAMPLE; calibrationValue = prosjek; // dobiti 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 timera0 T0CS = 0; PSA = 1; // postavljanje usporednika C1CH0 = 0; C1CH1 = 0; C1R = 0; C1ON = 1; C1POL = 0; // brisanje vrijednosti brojanja 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 dao sam zaglavlju naziv capacitiveTouch.h.

#uključi

#include "capacitiveTouch.h"

// ova varijabla govori je li gumb već pritisnut ili nije

int lastState = 0;

void main () {

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

kalibrirati:

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

setupCapacitiveTouch:

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

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 do CVREF napona, ova funkcija će ga testirati i vratiti cijeli broj. Za dobivanje vremena 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čeni: