INHOUDSOPGAWE:

Kapasitiewe aanraking met PIC16F886 mikrokontroller: 3 stappe
Kapasitiewe aanraking met PIC16F886 mikrokontroller: 3 stappe

Video: Kapasitiewe aanraking met PIC16F886 mikrokontroller: 3 stappe

Video: Kapasitiewe aanraking met PIC16F886 mikrokontroller: 3 stappe
Video: БОЛИ В ПОЯСНИЦЕ И МЕТАБОЛИЧЕСКИЙ СИНДРОМ 3 день 2024, Julie
Anonim
Kapasitiewe aanraking met PIC16F886 mikrokontroller
Kapasitiewe aanraking met PIC16F886 mikrokontroller

In hierdie tutoriaal gaan ons oor hoe u 'n PIC16F886 -mikrobeheerder kan gebruik om die kapasiteitsverskille op te spoor; dit kan later gebruik word om te bepaal of 'n raakvlak ingedruk word. Dit is goed om vertroud te wees met foto -mikrobeheerders voordat u hierdie projek maak.

Stap 1: Skakel u stroombaan op

Maak 'n draai by jou kring
Maak 'n draai by jou kring

Eerstens, laat ons begin deur die stroombaan aan te sluit volgens die skema hierbo. Om die raakvlak te maak, kan u aluminiumfoelie in 'n vierkant vou en op 'n draad plak. U kan eksperimenteer met verskillende waardes vir die 100k -weerstand; ek het gevind dat 100k goed vir my werk.

Die RC4 -pen word gebruik om die kapasiteit wat gemeet moet word, te laai/ontlaai. C12IN0 is aan die - kant van 'n interne vergelyker gekoppel en die C1IN -pen is aan die + kant van dieselfde vergelyker gekoppel. Die mikrobeheerder sien die kapasitansie as vol gelaai wanneer die C12IN0 spanning bo die C1IN spanning bereik. Die weerstandspanningsverdeler sorg dat C1IN naby 5 volt is.

Aangesien die raakvlak afhanklik is van 'n aansienlike kapasiteit tussen u en die stroombaan, is daar 'n moontlikheid dat 'n battery nie werk nie.

Stap 2: Die koptekstlêer

Die koplêer
Die koplêer

Klaar met al die verbindings? Goed, ons gaan voort met die koplêer. Ons sal die XC8-samesteller gebruik, en soos die titel aandui, moet u nou 'n nuwe koplêer in u projek skep en die volgende kode kopieer en plak. U kan dit net so bo die hoofkode kopieer en plak sonder enige koplêer.

#definieer CALIBRATION_SAMPLE 20 #definieer TOUCH_SAMPLE 10 #definieer DISCHARGE_TIME 5

int telling;

int calibrationValue, maxCalibrationValue, minCalibrationValue;

int getChargeTime () {

int timerCount = 0; int overflowCount = 0; // ontladingskapasiteit wat gemeet moet word RC4 = 0; _vertraag_ms (DISCHARGE_TIME); // gee genoeg vertraging om die "kapasitor" ten volle (feitlik ten volle) te ontlaai // maak die timer -oorloopvlag skoon T0IF = 0; // wag totdat die timer oorloop, begin tel vanaf 0 terwyl (! T0IF); T0IF = 0; // begin laaikapasiteit wat gemeet moet word RC4 = 1; // wag totdat kapasitansie laai tot by die verwysingsspanning terwyl (C1OUT) {timerCount = TMR0; as (T0IF) {overflowCount ++; T0IF = 0; }} count = (256 * overflowCount) + timerCount; // reset timerCount timerCount = 0; overflowCount = 0; opgawe telling; }

int isTouching (int tolerance) {

// gemiddelde van veelvoudige monsters dubbel gemiddelde = 0; vir (int i = 0; i calibrationValue+tolerance) gemiddelde ++; } gemiddeld /= TOUCH_SAMPLE; // gemiddelde sal 'n getal tussen 0 en 1 wees as (gemiddelde> 0.2) opbrengs 1; terugkeer 0; }

leemte kalibreer () {

int gemiddelde = 0; int monsters [CALIBRATION_SAMPLE]; // kry gemiddelde waarde vir (int i = 0; i <CALIBRATION_SAMPLE; i ++) {monsters = getChargeTime (); gemiddelde += monsters ; } gemiddeld /= CALIBRATION_SAMPLE; kalibrasiewaarde = gemiddeld; // kry max/min waardes maxCalibrationValue = monsters [0]; minCalibrationValue = monsters [0]; vir (int i = 0; i maxCalibrationValue) maxCalibrationValue = monsters ; if (monsters <minCalibrationValue) minCalibrationValue = monsters ; }}

leemte setupCapacitiveTouch () {

// die laai-/ontladingspen as uitset stel, in hierdie geval is dit RC4 TRISCbits. TRISC4 = 0; // die opstel van timer0 T0CS = 0; PSA = 1; // die opstel van vergelyking C1CH0 = 0; C1CH1 = 0; C1R = 0; C1ON = 1; C1POL = 0; // die opruiming van telwaardes tel = 0; // skoonmaak van kalibrasie waardes calibrationValue = 0; maxCalibrationValue = 0; minCalibrationValue = 0; // hardloop kalibrasie by begin kalibreer (); }

Stap 3: Skryf die hoofkode

Vanaf die hoofkode moet u die koptekstlêer insluit wat in die vorige stap geskep is. Die volgende kode is 'n voorbeeld van hoe u die isTouching -funksie as 'n skakelaar kan gebruik. In my geval het ek die kop die naam capacitiveTouch.h gegee.

#insluit

#sluit "capacitiveTouch.h" in

// hierdie veranderlike sê of die knoppie al dan nie ingedruk is nie

int lastState = 0;

void main () {

// die instelling van RC5 as uitset TRISCbits. TRISC5 = 0; // u moet hierdie funksie oproep met die aanvang van die program setupCapacitiveTouch (); _vertraag_ms (1000); // kalibreer na u presiese opstelling kalibreer (); terwyl (1) {// kyk of die knoppie ingedruk word as (isTouching (15) && lastState == 0) {if (RC5) RC5 = 0; anders RC5 = 1; laaste staat = 1; } // kyk of die knoppie vrygestel word, anders as (lastState == 1 &&! isTouching (15)) lastState = 0; _vertraag_ms (20); }}

kalibreer:

As hierdie funksie die veranderlikes calibrationValue genoem word, sal maxCalibrationValue en minCalibrationValue opgedateer word. calibrationValue word gebruik deur die isTouching -funksie. Hou in gedagte dat die raakvlak alleen tydens kalibrasie gelaat moet word.

setupCapacitiveTouch:

Moet aan die begin van u program gebel word. Dit stel die nodige stukkies op wat deur die ander funksies gebruik word. Dit voer ook 'n callibration uit. Ek het egter beter resultate behaal deur 'n oomblik te wag en die kalibrasie afsonderlik weer uit te voer.

is aanraak:

Hierdie funksie gee 1 terug as dit 'n toename in kapasitansie op die C12IN0 opspoor en 0 as die kapasitansie naby die een is wat tydens kalibrasie was. Eenvoudig gestel, as iemand aan die pad raak, sal die isTouching -funksie terugkeer 1. Die funksie wil ook 'n parameter as 'n invoer hê, dit is die toleransie wat dit veroorsaak. Hoe hoër die verdraagsaamheid, hoe minder sensitief word dit. In my opstelling het ek gevind 15 werk goed, maar omdat dit afhang van die frekwensie van die ocsillator en hoeveel kapasitansie bygevoeg word as u daarop druk, moet u met hierdie waarde eksperimenteer totdat u iets vind wat vir u werk.

getChargeTime:

As u wil weet hoe lank dit sal neem om die kapasitansie na die CVREF -spanning op te laai, sal hierdie funksie dit toets en 'n heelgetal teruggee. Om die tyd in sekondes te kry, gebruik u hierdie formule: (4 * getChargeTime) / oscillatorFrequency = chargeTimeInSeconds Hierdie formule kan ook gebruik word om die toleransie -invoer van die isTouching -funksie na sekondes te kry.

Aanbeveel: