Съдържание:

Капацитивно докосване с микроконтролер PIC16F886: 3 стъпки
Капацитивно докосване с микроконтролер PIC16F886: 3 стъпки

Видео: Капацитивно докосване с микроконтролер PIC16F886: 3 стъпки

Видео: Капацитивно докосване с микроконтролер PIC16F886: 3 стъпки
Видео: 🛜Neil Degrasse Tyson, WRONG about Tesla?!? 🛜 ​⁠@joerogan (30min) 2024, Ноември
Anonim
Капацитивно докосване с микроконтролер PIC16F886
Капацитивно докосване с микроконтролер PIC16F886

В този урок ще разгледаме как можете да използвате микроконтролер PIC16F886 за откриване на разлики в капацитета, което по -късно може да се използва за определяне дали е натиснат тъчпад. Добре е да сте запознати с микроконтролерите за снимки преди да направите този проект.

Стъпка 1: Свържете вашата верига

Свържете вашата верига
Свържете вашата верига

Първо, нека започнем с свързване на веригата съгласно схемата по -горе. За да направите тъчпад, можете да сгънете алуминиево фолио в квадрат и да залепите лента върху тел. Можете да експериментирате с различни стойности за 100k резистор, открих, че 100k ми работи добре.

Щифтът RC4 се използва за започване на зареждане/разреждане на измервания капацитет. C12IN0 е свързан към - страната на вътрешен компаратор, а щифтът C1IN е свързан към + страната на същия сравнител. Микроконтролерът вижда капацитета като напълно зареден, когато напрежението C12IN0 достигне над напрежението C1IN. Резистивният делител на напрежение гарантира, че C1IN е близо до 5 волта.

Тъй като тъчпадът зависи от наличието на значителен капацитет между вас и масата на веригата, има вероятност батерията да не работи.

Стъпка 2: Заглавният файл

Заглавният файл
Заглавният файл

Приключихте с всички връзки? Добре, ще продължим с заглавния файл. Ще използваме компилатора XC8 и както подсказва заглавието, сега трябва да създадете нов заглавен файл във вашия проект и да копирате и поставите следния код. Можете също така да го копирате-поставите над основния си код без никакъв заглавен файл.

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

int брой;

int calibrationValue, maxCalibrationValue, minCalibrationValue;

int getChargeTime () {

int timerCount = 0; int overflowCount = 0; // разряден капацитет за измерване RC4 = 0; _ закъснение_ms (DISCHARGE_TIME); // даваме достатъчно забавяне за пълно (почти напълно реално) разреждане на "кондензатора" // изчистване на флага за препълване на таймера T0IF = 0; // изчакайте таймера да препълни, стартиране на брояча от 0 while (! T0IF); T0IF = 0; // стартиране на зареждащия капацитет за измерване RC4 = 1; // изчакайте капацитетът да се зареди до референтното напрежение докато (C1OUT) {timerCount = TMR0; if (T0IF) {overflowCount ++; T0IF = 0; }} count = (256 * overflowCount) + timerCount; // нулиране на timerCount timerCount = 0; overflowCount = 0; брой връщания; }

int isTouching (int tolerance) {

// средна стойност на множество проби двойна средна стойност = 0; за (int i = 0; i calibrationValue+толеранс) средно ++; } средно /= TOUCH_SAMPLE; // средното ще бъде число между 0 и 1, ако (средно> 0,2) върне 1; връщане 0; }

void calibrate () {

int средно = 0; int проби [CALIBRATION_SAMPLE]; // получаваме средна стойност за (int i = 0; i <CALIBRATION_SAMPLE; i ++) {проби = getChargeTime (); средно += проби ; } средно /= CALIBRATION_SAMPLE; calibrationValue = средно; // получаваме максимални/минимални стойности maxCalibrationValue = проби [0]; minCalibrationValue = проби [0]; for (int i = 0; i maxCalibrationValue) maxCalibrationValue = проби ; if (проби <minCalibrationValue) minCalibrationValue = проби ; }}

void setupCapacitiveTouch () {

// задаване на извод за зареждане/разреждане, в този случай това е RC4 TRISCbits. TRISC4 = 0; // настройка на таймер0 T0CS = 0; PSA = 1; // настройка на компаратора C1CH0 = 0; C1CH1 = 0; C1R = 0; C1ON = 1; C1POL = 0; // изчистване на стойностите на броя count = 0; // изчистване на стойностите за калибриране calibrationValue = 0; maxCalibrationValue = 0; minCalibrationValue = 0; // стартиране на калибриране при стартиране calibrate (); }

Стъпка 3: Написване на основния код

Започвайки с основния код, ще трябва да включите заглавния файл, създаден в предишната стъпка. Следният код е пример за това как можете да използвате функцията isTouching като превключвател. В моя случай дадох на заглавката името capacitiveTouch.h.

#включва

#include "capacitiveTouch.h"

// тази променлива казва дали бутонът е натиснат или не

int lastState = 0;

void main () {

// настройка на RC5 като изход TRISCbits. TRISC5 = 0; // трябва да извикате тази функция при стартиране на програмата setupCapacitiveTouch (); _ закъснение_ms (1000); // калибриране след вашата точна настройка calibrate (); while (1) {// проверка дали бутонът се натиска if (isTouching (15) && lastState == 0) {if (RC5) RC5 = 0; иначе RC5 = 1; lastState = 1; } // проверка дали бутонът се освобождава иначе if (lastState == 1 &&! isTouching (15)) lastState = 0; _ закъснение_ms (20); }}

калибриране:

Когато тази функция бъде извикана променливите calibrationValue, maxCalibrationValue и minCalibrationValue ще бъдат актуализирани. calibrationValue се използва от функцията isTouching. Имайте предвид, че тъчпадът трябва да бъде оставен сам по време на калибрирането.

setupCapacitiveTouch:

Трябва да бъде извикан в началото на вашата програма. Той задава необходимите битове, използвани от другите функции. Той също така изпълнява калибриране. Въпреки това получих по -добри резултати, като изчаках секунда и стартирах калибрирането отново отделно.

е докосване:

Тази функция връща 1, ако открие увеличаване на капацитета на C12IN0 и връща 0, ако капацитетът е близък до този, който е бил по време на калибрирането. Просто казано, ако някой докосне подложката, функцията isTouching ще върне 1. Функцията също иска параметър като вход, това е допустимото отклонение за задействане. Колкото по -висока е толерантността, толкова по -малко чувствителна става. В моята настройка открих, че 15 работи добре, но тъй като това зависи от честотата на оксилатора и колко капацитет се добавя, когато го натиснете, трябва да експериментирате с тази стойност, докато намерите нещо, което работи за вас.

getChargeTime:

Когато искате да знаете колко време ще отнеме зареждането на капацитета до напрежението CVREF, тази функция ще го тества и ще върне цяло число. За да получите времето в секунди, използвайте тази формула: (4 * getChargeTime) / oscillatorFrequency = chargeTimeInSeconds Тази формула може да се използва и за извеждане на толеранса от функцията isTouching до секунди.

Препоръчано: