Capacitive Touch With PIC16F886 միկրոկառավարիչ ՝ 3 քայլ
Capacitive Touch With PIC16F886 միկրոկառավարիչ ՝ 3 քայլ
Anonim
Capacitive Touch With PIC16F886 միկրոկառավարիչ
Capacitive Touch With PIC16F886 միկրոկառավարիչ

Այս ձեռնարկում մենք կանդրադառնանք, թե ինչպես կարող եք օգտագործել PIC16F886 միկրոկոնտրոլերը `տարողունակության տարբերությունները հայտնաբերելու համար, որը հետագայում կարող է օգտագործվել ՝ հպման բարձիկի սեղմման դեպքում: Նախքան այս նախագիծը պատրաստելը լավ է ծանոթ լինել միկրոկառավարիչների հետ:

Քայլ 1: Լարացրեք ձեր սխեման

Լարացրեք ձեր սխեման
Լարացրեք ձեր սխեման

Նախ, եկեք սկսենք էլեկտրագծերի միացումից ՝ ըստ վերը նշված սխեմայի: Կպչուն պահոց պատրաստելու համար դուք կարող եք ալյումինե փայլաթիթեղը քառակուսի ծալել, իսկ ժապավենը `մետաղալարի վրա: 100k դիմադրության համար կարող եք տարբեր արժեքներով փորձարկել, ես գտա, որ 100k- ն ինձ համար լավ է աշխատել:

RC4 քորոցն օգտագործվում է չափվող հզորությունը լիցքավորելու/լիցքաթափելու համար: C12IN0- ը միացված է ներքին համեմատիչի - կողմին, իսկ C1IN- ի կապը միացված է նույն համեմատիչի + կողմին: Միկրոկոնտրոլերը տեսնում է, որ հզորությունը լիովին լիցքավորված է, երբ C12IN0 լարումը հասնում է C1IN լարման մակարդակին: Դիմադրողական լարման բաժանարարը համոզված է, որ C1IN- ը մոտ է 5 վոլտին:

Քանի որ հպման պահոցը կախված է ձեր և միացման միջանցքի միջև զգալի հզորությունից, հնարավոր է, որ մարտկոցը չաշխատի:

Քայլ 2: Վերնագրի ֆայլ

Վերնագրի ֆայլը
Վերնագրի ֆայլը

Ավարտե՞լ եք բոլոր կապերով: Լավ, մենք կշարունակենք վերնագրի ֆայլը: Մենք կօգտագործենք XC8 կոմպիլյատորը, և ինչպես ենթադրվում է վերնագրից, այժմ դուք պետք է ստեղծեք նոր վերնագրի ֆայլ ձեր նախագծում և պատճենեք-տեղադրեք հետևյալ ծածկագիրը: Դուք կարող եք նույնքան լավ պատճենել-տեղադրեք այն ձեր հիմնական կոդի վերևում ՝ առանց վերնագրի ֆայլի:

#սահմանել CALIBRATION_SAMPLE 20 #սահմանել TOUCH_SAMPLE 10 #սահմանել DISCHARGE_TIME 5

int հաշվարկ;

int calibrationValue, maxCalibrationValue, minCalibrationValue;

int getChargeTime () {

int timerCount = 0; int overflowCount = 0; // չափվող արտանետվող հզորությունը RC4 = 0; _ ուշացումով (DISCHARGE_TIME); // բավականաչափ ուշացում տալ «կոնդենսատորը» ամբողջությամբ (գրեթե ամբողջությամբ) լիցքաթափելու համար // ջնջել ժամաչափի արտահոսքի դրոշը T0IF = 0; // սպասեք, որ ժամաչափը լցվի, սկսեք հաշվել 0 -ից մինչ (! T0IF); T0IF = 0; // սկսել լիցքավորման հզորությունը, որը պետք է չափվի RC4 = 1; // սպասեք, որ հզորությունը լիցքավորվի մինչև հղման լարումը (C1OUT) {timerCount = TMR0; եթե (T0IF) {overflowCount ++; T0IF = 0; }} count = (256 * overflowCount) + timerCount; // վերականգնել timerCount timerCount = 0; overflowCount = 0; վերադարձի հաշվարկ; }

int isTouching (int հանդուրժողականություն) {

// բազմակի նմուշների միջինը կրկնակի միջին = 0; համար (int i = 0; i calibrationValue+tolerance) միջին ++; } միջին /= TOUCH_SAMPLE; // միջինը կլինի թիվ 0 -ից 1 -ի միջև, եթե (միջինը> 0.2) վերադարձնի 1; վերադարձ 0; }

դատարկ calibrate () {

int միջին = 0; int նմուշներ [CALIBRATION_SAMPLE]; // ստանալ միջին արժեքը (int i = 0; i <CALIBRATION_SAMPLE; i ++) {sample = getChargeTime (); միջին += նմուշներ ; } միջին /= CALIBRATION_SAMPLE; calibrationValue = միջին; // ստանալ max/min արժեքներ maxCalibrationValue = նմուշներ [0]; minCalibrationValue = նմուշներ [0]; համար (int i = 0; i maxCalibrationValue) maxCalibrationValue = նմուշներ ; եթե (նմուշներ <minCalibrationValue) minCalibrationValue = նմուշներ ; }}

void setupCapacitiveTouch () {

// լիցքավորման/լիցքավորման քորոցը որպես ելք սահմանել, այս դեպքում դա RC4 TRISCbits. TRISC4 = 0; // ժամանակաչափի տեղադրում 0 T0CS = 0; PSA = 1; // համեմատիչի տեղադրում C1CH0 = 0; C1CH1 = 0; C1R = 0; C1ON = 1; C1POL = 0; // մաքրման հաշվարկի արժեքների հաշվարկ = 0; // calibration արժեքների մաքրում calibrationValue = 0; maxCalibrationValue = 0; minCalibrationValue = 0; // գործարկել calibration սկզբնական calibrate (); }

Քայլ 3. Գրեք հիմնական ծածկագիրը

Սկսած հիմնական կոդից ՝ ձեզ հարկավոր է ներառել նախորդ քայլում ստեղծված վերնագրի ֆայլը: Հետևյալ կոդը օրինակ է, թե ինչպես կարող եք օգտագործել isTouching գործառույթը որպես անջատիչ: Իմ դեպքում վերնագրին տվեցի capacitiveTouch.h անունը:

#ներառում

#ներառել «capacitiveTouch.h»

// այս փոփոխականն ասում է, եթե կոճակը սեղմված է կամ դեռ սեղմված չէ

int lastState = 0;

դատարկ հիմնական () {

// RC5- ը որպես ելք TRISCbits. TRISC5 = 0; // դուք պետք է այս գործառույթը կանչեք ծրագրի setupCapacitiveTouch () սկզբին; _ ուշացում (1000); // calibrate ձեր ճշգրիտ կարգավորումից հետո calibrate (); իսկ (1) {// ստուգում, եթե կոճակը սեղմվում է if (isTouching (15) && lastState == 0) {if (RC5) RC5 = 0; այլ RC5 = 1; lastState = 1; } // ստուգում, արդյոք կոճակը այլևս ազատվում է, եթե (lastState == 1 &&! isTouching (15)) lastState = 0; _ ուշացումով (20); }}

calibrate:

Երբ այս գործառույթը կոչվի փոփոխականներ calibrationValue, maxCalibrationValue և minCalibrationValue կթարմացվեն: calibrationValue- ն օգտագործվում է isTouching գործառույթի կողմից: Հիշեք, որ սենսորային պահոցը պետք է միայնակ մնա տրամաչափման ընթացքում:

setupCapacitiveTouch:

Անհրաժեշտ է զանգահարել ձեր ծրագրի սկզբում: Այն սահմանում է այլ գործառույթների կողմից օգտագործվող անհրաժեշտ բիթերը: Այն նաև վարում է կալիբրացիա: Այնուամենայնիվ, ես ավելի լավ արդյունքներ ստացա `սպասելով մեկ վայրկյան և նորից առանձին -առանձին գործարկեցի չափագրումը:

isTouching:

Այս ֆունկցիան վերադարձնում է 1 -ը, եթե հայտնաբերում է C12IN0- ի հզորության բարձրացում և վերադարձնում 0 -ը, եթե հզորությունը մոտ է նրան, ինչ եղել է կալիբրացիայի ժամանակ: Պարզապես ասված է, որ եթե ինչ -որ մեկը դիպչի բարձիկին, isTouching գործառույթը կվերադառնա 1. Ֆունկցիան նաև ուզում է պարամետր որպես մուտքագրում, սա է դրա հանդուրժողականությունը: Որքան բարձր է հանդուրժողականության արժեքը, այնքան պակաս զգայուն է դառնում: Իմ տեղադրման մեջ ես գտա, որ 15 -ը լավ են աշխատել, բայց քանի որ դա կախված է օկիլյատորների հաճախականությունից և այն, թե որքան հզորություն է ավելացվում այն սեղմելիս, պետք է փորձեք այս արժեքով, մինչև չգտնեք ինչ -որ բան, որը ձեզ հարմար է:

getChargeTime:

Երբ ցանկանում եք իմանալ, թե որքան ժամանակ կպահանջվի CVREF լարման հզորությունը լիցքավորելու համար, այս գործառույթը կփորձարկի այն և կվերադարձնի մի ամբողջ թիվ: Վայրկյաններում ժամանակը ստանալու համար օգտագործեք այս բանաձևը. (4 * getChargeTime) / oscillatorFrequency = chargeTimeInSeconds Այս բանաձևը կարող է օգտագործվել նաև isTouching գործառույթից վայրկյանների հանդուրժողականության մուտքը ստանալու համար:

Խորհուրդ ենք տալիս: