Πίνακας περιεχομένων:

Χωρητική αφή με μικροελεγκτή PIC16F886: 3 βήματα
Χωρητική αφή με μικροελεγκτή PIC16F886: 3 βήματα

Βίντεο: Χωρητική αφή με μικροελεγκτή PIC16F886: 3 βήματα

Βίντεο: Χωρητική αφή με μικροελεγκτή PIC16F886: 3 βήματα
Βίντεο: Industrial Touch Screen Monitor 4K LCD Digital Signage Media Player Interactive Display Advertising 2024, Νοέμβριος
Anonim
Χωρητική αφή με μικροελεγκτή PIC16F886
Χωρητική αφή με μικροελεγκτή PIC16F886

Σε αυτό το σεμινάριο θα εξετάσουμε πώς μπορείτε να χρησιμοποιήσετε έναν μικροελεγκτή PIC16F886 για να ανιχνεύσετε διαφορές στην χωρητικότητα, αυτό μπορεί αργότερα να χρησιμοποιηθεί για να πείτε εάν πιέζεται μια επιφάνεια αφής. Είναι καλό να είστε εξοικειωμένοι με τους μικροελεγκτές φωτογραφιών πριν κάνετε αυτό το έργο.

Βήμα 1: Συνδέστε το κύκλωμά σας

Wire Up Your Circuit
Wire Up Your Circuit

Αρχικά, ας ξεκινήσουμε καλωδιώνοντας το κύκλωμα σύμφωνα με το παραπάνω διάγραμμα. Για να φτιάξετε το μαξιλάρι αφής μπορείτε να διπλώσετε αλουμινόχαρτο σε τετράγωνο και να κολλήσετε ταινία σε σύρμα. Μπορείτε να πειραματιστείτε με διαφορετικές τιμές για την αντίσταση 100k, βρήκα ότι τα 100k λειτουργούσαν καλά για μένα.

Ο πείρος RC4 χρησιμοποιείται για την έναρξη φόρτισης/εκφόρτισης της χωρητικότητας που πρέπει να μετρηθεί. Το C12IN0 συνδέεται στην - πλευρά ενός εσωτερικού συγκριτή και ο ακροδέκτης C1IN συνδέεται με την + πλευρά του ίδιου συγκριτή. Ο μικροελεγκτής βλέπει την χωρητικότητα να είναι πλήρως φορτισμένη όταν η τάση C12IN0 φτάσει πάνω από την τάση C1IN. Ο διαχωριστής αντίστασης τάσης διασφαλίζει ότι το C1IN είναι κοντά στα 5 βολτ.

Δεδομένου ότι η επιφάνεια αφής εξαρτάται από την ύπαρξη σημαντικής χωρητικότητας μεταξύ εσάς και της γείωσης του κυκλώματος, υπάρχει πιθανότητα μια μπαταρία να μην λειτουργεί.

Βήμα 2: Το αρχείο κεφαλίδας

Το αρχείο κεφαλίδας
Το αρχείο κεφαλίδας

Τελειώσατε με όλες τις συνδέσεις; Καλά, θα συνεχίσουμε με το αρχείο κεφαλίδας. Θα χρησιμοποιήσουμε τον μεταγλωττιστή XC8 και όπως υποδηλώνει ο τίτλος, θα δημιουργήσετε τώρα ένα νέο αρχείο κεφαλίδας στο έργο σας και θα αντιγράψετε-επικολλήσετε τον ακόλουθο κώδικα. Μπορείτε επίσης να το αντιγράψετε-επικολλήσετε επάνω από τον κύριο κώδικα χωρίς κανένα αρχείο κεφαλίδας.

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

int count?

int calibrationValue, maxCalibrationValue, minCalibrationValue;

int getChargeTime () {

int timerCount = 0; int overflowCount = 0; // χωρητικότητα εκφόρτισης που θα μετρηθεί RC4 = 0. _ καθυστέρηση_ms (DISCHARGE_TIME); // δώστε αρκετή καθυστέρηση για να αποφορτίσετε πλήρως (σχεδόν πλήρως) τον "πυκνωτή" // να καθαρίσετε τη σημαία υπερχείλισης του χρονοδιακόπτη T0IF = 0. // περιμένετε να ξεχειλίσει ο χρονοδιακόπτης, ξεκινήστε την καταμέτρηση από το 0 ενώ (! 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+tolerance) μέσο ++; } μέσος όρος /= 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 = μέσος όρος; // λάβετε τιμές max/min maxCalibrationValue = δείγματα [0]; minCalibrationValue = δείγματα [0]; για (int i = 0; i maxCalibrationValue) maxCalibrationValue = δείγματα ; εάν (δείγματα <minCalibrationValue) minCalibrationValue = δείγματα ; }}

void setupCapacitiveTouch () {

// ορίζοντας τον πείρο φόρτισης/εκφόρτισης ως έξοδο, στην περίπτωση αυτή είναι RC4 TRISCbits. TRISC4 = 0; // ρύθμιση timer0 T0CS = 0; PSA = 1; // ρύθμιση συγκριτικού C1CH0 = 0; C1CH1 = 0; C1R = 0; C1ON = 1; C1POL = 0; // εκκαθάριση των μετρήσεων των τιμών count = 0; // εκκαθάριση τιμών βαθμονόμησης calibrationValue = 0; maxCalibrationValue = 0; minCalibrationValue = 0; // εκτέλεση βαθμονόμησης κατά την έναρξη βαθμονόμησης (); }

Βήμα 3: Γράφοντας τον κύριο κώδικα

Ξεκινώντας από τον κύριο κώδικα, θα πρέπει να συμπεριλάβετε το αρχείο κεφαλίδας που δημιουργήθηκε στο προηγούμενο βήμα. Ο παρακάτω κώδικας είναι ένα παράδειγμα του τρόπου με τον οποίο μπορείτε να χρησιμοποιήσετε τη λειτουργία isTouching ως διακόπτη. Στην περίπτωσή μου έδωσα στην κεφαλίδα το όνομα capacitiveTouch.h.

#περιλαμβάνω

#include "capacitiveTouch.h"

// αυτή η μεταβλητή λέει εάν το κουμπί είναι ή δεν είναι ήδη πατημένο

int lastState = 0;

void main () {

// ρύθμιση του RC5 ως εξόδου TRISCbits. TRISC5 = 0; // πρέπει να καλέσετε αυτήν τη συνάρτηση κατά την έναρξη του προγράμματος setupCapacitiveTouch (); _ καθυστέρηση_ms (1000); // βαθμονόμηση μετά την ακριβή ρύθμισή σας βαθμονόμηση (); ενώ (1) {// έλεγχος αν το κουμπί πιέζεται εάν (isTouching (15) && lastState == 0) {if (RC5) RC5 = 0; αλλιώς RC5 = 1; lastState = 1; } // έλεγχος αν το κουμπί κυκλοφορεί αλλιώς εάν (lastState == 1 &&! isTouching (15)) lastState = 0; _ καθυστέρηση_ms (20); }}

μετρώ την διάμετρο:

Όταν αυτή η συνάρτηση καλείται μεταβλητές calibrationValue, maxCalibrationValue και minCalibrationValue θα ενημερωθούν. Το calibrationValue χρησιμοποιείται από τη λειτουργία isTouching. Λάβετε υπόψη ότι το touch pad πρέπει να παραμείνει μόνο κατά τη βαθμονόμηση.

setupCapacitiveTouch:

Πρέπει να καλέσετε στην αρχή του προγράμματος σας. Ρυθμίζει τα απαραίτητα bits που χρησιμοποιούνται από τις άλλες συναρτήσεις. Τρέχει επίσης μια καλλιγραφία. Ωστόσο, πήρα καλύτερα αποτελέσματα περιμένοντας ένα δευτερόλεπτο και εκτελούσα ξανά τη βαθμονόμηση ξεχωριστά.

isTouching:

Αυτή η συνάρτηση επιστρέφει 1 αν ανιχνεύσει αύξηση της χωρητικότητας στο C12IN0 και επιστρέφει 0 αν η χωρητικότητα είναι κοντά σε αυτήν που ήταν κατά τη βαθμονόμηση. Με απλά λόγια, εάν κάποιος αγγίξει το pad, η λειτουργία isTouching θα επιστρέψει 1. Η συνάρτηση θέλει επίσης μια παράμετρο ως είσοδο, αυτή είναι η ανοχή για να ενεργοποιηθεί. Όσο υψηλότερη είναι η τιμή ανοχής τόσο λιγότερο ευαίσθητη γίνεται. Στη ρύθμισή μου βρήκα ότι 15 λειτουργούσαν καλά, αλλά επειδή αυτό εξαρτάται από τη συχνότητα του ταλαντωτή και τη χωρητικότητα που προστίθεται όταν το πατάτε, θα πρέπει να πειραματιστείτε με αυτήν την τιμή μέχρι να βρείτε κάτι που λειτουργεί για εσάς.

getChargeTime:

Όταν θέλετε να μάθετε πόσο καιρό θα χρειαστεί για να φορτίσετε την χωρητικότητα στην τάση CVREF, αυτή η συνάρτηση θα το δοκιμάσει και θα επιστρέψει έναν ακέραιο. Για να λάβετε το χρόνο σε δευτερόλεπτα, χρησιμοποιήστε αυτόν τον τύπο: (4 * getChargeTime) / oscillatorFrequency = chargeTimeInSeconds Αυτός ο τύπος μπορεί επίσης να χρησιμοποιηθεί για να φτάσει την εισαγωγή ανοχής από τη λειτουργία isTouching σε δευτερόλεπτα.

Συνιστάται: