Talaan ng mga Nilalaman:

Capacitive Touch Sa PIC16F886 Microcontroller: 3 Hakbang
Capacitive Touch Sa PIC16F886 Microcontroller: 3 Hakbang

Video: Capacitive Touch Sa PIC16F886 Microcontroller: 3 Hakbang

Video: Capacitive Touch Sa PIC16F886 Microcontroller: 3 Hakbang
Video: Easy Capacitive Touch Sense 2024, Nobyembre
Anonim
Capacitive Touch Sa PIC16F886 Microcontroller
Capacitive Touch Sa PIC16F886 Microcontroller

Sa tutorial na ito pupunta kami sa kung paano mo magagamit ang isang PIC16F886 microcontroller upang makita ang mga pagkakaiba sa capacitance, maaari itong magamit sa paglaon upang masabi kung ang isang touch pad ay pinindot. Mabuti na maging pamilyar sa mga pic microcontroller bago gawin ang proyektong ito.

Hakbang 1: Wire Up Ang iyong Circuit

Wire Up Ang iyong Circuit
Wire Up Ang iyong Circuit

Una, magsimula tayo sa pamamagitan ng mga kable ng circuit ayon sa eskematiko sa itaas. Upang makagawa ng touch pad maaari mong tiklop ang aluminyo foil sa isang parisukat at tape sa isang kawad. Maaari kang mag-eksperimento sa paligid ng iba't ibang mga halaga para sa 100k risistor, nakita kong 100k na gumana nang maayos para sa akin.

Ginamit ang RC4 pin upang simulan ang pagsingil / paglabas ng capacitance na susukat. Ang C12IN0 ay konektado sa - gilid ng isang panloob na paghahambing at ang C1IN pin ay konektado sa + gilid ng parehong kumpare. Nakita ng microcontroller ang capacitance bilang ganap na sisingilin kapag ang boltahe ng C12IN0 ay umabot sa itaas ng boltahe ng C1IN. Tinitiyak ng resistive voltage divider na ang C1IN ay malapit sa 5 volts.

Dahil ang touch pad ay nakasalalay sa pagkakaroon ng isang makabuluhang capacitance sa pagitan mo at ng circuit ground mayroong posibilidad na maaaring hindi gumana ang isang baterya.

Hakbang 2: Ang Header File

Ang Header File
Ang Header File

Tapos sa lahat ng mga koneksyon? Mabuti, magpapatuloy kami sa header file. Gagamitin namin ang XC8 compiler at tulad ng pamagat ng pamagat na lilikha ka ngayon ng isang bagong header file sa iyong proyekto at kopyahin ang sumusunod na code. Maaari mo ring kopyahin-i-paste ito sa itaas ng iyong pangunahing code nang walang anumang header file.

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

int count;

int calibrationValue, maxCalibrationValue, minCalibrationValue;

int getChargeTime () {

int timerCount = 0; int overflowCount = 0; // discharge capacitance upang masukat RC4 = 0; _delay_ms (DISCHARGE_TIME); // bigyan ng sapat na pagkaantala upang ganap (halos ganap na talagang) maalis ang "capacitor" // i-clear ang timer overflow flag T0IF = 0; // maghintay para sa timer na umapaw, simulang bilang mula sa 0 habang (! T0IF); T0IF = 0; // simulan ang pagsingil ng capacitance upang masusukat RC4 = 1; // maghintay para sa capacitance na singilin hanggang sa boltahe ng referance habang (C1OUT) {timerCount = TMR0; kung (T0IF) {overflowCount ++; T0IF = 0; }} count = (256 * overflowCount) + timerCount; // reset timerCount timerCount = 0; overflowCount = 0; bilang ng pagbalik; }

int isTouching (int tolerance) {

// average ng maraming mga sample dobleng average = 0; para sa (int i = 0; i calibrationValue + tolerance) average ++; } average / = TOUCH_SAMPLE; // average ay magiging isang numero sa pagitan ng 0 at 1 kung (average> 0.2) return 1; ibalik ang 0; }

void calibrate () {

int average = 0; int sample [CALIBRATION_SAMPLE]; // get average value for (int i = 0; i <CALIBRATION_SAMPLE; i ++) {sample = getChargeTime (); average + = mga sample ; } average / = CALIBRATION_SAMPLE; calibrationValue = average; // get max / min halaga maxCalibrationValue = mga sample [0]; minCalibrationValue = mga sample [0]; para sa (int i = 0; i maxCalibrationValue) maxCalibrationValue = mga sample ; kung (mga sample <minCalibrationValue) minCalibrationValue = mga sample ; }}

walang bisa ang setupCapacitiveTouch () {

// setting setting / debit pin bilang output, sa kasong ito ito ay RC4 TRISCbits. TRISC4 = 0; // setting up timer0 T0CS = 0; PSA = 1; // setting up comparator C1CH0 = 0; C1CH1 = 0; C1R = 0; C1ON = 1; C1POL = 0; // clearing count count count = 0; // clearing calibration values calibrationValue = 0; maxCalibrationValue = 0; minCalibrationValue = 0; // run calibration on start calibrate (); }

Hakbang 3: Pagsulat ng Pangunahing Code

Simula sa pangunahing code, kakailanganin mong isama ang header file na nilikha sa nakaraang hakbang. Ang sumusunod na code ay isang halimbawa ng kung paano mo magagamit ang pagpapaandar ng isTouching bilang isang switch. Sa aking kaso binigyan ko ang header ng pangalang capacitiveTouch.h.

# isama

# isama ang "capacitiveTouch.h"

// ang variable na ito ay nagsasabi kung ang pindutan ay o hindi pa pinindot

int lastState = 0;

void main () {

// setting RC5 as output TRISCbits. TRISC5 = 0; // kailangan mong tawagan ang pagpapaandar na ito hanggang sa pagsisimula ng program setupCapacitiveTouch (); _delay_ms (1000); // calibrate pagkatapos ng iyong eksaktong pag-set up ng calibrate (); habang (1) {// pagsuri kung ang pindutan ay nakakakuha ng pinindot kung (isTouching (15) && lastState == 0) {kung (RC5) RC5 = 0; iba pa RC5 = 1; lastState = 1; } // pagsuri kung ang pindutan ay pinakawalan kung iba pa (lastState == 1 &&! isTouching (15)) lastState = 0; _delay_ms (20); }}

i-calibrate:

Kapag tinawag ang pagpapaandar na ito ng mga variable na calibrationValue, maa-update ang maxCalibrationValue at minCalibrationValue. calibrationValue ay ginagamit ng pagpapaandar ng isTouching. Tandaan na ang touch pad ay dapat iwanang nag-iisa sa pagkakalibrate.

setupCapacitiveTouch:

Kailangang tawagan sa simula ng iyong programa. Itinatakda nito ang mga kinakailangang piraso na ginamit ng iba pang mga pagpapaandar. Nagpapatakbo din ito ng isang callibration. Gayunpaman nakuha ko ang mas mahusay na mga resulta sa pamamagitan ng paghihintay ng isang segundo at patakbuhin muli ang pagkakalibrate nang hiwalay.

isTouching:

Ang pagpapaandar na ito ay nagbabalik ng 1 kung nakita nito ang isang pagtaas sa capacitance sa C12IN0 at ibabalik ang 0 kung ang capacitance ay malapit sa isa na ito ay habang naka-calibrate. Sa simpleng pahayag, kung ang isang tao ay hawakan ang pad ang isTouching function ay babalik 1. Ang pagpapaandar ay nais din ng isang parameter bilang isang input, ito ang pagpapaubaya para sa mga ito upang ma-trigger. Ang mas mataas na halaga ng pagpapaubaya ay hindi gaanong sensitibo. Sa aking pag-set up natagpuan ko ang 15 na gumana nang maayos, ngunit dahil nakasalalay ito sa dalas ng ocsillator at kung magkano ang idinagdag na capacitance kapag pinindot mo ito dapat mong eksperimento sa halagang ito hanggang sa makahanap ka ng isang bagay na gumagana para sa iyo.

getChargeTime:

Kung nais mong malaman kung gaano katagal aabutin upang singilin ang kapasidad sa boltahe ng CVREF, susubukan ito ng pagpapaandar na ito at ibabalik ang isang integer. Upang makuha ang oras sa mga segundo gagamitin mo ang formula na ito: (4 * getChargeTime) / oscillatorFrequency = chargeTimeInSeconds Ang formula na ito ay maaari ding magamit upang makuha ang input ng pagpapaubaya mula sa pagpapaandar ng isTouching hanggang segundo.

Inirerekumendang: