Indholdsfortegnelse:

Kapacitiv berøring med PIC16F886 mikrokontroller: 3 trin
Kapacitiv berøring med PIC16F886 mikrokontroller: 3 trin

Video: Kapacitiv berøring med PIC16F886 mikrokontroller: 3 trin

Video: Kapacitiv berøring med PIC16F886 mikrokontroller: 3 trin
Video: Распаковка и обзор LeEco Pro 3 X650 Ai Helio X27 (спецификация, фото и видео камера, оценка Antutu) 2024, November
Anonim
Kapacitiv berøring med PIC16F886 mikrokontroller
Kapacitiv berøring med PIC16F886 mikrokontroller

I denne vejledning vil vi gå over, hvordan du kan bruge en PIC16F886 mikrokontroller til at registrere forskelle i kapacitans, dette kan senere bruges til at fortælle, om der trykkes på en berøringsplade. Det er godt at være fortrolig med pic -mikrokontrollere, før du laver dette projekt.

Trin 1: Tilslut dit kredsløb

Forbind dit kredsløb
Forbind dit kredsløb

Lad os først starte med at tilslutte kredsløbet ifølge skematikken ovenfor. For at lave berøringspladen kan du folde aluminiumsfolie til en firkant og tape på en wire. Du kan eksperimentere med forskellige værdier for 100k modstanden, jeg fandt 100k fungerede godt for mig.

RC4 -stiften bruges til at starte opladning/afladning af den kapacitans, der skal måles. C12IN0 er forbundet til - siden af en intern komparator, og C1IN -stiften er forbundet til + siden af den samme komparator. Mikrocontrolleren ser kapacitansen som fuldt opladet, når C12IN0 -spændingen når over C1IN -spændingen. Den resistive spændingsdeler sørger for, at C1IN er tæt på 5 volt.

Da berøringspladen afhænger af, at der er en betydelig kapacitans mellem dig og kredsløbets jord, er der en mulighed for, at et batteri muligvis ikke fungerer.

Trin 2: Hovedfilen

Hovedfilen
Hovedfilen

Færdig med alle forbindelser? Godt, vi fortsætter med header -filen. Vi vil bruge XC8-kompilatoren, og som titlen antyder, skal du nu oprette en ny header-fil i dit projekt og kopiere og indsætte følgende kode. Du kan lige så godt kopiere og indsætte den over din hovedkode uden nogen headerfil.

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

int tæller;

int calibrationValue, maxCalibrationValue, minCalibrationValue;

int getChargeTime () {

int timerCount = 0; int overflowCount = 0; // afladningskapacitans, der skal måles RC4 = 0; _forsinkelse_ms (DISCHARGE_TIME); // give tilstrækkelig forsinkelse til helt (næsten fuldstændigt faktisk) at aflade "kondensatoren" // rydde timeroverløbsflagget T0IF = 0; // vent på, at timeren løber over, start tællingen fra 0, mens (! T0IF); T0IF = 0; // start opladningskapacitans, der skal måles RC4 = 1; // vent på, at kapacitansen oplades op til referencespændingen, mens (C1OUT) {timerCount = TMR0; hvis (T0IF) {overflowCount ++; T0IF = 0; }} count = (256 * overflowCount) + timerCount; // reset timerCount timerCount = 0; overflowCount = 0; return tæller; }

int isTouching (int tolerance) {

// gennemsnit af flere prøver dobbelt gennemsnit = 0; for (int i = 0; i calibrationValue+tolerance) gennemsnit ++; } gennemsnit /= TOUCH_SAMPLE; // gennemsnit vil være et tal mellem 0 og 1, hvis (gennemsnit> 0,2) returnerer 1; returnere 0; }

void kalibrer () {

int gennemsnit = 0; int prøver [CALIBRATION_SAMPLE]; // få gennemsnitsværdi for (int i = 0; i <CALIBRATION_SAMPLE; i ++) {samples = getChargeTime (); gennemsnit += prøver ; } gennemsnit /= CALIBRATION_SAMPLE; kalibreringsværdi = gennemsnit; // få max/min værdier maxCalibrationValue = samples [0]; minCalibrationValue = prøver [0]; for (int i = 0; i maxCalibrationValue) maxCalibrationValue = prøver ; hvis (prøver <minCalibrationValue) minCalibrationValue = prøver ; }}

void setupCapacitiveTouch () {

// indstilling af opladnings-/afladningsstift som output, i dette tilfælde er det RC4 TRISCbits. TRISC4 = 0; // opsætning af timer0 T0CS = 0; PSA = 1; // opsætning af komparator C1CH0 = 0; ClCH1 = 0; C1R = 0; C1ON = 1; C1POL = 0; // clearing count værdier count = 0; // sletning af kalibreringsværdier calibrationValue = 0; maxCalibrationValue = 0; minCalibrationValue = 0; // køre kalibrering ved start kalibrere (); }

Trin 3: Skrivning af hovedkoden

Fra og med hovedkoden skal du inkludere overskriftsfilen, der blev oprettet i det foregående trin. Den følgende kode er et eksempel på, hvordan du kan bruge isTouching -funktionen som en switch. I mit tilfælde gav jeg overskriften navnet capacitiveTouch.h.

#omfatte

#include "capacitiveTouch.h"

// denne variabel fortæller, om der er trykket på knappen eller ikke allerede

int lastState = 0;

void main () {

// indstilling af RC5 som output TRISCbits. TRISC5 = 0; // du skal kalde denne funktion op ved starten af programmet setupCapacitiveTouch (); _forsinkelse_ms (1000); // kalibrer efter din nøjagtige opsætning kalibrer (); mens (1) {// tjekker, om der trykkes på knappen, hvis (isTouching (15) && lastState == 0) {if (RC5) RC5 = 0; ellers RC5 = 1; lastState = 1; } // kontrollere, om knappen frigives, hvis (lastState == 1 &&! isTouching (15)) lastState = 0; _forsinkelse_ms (20); }}

kalibrer:

Når denne funktion kaldes variablerne calibrationValue, opdateres maxCalibrationValue og minCalibrationValue. calibrationValue bruges af isTouching -funktionen. Husk, at pegefeltet skal stå alene under kalibreringen.

setupCapacitiveTouch:

Skal kaldes i starten af dit program. Det opsætter de nødvendige bits, der bruges af de andre funktioner. Det kører også en kalibrering. Jeg fik dog bedre resultater ved at vente et sekund og køre kalibreringen igen separat.

isTouching:

Denne funktion returnerer 1, hvis den registrerer en stigning i kapacitans på C12IN0 og returnerer 0, hvis kapacitansen er tæt på den, den var under kalibreringen. Simpelthen sagt, hvis nogen rører puden, returnerer isTouching -funktionen 1. Funktionen vil også have en parameter som input, det er tolerancen for den til at udløse. Jo højere toleranceværdi, jo mindre følsom bliver den. I mit setup fandt jeg 15 fungeret godt, men fordi dette afhænger af ocsillator frekvens og hvor meget kapacitans der tilføjes, når du trykker på den, bør du eksperimentere med denne værdi, indtil du finder noget, der fungerer for dig.

getChargeTime:

Når du vil vide, hvor lang tid det vil tage at oplade kapacitansen til CVREF -spændingen, tester denne funktion det og returnerer et helt tal. For at få tiden i sekunder bruger du denne formel: (4 * getChargeTime) / oscillatorFrequency = chargeTimeInSeconds Denne formel kan også bruges til at få toleranceindtastningen fra isTouching -funktionen til sekunder.

Anbefalede: