Mundarija:

PIC16F886 mikrokontrolerli sig'imli sensor: 3 qadam
PIC16F886 mikrokontrolerli sig'imli sensor: 3 qadam

Video: PIC16F886 mikrokontrolerli sig'imli sensor: 3 qadam

Video: PIC16F886 mikrokontrolerli sig'imli sensor: 3 qadam
Video: Как поработить человечество ►1 Прохождение Destroy all humans! 2024, Noyabr
Anonim
PIC16F886 mikrokontrolerli sig'imli sensor
PIC16F886 mikrokontrolerli sig'imli sensor

Ushbu qo'llanmada biz sig'imdagi farqlarni aniqlash uchun PIC16F886 mikrokontroleridan qanday foydalanish mumkinligini ko'rib chiqamiz, keyinchalik bu sensorli panel bosilganligini aniqlash uchun ishlatilishi mumkin. Loyihani amalga oshirishdan oldin mikrokontrollerlar bilan tanishish yaxshi.

1 -qadam: O'chirish davrasini uzing

O'z davrangizni elektr tarmog'iga ulang
O'z davrangizni elektr tarmog'iga ulang

Birinchidan, sxemani yuqoridagi sxema bo'yicha ulashdan boshlaylik. Sensorli panelni yaratish uchun siz alyumin folga kvadratga o'ralib, simga lenta qo'yishingiz mumkin. Siz 100k qarshilik uchun turli qiymatlar bilan tajriba o'tkazishingiz mumkin, men 100k men uchun yaxshi ishlaganini topdim.

RC4 pimi o'lchanadigan sig'imni zaryad qilish/tushirishni boshlash uchun ishlatiladi. C12IN0 ichki taqqoslagichning yon tomoniga, C1IN pimi esa xuddi shu taqqoslagichning + tomoniga ulangan. Mikrokontroller C12IN0 zo'riqishi C1IN kuchlanishidan yuqori bo'lganida, sig'im to'liq zaryadlangan deb hisoblaydi. Rezistiv kuchlanish bo'luvchi C1IN 5 voltga yaqin ekanligiga ishonch hosil qiladi.

Sensorli panel siz va kontaktlarning zanglashiga olib boruvchi quvvati o'rtasida bog'liq bo'lgani uchun, batareyaning ishlamasligi ehtimoli bor.

2 -qadam: Sarlavha fayli

Sarlavha fayli
Sarlavha fayli

Barcha ulanishlar tugadimi? Yaxshi, biz sarlavha faylini davom ettiramiz. Biz XC8 kompilyatoridan foydalanamiz va sarlavhadan ko'rinib turibdiki, endi siz loyihangizda yangi sarlavha faylini yaratasiz va quyidagi kodni nusxa ko'chirasiz. Siz hech qanday sarlavha faylisiz uni asosiy kodingiz ustiga nusxalashingiz mumkin.

#kalibratsiya_MASALASI 20 ni belgilang #TOUCH_SAMPLE 10 ni aniqlang #yuklash vaqtini aniqlang 5

int soni;

int calibrationValue, maxCalibrationValue, minCalibrationValue;

int getChargeTime () {

int timerCount = 0; int overflowCount = 0; // o'lchash kerak bo'lgan tushirish sig'imi RC4 = 0; _delay_ms (DISCHARGE_TIME); // "kondansatkichni" to'liq (deyarli to'liq) chiqarib yuborish uchun etarli kechikish bering // taymer to'lib ketish bayrog'ini tozalang T0IF = 0; // taymer oshib ketishini kuting, hisobni 0 dan boshlang (! T0IF); T0IF = 0; // o'lchash uchun zaryadlovchi sig'imini boshlash RC4 = 1; // (C1OUT) {timerCount = TMR0; agar (T0IF) {overflowCount ++; T0IF = 0; }} count = (256 * overflowCount) + timerCount; // reset timerCount timerCount = 0; overflowCount = 0; qaytarish soni; }

int isTouch (int bag'rikenglik) {

// bir nechta namunalarning o'rtacha ikki baravar ortasi = 0; for (int i = 0; i calibrationValue+tolerance) o'rtacha ++; } o'rtacha /= TOUCH_SAMPLE; // o'rtacha 0 dan 1 gacha bo'lgan son bo'ladi, agar (o'rtacha> 0,2) 1 qaytsa; qaytarish 0; }

bekor kalibrlash () {

int o'rtacha = 0; int namunalari [CALIBRATION_SAMPLE]; // (int i = 0; i <CALIBRATION_SAMPLE; i ++) {namuna = getChargeTime () uchun o'rtacha qiymatni oling; o'rtacha += namunalar ; } o'rtacha /= CALIBRATION_SAMPLE; calibrationValue = o'rtacha; // max/min qiymatlarini olish maxCalibrationValue = namunalar [0]; minCalibrationValue = namunalar [0]; for (int i = 0; i maxCalibrationValue) maxCalibrationValue = namunalar ; if (namunalar <minCalibrationValue) minCalibrationValue = namunalar ; }}

void setupCapacitiveTouch () {

// zaryad/tushirish pinini chiqish sifatida o'rnatish, bu holda bu RC4 TRISCbits. TRISC4 = 0; // taymerni sozlash0 T0CS = 0; PSA = 1; // komparatorni sozlash C1CH0 = 0; C1CH1 = 0; C1R = 0; C1ON = 1; C1POL = 0; // tozalash qiymatlari hisobini tozalash = 0; // kalibrlash qiymatlarini tozalash calibrationValue = 0; maxCalibrationValue = 0; minCalibrationValue = 0; // kalibrlashni start calibrate -da ishga tushirish (); }

3 -qadam: Asosiy kodni yozish

Asosiy koddan boshlab, oldingi qadamda yaratilgan sarlavha faylini kiritishingiz kerak bo'ladi. Quyidagi kod isTouching funktsiyasini kalit sifatida qanday ishlatishingiz mumkinligiga misol. Mening vaziyatimda sarlavhaga capacitiveTouch.h nomini berdim.

#qo'shing

#"capacitiveTouch.h" ni qo'shing

// bu o'zgaruvchi tugma bosilgan yoki bosilmaganligini bildiradi

int lastState = 0;

void main () {

// RC5 ni TRISCbits. TRISC5 = 0 chiqishi sifatida sozlash; // setupCapacitiveTouch () dasturining boshlanishida siz ushbu funktsiyani chaqirishingiz kerak; _ kechikish (1000); // aniq sozlangandan keyin sozlang kalibrlash (); while (1) {// agar tugmani bosilishini tekshirish (isTouching (15) && lastState == 0) {if (RC5) RC5 = 0; boshqa RC5 = 1; lastState = 1; } // boshqa tugma chiqayotganligini tekshirish, agar (lastState == 1 &&! isTouching (15)) lastState = 0; _ kechikish (20); }}

kalibrlash:

Qachon bu funksiya o'zgaruvchilar deb nomlansa calibrationValue, maxCalibrationValue va minCalibrationValue yangilanadi. calibrationValue isTouching funktsiyasi tomonidan ishlatiladi. Kalibrlash paytida sensorli panelni yolg'iz qoldirish kerakligini unutmang.

setupCapacitiveTouch:

Dasturning boshida qo'ng'iroq qilish kerak. U boshqa funktsiyalar uchun zarur bo'lgan bitlarni o'rnatadi. Bundan tashqari, kalibrlash ishlaydi. Biroq, men bir soniya kutib, kalibrlashni alohida -alohida bajarib, yaxshiroq natijalarga erishdim.

tegmoqda:

Agar bu funktsiya C12IN0 da sig'imning oshishini aniqlasa, 1 ni qaytaradi va agar sig'im kalibrlash paytida bo'lganiga yaqin bo'lsa, 0 ni qaytaradi. Oddiy qilib aytganda, agar kimdir padga tegsa, isTouching funktsiyasi qaytadi. Funktsiya parametr sifatida kirishni xohlaydi, bu uning ishga tushishiga bardoshlikdir. Bardoshlik qiymati qanchalik yuqori bo'lsa, u shunchalik sezgir bo'ladi. O'rnatishimda men 15 ta yaxshi ish topdim, lekin bu osilator chastotasiga va uni bosganingizda qancha sig'im qo'shilishiga bog'liq bo'lgani uchun siz o'zingiz uchun mos keladigan narsani topmaguningizcha bu qiymat bilan tajriba o'tkazishingiz kerak.

getChargeTime:

Agar siz CVREF kuchlanishiga sig'imning zaryadlanishi qancha vaqt ketishini bilmoqchi bo'lsangiz, bu funksiya uni tekshiradi va butun sonni qaytaradi. Vaqtni soniyalarda olish uchun siz ushbu formuladan foydalanasiz: (4 * getChargeTime) / oscillatorFrequency = chargeTimeInSeconds Bu formuladan isTouching funksiyasidan bardoshlik kiritishini soniyalargacha olish uchun ham foydalanish mumkin.

Tavsiya: