Sisällysluettelo:

Kapasitiivinen kosketus PIC16F886 -mikrokontrollerilla: 3 vaihetta
Kapasitiivinen kosketus PIC16F886 -mikrokontrollerilla: 3 vaihetta

Video: Kapasitiivinen kosketus PIC16F886 -mikrokontrollerilla: 3 vaihetta

Video: Kapasitiivinen kosketus PIC16F886 -mikrokontrollerilla: 3 vaihetta
Video: Unboxing & Review LeEco Pro 3 X650 Ai Helio X27 (tekniset tiedot, valokuva ja videokamera, tulos) 2024, Marraskuu
Anonim
Kapasitiivinen kosketus PIC16F886 -mikrokontrollerilla
Kapasitiivinen kosketus PIC16F886 -mikrokontrollerilla

Tässä opetusohjelmassa käymme läpi, kuinka voit käyttää PIC16F886 -mikrokontrolleria havaitaksesi kapasitanssin erot. Tätä voidaan myöhemmin käyttää kertomaan, onko kosketuslevyä painettu. On hyvä tuntea pic -mikrokontrollerit ennen tämän projektin tekemistä.

Vaihe 1: Johdotkaa piiri

Johdota piiri
Johdota piiri

Aloitetaan ensin kytkemällä piiri yllä olevan kaavion mukaisesti. Voit tehdä kosketuslevyn taittamalla alumiinifolion neliöksi ja teippaamalla langan. Voit kokeilla 100k: n vastuksen eri arvoja, huomasin, että 100k toimi minulle hyvin.

RC4 -nastaa käytetään mitattavan kapasitanssin lataamiseen/purkamiseen. C12IN0 on kytketty sisäisen vertailulaitteen puolelle ja C1IN -nasta on kytketty saman vertailijan + -puolelle. Mikro -ohjain näkee kapasitanssin täyteen ladattuna, kun C12IN0 -jännite saavuttaa C1IN -jännitteen. Resistiivinen jännitteenjakaja varmistaa, että C1IN on lähellä 5 volttia.

Koska kosketuslevy riippuu siitä, että sinun ja piirin välillä on merkittävä kapasitanssi, on mahdollista, että paristo ei toimi.

Vaihe 2: Otsikkotiedosto

Otsikkotiedosto
Otsikkotiedosto

Oletko saanut kaikki liitännät valmiiksi? Hyvä, jatkamme otsikkotiedoston kanssa. Käytämme XC8-kääntäjää, ja kuten otsikko ehdottaa, sinun on nyt luotava uusi otsikkotiedosto projektillesi ja kopioitava ja liitettävä seuraava koodi. Voit yhtä hyvin kopioida ja liittää sen pääkoodisi yläpuolelle ilman otsikkotiedostoa.

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

int laskea;

int calibrationValue, maxCalibrationValue, minCalibrationValue;

int getChargeTime () {

int timerCount = 0; int overflowCount = 0; // mitattava purkauskapasitanssi RC4 = 0; _viive_ms (DISCHARGE_TIME); // anna riittävästi viivettä "kondensaattorin" purkamiseksi kokonaan (melkein kokonaan) // tyhjennä ajastimen ylivuotolippu T0IF = 0; // odota ajastimen ylivuotoa, aloita laskenta 0: sta (! T0IF); T0IF = 0; // aloita mitattava latauskapasitanssi RC4 = 1; // odota, että kapasitanssi latautuu referance -jännitteeseen, kun taas (C1OUT) {timerCount = TMR0; jos (T0IF) {overflowCount ++; T0IF = 0; }} count = (256 * overflowCount) + timerCount; // nollaa timerCount timerCount = 0; overflowCount = 0; palautuslaskenta; }

int isTouching (int suvaitsevaisuus) {

// useiden näytteiden keskiarvo kaksinkertainen keskiarvo = 0; (int i = 0; i calibrationValue+toleranssi) keskiarvo ++; } keskiarvo /= TOUCH_SAMPLE; // keskiarvo on luku välillä 0 ja 1, jos (keskiarvo> 0,2) palauttaa 1; palauta 0; }

void calibrate () {

int keskiarvo = 0; int näytteet [CALIBRATION_SAMPLE]; // hae keskiarvo kohteelle (int i = 0; i <CALIBRATION_SAMPLE; i ++) {sample = getChargeTime (); keskiarvo += näytteet ; } keskiarvo /= CALIBRATION_SAMPLE; calibrationValue = keskiarvo; // hanki max/min -arvot maxCalibrationValue = näytteet [0]; minCalibrationValue = näytteet [0]; for (int i = 0; i maxCalibrationValue) maxCalibrationValue = näytteet ; if (näytteet <minCalibrationValue) minCalibrationValue = näytteet ; }}

void setupCapacitiveTouch () {

// lataus-/purkausnastan asettaminen lähtöksi, tässä tapauksessa se on RC4 TRISCbits. TRISC4 = 0; // ajastimen asettaminen0 T0CS = 0; PSA = 1; // vertailijan asettaminen C1CH0 = 0; C1CH1 = 0; C1R = 0; C1ON = 1; C1POL = 0; // selvityslaskujen arvojen lukumäärä count = 0; // kalibrointiarvojen tyhjentäminen calibrationValue = 0; maxCalibrationValue = 0; minCalibrationValue = 0; // suorittaa kalibrointi käynnistettäessä kalibroi (); }

Vaihe 3: Pääkoodin kirjoittaminen

Pääkoodista alkaen sinun on sisällytettävä edellisessä vaiheessa luotu otsikkotiedosto. Seuraava koodi on esimerkki siitä, kuinka voit käyttää isTouching -toimintoa kytkimenä. Minun tapauksessani annoin otsikolle nimen capacitiveTouch.h.

#sisältää

#include "capacitiveTouch.h"

// tämä muuttuja kertoo, onko painiketta painettu vai ei

int lastState = 0;

void main () {

// asetetaan RC5 tuloksi TRISCbits. TRISC5 = 0; // sinun on kutsuttava tämä toiminto käyttöön ohjelman käynnistyksen yhteydessäCapacitiveTouch (); _viive_ms (1000); // kalibroi tarkan asennuksen jälkeen kalibroi (); while (1) {// tarkistetaan, painetaanko painiketta, jos (isTouching (15) && lastState == 0) {if (RC5) RC5 = 0; muuten RC5 = 1; lastState = 1; } // tarkistetaan, vapautetaanko painike muuten if (lastState == 1 &&! isTouching (15)) lastState = 0; _viive_ms (20); }}

kalibroida:

Kun tätä toimintoa kutsutaan, muuttujat calibrationValue, maxCalibrationValue ja minCalibrationValue päivitetään. calibrationValue käytetään isTouching -toiminnossa. Muista, että kosketuslevy tulee jättää yksin kalibroinnin aikana.

setupCapacitiveTouch:

Sinun on kutsuttava ohjelman alussa. Se asettaa tarvittavat bitit, joita muut toiminnot käyttävät. Se suorittaa myös kalibroinnin. Sain kuitenkin parempia tuloksia odottamalla hetken ja suorittamalla kalibroinnin uudelleen erikseen.

isTouching:

Tämä toiminto palauttaa arvon 1, jos se havaitsee C12IN0: n kapasitanssin kasvun, ja palauttaa arvon 0, jos kapasitanssi on lähellä sitä, joka se oli kalibroinnin aikana. Yksinkertaisesti sanottuna, jos joku koskettaa tyynyä, isTouching -toiminto palauttaa 1. Toiminto haluaa myös parametrin syötteeksi, tämä on toleranssi sen laukaisulle. Mitä suurempi toleranssi, sitä vähemmän herkkä se on. Asetuksessani huomasin, että 15 toimi hyvin, mutta koska tämä riippuu ocsillator -taajuudesta ja kuinka paljon kapasitanssia lisätään, kun painat sitä, kokeile tätä arvoa, kunnes löydät jotain, joka toimii sinulle.

getChargeTime:

Kun haluat tietää kuinka kauan kestää kapasitanssin lataaminen CVREF -jännitteeseen, tämä toiminto testaa sen ja palauttaa kokonaisluvun. Voit saada ajan sekunneissa käyttämällä tätä kaavaa: (4 * getChargeTime) / oscillatorFrequency = chargeTimeInSeconds Tätä kaavaa voidaan käyttää myös toleranssitulon saamiseen isTouching -toiminnosta sekunteihin.

Suositeltava: