Բովանդակություն:

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

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

Video: Capacitive Touch With PIC16F886 միկրոկառավարիչ ՝ 3 քայլ
Video: Touch Sensor with CVD Capacitive Voltage Divider Library 2024, Նոյեմբեր
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 գործառույթից վայրկյանների հանդուրժողականության մուտքը ստանալու համար:

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