Turinys:

Talpinis prisilietimas naudojant PIC16F886 mikrovaldiklį: 3 žingsniai
Talpinis prisilietimas naudojant PIC16F886 mikrovaldiklį: 3 žingsniai

Video: Talpinis prisilietimas naudojant PIC16F886 mikrovaldiklį: 3 žingsniai

Video: Talpinis prisilietimas naudojant PIC16F886 mikrovaldiklį: 3 žingsniai
Video: Мастер Класс "LA ROSA" Как связать самый ПОПУЛЯРНЫЙ детский плед СПИЦАМИ из ЛЮБОЙ ПЛЮШЕВОЙ пряжи 2024, Lapkritis
Anonim
Talpinis prisilietimas su PIC16F886 mikrovaldikliu
Talpinis prisilietimas su PIC16F886 mikrovaldikliu

Šioje pamokoje apžvelgsime, kaip galite naudoti PIC16F886 mikrovaldiklį, kad nustatytumėte talpos skirtumus, vėliau tai gali būti naudojama norint nustatyti, ar yra paspaudžiamas jutiklinis kilimėlis. Prieš kuriant šį projektą gerai žinoti „pic“mikrovaldiklius.

1 žingsnis: prijunkite grandinę

Sujunkite grandinę
Sujunkite grandinę

Pirma, pradėkime nuo grandinės prijungimo pagal aukščiau pateiktą schemą. Norėdami pagaminti jutiklinį kilimėlį, galite sulankstyti aliuminio foliją į kvadratą ir užklijuoti juostą ant vielos. Galite eksperimentuoti su skirtingomis 100k rezistoriaus vertėmis, radau, kad 100k man puikiai tinka.

RC4 kaištis naudojamas matuojamai talpai įkrauti/iškrauti. C12IN0 prijungtas prie vidinio lygintuvo pusės, o C1IN kaištis prijungtas prie to paties lygintuvo + pusės. Mikrovaldiklis mato, kad talpa yra visiškai įkrauta, kai C12IN0 įtampa viršija C1IN įtampą. Varžos įtampos daliklis užtikrina, kad C1IN yra arti 5 voltų.

Kadangi jutiklinis kilimėlis priklauso nuo to, ar tarp jūsų ir grandinės įžeminimo yra didelė talpa, yra galimybė, kad baterija gali neveikti.

2 veiksmas: antraštės failas

Antraštės failas
Antraštės failas

Baigėte visus ryšius? Gerai, mes tęsime antraštės failą. Mes naudosime XC8 kompiliatorių ir, kaip rodo pavadinimas, dabar savo projekte sukurkite naują antraštės failą ir nukopijuokite ir įklijuokite šį kodą. Taip pat galite nukopijuoti ir įklijuoti jį virš pagrindinio kodo be antraštės failo.

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

int skaičiuoti;

int calibrationValue, maxCalibrationValue, minCalibrationValue;

int getChargeTime () {

int timerCount = 0; int overflowCount = 0; // išmatuota iškrovos talpa RC4 = 0; _delay_ms (DISCHARGE_TIME); // pakankamai atidėti, kad visiškai (beveik visiškai) iškrautų "kondensatorių" // išvalyti laikmačio perpildymo vėliavą T0IF = 0; // laukti, kol laikmatis perpildys, pradėti skaičiuoti nuo 0 while (! T0IF); T0IF = 0; // pradėti matuoti įkrovimo talpą RC4 = 1; // laukti, kol talpa įkraus iki atraminės įtampos, kol (C1OUT) {timerCount = TMR0; if (T0IF) {overflowCount ++; T0IF = 0; }} count = (256 * overflowCount) + timerCount; // reset timerCount timerCount = 0; overflowCount = 0; grąžinimo skaičius; }

int isTouching (int tolerancija) {

// kelių mėginių vidurkis dvigubas vidurkis = 0; (int i = 0; i calibrationValue+tolerancija) vidurkis ++; } vidutinis /= TOUCH_SAMPLE; // vidurkis bus skaičius nuo 0 iki 1, jei (vidurkis> 0,2) grąžins 1; grįžti 0; }

void calibrate () {

int vidurkis = 0; int mėginiai [CALIBRATION_SAMPLE]; // gauti vidutinę reikšmę (int i = 0; i <CALIBRATION_SAMPLE; i ++) {sample = getChargeTime (); vidurkis += mėginiai ; } vidurkis /= CALIBRATION_SAMPLE; calibrationValue = vidutinis; // gauti max/min reikšmes maxCalibrationValue = mėginiai [0]; minCalibrationValue = mėginiai [0]; for (int i = 0; i maxCalibrationValue) maxCalibrationValue = mėginiai ; if (mėginiai <minCalibrationValue) minCalibrationValue = mėginiai ; }}

void setupCapacitiveTouch () {

// įkrovimo/iškrovimo kaiščio nustatymas kaip išėjimas, šiuo atveju tai RC4 TRISCbits. TRISC4 = 0; // laikmačio nustatymas0 T0CS = 0; PSA = 1; // lyginamojo nustatymas C1CH0 = 0; C1CH1 = 0; C1R = 0; C1ON = 1; C1POL = 0; // kliringo skaičiaus reikšmių skaičius = 0; // kalibravimo verčių išvalymas calibrationValue = 0; maxCalibrationValue = 0; minCalibrationValue = 0; // paleisti kalibravimą pradėjus kalibruoti (); }

3 žingsnis: pagrindinio kodo rašymas

Pradėdami nuo pagrindinio kodo, turėsite įtraukti antraštės failą, sukurtą ankstesniame veiksme. Šis kodas yra pavyzdys, kaip galite naudoti funkciją „isTouching“kaip jungiklį. Mano atveju antraštei daviau pavadinimą „capacitiveTouch.h“.

#įtraukti

#include "capacitiveTouch.h"

// šis kintamasis nurodo, ar mygtukas jau paspaustas, ar ne

int lastState = 0;

void main () {

// nustatant RC5 kaip išvestį TRISCbits. TRISC5 = 0; // šią funkciją reikia iškviesti pradedant programą setupCapacitiveTouch (); _delsimas_ms (1000); // kalibruoti po tikslios sąrankos kalibruoti (); while (1) {// patikrinti, ar mygtukas spaudžiamas, jei (isTouching (15) && lastState == 0) {if (RC5) RC5 = 0; kitaip RC5 = 1; paskutinė būsena = 1; } // patikrinti, ar mygtukas atleidžiamas kitaip, jei (lastState == 1 &&! isTouching (15)) lastState = 0; _delsimas_ms (20); }}

kalibruoti:

Kai ši funkcija bus vadinama, bus atnaujinti kintamieji calibrationValue, maxCalibrationValue ir minCalibrationValue. calibrationValue naudoja funkcija isTouching. Atminkite, kad kalibravimo metu jutiklinį kilimėlį reikia palikti vieną.

setupCapacitiveTouch:

Reikia paskambinti programos pradžioje. Jis nustato reikiamus bitus, kuriuos naudoja kitos funkcijos. Taip pat veikia kalibravimas. Tačiau sulaukiau geresnių rezultatų palaukęs sekundę ir vėl atlikęs kalibravimą atskirai.

isTouching:

Ši funkcija grąžina 1, jei aptinka C12IN0 talpos padidėjimą, ir grąžina 0, jei talpa yra artima kalibravimo metu. Paprasčiau tariant, jei kas nors paliečia trinkelę, funkcija „isTouching“grąžina 1. Funkcija taip pat nori parametro kaip įvesties, tai yra tolerancija, kad jis suveiktų. Kuo didesnė tolerancijos vertė, tuo ji tampa mažiau jautri. Nustatydamas radau, kad 15 veikė gerai, tačiau kadangi tai priklauso nuo okiliatoriaus dažnio ir kiek talpos pridedama paspaudus, turėtumėte eksperimentuoti su šia verte, kol rasite tai, kas jums tinka.

getChargeTime:

Jei norite sužinoti, kiek laiko užtruks įkrauti talpą iki CVREF įtampos, ši funkcija jį patikrins ir grąžins sveiką skaičių. Norėdami gauti laiką sekundėmis, naudokite šią formulę: (4 * getChargeTime) / oscillatorFrequency = chargeTimeInSeconds Ši formulė taip pat gali būti naudojama norint gauti tolerancijos įvestį iš funkcijos isTouching į sekundes.

Rekomenduojamas: