Obsah:

Kapacitní dotek s mikrokontrolérem PIC16F886: 3 kroky
Kapacitní dotek s mikrokontrolérem PIC16F886: 3 kroky

Video: Kapacitní dotek s mikrokontrolérem PIC16F886: 3 kroky

Video: Kapacitní dotek s mikrokontrolérem PIC16F886: 3 kroky
Video: CAPTRON / Dotyková kapacitní tlačítka - ukázka odolnosti / BIBUS 2024, Červenec
Anonim
Kapacitní dotek s mikrokontrolérem PIC16F886
Kapacitní dotek s mikrokontrolérem PIC16F886

V tomto tutoriálu se podíváme na to, jak můžete pomocí mikrokontroléru PIC16F886 detekovat rozdíly v kapacitě, což lze později použít k určení, zda je stisknut dotykový panel. Před vytvořením tohoto projektu je dobré se seznámit s obrazovými mikrokontroléry.

Krok 1: Zapojte obvod

Zapojte svůj obvod
Zapojte svůj obvod

Nejprve začněme zapojením obvodu podle výše uvedeného schématu. Chcete -li vytvořit dotykovou podložku, můžete skládat hliníkovou fólii do čtverce a pásku na drát. Můžete experimentovat s různými hodnotami pro odpor 100k, zjistil jsem, že 100k pro mě funguje dobře.

Kolík RC4 se používá k zahájení nabíjení/vybíjení měřené kapacity. C12IN0 je připojen na - stranu interního komparátoru a pin C1IN je připojen k + straně stejného komparátoru. Mikrokontrolér vidí kapacitu jako plně nabitou, když napětí C12IN0 dosáhne nad napětí C1IN. Odporový dělič napětí zajišťuje, že C1IN je blízko 5 voltů.

Protože dotyková podložka závisí na tom, že mezi vámi a uzemněním obvodu je významná kapacita, existuje možnost, že baterie nemusí fungovat.

Krok 2: Soubor záhlaví

Soubor záhlaví
Soubor záhlaví

Dokončili jste všechna připojení? Dobrá, budeme pokračovat v hlavičkovém souboru. Budeme používat kompilátor XC8 a jak název napovídá, nyní musíte ve svém projektu vytvořit nový soubor záhlaví a zkopírovat a vložit následující kód. Stejně dobře jej můžete zkopírovat a vložit nad svůj hlavní kód bez jakéhokoli záhlaví.

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

int count;

int calibrationValue, maxCalibrationValue, minCalibrationValue;

int getChargeTime () {

int timerCount = 0; int overflowCount = 0; // měřená vybíjecí kapacita RC4 = 0; _delay_ms (DISCHARGE_TIME); // dejte dostatečné zpoždění na úplné (téměř úplné) vybití "kondenzátoru" // vymazání příznaku přetečení časovače T0IF = 0; // počkejte na přetečení časovače, počítejte od 0 while (! T0IF); T0IF = 0; // spusťte nabíjení měřené kapacity RC4 = 1; // počkejte, až se kapacita nabije až na referenční napětí, zatímco (C1OUT) {timerCount = TMR0; if (T0IF) {overflowCount ++; T0IF = 0; }} počet = (256 * overflowCount) + timerCount; // reset timerCount timerCount = 0; overflowCount = 0; počet návratů; }

int isTouching (int tolerance) {

// průměr více vzorků dvojitý průměr = 0; pro (int i = 0; i calibrationValue+tolerance) průměr ++; } průměr /= TOUCH_SAMPLE; // průměr bude číslo mezi 0 a 1, pokud (průměr> 0,2) vrátí 1; návrat 0; }

void calibrate () {

int průměr = 0; int vzorky [CALIBRATION_SAMPLE]; // získání průměrné hodnoty pro (int i = 0; i <CALIBRATION_SAMPLE; i ++) {sample = getChargeTime (); průměr += vzorky ; } průměr /= CALIBRATION_SAMPLE; calibrationValue = průměr; // získejte hodnoty max/min maxCalibrationValue = vzorky [0]; minCalibrationValue = vzorky [0]; pro (int i = 0; i maxCalibrationValue) maxCalibrationValue = vzorky ; if (vzorky <minCalibrationValue) minCalibrationValue = vzorky ; }}

neplatné nastaveníCapacitiveTouch () {

// nastavení nabíjecího/vybíjecího pinu jako výstupu, v tomto případě je to RC4 TRISCbits. TRISC4 = 0; // nastavení časovače0 T0CS = 0; PSA = 1; // nastavení komparátoru C1CH0 = 0; C1CH1 = 0; C1R = 0; C1ON = 1; C1POL = 0; // vymazání hodnot count count = 0; // vymazání hodnot kalibrace calibrationValue = 0; maxCalibrationValue = 0; minCalibrationValue = 0; // spustit kalibraci při startu calibrate (); }

Krok 3: Napsání hlavního kódu

Počínaje hlavním kódem budete muset zahrnout soubor záhlaví vytvořený v předchozím kroku. Následující kód je příkladem toho, jak můžete použít funkci isTouching jako přepínač. V mém případě jsem dal záhlaví název kapacitníTouch.h.

#zahrnout

#include "kapacitníTouch.h"

// tato proměnná udává, zda je nebo není tlačítko již stisknuto

int lastState = 0;

void main () {

// nastavení RC5 jako výstupu TRISCbits. TRISC5 = 0; // tuto funkci musíte vyvolat při spuštění programu setupCapacitiveTouch (); _delay_ms (1000); // kalibrace po vašem přesném nastavení calibrate (); while (1) {// kontrola, zda je tlačítko stisknuto if (isTouching (15) && lastState == 0) {if (RC5) RC5 = 0; jinak RC5 = 1; lastState = 1; } // kontrola, zda se uvolňuje tlačítko else if (lastState == 1 &&! isTouching (15)) lastState = 0; _delay_ms (20); }}

kalibrovat:

Když se tato funkce zavolá, budou aktualizovány proměnné calibrationValue, maxCalibrationValue a minCalibrationValue. calibrationValue používá funkce isTouching. Pamatujte, že dotykový panel by měl během kalibrace zůstat sám.

setupCapacitiveTouch:

Vyžaduje se volání na začátku vašeho programu. Nastavuje potřebné bity používané ostatními funkcemi. Spustí také kalibraci. Lepší výsledky jsem však dosáhl tak, že jsem chvíli počkal a znovu spustil kalibraci samostatně.

isTouching:

Tato funkce vrátí hodnotu 1, pokud detekuje zvýšení kapacity na C12IN0, a vrátí hodnotu 0, pokud je kapacita blízká kapacitě, která byla během kalibrace. Jednoduše řečeno, pokud se někdo dotkne podložky, funkce isTouching vrátí 1. Funkce také chce jako vstup parametr, to je tolerance, kterou může spustit. Čím vyšší je hodnota tolerance, tím méně je citlivá. V mém nastavení jsem zjistil, že 15 funguje dobře, ale protože to závisí na frekvenci ocsillatoru a na tom, kolik kapacity se přidá při jeho stisknutí, měli byste s touto hodnotou experimentovat, dokud nenajdete něco, co vám vyhovuje.

getChargeTime:

Pokud chcete vědět, jak dlouho by trvalo nabití kapacity na napětí CVREF, tato funkce ji otestuje a vrátí celé číslo. Chcete -li získat čas v sekundách, použijte tento vzorec: (4 * getChargeTime) / oscillatorFrequency = chargeTimeInSeconds Tento vzorec lze také použít k získání vstupu tolerance z funkce isTouching na sekundy.

Doporučuje: