Taula de continguts:

Tacte capacitiu amb microcontrolador PIC16F886: 3 passos
Tacte capacitiu amb microcontrolador PIC16F886: 3 passos

Vídeo: Tacte capacitiu amb microcontrolador PIC16F886: 3 passos

Vídeo: Tacte capacitiu amb microcontrolador PIC16F886: 3 passos
Vídeo: ✅ Todos los pasos y trucos para crear PCB con la CNC #9 2024, Juliol
Anonim
Tacte capacitiu amb microcontrolador PIC16F886
Tacte capacitiu amb microcontrolador PIC16F886

En aquest tutorial repassarem com podeu utilitzar un microcontrolador PIC16F886 per detectar diferències en la capacitat; posteriorment es pot utilitzar per saber si es prem un teclat tàctil. És bo conèixer els microcontroladors pic abans de fer aquest projecte.

Pas 1: connecteu el vostre circuit

Connecteu el vostre circuit
Connecteu el vostre circuit

Primer, comencem cablejant el circuit segons l’esquema anterior. Per fer la pantalla tàctil es pot plegar paper d'alumini en un quadrat i cinta adhesiva sobre un filferro. Podeu experimentar amb diferents valors per a la resistència de 100 k, he trobat que 100 k funcionaven bé per a mi.

El pin RC4 s’utilitza per començar a carregar / descarregar la capacitat a mesurar. C12IN0 està connectat al costat - d'un comparador intern i el pin C1IN està connectat al costat + del mateix comparador. El microcontrolador veu la capacitat com a totalment carregada quan el voltatge C12IN0 arriba per sobre del voltatge C1IN. El divisor de tensió resistiva assegura que C1IN sigui proper als 5 volts.

Com que el teclat tàctil depèn que hi hagi una capacitat significativa entre vosaltres i la terra del circuit, hi ha la possibilitat que una bateria no funcioni.

Pas 2: el fitxer de capçalera

El fitxer de capçalera
El fitxer de capçalera

Heu acabat amb totes les connexions? Bé, continuarem amb el fitxer de capçalera. Utilitzarem el compilador XC8 i, tal com indica el títol, ara creeu un nou fitxer de capçalera al vostre projecte i copieu-enganxeu el següent codi. També podeu copiar-enganxar-lo sobre el vostre codi principal sense cap fitxer de capçalera.

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

int recompte;

int calibrationValue, maxCalibrationValue, minCalibrationValue;

int getChargeTime () {

int timerCount = 0; int overflowCount = 0; // capacitat de descàrrega a mesurar RC4 = 0; _delay_ms (DISCHARGE_TIME); // donar prou retard per descarregar completament (gairebé totalment) el "condensador" // esborreu el senyal de desbordament del temporitzador T0IF = 0; // espera que el temporitzador es desbordi, comença el recompte a partir de 0 mentre (! T0IF); T0IF = 0; // començar a carregar la capacitat a mesurar RC4 = 1; // esperar que la capacitat es carregui fins a la tensió de referència mentre que (C1OUT) {timerCount = TMR0; if (T0IF) {overflowCount ++; T0IF = 0; }} count = (256 * overflowCount) + timerCount; // reset timerCount timerCount = 0; overflowCount = 0; recompte de devolucions; }

int isTouching (int tolerància) {

// mitjana de diverses mostres doble mitjana = 0; for (int i = 0; i calibrationValue + tolerance) mitjana ++; } mitjana / = TOUCH_SAMPLE; // La mitjana serà un número entre 0 i 1 si (mitjana> 0,2) retorna 1; retorn 0; }

void calibrate () {

int mitjana = 0; int samples [CALIBRATION_SAMPLE]; // obtenir valor mitjà per a (int i = 0; i <CALIBRATION_SAMPLE; i ++) {samples = getChargeTime (); mitjana + = mostres ; } mitjana / = CALIBRATION_SAMPLE; calibrationValue = mitjana; // obtenir valors màx / min maxCalibrationValue = mostres [0]; minCalibrationValue = mostres [0]; for (int i = 0; i maxCalibrationValue) maxCalibrationValue = mostres ; if (samples <minCalibrationValue) minCalibrationValue = mostres ; }}

void setupCapacitiveTouch () {

// configurant el pin de càrrega / descàrrega com a sortida, en aquest cas és RC4 TRISCbits. TRISC4 = 0; // configuració del temporitzador0 T0CS = 0; PSA = 1; // configuració del comparador C1CH0 = 0; C1CH1 = 0; C1R = 0; C1ON = 1; C1POL = 0; // neteja dels valors del recompte = 0; // esborra els valors de calibratge calibrationValue = 0; maxCalibrationValue = 0; minCalibrationValue = 0; // executa el calibratge a l'inici calibra (); }

Pas 3: escriure el codi principal

Començant pel codi principal, haureu d'incloure el fitxer de capçalera creat al pas anterior. El següent codi és un exemple de com podeu utilitzar la funció isTouching com a commutador. En el meu cas, he donat a la capçalera el nom capacitiveTouch.h.

#incloure

#include "capacitiveTouch.h"

// aquesta variable indica si el botó està o no està premut

int lastState = 0;

void main () {

// configurant RC5 com a sortida TRISCbits. TRISC5 = 0; // heu de convocar aquesta funció a l'inici del programa setupCapacitiveTouch (); _delay_ms (1000); // calibra després de la configuració exacta calibra (); while (1) {// comprovant si es prem el botó if (isTouching (15) && lastState == 0) {if (RC5) RC5 = 0; altrament RC5 = 1; lastState = 1; } // comprovant si el botó s’allibera else if (lastState == 1 &&! isTouching (15)) lastState = 0; _delay_ms (20); }}

calibrar:

Quan s'anomeni aquesta funció les variables calibrationValue, maxCalibrationValue i minCalibrationValue s'actualitzaran. calibrationValue l’utilitza la funció isTouching. Tingueu en compte que el teclat tàctil s’ha de deixar sol durant el calibratge.

setupCapacitiveTouch:

S’ha de trucar al principi del programa. Estableix els bits necessaris que utilitzen les altres funcions. També executa una calibració. No obstant això, vaig obtenir millors resultats en esperar un segon i tornar a executar el calibratge per separat.

isTouching:

Aquesta funció retorna 1 si detecta un augment de la capacitat al C12IN0 i retorna 0 si la capacitat és propera a la que era durant el calibratge. Simplement, si algú toca el teclat, la funció isTouching tornarà 1. La funció també vol un paràmetre com a entrada, aquesta és la tolerància perquè s'activi. Com més gran sigui el valor de tolerància, menys sensible es fa. A la meva configuració, he trobat que 15 funcionaven bé, però perquè això depèn de la freqüència de l’ocsil·lador i de la quantitat de capacitat que s’afegeixi quan el premeu, hauríeu d’experimentar amb aquest valor fins que trobeu alguna cosa que us funcioni.

getChargeTime:

Quan vulgueu saber quant de temps trigaria a carregar la capacitat fins a la tensió CVREF, aquesta funció el provarà i retornarà un enter. Per obtenir el temps en segons, utilitzeu aquesta fórmula: (4 * getChargeTime) / oscillatorFrequency = chargeTimeInSeconds Aquesta fórmula també es pot utilitzar per obtenir l'entrada de tolerància de la funció isTouching a segons.

Recomanat: