Orodha ya maudhui:

Kugusa Nguvu Kwa PIC16F886 Microcontroller: 3 Hatua
Kugusa Nguvu Kwa PIC16F886 Microcontroller: 3 Hatua

Video: Kugusa Nguvu Kwa PIC16F886 Microcontroller: 3 Hatua

Video: Kugusa Nguvu Kwa PIC16F886 Microcontroller: 3 Hatua
Video: BigTreeTech - SKR 3 - TMC2208 UART 2024, Novemba
Anonim
Kugusa Nguvu na Microcontroller ya PIC16F886
Kugusa Nguvu na Microcontroller ya PIC16F886

Katika mafunzo haya tutapita jinsi unaweza kutumia microcontroller ya PIC16F886 kugundua utofauti wa uwezo, hii inaweza baadaye kutumiwa ikiwa pedi ya kugusa inasisitizwa. Ni vizuri kufahamiana na wadhibiti wa picha ndogo kabla ya kufanya mradi huu.

Hatua ya 1: Funga waya wako

Waya Up Mzunguko wako
Waya Up Mzunguko wako

Kwanza, wacha tuanze kwa kuunganisha nyaya kulingana na skimu hapo juu. Ili kutengeneza pedi ya kugusa unaweza kubandika karatasi ya aluminium kwenye mraba na mkanda kwenye waya. Unaweza kujaribu karibu na maadili tofauti kwa kontena la 100k, nimepata 100k inanifanyia kazi vizuri.

Pini ya RC4 hutumiwa kuanza kuchaji / kutoa uwezo unaopimwa. C12IN0 imeunganishwa na - upande wa kulinganisha wa ndani na pini ya C1IN imeunganishwa na + upande wa kulinganisha sawa. Mdhibiti mdogo huona uwezo umeshtakiwa kabisa wakati voltage ya C12IN0 inafikia juu ya voltage ya C1IN. Mgawanyiko wa voltage inayopinga huhakikisha kuwa C1IN iko karibu na volts 5.

Kwa kuwa pedi ya kugusa inategemea kuwa kuna uwezo mkubwa kati yako na uwanja wa mzunguko kuna uwezekano kwamba betri inaweza isifanye kazi.

Hatua ya 2: Faili ya kichwa

Faili ya Kichwa
Faili ya Kichwa

Imemalizika na viunganisho vyote? Nzuri, tutaendelea na faili ya kichwa. Tutatumia mkusanyaji wa XC8 na kama kichwa kinapendekeza sasa utaunda faili mpya ya kichwa katika mradi wako na unakili-weka nambari ifuatayo. Unaweza pia kunakili-kubandika juu ya nambari yako kuu bila faili yoyote ya kichwa.

#fafanua HALISI_SAMPLE 20 # fafanua GUSA_SAMPLE 10 #fafanua DISCHARGE_TIME 5

hesabu;

hesabu ya ndani Thamani, upeo wa MahesabuUthamini, minCalibrationValue;

wakati wa kupataChargeTime () {

tim timCount = 0; kufurika int = Hesabu = 0; // uwezo wa kutokwa kupimwa RC4 = 0; _kuchelewesha_ms (DISCHARGE_TIME); // toa ucheleweshaji wa kutosha kutekeleza kikamilifu (karibu kabisa kabisa) kutekeleza "capacitor" // wazi bendera ya kufurika kwa timer T0IF = 0; // subiri kipima muda, anza kuhesabu kutoka 0 wakati (! T0IF); T0IF = 0; // kuanza kuchaji uwezo wa kupimwa RC4 = 1; // subiri uwezo wa kulipia hadi voltage ya marejeleo wakati (C1OUT) {timerCount = TMR0; ikiwa (T0IF) {overflowCount ++; T0IF = 0; }} hesabu = (256 * kufurikaCount) + hesabu ya saa; // kuweka upya kipima mudaHesabu ya saaHesabu = 0; kufurikaCount = 0; hesabu ya kurudi; }

int isTouching (uvumilivu wa int) {

// wastani wa sampuli nyingi wastani mara mbili = 0; kwa (int i = 0; i calibration Thamani + uvumilivu) wastani ++; } wastani / = GUSA_SAMPLE; // wastani itakuwa nambari kati ya 0 na 1 ikiwa (wastani> 0.2) atarudi 1; kurudi 0; }

calibrate batili () {

wastani = 0; sampuli za [CALIBRATION_SAMPLE]; // pata wastani wa thamani ya (int i = 0; i <CALIBRATION_SAMPLE; i ++) {sampuli = getChargeTime (); wastani + = sampuli ; } wastani / = CALIBRATION_SAMPLE; calibrationValue = wastani; // pata max / min max maxCalibrationValue = sampuli [0]; Thamani ya minCalibrationValu = sampuli [0]; kwa (int i = 0; i maxCalibrationValue) maxCalibrationValue = sampuli ; ikiwa (sampuli <minCalibrationValue) minCalibrationValue = sampuli ; }}

batili setupCapacitiveTouch () {

// kuweka malipo / pini ya kutokwa kama pato, katika kesi hii ni RC4 TRISCbits. TRISC4 = 0; // kuanzisha kipima muda0 T0CS = 0; PSA = 1; // kuanzisha kulinganisha C1CH0 = 0; C1CH1 = 0; C1R = 0; C1ON = 1; C1POL = 0; // kusafisha hesabu za hesabu kuhesabu = 0; // kusafisha viwango vya calibrationValue = 0; Thamani ya upeo wa juu = 0; Thamani ya hesabu ya Min = 0; // kukimbia calibrate kwenye calibrate ya mwanzo (); }

Hatua ya 3: Kuandika Kanuni kuu

Kuanzia nambari kuu, utahitaji kujumuisha faili ya kichwa iliyoundwa katika hatua ya awali. Nambari ifuatayo ni mfano wa jinsi unaweza kutumia kazi ya kugusa kama kubadili. Katika kesi yangu nilipa kichwa jina capacitiveTouch.h.

# pamoja

# pamoja na "capacitiveTouch.h"

// ubadilishaji huu unaelezea ikiwa kifungo kiko au hakijakandamizwa tayari

int lastState = 0;

utupu kuu () {

// kuweka RC5 kama pato TRISCbits. TRISC5 = 0; // unahitaji kuita kazi hii mwanzoni mwa usanidi wa programuCapacitiveTouch (); _kuchelewesha_ms (1000); // calibrate baada ya usanidi wako halisi wa usanidi (); wakati (1) {// kuangalia ikiwa kitufe kinabanwa ikiwa (isTouching (15) && lastState == 0) {if (RC5) RC5 = 0; mwingine RC5 = 1; mwishoState = 1; } // kuangalia ikiwa kitufe kinatolewa kingine ikiwa (lastState == 1 &&! isTouching (15)) lastState = 0; _kuchelewesha_ms (20); }}

rekebisha:

Kazi hii itakapoitwa vigeuzi calibrationValue, maxCalibrationValue na minCalibrationValue zitasasishwa. Thamani ya calibration hutumiwa na kazi ya kugusa. Kumbuka kwamba pedi ya kugusa inapaswa kushoto peke yake wakati wa usawazishaji.

kuanzishaCapacitiveTouch:

Mahitaji ya kuitwa mwanzoni mwa programu yako. Inaweka bits muhimu zinazotumiwa na kazi zingine. Pia inaendesha callibration. Walakini nilipata matokeo bora kwa kusubiri sekunde moja na kuendesha upimaji tena tofauti.

Kugusa:

Kazi hii inarudi 1 ikiwa inagundua kuongezeka kwa uwezo kwenye C12IN0 na inarudi 0 ikiwa uwezo huo uko karibu na ile ilivyokuwa wakati wa usawazishaji. Inaelezewa tu, ikiwa mtu atagusa pedi kazi ya isTouching itarudi 1. Kazi pia inataka parameter kama pembejeo, huu ni uvumilivu wa hiyo kusababisha. Ya juu thamani ya uvumilivu hupata nyeti kidogo. Katika usanidi wangu nilipata 15 ikifanya kazi vizuri, lakini kwa sababu hii inategemea masafa ya ocsillator na ni kiasi gani cha uwezo kinachoongezwa unapobonyeza ni lazima ujaribu kuzunguka na thamani hii hadi utapata kitu kinachokufaa.

Wakati wa Charge:

Wakati unataka kujua ni muda gani utachukua kuchaji uwezo wa voltage ya CVREF, kazi hii itaijaribu na kurudisha nambari. Kupata muda kwa sekunde unatumia fomula hii: (4 * getChargeTime) / oscillatorFrequency = chargeTimeInSeconds Fomula hii pia inaweza kutumika kupata uingizaji wa uvumilivu kutoka kwa kazi ya IsTouching hadi sekunde.

Ilipendekeza: