Innehållsförteckning:

Kapacitiv beröring med PIC16F886 mikrokontroller: 3 steg
Kapacitiv beröring med PIC16F886 mikrokontroller: 3 steg

Video: Kapacitiv beröring med PIC16F886 mikrokontroller: 3 steg

Video: Kapacitiv beröring med PIC16F886 mikrokontroller: 3 steg
Video: Зачем использовать резисторы с кнопками и как использовать их с Arduino 2024, Juli
Anonim
Kapacitiv beröring med PIC16F886 mikrokontroller
Kapacitiv beröring med PIC16F886 mikrokontroller

I denna handledning kommer vi att gå igenom hur du kan använda en PIC16F886 mikrokontroller för att upptäcka skillnader i kapacitans, detta kan senare användas för att berätta om en pekplatta trycks ned. Det är bra att vara bekant med bildmikrokontroller innan du gör detta projekt.

Steg 1: Koppla upp din krets

Koppla upp din krets
Koppla upp din krets

Låt oss först börja med att koppla upp kretsen enligt schemat ovan. För att göra pekplattan kan du vika aluminiumfolie till en kvadrat och tejpa på en tråd. Du kan experimentera med olika värden för 100k -motståndet, jag tyckte att 100k fungerade bra för mig.

RC4 -stiftet används för att börja ladda/ladda ur kapacitansen som ska mätas. C12IN0 är ansluten till - sidan av en intern komparator och C1IN -stiftet är anslutet till + -sidan av samma komparator. Mikrokontrollern ser kapacitansen som fulladdad när C12IN0 -spänningen når över C1IN -spänningen. Den resistiva spänningsdelaren ser till att C1IN är nära 5 volt.

Eftersom pekplattan är beroende av att det finns en betydande kapacitans mellan dig och kretsens jord finns det en möjlighet att ett batteri kanske inte fungerar.

Steg 2: Rubrikfilen

Rubrikfilen
Rubrikfilen

Klar med alla anslutningar? Bra, vi fortsätter med rubrikfilen. Vi kommer att använda XC8-kompilatorn och som titeln antyder ska du nu skapa en ny rubrikfil i ditt projekt och kopiera-klistra in följande kod. Du kan lika gärna kopiera och klistra in den ovanför din huvudkod utan huvudfil.

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

int count;

int calibrationValue, maxCalibrationValue, minCalibrationValue;

int getChargeTime () {

int timerCount = 0; int overflowCount = 0; // urladdningskapacitans som ska mätas RC4 = 0; _fördröjning_ms (DISCHARGE_TIME); // ge tillräckligt med fördröjning för att helt (nästan helt faktiskt) ladda ur "kondensatorn" // rensa timeröverflödesflaggan T0IF = 0; // vänta tills timern flödar över, börja räkna från 0 medan (! T0IF); T0IF = 0; // starta laddningskapacitansen som ska mätas RC4 = 1; // vänta på att kapacitansen laddas upp till referensspänningen medan (C1OUT) {timerCount = TMR0; if (T0IF) {overflowCount ++; T0IF = 0; }} count = (256 * overflowCount) + timerCount; // reset timerCount timerCount = 0; overflowCount = 0; returräkning; }

int isTouching (int tolerans) {

// genomsnitt av flera prover dubbel genomsnitt = 0; för (int i = 0; i calibrationValue+tolerance) genomsnitt ++; } genomsnitt /= TOUCH_SAMPLE; // genomsnittet kommer att vara ett tal mellan 0 och 1 om (genomsnitt> 0,2) returnerar 1; returnera 0; }

void kalibrera () {

int genomsnitt = 0; int -prover [CALIBRATION_SAMPLE]; // få medelvärde för (int i = 0; i <CALIBRATION_SAMPLE; i ++) {samples = getChargeTime (); genomsnitt += prover ; } genomsnitt /= CALIBRATION_SAMPLE; calibrationValue = genomsnitt; // få max/min -värden maxCalibrationValue = samples [0]; minCalibrationValue = prover [0]; för (int i = 0; i maxCalibrationValue) maxCalibrationValue = prover ; if (prover <minCalibrationValue) minCalibrationValue = prover ; }}

void setupCapacitiveTouch () {

// ställa in laddnings-/urladdningsstift som utgång, i detta fall är det RC4 TRISCbits. TRISC4 = 0; // ställa in timer0 T0CS = 0; PSA = 1; // konfigurera komparator C1CH0 = 0; ClCH1 = 0; Cl = 0; ClON = 1; ClPOL = 0; // rensa räkna värden räkna = 0; // rensa kalibreringsvärden calibrationValue = 0; maxCalibrationValue = 0; minCalibrationValue = 0; // kör kalibrering vid start kalibrera (); }

Steg 3: Skriva huvudkoden

Från och med huvudkoden måste du inkludera rubrikfilen som skapades i föregående steg. Följande kod är ett exempel på hur du kan använda isTouching -funktionen som en omkopplare. I mitt fall gav jag rubriken namnet capacitiveTouch.h.

#omfatta

#inkludera "capacitiveTouch.h"

// denna variabel berättar om knappen är eller inte redan är nedtryckt

int lastState = 0;

void main () {

// inställning av RC5 som utgång TRISCbits. TRISC5 = 0; // du måste ringa upp denna funktion vid start av programmet setupCapacitiveTouch (); _fördröjning_ms (1000); // kalibrera efter din exakta inställning kalibrera (); medan (1) {// kontrollerar om knappen trycks in om (isTouching (15) && lastState == 0) {if (RC5) RC5 = 0; annars RC5 = 1; lastState = 1; } // kontrollera om knappen släpps annars om (lastState == 1 &&! isTouching (15)) lastState = 0; _fördröjning_ms (20); }}

kalibrera:

När denna funktion kallas variablerna calibrationValue uppdateras maxCalibrationValue och minCalibrationValue. calibrationValue används av isTouching -funktionen. Tänk på att pekplattan ska lämnas ensam under kalibreringen.

setupCapacitiveTouch:

Måste ringas i början av ditt program. Det ställer in de nödvändiga bitarna som används av de andra funktionerna. Den kör också en kallibrering. Men jag fick bättre resultat genom att vänta en sekund och köra kalibreringen igen separat.

isTouching:

Denna funktion returnerar 1 om den upptäcker en ökning av kapacitansen på C12IN0 och returnerar 0 om kapacitansen är nära den den var under kalibreringen. Enkelt uttryckt, om någon rör vid plattan kommer isTouching -funktionen att returnera 1. Funktionen vill också ha en parameter som en ingång, detta är toleransen för den att utlösa. Ju högre toleransvärde desto mindre känsligt blir det. I min installation fann jag att 15 fungerade bra, men eftersom detta beror på ocsillatorfrekvens och hur mycket kapacitans som läggs till när du trycker på det bör du experimentera med detta värde tills du hittar något som fungerar för dig.

getChargeTime:

När du vill veta hur lång tid det tar att ladda upp kapacitansen till CVREF -spänningen, testar den här funktionen och returnerar ett heltal. För att få tiden i sekunder använder du denna formel: (4 * getChargeTime) / oscillatorFrequency = chargeTimeInSeconds Denna formel kan också användas för att få toleransinmatningen från isTouching -funktionen till sekunder.

Rekommenderad: