Satura rādītājs:

Kapacitīvs pieskāriens ar PIC16F886 mikrokontrolleru: 3 soļi
Kapacitīvs pieskāriens ar PIC16F886 mikrokontrolleru: 3 soļi

Video: Kapacitīvs pieskāriens ar PIC16F886 mikrokontrolleru: 3 soļi

Video: Kapacitīvs pieskāriens ar PIC16F886 mikrokontrolleru: 3 soļi
Video: Дневник хранящий жуткие тайны. Переход. Джеральд Даррелл. Мистика. Ужасы 2024, Jūlijs
Anonim
Kapacitīvs pieskāriens ar PIC16F886 mikrokontrolleru
Kapacitīvs pieskāriens ar PIC16F886 mikrokontrolleru

Šajā apmācībā mēs apskatīsim, kā jūs varat izmantot PIC16F886 mikrokontrolleru, lai noteiktu kapacitātes atšķirības, vēlāk to var izmantot, lai noteiktu, vai tiek piespiests skārienpaliktnis. Pirms šī projekta veikšanas ir labi iepazīties ar mikrokontrolleriem.

1. darbība: savienojiet ķēdi

Pieslēdziet ķēdi
Pieslēdziet ķēdi

Pirmkārt, sāksim ar ķēdes savienošanu saskaņā ar iepriekš minēto shēmu. Lai izveidotu skārienpaliktni, alumīnija foliju var salocīt kvadrātā un pielīmēt pie stieples. Jūs varat eksperimentēt ar dažādām 100k rezistora vērtībām, es atklāju, ka 100k man derēja labi.

RC4 tapu izmanto, lai sāktu izmērāmās kapacitātes uzlādi/izlādi. C12IN0 ir savienots ar iekšējā salīdzinātāja pusi, un C1IN tapa ir pievienota tā paša salīdzinātāja + pusei. Mikrokontrolleris redz kapacitāti kā pilnībā uzlādētu, kad C12IN0 spriegums sasniedz virs C1IN sprieguma. Pretestības sprieguma dalītājs nodrošina, ka C1IN ir tuvu 5 voltiem.

Tā kā skārienpaliktnis ir atkarīgs no tā, vai starp jums un ķēdes zemi ir ievērojama kapacitāte, pastāv iespēja, ka akumulators var nedarboties.

2. darbība: galvenes fails

Galvenes fails
Galvenes fails

Vai esat pabeidzis visus savienojumus? Labi, mēs turpināsim ar galvenes failu. Mēs izmantosim XC8 kompilatoru, un, kā norāda nosaukums, tagad savā projektā izveidojiet jaunu galvenes failu un kopējiet un ielīmējiet šādu kodu. Tikpat labi varat to kopēt un ielīmēt virs galvenā koda bez galvenes faila.

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

int skaits;

int calibrationValue, maxCalibrationValue, minCalibrationValue;

int getChargeTime () {

int timerCount = 0; int overflowCount = 0; // izmērāmā izlādes kapacitāte RC4 = 0; _delay_ms (DISCHARGE_TIME); // dod pietiekami daudz kavēšanās, lai pilnībā (gandrīz pilnībā) izlādētu "kondensatoru" // notīrītu taimera pārplūdes karodziņu T0IF = 0; // gaidīt, lai taimeris pārplūst, sākt skaitīt no 0, kamēr (! T0IF); T0IF = 0; // sākt mērāmo uzlādes kapacitāti RC4 = 1; // pagaidiet, līdz kapacitāte uzlādējas līdz atsauces spriegumam, kamēr (C1OUT) {timerCount = TMR0; ja (T0IF) {overflowCount ++; T0IF = 0; }} skaits = (256 * overflowCount) + timerCount; // reset timerCount timerCount = 0; overflowCount = 0; atgriešanās skaits; }

int isTouching (int tolerance) {

// vairāku paraugu vidējais rādītājs dubultā vidējais = 0; par (int i = 0; i calibrationValue+tolerance) vidēji ++; } vidējais /= TOUCH_SAMPLE; // vidējais būs skaitlis no 0 līdz 1, ja (vidēji> 0,2) atgriež 1; atgriezties 0; }

void calibrate () {

int vidēji = 0; int paraugi [CALIBRATION_SAMPLE]; // iegūt vidējo vērtību (int i = 0; i <CALIBRATION_SAMPLE; i ++) {paraugi = getChargeTime (); vidējais += paraugi ; } vidējais /= CALIBRATION_SAMPLE; calibrationValue = vidējais; // iegūt maksimālās/min vērtības maxCalibrationValue = paraugi [0]; minCalibrationValue = paraugi [0]; par (int i = 0; i maxCalibrationValue) maxCalibrationValue = paraugi ; ja (paraugi <minCalibrationValue) minCalibrationValue = paraugi ; }}

void setupCapacitiveTouch () {

// iestatot uzlādes/izlādes tapu kā izeju, šajā gadījumā tas ir RC4 TRISCbits. TRISC4 = 0; // taimera iestatīšana0 T0CS = 0; PSA = 1; // salīdzinātāja iestatīšana C1CH0 = 0; C1CH1 = 0; C1R = 0; C1ON = 1; C1POL = 0; // ieskaita skaitļu vērtību skaits count = 0; // kalibrēšanas vērtību notīrīšana calibrationValue = 0; maxCalibrationValue = 0; minCalibrationValue = 0; // palaist kalibrēšanu, uzsākot kalibrēšanu (); }

3. solis: galvenā koda rakstīšana

Sākot ar galveno kodu, jums jāiekļauj galvenes fails, kas izveidots iepriekšējā solī. Šis kods ir piemērs tam, kā jūs varat izmantot funkciju isTouching kā slēdzi. Manā gadījumā galvenei devu nosaukumu capacitiveTouch.h.

#iekļaut

#include "capacitiveTouch.h"

// šis mainīgais norāda, vai poga ir vai nav jau nospiesta

int lastState = 0;

void main () {

// iestatot RC5 kā izeju TRISCbits. TRISC5 = 0; // šī funkcija jāizsauc, startējot programmu setupCapacitiveTouch (); _ kavēšanās_ms (1000); // kalibrēt pēc precīzas iestatīšanas calibrate (); while (1) {// pārbaudot, vai poga tiek nospiesta, ja (isTouching (15) && lastState == 0) {if (RC5) RC5 = 0; citādi RC5 = 1; lastState = 1; } // pārbaude, vai poga tiek atbrīvota citādi, ja (lastState == 1 &&! isTouching (15)) lastState = 0; _kavēšanās_ms (20); }}

kalibrēt:

Kad šī funkcija tiek saukta, tiks atjaunināti mainīgie calibrationValue, maxCalibrationValue un minCalibrationValue. calibrationValue izmanto funkcija isTouching. Paturiet prātā, ka skārienpaliktnis kalibrēšanas laikā jāatstāj viens.

setupCapacitiveTouch:

Nepieciešams piezvanīt programmas sākumā. Tas nosaka nepieciešamos bitus, ko izmanto citas funkcijas. Tas arī veic kalibrēšanu. Tomēr es guvu labākus rezultātus, gaidot sekundi un vēlreiz veicot kalibrēšanu atsevišķi.

isTouching:

Šī funkcija atgriež 1, ja tā konstatē C12IN0 kapacitātes palielināšanos, un atgriež 0, ja kapacitāte ir tuvu tai, kas bija kalibrēšanas laikā. Vienkārši sakot, ja kāds pieskaras spilventiņam, funkcija isTouching atgriezīsies 1. Funkcija arī vēlas ievadīt parametru, tā ir pielaide, lai to aktivizētu. Jo augstāka ir pielaides vērtība, jo mazāk jutīga tā kļūst. Savā iestatījumā es atklāju, ka 15 strādāja labi, taču, tā kā tas ir atkarīgs no oksilatora frekvences un no tā, cik daudz jaudas tiek pievienotas, nospiežot to, jums vajadzētu eksperimentēt ar šo vērtību, līdz atrodat kaut ko, kas jums noder.

getChargeTime:

Ja vēlaties uzzināt, cik ilgs laiks būtu nepieciešams, lai uzlādētu kapacitāti līdz CVREF spriegumam, šī funkcija to pārbaudīs un parādīs veselu skaitli. Lai iegūtu laiku sekundēs, izmantojiet šo formulu: (4 * getChargeTime) / oscillatorFrequency = chargeTimeInSeconds Šo formulu var izmantot arī, lai iegūtu pielaides ievadi no funkcijas isTouching līdz sekundēm.

Ieteicams: