Innholdsfortegnelse:

Kapasitiv berøring med PIC16F886 mikrokontroller: 3 trinn
Kapasitiv berøring med PIC16F886 mikrokontroller: 3 trinn

Video: Kapasitiv berøring med PIC16F886 mikrokontroller: 3 trinn

Video: Kapasitiv berøring med PIC16F886 mikrokontroller: 3 trinn
Video: Introduction to M5Stack Core2 ESP32 2" Display Development Module -Robojax 2024, Juli
Anonim
Kapasitiv berøring med PIC16F886 mikrokontroller
Kapasitiv berøring med PIC16F886 mikrokontroller

I denne opplæringen vil vi gå over hvordan du kan bruke en PIC16F886 mikrokontroller for å oppdage forskjeller i kapasitans, dette kan senere brukes til å fortelle om en berøringsplate trykkes ned. Det er godt å bli kjent med pic -mikrokontrollere før du gjør dette prosjektet.

Trinn 1: Koble opp kretsen din

Koble opp kretsen din
Koble opp kretsen din

La oss først starte med å koble opp kretsen i henhold til skjemaet ovenfor. For å lage berøringsplaten kan du brette aluminiumsfolie til en firkant og tape på en wire. Du kan eksperimentere med forskjellige verdier for 100k -motstanden, jeg fant 100k som fungerte bra for meg.

RC4 -pinnen brukes til å begynne å lade/tømme kapasitansen som skal måles. C12IN0 er koblet til - siden av en intern komparator, og C1IN - pinnen er koblet til + - siden av den samme komparatoren. Mikrokontrolleren ser på kapasitansen som fulladet når C12IN0 -spenningen når over C1IN -spenningen. Den resistive spenningsdeleren sørger for at C1IN er nær 5 volt.

Siden styreplaten er avhengig av at det er en betydelig kapasitans mellom deg og kretsjorda, er det en mulighet for at et batteri ikke fungerer.

Trinn 2: Overskriftsfilen

Hovedfilen
Hovedfilen

Ferdig med alle tilkoblinger? Bra, vi fortsetter med toppteksten. Vi skal bruke XC8-kompilatoren, og som tittelen antyder, skal du nå opprette en ny toppfil i prosjektet og kopiere og lime inn følgende kode. Du kan like godt kopiere og lime den inn over hovedkoden din uten noen overskriftsfil.

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

int telle;

int calibrationValue, maxCalibrationValue, minCalibrationValue;

int getChargeTime () {

int timerCount = 0; int overflowCount = 0; // utladningskapasitans som skal måles RC4 = 0; _forsinkelse_ms (DISCHARGE_TIME); // gi nok forsinkelse til å fullstendig (nesten helt faktisk) tømme "kondensatoren" // tømme tidtakeroverløpsflagget T0IF = 0; // vent på at timeren overløper, begynn tellingen fra 0 mens (! T0IF); T0IF = 0; // start ladekapasitansen som skal måles RC4 = 1; // vent på at kapasitansen lades opp til referansespenningen mens (C1OUT) {timerCount = TMR0; hvis (T0IF) {overflowCount ++; T0IF = 0; }} count = (256 * overflowCount) + timerCount; // reset timerCount timerCount = 0; overflowCount = 0; returantall; }

int isTouching (int toleranse) {

// gjennomsnitt av flere prøver dobbelt gjennomsnitt = 0; for (int i = 0; i calibrationValue+tolerance) gjennomsnitt ++; } gjennomsnitt /= TOUCH_SAMPLE; // gjennomsnitt vil være et tall mellom 0 og 1 hvis (gjennomsnitt> 0,2) returnerer 1; retur 0; }

ugyldig kalibrer () {

int gjennomsnitt = 0; int prøver [CALIBRATION_SAMPLE]; // få gjennomsnittlig verdi for (int i = 0; i <CALIBRATION_SAMPLE; i ++) {samples = getChargeTime (); gjennomsnittlig += prøver ; } gjennomsnitt /= CALIBRATION_SAMPLE; calibrationValue = gjennomsnittlig; // få max/min verdier 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 () {

// angi lade-/utladningspinne som utgang, i dette tilfellet er det RC4 TRISCbits. TRISC4 = 0; // sette opp timer0 T0CS = 0; PSA = 1; // sette opp komparator C1CH0 = 0; ClCH1 = 0; C1R = 0; C1ON = 1; C1POL = 0; // telle telleverdier telle = 0; // slette kalibreringsverdier calibrationValue = 0; maxCalibrationValue = 0; minCalibrationValue = 0; // kjøre kalibrering ved start kalibrere (); }

Trinn 3: Skrive hovedkoden

Fra og med hovedkoden må du inkludere toppfilen som ble opprettet i forrige trinn. Følgende kode er et eksempel på hvordan du kan bruke isTouching -funksjonen som en bryter. I mitt tilfelle ga jeg overskriften navnet capacitiveTouch.h.

#inkludere

#include "capacitiveTouch.h"

// denne variabelen forteller om knappen er trykket eller ikke allerede

int lastState = 0;

void main () {

// sette RC5 som utgang TRISCbits. TRISC5 = 0; // du må ringe denne funksjonen ved starten av programmet setupCapacitiveTouch (); _forsinkelse_ms (1000); // kalibrer etter det nøyaktige oppsettet kalibrer (); mens (1) {// sjekker om knappen blir trykket hvis (isTouching (15) && lastState == 0) {if (RC5) RC5 = 0; annet RC5 = 1; lastState = 1; } // sjekke om knappen slippes, ellers hvis (lastState == 1 &&! isTouching (15)) lastState = 0; _forsinkelse_ms (20); }}

kalibrere:

Når denne funksjonen kalles variablene calibrationValue, oppdateres maxCalibrationValue og minCalibrationValue. calibrationValue brukes av isTouching -funksjonen. Husk at berøringsputen skal stå alene under kalibreringen.

setupCapacitiveTouch:

Må ringes opp i begynnelsen av programmet. Den setter opp de nødvendige bitene som brukes av de andre funksjonene. Den kjører også en kalibrering. Imidlertid fikk jeg bedre resultater ved å vente et sekund og kjøre kalibreringen igjen separat.

isTouching:

Denne funksjonen returnerer 1 hvis den oppdager en økning i kapasitans på C12IN0 og returnerer 0 hvis kapasitansen er nær den den var under kalibreringen. Enkelt sagt, hvis noen berører puten, vil isTouching -funksjonen returnere 1. Funksjonen vil også ha en parameter som inngang, dette er toleransen for den å utløse. Jo høyere toleranseverdi, jo mindre sensitiv blir den. I oppsettet mitt fant jeg ut at 15 fungerte bra, men fordi dette avhenger av ocsillatorfrekvensen og hvor mye kapasitans som tilføres når du trykker på den, bør du eksperimentere med denne verdien til du finner noe som fungerer for deg.

getChargeTime:

Når du vil vite hvor lang tid det vil ta å lade opp kapasitansen til CVREF -spenningen, vil denne funksjonen teste den og returnere et helt tall. For å få tiden i sekunder bruker du denne formelen: (4 * getChargeTime) / oscillatorFrequency = chargeTimeInSeconds Denne formelen kan også brukes til å få toleranseinngangen fra isTouching -funksjonen til sekunder.

Anbefalt: