Spisu treści:

Dotyk pojemnościowy z mikrokontrolerem PIC16F886: 3 kroki
Dotyk pojemnościowy z mikrokontrolerem PIC16F886: 3 kroki

Wideo: Dotyk pojemnościowy z mikrokontrolerem PIC16F886: 3 kroki

Wideo: Dotyk pojemnościowy z mikrokontrolerem PIC16F886: 3 kroki
Wideo: Podstawy programowania mikrokontrolerów 2024, Lipiec
Anonim
Dotyk pojemnościowy z mikrokontrolerem PIC16F886
Dotyk pojemnościowy z mikrokontrolerem PIC16F886

W tym samouczku omówimy, w jaki sposób można użyć mikrokontrolera PIC16F886 do wykrywania różnic w pojemności, które można później wykorzystać do sprawdzenia, czy wciśnięty jest panel dotykowy. Dobrze jest zapoznać się z mikrokontrolerami pic przed wykonaniem tego projektu.

Krok 1: Podłącz obwód

Podłącz swój obwód
Podłącz swój obwód

Najpierw zacznijmy od okablowania obwodu zgodnie z powyższym schematem. Aby wykonać touchpad, możesz zwinąć folię aluminiową w kwadrat i przykleić taśmą drut. Możesz poeksperymentować z różnymi wartościami rezystora 100k, stwierdziłem, że 100k działa dobrze dla mnie.

Pin RC4 służy do rozpoczęcia ładowania/rozładowywania mierzonej pojemności. C12IN0 jest podłączony do strony - wewnętrznego komparatora, a pin C1IN jest podłączony do strony + tego samego komparatora. Mikrokontroler widzi pojemność jako w pełni naładowaną, gdy napięcie C12IN0 przekroczy napięcie C1IN. Rezystancyjny dzielnik napięcia zapewnia, że C1IN jest zbliżone do 5 woltów.

Ponieważ panel dotykowy zależy od znacznej pojemności między tobą a masą obwodu, istnieje możliwość, że bateria może nie działać.

Krok 2: Plik nagłówkowy

Plik nagłówkowy
Plik nagłówkowy

Skończyłeś ze wszystkimi połączeniami? Dobrze, będziemy kontynuować z plikiem nagłówkowym. Będziemy używać kompilatora XC8 i jak sugeruje tytuł, teraz utwórz nowy plik nagłówkowy w swoim projekcie i skopiuj i wklej poniższy kod. Możesz równie dobrze skopiować i wkleić go nad głównym kodem bez żadnego pliku nagłówkowego.

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

liczba int;

int CalibrationValue, maxCalibrationValue, minCalibrationValue;

int pobierzCzasObładowania(){

int licznik licznika = 0; int overflowCount = 0; //mierzona pojemność rozładowania RC4 = 0; _delay_ms(DISCHARGE_TIME); //daj wystarczająco dużo opóźnienia, aby całkowicie (prawie w pełni) rozładować "kondensator" //wyczyść flagę przepełnienia timera T0IF = 0; //czekaj na przepełnienie timera, rozpocznij liczenie od 0 while(!T0IF); T0JEŻELI = 0; //rozpocznij pomiar pojemności ładowania RC4 = 1; //czekaj na naładowanie pojemności do napięcia odniesienia while(C1OUT){ timerCount = TMR0; if(T0IF){ overflowCount++; T0JEŻELI = 0; } } count = (256 * overflowCount) + timerCount; //resetuj licznik licznika licznik licznika = 0; overflowCount = 0; liczba zwrotów; }

int dotyka(int tolerancja){

//średnia z wielu próbek podwójna średnia = 0; for(int i = 0; i wartośćkalibracji + tolerancja) średnia++; } średnia /= TOUCH_SAMPLE; //średnia będzie liczbą z zakresu od 0 do 1 if(średnia > 0,2) return 1; zwróć 0; }

pusta kalibracja (){

średnia int = 0; próbki int[CALIBRATION_SAMPLE]; //pobierz średnią wartość for(int i = 0; i < CALIBRATION_SAMPLE; i++){ sample = getChargeTime(); średnia += próbki; } średnia /= CALIBRATION_SAMPLE; WartośćKalibracji = średnia; //pobierz wartości max/min maxCalibrationValue = sample[0]; minCalibrationValue = sample[0]; for(int i = 0; i maxCalibrationValue) maxCalibrationValue = sample; if(samples < minCalibrationValue) minCalibrationValue = sample; } }

void setupCpacitiveTouch(){

//ustawienie pinu ładowania/rozładowania jako wyjścia, w tym przypadku jest to RC4 TRISCbits. TRISC4 = 0; //ustawianie timera0 T0CS = 0; PSA = 1; //ustawianie komparatora C1CH0 = 0; C1CH1 = 0; C1R = 0; C1ON = 1; C1POL = 0; //czyszczenie wartości licznika count = 0; //kasowanie wartości kalibracyjnych CalibrationValue = 0; maxCalibrationValue = 0; minWartośćKalibracji = 0; //uruchom kalibrację przy starcie kalibruj(); }

Krok 3: Pisanie kodu głównego

Zaczynając od głównego kodu, musisz dołączyć plik nagłówkowy utworzony w poprzednim kroku. Poniższy kod jest przykładem użycia funkcji isTouching jako przełącznika. W moim przypadku nadałem nagłówkowi nazwę capacitiveTouch.h.

#włączać

#include "capacitiveTouch.h"

// ta zmienna mówi, czy przycisk jest już naciśnięty, czy nie

int ostatni stan = 0;

nieważne główne () {

//ustawienie RC5 jako wyjścia TRISCbits. TRISC5 = 0; //musisz wywołać tę funkcję przy starcie programu setupCapacitiveTouch(); _delay_ms(1000); //kalibruj po dokładnym ustawieniu kalibracja(); while(1){ //sprawdzenie, czy przycisk jest naciśnięty if(isTouching(15) && lastState == 0){ if(RC5) RC5 = 0; w przeciwnym razie RC5 = 1; ostatni stan = 1; } //sprawdzenie, czy przycisk jest zwalniany else if(lastState == 1 && !isTouching(15)) lastState = 0; _delay_ms(20); } }

kalibrować:

Gdy ta funkcja zostanie wywołana, zmienne CalibrationValue, maxCalibrationValue i minCalibrationValue zostaną zaktualizowane. CalibrationValue jest używana przez funkcję isTouching. Należy pamiętać, że podczas kalibracji tabliczkę dotykową należy pozostawić samą.

konfiguracjaCapacitiveTouch:

Musi zostać wywołany na początku twojego programu. Konfiguruje niezbędne bity używane przez inne funkcje. Prowadzi również kalibrację. Jednak lepsze wyniki uzyskałem, odczekując sekundę i ponownie przeprowadzając kalibrację osobno.

dotyka:

Ta funkcja zwraca 1, jeśli wykryje wzrost pojemności na C12IN0 i zwraca 0, jeśli pojemność jest zbliżona do tej, którą była podczas kalibracji. Mówiąc prosto, jeśli ktoś dotknie padu, funkcja isTouching zwróci 1. Funkcja również potrzebuje parametru jako wejścia, jest to tolerancja na jej wyzwolenie. Im wyższa wartość tolerancji, tym mniej wrażliwa. W mojej konfiguracji stwierdziłem, że 15 działa dobrze, ale ponieważ zależy to od częstotliwości oscylatora i tego, ile pojemności dodaje się po naciśnięciu, powinieneś poeksperymentować z tą wartością, aż znajdziesz coś, co działa dla ciebie.

getChargeTime:

Jeśli chcesz wiedzieć, ile czasu zajmie naładowanie pojemności do napięcia CVREF, ta funkcja przetestuje ją i zwróci liczbę całkowitą. Aby uzyskać czas w sekundach, użyj następującej formuły: (4 * getChargeTime) / oscillatorFrequency = chargeTimeInSeconds Ta formuła może być również wykorzystana do obliczenia tolerancji danych wejściowych z funkcji isTouching na sekundy.

Zalecana: