Tartalomjegyzék:

Kapacitív érintés a PIC16F886 mikrokontrollerrel: 3 lépés
Kapacitív érintés a PIC16F886 mikrokontrollerrel: 3 lépés

Videó: Kapacitív érintés a PIC16F886 mikrokontrollerrel: 3 lépés

Videó: Kapacitív érintés a PIC16F886 mikrokontrollerrel: 3 lépés
Videó: Mobilarena TV: Hallatja a hangját 2024, Július
Anonim
Kapacitív érintés a PIC16F886 mikrokontrollerrel
Kapacitív érintés a PIC16F886 mikrokontrollerrel

Ebben az oktatóanyagban áttekintjük, hogyan használhatja a PIC16F886 mikrokontrollert a kapacitásbeli különbségek észlelésére, ez később arra szolgál, hogy megmondja, ha megnyomják az érintőpadot. Jó, ha ismerjük a pic mikrokontrollereket a projekt elkészítése előtt.

1. lépés: Csatlakoztassa az áramkört

Csatlakoztassa az áramkört
Csatlakoztassa az áramkört

Először is kezdjük az áramkör bekötésével a fenti vázlat szerint. Az érintőpárna elkészítéséhez négyzetre hajtogathatja az alumínium fóliát, és ragaszthatja a drótra. Kísérletezhet a 100k ellenállás különböző értékeivel, azt találtam, hogy a 100k jól működik nekem.

Az RC4 tüske a mérni kívánt kapacitás töltésének/kisütésének megkezdésére szolgál. A C12IN0 egy belső komparátor oldalához, a C1IN csap pedig ugyanazon összehasonlító + oldalához van csatlakoztatva. A mikrokontroller úgy látja, hogy a kapacitás teljesen fel van töltve, amikor a C12IN0 feszültség eléri a C1IN feszültséget. Az ellenállásos feszültségosztó gondoskodik arról, hogy a C1IN közel 5 volt legyen.

Mivel az érintőpad attól függ, hogy jelentős kapacitás van -e köztetek és az áramkör között, lehetséges, hogy az akkumulátor nem működik.

2. lépés: A fejlécfájl

A fejléc fájl
A fejléc fájl

Befejezte az összes csatlakozást? Jó, folytatjuk a fejlécfájlt. Az XC8 fordítót fogjuk használni, és amint a cím is sugallja, most létre kell hoznia egy új fejlécfájlt a projektben, és másolja be a következő kódot. Ugyanilyen jól másolhatja be a fő kód fölé fejlécfájl nélkül.

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

int gróf;

int calibrationValue, maxCalibrationValue, minCalibrationValue;

int getChargeTime () {

int timerCount = 0; int overflowCount = 0; // mérni kívánt kisülési kapacitás RC4 = 0; _ késleltetés (DISCHARGE_TIME); // adjon elegendő késleltetést a "kondenzátor" teljes (szinte teljes) kisütéséhez // // törölje az időzítő túlcsordulási jelzőjét T0IF = 0; // várja meg, hogy az időzítő túlcsorduljon, kezdje a számlálást 0 -ról, miközben (! T0IF); T0IF = 0; // mérni kell a töltés kapacitását RC4 = 1; // várja meg, amíg a kapacitás feltöltődik a referance feszültségig, miközben (C1OUT) {timerCount = TMR0; if (T0IF) {overflowCount ++; T0IF = 0; }} count = (256 * overflowCount) + timerCount; // reset timerCount timerCount = 0; overflowCount = 0; visszatérési szám; }

int isTouching (int tolerancia) {

// több minta átlaga dupla átlag = 0; (int i = 0; i calibrationValue+tolerancia) esetén átlag ++; } átlagos /= TOUCH_SAMPLE; // az átlag 0 és 1 közötti szám lesz, ha (átlag> 0,2) return 1; visszatérés 0; }

void calibrate () {

int átlag = 0; int minták [CALIBRATION_SAMPLE]; // átlagos érték lekérése (int i = 0; i <CALIBRATION_SAMPLE; i ++) {minták = getChargeTime (); átlag += minták ; } átlagos /= CALIBRATION_SAMPLE; calibrationValue = átlagos; // max/min értékek beszerzése maxCalibrationValue = minták [0]; minCalibrationValue = minták [0]; for (int i = 0; i maxCalibrationValue) maxCalibrationValue = minták ; if (minták <minCalibrationValue) minCalibrationValue = minták ; }}

void setupCapacitiveTouch () {

// töltés/kisütés csap beállítása kimenetként, ebben az esetben ez RC4 TRISCbits. TRISC4 = 0; // időzítő beállítása0 T0CS = 0; PSA = 1; // összehasonlító beállítása C1CH0 = 0; C1CH1 = 0; C1R = 0; C1ON = 1; C1POL = 0; // számolási értékek törlése count = 0; // kalibrálási értékek törlése calibrationValue = 0; maxCalibrationValue = 0; minCalibrationValue = 0; // futtassa a kalibrálást a kalibrálás indításakor (); }

3. lépés: A fő kód írása

A fő kódtól kezdve bele kell foglalnia az előző lépésben létrehozott fejlécfájlt. A következő kód egy példa arra, hogyan használhatja az isTouching funkciót kapcsolóként. Esetemben a fejlécnek a capacitiveTouch.h nevet adtam.

#befoglalni

#include "capacitiveTouch.h"

// ez a változó azt jelzi, hogy a gomb már le van -e nyomva

int lastState = 0;

void main () {

// az RC5 beállítása kimenetként TRISCbits. TRISC5 = 0; // ezt a függvényt meg kell hívni a program beállításakorCapacitiveTouch (); _késleltetés (1000); // kalibrálás a pontos beállítás után calibrate (); while (1) {// annak ellenőrzése, hogy megnyomják -e a gombot, ha (isTouching (15) && lastState == 0) {if (RC5) RC5 = 0; különben RC5 = 1; lastState = 1; } // annak ellenőrzése, hogy a gomb felszabadul -e, ha if (lastState == 1 &&! isTouching (15)) lastState = 0; _ késleltetés_ms (20); }}

kalibrálás:

Amikor ezt a függvényt meghívják, a calibrationValue, a maxCalibrationValue és a minCalibrationValue változók frissülnek. A calibrationValue értéket az isTouching függvény használja. Ne feledje, hogy az érintőpadot egyedül kell hagyni a kalibrálás során.

setupCapacitiveTouch:

Hívni kell a program elején. Beállítja a többi bit által használt szükséges biteket. Kallibrációt is futtat. Mindazonáltal jobb eredményeket értem el, ha vártam egy másodpercet, és külön elvégeztem a kalibrálást.

isTouching:

Ez a függvény 1 -et ad vissza, ha a C12IN0 kapacitásának növekedését észleli, és 0 -t ad vissza, ha a kapacitás közel van ahhoz, ami a kalibrálás során volt. Egyszerűen fogalmazva, ha valaki megérinti a padot, az isTouching függvény 1 -et ad vissza. A függvény paramétert is szeretne bemenetként megadni, ez a tűréshatár, hogy aktiválódjon. Minél magasabb a tolerancia értéke, annál kevésbé érzékeny. A beállításomban azt találtam, hogy 15 jól működött, de mivel ez az ocsilátor frekvenciájától és attól függ, hogy mekkora kapacitást ad hozzá, amikor megnyomja, kísérletezzen ezzel az értékkel, amíg meg nem találja az Önnek megfelelőt.

getChargeTime:

Ha szeretné tudni, hogy mennyi idő alatt tölti fel a kapacitást a CVREF feszültségre, ez a funkció teszteli, és visszaad egy egész számot. Az idő másodpercben történő lekéréséhez használja ezt a képletet: (4 * getChargeTime) / oscillatorFrequency = chargeTimeInSeconds Ez a képlet arra is használható, hogy az isTouching függvényből másodpercekre írja le a toleranciabemenetet.

Ajánlott: