Inhaltsverzeichnis:

Kapazitiver Touch mit Mikrocontroller PIC16F886 - Gunook
Kapazitiver Touch mit Mikrocontroller PIC16F886 - Gunook

Video: Kapazitiver Touch mit Mikrocontroller PIC16F886 - Gunook

Video: Kapazitiver Touch mit Mikrocontroller PIC16F886 - Gunook
Video: BitBastelei #375 - Keypads mit Mikrocontroller/Arduino: Typen und Ansteuerung 2024, Juli
Anonim
Kapazitiver Touch mit PIC16F886 Mikrocontroller
Kapazitiver Touch mit PIC16F886 Mikrocontroller

In diesem Tutorial erfahren Sie, wie Sie einen PIC16F886-Mikrocontroller verwenden können, um Kapazitätsunterschiede zu erkennen. Dies kann später verwendet werden, um festzustellen, ob ein Touchpad gedrückt wird. Es ist gut, sich mit Pic-Mikrocontrollern vertraut zu machen, bevor Sie dieses Projekt durchführen.

Schritt 1: Verdrahten Sie Ihre Schaltung

Verdrahten Sie Ihre Schaltung
Verdrahten Sie Ihre Schaltung

Beginnen wir zunächst mit der Verdrahtung der Schaltung gemäß dem obigen Schema. Um das Touchpad herzustellen, können Sie Aluminiumfolie zu einem Quadrat falten und auf einen Draht kleben. Sie können mit verschiedenen Werten für den 100k-Widerstand herumexperimentieren, ich fand 100k gut für mich.

Der RC4-Pin wird verwendet, um das Laden/Entladen der zu messenden Kapazität zu starten. C12IN0 ist mit der - Seite eines internen Komparators verbunden und der C1IN Pin ist mit der + Seite desselben Komparators verbunden. Der Mikrocontroller sieht die Kapazität als vollständig geladen an, wenn die Spannung C12IN0 die Spannung C1IN überschreitet. Der ohmsche Spannungsteiler stellt sicher, dass C1IN nahe 5 Volt liegt.

Da das Touchpad von einer erheblichen Kapazität zwischen Ihnen und der Schaltungsmasse abhängt, besteht die Möglichkeit, dass eine Batterie nicht funktioniert.

Schritt 2: Die Header-Datei

Die Header-Datei
Die Header-Datei

Fertig mit allen Anschlüssen? Gut, wir fahren mit der Header-Datei fort. Wir verwenden den XC8-Compiler und wie der Titel schon sagt, erstellen Sie jetzt eine neue Header-Datei in Ihrem Projekt und kopieren den folgenden Code. Sie können es auch ohne Header-Datei über Ihren Hauptcode kopieren und einfügen.

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

int zählen;

int CalibrationValue, maxCalibrationValue, minCalibrationValue;

int getChargeTime(){

int TimerCount = 0; int overflowCount = 0; // zu messende Entladekapazität RC4 = 0; _delay_ms(ENTLADEN_ZEIT); // genügend Verzögerung geben, um den "Kondensator" vollständig (fast vollständig) zu entladen // das Timer-Überlauf-Flag löschen T0IF = 0; // Warten Sie, bis der Timer überläuft, beginnen Sie mit der Zählung von 0 while (!T0IF); T0IF = 0; // zu messende Ladekapazität starten RC4 = 1; // warten, bis die Kapazität bis zur Referenzspannung aufgeladen ist, während (C1OUT) {timerCount = TMR0; if (T0IF) { overflowCount ++; T0IF = 0; } } count = (256 * overflowCount) + TimerCount; // TimerCount zurücksetzen TimerCount = 0; Überlaufzähler = 0; Rücklaufzahl; }

int isTouching(int Toleranz){

// Durchschnitt mehrerer Stichproben doppelter Durchschnitt = 0; for(int i = 0; i CalibrationValue + Toleranz) Average++; } Durchschnitt /= TOUCH_SAMPLE; //Durchschnitt ist eine Zahl zwischen 0 und 1 if (Durchschnitt > 0,2) return 1; 0 zurückgeben; }

Leere kalibrieren () {

int-Durchschnitt = 0; int-Beispiele[CALIBRATION_SAMPLE]; // Durchschnittswert abrufen für (int i = 0; i < CALIBRATION_SAMPLE; i ++) { Samples = getChargeTime (); Durchschnitt += Proben; } Durchschnitt /= CALIBRATION_SAMPLE; Kalibrierwert = Durchschnitt; //Max/Min-Werte abrufen maxCalibrationValue = Samples[0]; minCalibrationValue = Samples[0]; for(int i = 0; i maxCalibrationValue) maxCalibrationValue = Samples; if(samples < minCalibrationValue) minCalibrationValue = Samples; } }

void setupCapacitiveTouch(){

// Lade-/Entlade-Pin als Ausgang einstellen, in diesem Fall RC4 TRISCbits. TRISC4 = 0; // Timer0 einrichten T0CS = 0; PSA = 1; // Komparator C1CH0 einrichten = 0; C1CH1 = 0; C1R = 0; C1ON = 1; C1POL = 0; // Zählwerte löschen count = 0; // Kalibrierwerte löschen CalibrationValue = 0; maxCalibrationValue = 0; minCalibrationValue = 0; // Kalibrierung beim Start ausführen kalibrieren (); }

Schritt 3: Schreiben des Hauptcodes

Beginnend mit dem Hauptcode müssen Sie die im vorherigen Schritt erstellte Header-Datei einschließen. Der folgende Code ist ein Beispiel dafür, wie Sie die isTouching-Funktion als Schalter verwenden können. In meinem Fall habe ich dem Header den Namen capacitiveTouch.h gegeben.

#enthalten

#include "capacitiveTouch.h"

// diese Variable sagt, ob die Taste bereits gedrückt ist oder nicht

int lastState = 0;

Leere Haupt(){

// RC5 als Ausgang einstellen TRISCbits. TRISC5 = 0; // Sie müssen diese Funktion beim Start des Programms aufrufen setupCapacitiveTouch (); _verzögerung_ms(1000); // nach Ihrem genauen Setup kalibrieren calibrate (); Während (1) {// prüfen, ob die Schaltfläche gedrückt wird if (isTouching (15) && lastState == 0) { if (RC5) RC5 = 0; sonst RC5 = 1; lastState = 1; } //Überprüfen, ob die Schaltfläche freigegeben wird else if(lastState == 1 && !isTouching(15)) lastState = 0; _verzögerung_ms(20); } }

kalibrieren:

Beim Aufruf dieser Funktion werden die Variablen CalibrationValue, maxCalibrationValue und minCalibrationValue aktualisiert. CalibrationValue wird von der isTouching-Funktion verwendet. Denken Sie daran, dass das Touchpad während der Kalibrierung in Ruhe gelassen werden sollte.

setupCapacitiveTouch:

Muss am Anfang Ihres Programms aufgerufen werden. Es richtet die notwendigen Bits ein, die von den anderen Funktionen verwendet werden. Es führt auch eine Kalibrierung durch. Ich habe jedoch bessere Ergebnisse erzielt, indem ich eine Sekunde gewartet und die Kalibrierung erneut separat durchgeführt habe.

ist berührend:

Diese Funktion gibt 1 zurück, wenn sie einen Kapazitätsanstieg am C12IN0 erkennt, und gibt 0 zurück, wenn die Kapazität nahe der während der Kalibrierung liegt. Einfach ausgedrückt, wenn jemand das Pad berührt, gibt die isTouching-Funktion 1 zurück. Die Funktion möchte auch einen Parameter als Eingabe, dies ist die Toleranz, die sie auslösen kann. Je höher der Toleranzwert, desto weniger empfindlich wird er. In meinem Setup fand ich 15 gut funktioniert, aber da dies von der Oszillatorfrequenz abhängt und wie viel Kapazität beim Drücken hinzugefügt wird, sollten Sie mit diesem Wert herumexperimentieren, bis Sie etwas finden, das für Sie funktioniert.

getChargeTime:

Wenn Sie wissen möchten, wie lange es dauern würde, die Kapazität auf die CVREF-Spannung aufzuladen, testet diese Funktion sie und gibt eine ganze Zahl zurück. Um die Zeit in Sekunden zu erhalten, verwenden Sie diese Formel: (4 * getChargeTime) /oszillatorFrequency = chargeTimeInSeconds Diese Formel kann auch verwendet werden, um die Toleranzeingabe von der isTouching-Funktion in Sekunden zu erhalten.

Empfohlen: