Përmbajtje:

Prekje kapacitive me mikrokontrollues PIC16F886: 3 hapa
Prekje kapacitive me mikrokontrollues PIC16F886: 3 hapa

Video: Prekje kapacitive me mikrokontrollues PIC16F886: 3 hapa

Video: Prekje kapacitive me mikrokontrollues PIC16F886: 3 hapa
Video: 🛜Neil Degrasse Tyson, WRONG about Tesla?!? 🛜 ​⁠@joerogan (30min) 2024, Nëntor
Anonim
Prekje kapacitive me mikrokontrollues PIC16F886
Prekje kapacitive me mikrokontrollues PIC16F886

Në këtë tutorial ne do të kalojmë se si mund të përdorni një mikrokontrollues PIC16F886 për të zbuluar dallimet në kapacitet, kjo më vonë mund të përdoret për të treguar nëse një tastierë prekëse është duke u shtypur. Goodshtë mirë të njiheni me mikrokontrolluesit e fotografisë para se të bëni këtë projekt.

Hapi 1: Lidhni qarkun tuaj

Lidhni qarkun tuaj
Lidhni qarkun tuaj

Së pari, le të fillojmë duke instaluar qarkun sipas skemës së mësipërme. Për të bërë jastëkun e prekjes mund të palosni fletë alumini në një katror dhe të ngjisni në një tel. Ju mund të eksperimentoni me vlera të ndryshme për rezistencën 100k, kam gjetur se 100k ka punuar mirë për mua.

Kunja RC4 përdoret për të filluar karikimin/shkarkimin e kapacitetit që duhet matur. C12IN0 është i lidhur me anën - e një krahasuesi të brendshëm dhe kunja C1IN është e lidhur me anën + të të njëjtit krahasues. Mikrokontrolluesi e sheh kapacitetin si të ngarkuar plotësisht kur tensioni C12IN0 arrin mbi tensionin C1IN. Ndarësi i tensionit rezistues sigurohet që C1IN të jetë afër 5 volt.

Meqenëse blloku i prekjes varet nga fakti që ka një kapacitet të rëndësishëm midis jush dhe tokës së qarkut, ekziston mundësia që një bateri të mos funksionojë.

Hapi 2: Skedari i kokës

Skedari i kokës
Skedari i kokës

Përfunduar me të gjitha lidhjet? Mirë, ne do të vazhdojmë me skedarin e kokës. Ne do të përdorim përpiluesin XC8 dhe siç sugjeron titulli ju tani do të krijoni një skedar të ri header në projektin tuaj dhe kopjoni-ngjisni kodin e mëposhtëm. Ju gjithashtu mund ta kopjoni-ngjisni atë mbi kodin tuaj kryesor pa ndonjë skedar titulli.

#përcakto CALIBRATION_SAMPLE 20 #përcakto TOUCH_SAMPLE 10 #përcakto DISCHARGE_TIME 5

int numërimi;

int calibrationValue, maxCalibrationValue, minCalibrationValue;

int getChargeTime () {

int timerCount = 0; int overflowCount = 0; // kapaciteti i shkarkimit që do të matet RC4 = 0; _vonesë_ms (DISCHARGE_TIME); // jepni vonesë të mjaftueshme për të shkarkuar plotësisht (pothuajse plotësisht në të vërtetë) "kondensatorin" // pastroni flamurin e tejkalimit të kohëmatësit T0IF = 0; // prisni që kohëmatësi të mbushet, filloni numërimin nga 0 ndërsa (! T0IF); T0IF = 0; // filloni kapacitetin e karikimit për t'u matur RC4 = 1; // prisni që kapaciteti të ngarkohet deri në tensionin e referencës ndërsa (C1OUT) {timerCount = TMR0; nëse (T0IF) {overflowCount ++; T0IF = 0; }} count = (256 * overflowCount) + timerCount; // rivendos timerCount timerCount = 0; overflowCount = 0; numërimi i kthimit; }

int isTouching (int toleranca) {

// mesatarja e mostrave të shumta mesatarja e dyfishtë = 0; për (int i = 0; i kalibrimitVlera+tolerancë) mesatare ++; } mesatare /= TOUCH_SAMPLE; // mesatarja do të jetë një numër midis 0 dhe 1 nëse (mesatarja> 0.2) kthehet 1; kthimi 0; }

kalibrimi i pavlefshëm () {

mesatarja int = 0; mostrat int [CALIBRATION_SAMPLE]; // merrni vlerën mesatare për (int i = 0; i <CALIBRATION_SAMPLE; i ++) {mostra = getChargeTime (); mesatare += mostra ; } mesatare /= CALIBRATION_SAMPLE; calibrationValue = mesatare; // merrni vlerat max/min maxCalibrationValue = mostrat [0]; minCalibrationValue = mostra [0]; për (int i = 0; i maxCalibrationValue) maxCalibrationValue = mostra ; nëse (mostrat <minCalibrationValue) minCalibrationValue = mostrat ; }}

void setupCapacitiveTouch () {

// vendosja e pinit të ngarkimit/shkarkimit si dalje, në këtë rast është RC4 TRISCbits. TRISC4 = 0; // vendosja e kohëmatësit0 T0CS = 0; PSA = 1; // vendosja e krahasuesit C1CH0 = 0; C1CH1 = 0; C1R = 0; C1ON = 1; C1POL = 0; // pastrimi i vlerave të numërimit numërimi = 0; // pastrimi i vlerave të kalibrimit calibrationValue = 0; maxCalibrationValue = 0; minCalibrationValue = 0; // drejtoni kalibrimin në kalibrimin fillestar (); }

Hapi 3: Shkrimi i Kodit Kryesor

Duke filluar me kodin kryesor, do t'ju duhet të përfshini skedarin e titullit të krijuar në hapin e mëparshëm. Kodi i mëposhtëm është një shembull se si mund ta përdorni funksionin isTouching si ndërprerës. Në rastin tim i dhashë titullit emrin capacitiveTouch.h.

#përfshi

#include "capacitiveTouch.h"

// kjo ndryshore tregon nëse butoni është ose nuk është shtypur tashmë

int lastState = 0;

void kryesore () {

// vendosja e RC5 si dalje TRISCbits. TRISC5 = 0; // ju duhet ta thërrisni këtë funksion në fillim të programit setupCapacitiveTouch (); _vonesë_ms (1000); // kalibroni pas konfigurimit tuaj të saktë kalibroni (); ndërsa (1) {// kontrolloni nëse butoni po shtypet nëse (isTouching (15) && lastState == 0) {if (RC5) RC5 = 0; tjetër RC5 = 1; shteti i fundit = 1; } // kontrolloni nëse butoni po lëshohet tjetër nëse (lastState == 1 &&! isTouching (15)) lastState = 0; _vonesë_ms (20); }}

kalibro:

Kur ky funksion quhet variablat calibrationValue, maxCalibrationValue dhe minCalibrationValue do të përditësohen. calibrationValue përdoret nga funksioni isTouching. Mbani në mend se blloku i prekjes duhet të lihet vetëm gjatë kalibrimit.

setupCapacitiveTouch:

Duhet të thirret në fillim të programit tuaj. Ai vendos bitët e nevojshëm të përdorur nga funksionet e tjera. Gjithashtu drejton një kalibrim. Sidoqoftë, unë mora rezultate më të mira duke pritur një sekondë dhe kalova përsëri kalibrimin veç e veç.

ështëTouching:

Ky funksion kthen 1 nëse zbulon një rritje të kapacitetit në C12IN0 dhe kthen 0 nëse kapaciteti është afër atij që ishte gjatë kalibrimit. Thënë thjesht, nëse dikush prek jastëkun funksioni isTouching do të kthehet 1. Funksioni gjithashtu dëshiron një parametër si hyrje, kjo është toleranca që ajo të shkaktojë. Sa më e lartë vlera e tolerancës aq më pak e ndjeshme bëhet. Në konfigurimin tim kam gjetur se 15 punojnë mirë, por sepse kjo varet nga frekuenca e okcillatorit dhe sa kapacitet shtohet kur e shtypni atë, duhet të eksperimentoni me këtë vlerë derisa të gjeni diçka që funksionon për ju.

getChargeTime:

Kur doni të dini sa kohë do të duhej për të ngarkuar kapacitetin në tensionin CVREF, ky funksion do ta testojë atë dhe do të kthejë një numër të plotë. Për të marrë kohën në sekonda përdorni këtë formulë: (4 * getChargeTime) / oscillatorFrequency = chargeTimeInSeconds Kjo formulë mund të përdoret gjithashtu për të marrë inputin e tolerancës nga funksioni isTouching në sekonda.

Recommended: