Sisukord:

Mahtuvuslik puudutus PIC16F886 mikrokontrolleriga: 3 sammu
Mahtuvuslik puudutus PIC16F886 mikrokontrolleriga: 3 sammu

Video: Mahtuvuslik puudutus PIC16F886 mikrokontrolleriga: 3 sammu

Video: Mahtuvuslik puudutus PIC16F886 mikrokontrolleriga: 3 sammu
Video: Замена экрана Huawei P30 Pro #huaweip30pro 2024, Juuli
Anonim
Mahtuvuslik puudutus PIC16F886 mikrokontrolleriga
Mahtuvuslik puudutus PIC16F886 mikrokontrolleriga

Selles õpetuses käsitleme, kuidas saate kasutada PIC16F886 mikrokontrollerit mahtuvuse erinevuste tuvastamiseks. Seda saab hiljem kasutada puuteplaadi vajutamise tuvastamiseks. Enne selle projekti tegemist on hea tutvuda pic -mikrokontrolleritega.

Samm: ühendage oma vooluahel

Ühendage oma vooluring
Ühendage oma vooluring

Esiteks alustame vooluringi ühendamisega vastavalt ülaltoodud skeemile. Puuteplaadi valmistamiseks võite alumiiniumfooliumi ruuduks kokku voltida ja teibile kleepida. Võite katsetada 100k takisti erinevate väärtustega, leidsin, et 100k töötas minu jaoks hästi.

RC4 tihvti kasutatakse mõõdetava mahtuvuse laadimise/tühjendamise alustamiseks. C12IN0 on ühendatud sisemise võrdlusseadme küljega ja C1IN -tihvt on ühendatud sama komparaatori + küljega. Mikrokontroller näeb mahtuvust täielikult laetuna, kui C12IN0 pinge ületab C1IN pinge. Takistuslik pingejagur tagab, et C1IN on 5 volti lähedal.

Kuna puuteplaat sõltub sellest, kas teie ja vooluahela vahel on märkimisväärne mahtuvus, on võimalik, et aku ei tööta.

Samm: päisefail

Päisefail
Päisefail

Kas olete kõik ühendused lõpetanud? Hea, jätkame päisefailiga. Me kasutame XC8 kompilaatorit ja nagu pealkiri ütleb, looge nüüd oma projektile uus päisefail ja kopeerige ja kleepige järgmine kood. Sama hästi saate selle kopeerida ja kleepida oma põhikoodi kohale ilma päisefailita.

#defineeri 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õõdetav tühjenemismahtuvus RC4 = 0; _delay_ms (DISCHARGE_TIME); // anna piisavalt viivitust, et "kondensaator" täielikult (peaaegu täielikult) tühjendada // kustuta taimeri ülevoolu lipp T0IF = 0; // oodake, kuni taimer üle voolab, alustage loendamist 0 -st (! T0IF); T0IF = 0; // mõõta laadimise mahtuvust RC4 = 1; // oodake, kuni mahtuvus laeb kuni viitepingeni, samal ajal (C1OUT) {timerCount = TMR0; kui (T0IF) {overflowCount ++; T0IF = 0; }} count = (256 * overflowCount) + timerCount; // lähtesta timerCount timerCount = 0; overflowCount = 0; tagastuste arv; }

int isTouching (int tolerantsus) {

// mitme proovi keskmine kahekordne keskmine = 0; jaoks (int i = 0; i calibrationValue+tolerants) keskmine ++; } keskmine /= TOUCH_SAMPLE; // keskmine on arv vahemikus 0 kuni 1, kui (keskmine> 0,2) tagastab 1; tagasitulek 0; }

void calibrate () {

int keskmine = 0; int proovid [CALIBRATION_SAMPLE]; // saada keskmine väärtus (int i = 0; i <CALIBRATION_SAMPLE; i ++) {sample = getChargeTime (); keskmine += proovid ; } keskmine /= CALIBRATION_SAMPLE; calibrationValue = keskmine; // saada max/min väärtused maxCalibrationValue = proovid [0]; minCalibrationValue = proovid [0]; jaoks (int i = 0; i maxCalibrationValue) maxCalibrationValue = proovid ; if (proovid <minCalibrationValue) minCalibrationValue = proovid ; }}

void setupCapacitiveTouch () {

// laadimis-/tühjendusnõela seadistamine väljundiks, antud juhul on see RC4 TRISCbits. TRISC4 = 0; // taimeri seadistamine0 T0CS = 0; PSA = 1; // võrdleja seadistamine C1CH0 = 0; C1CH1 = 0; C1R = 0; C1ON = 1; C1POL = 0; // arvelduste arvu väärtuste loendamine = 0; // kalibreerimisväärtuste kustutamine calibrationValue = 0; maxCalibrationValue = 0; minCalibrationValue = 0; // käivita kalibreerimine käivitamisel kalibreerimine (); }

Samm: põhikoodi kirjutamine

Alustades põhikoodist, peate lisama eelmises etapis loodud päisefaili. Järgmine kood on näide sellest, kuidas saate funktsiooni isTouching lülitina kasutada. Minu puhul andsin päisele nime capacitiveTouch.h.

#kaasake

#include "mahtuvuslikTouch.h"

// see muutuja ütleb, kas nuppu on juba vajutatud või mitte

int lastState = 0;

void main () {

// RC5 seadistamine väljundiks TRISCbits. TRISC5 = 0; // peate selle funktsiooni käivitama programmi setupCapacitiveTouch () käivitamisel; _ viivitus_ms (1000); // kalibreeri pärast täpset seadistust calibrate (); while (1) {// kontrollides, kas nuppu vajutatakse, kui (isTouching (15) && lastState == 0) {if (RC5) RC5 = 0; muidu RC5 = 1; viimane riik = 1; } // kontrollimine, kas nupp vabastatakse muidu, kui (lastState == 1 &&! isTouching (15)) lastState = 0; _ viivitus_ms (20); }}

kalibreerida:

Kui seda funktsiooni nimetatakse, muutuvad muutujad calibrationValue, maxCalibrationValue ja minCalibrationValue. funktsiooni calibrationValue kasutab funktsioon isTouching. Pidage meeles, et puuteplaat tuleks kalibreerimise ajal üksi jätta.

setupCapacitiveTouch:

Programmi alguses tuleb helistada. See seadistab vajalikud bitid, mida teised funktsioonid kasutavad. Samuti käivitab see kalibreerimise. Siiski sain paremaid tulemusi sekundit oodates ja kalibreerisin uuesti eraldi.

isTouching:

See funktsioon tagastab 1, kui tuvastab C12IN0 mahtuvuse suurenemise, ja tagastab 0, kui mahtuvus on kalibreerimise ajal lähedane. Lihtsalt öeldes, kui keegi puudutab padi, naaseb funktsioon isTouching 1. Funktsioon soovib sisendiks ka parameetrit, see on tolerants selle käivitamiseks. Mida kõrgem on tolerantsi väärtus, seda vähem tundlik see muutub. Oma seadistuses leidsin, et 15 töötas hästi, kuid kuna see sõltub oklaslaatori sagedusest ja selle vajutamisel lisatud mahtuvusest, peaksite selle väärtusega katsetama, kuni leiate midagi, mis teile sobib.

getChargeTime:

Kui soovite teada, kui kaua võtab aega mahtuvuse laadimine CVREF -i pingele, testib see funktsioon seda ja tagastab täisarvu. Aegade saamiseks sekundites kasutage järgmist valemit: (4 * getChargeTime) / oscillatorFrequency = chargeTimeInSeconds Seda valemit saab kasutada ka isTouching funktsiooni tolerantsi sisestamiseks sekunditesse.

Soovitan: