Inhoudsopgave:

Capacitieve Touch met PIC16F886 Microcontroller - Ajarnpa
Capacitieve Touch met PIC16F886 Microcontroller - Ajarnpa

Video: Capacitieve Touch met PIC16F886 Microcontroller - Ajarnpa

Video: Capacitieve Touch met PIC16F886 Microcontroller - Ajarnpa
Video: Innovative Printed Electronics and Integrated Capacitive Touch Sensors 2024, November
Anonim
Capacitieve aanraking met PIC16F886-microcontroller
Capacitieve aanraking met PIC16F886-microcontroller

In deze tutorial zullen we bespreken hoe je een PIC16F886-microcontroller kunt gebruiken om verschillen in capaciteit te detecteren, dit kan later worden gebruikt om te zien of een touchpad wordt ingedrukt. Het is goed om bekend te zijn met pic-microcontrollers voordat u dit project maakt.

Stap 1: Sluit uw circuit aan

Sluit uw circuit aan
Sluit uw circuit aan

Laten we eerst beginnen met de bedrading van het circuit volgens het bovenstaande schema. Om het touchpad te maken, kun je aluminiumfolie tot een vierkant vouwen en op een draad plakken. Je kunt experimenteren met verschillende waarden voor de 100k-weerstand, ik vond dat 100k goed werkte voor mij.

De RC4-pin wordt gebruikt om het laden/ontladen van de te meten capaciteit te starten. C12IN0 is verbonden met de - kant van een interne comparator en de C1IN-pin is verbonden met de + kant van dezelfde comparator. De microcontroller ziet de capaciteit als volledig opgeladen wanneer de C12IN0-spanning boven de C1IN-spanning komt. De resistieve spanningsdeler zorgt ervoor dat C1IN bijna 5 volt is.

Aangezien het touchpad afhankelijk is van een aanzienlijke capaciteit tussen u en de aarding van het circuit, bestaat de mogelijkheid dat een batterij niet werkt.

Stap 2: Het kopbestand

Het kopbestand
Het kopbestand

Klaar met alle aansluitingen? Goed, we gaan verder met het headerbestand. We zullen de XC8-compiler gebruiken en zoals de titel al doet vermoeden, maakt u nu een nieuw headerbestand in uw project en kopieert en plakt u de volgende code. Je kunt het net zo goed boven je hoofdcode kopiëren en plakken zonder een headerbestand.

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

int tellen;

int kalibratiewaarde, max kalibratiewaarde, min kalibratiewaarde;

int getChargeTime(){

int timerCount = 0; int overflowCount = 0; // te meten ontlaadcapaciteit RC4 = 0; _delay_ms(DISCHARGE_TIME); // geef voldoende vertraging om de "condensator" volledig (bijna volledig) te ontladen // wis de timeroverloopvlag T0IF = 0; // wacht tot de timer overloopt, begin met tellen vanaf 0 while (!T0IF); T0IF = 0; // start laadcapaciteit te meten RC4 = 1; // wacht tot de capaciteit is opgeladen tot de referentiespanning while (C1OUT) {timerCount = TMR0; if(T0IF){ overflowCount++; T0IF = 0; } } count = (256 * overflowCount) + timerCount; // reset timerCount timerCount = 0; overflowCount = 0; terugtelling; }

int isTouching(int tolerantie){

//gemiddelde van meerdere steekproeven dubbel gemiddelde = 0; for(int i = 0; i kalibratieWaarde + tolerantie) gemiddeld++; } gemiddeld /= TOUCH_SAMPLE; //gemiddelde is een getal tussen 0 en 1 als (gemiddeld > 0,2) retourneert 1; retourneer 0; }

ongeldig kalibreren(){

int gemiddelde = 0; int-voorbeelden [CALIBRATION_SAMPLE]; // haal gemiddelde waarde voor (int i = 0; i <CALIBRATION_SAMPLE; i++) {samples = getChargeTime (); gemiddelde += steekproeven; } gemiddelde /= CALIBRATION_SAMPLE; kalibratieWaarde = gemiddelde; // haal max/min-waarden maxCalibrationValue = samples [0]; minCalibrationValue = monsters [0]; for(int i = 0; i maxCalibrationValue) maxCalibrationValue = samples; if(samples < minCalibrationValue) minCalibrationValue = samples; } }

ongeldige setupCapacitiveTouch(){

// laad- / ontlaadpin instellen als uitvoer, in dit geval is het RC4 TRISCbits. TRISC4 = 0; // timer instellen0 T0CS = 0; PSA = 1; // comparator instellen C1CH0 = 0; C1CH1 = 0; C1R = 0; C1ON = 1; C1POL = 0; // telwaarden wissen tellen = 0; // kalibratiewaarden wissen kalibratiewaarde = 0; maxCalibrationValue = 0; minCalibrationValue = 0; // voer kalibratie uit bij start kalibreren (); }

Stap 3: De hoofdcode schrijven

Beginnend met de hoofdcode, moet u het headerbestand opnemen dat in de vorige stap is gemaakt. De volgende code is een voorbeeld van hoe u de isTouching-functie als schakelaar kunt gebruiken. In mijn geval heb ik de header de naam capacitiveTouch.h gegeven.

#erbij betrekken

#include "capacitiveTouch.h"

// deze variabele vertelt of de knop al dan niet is ingedrukt

int lastState = 0;

ongeldig hoofd(){

// RC5 instellen als uitvoer TRISCbits. TRISC5 = 0; // je moet deze functie oproepen bij het starten van het programma setupCapacitiveTouch(); _delay_ms(1000); //kalibreren na uw exacte setup calibrate(); while(1){ //controleren of de knop wordt ingedrukt if(isTouching(15) && lastState == 0){ if(RC5) RC5 = 0; anders RC5 = 1; laatsteStaat = 1; } //controleren of de knop wordt losgelaten else if(lastState == 1 && !isTouching(15)) lastState = 0; _delay_ms(20); } }

ijken:

Wanneer deze functie de variabelen CalibrationValue wordt aangeroepen, worden maxCalibrationValue en minCalibrationValue bijgewerkt. CalibrationValue wordt gebruikt door de isTouching-functie. Houd er rekening mee dat het touchpad tijdens de kalibratie met rust moet worden gelaten.

setupCapacitiveTouch:

Moet aan het begin van uw programma worden opgeroepen. Het stelt de benodigde bits in die door de andere functies worden gebruikt. Het voert ook een kalibratie uit. Ik kreeg echter betere resultaten door even te wachten en de kalibratie afzonderlijk opnieuw uit te voeren.

isAanraken:

Deze functie retourneert 1 als het een toename in capaciteit op de C12IN0 detecteert en retourneert 0 als de capaciteit dicht bij de capaciteit ligt die het was tijdens de kalibratie. Simpel gezegd, als iemand de pad aanraakt, zal de functie isTouching 1 teruggeven. De functie wil ook een parameter als invoer, dit is de tolerantie om deze te activeren. Hoe hoger de tolerantiewaarde, hoe minder gevoelig het wordt. In mijn opstelling vond ik 15 goed werken, maar omdat dit afhangt van de oscillatorfrequentie en hoeveel capaciteit wordt toegevoegd wanneer je erop drukt, moet je met deze waarde experimenteren totdat je iets vindt dat voor jou werkt.

getChargeTime:

Als u wilt weten hoe lang het zou duren om de capaciteit op te laden tot de CVREF-spanning, zal deze functie deze testen en een geheel getal retourneren. Om de tijd in seconden te krijgen, gebruikt u deze formule: (4 * getChargeTime) / oscillatorFrequency = chargeTimeInSeconds Deze formule kan ook worden gebruikt om de tolerantie-invoer van de isTouching-functie naar seconden te krijgen.

Aanbevolen: