Ecco alcune idee di progetto di tipo hardware e di tipo software per applicazioni touch-sensing con i PIC della Microchip. Una maniera alternativa per implementare i dispositivi d'ingresso.
La teoria del capacitive sensing è piuttosto datata, ma soltanto di recente gli sviluppi tecnologici hanno consentito di introdurre controlli di questo tipo nelle più tipiche applicazione. Nel settore embedded, in particolare, questo è stato favorito dalla diffusione di dispositivi con periferiche mixed-signal a basso costo e ridotta dissipazione di potenza, che consentono di realizzare capacitance-to-digital converter di buona precisione. La capacità di un elettrodo, come noto, è direttamente legata al suo stato, per cui la misura delle variazioni di questa può essere usata come strumento per determinare un eventuale contatto o la prossimità di oggetti.
Di seguito, è descritto in particolare come gestire un elettrodo touch-sensing capacitivo mediante microcontrollori PIC ad 8-bit della Microchip. Il metodo presentato si basa sulla misura della frequenza di clock di un oscillatore controllato in qualche modo, come vedremo, dall’elettrodo; la frequenza dell’oscillatore, in particolare, varia in funzione della capacità di questo. È solo il caso di osservare che non si tratta dell’unico meto- do disponibile. Una soluzione alternativa, ad esempio, consiste nel misurare le variazioni dei tempi di salita/discesa del segnale all’elettrodo in successivi cicli di carica/scarica.
Come realizzare un oscillatore "controllato in capacità"
La figura 1 mostra lo schema di principio del circuito necessario per realizzare un oscillatore controllato in capacità ed il relativo circuito di misura di frequenza; Cs è la capacità associata all’elettrodo touch sensing.
Il principio di funzionamento del circuito è piuttosto banale ed utilizza due comparatori, altrettante tensioni di riferimento, un latch SR e due timer T0 e T1, rispettivamente a 8 bit e 16 bit. Tali risorse, ad eccezione del riferimento per la soglia bassa del comparatore C2 generato mediante partitore, sono tutte disponibili nei micro a 8-bit della MicroChip, appartenenti alle serie PIC16F616, PIC16F690 e PIC16F887. Inizialmente l’uscita del latch è alta, per cui la tensione sull’elettrodo cresce con costante di tempo RCs. Quando la tensione supera il livello 2/3 Vdd (dove Vdd è la tensione di alimentazione del micro), il comparatore C1 commuta e forza l’uscita del latch SR a zero. Il condensatore Cs inizia quindi a scaricarsi con la stessa costante di tempo. Quanto la tensione scende al di sotto della soglia 1/4 Vdd, commuta l’uscita del comparatore C2, il che riporta ad uno l’uscita del latch SR. Il ciclo quindi si ripete indefinitamente. Il risultato è una forma periodica con periodo legato alla costante di tempo di carica/scarica dell’elettrodo, come mostrato schematicamente in figura 2.
Tipicamente, la resistenza R viene dimensionata in modo da avere una frequenza di oscillazione nominale (in assenza di contatto sull’elettrodo) compresa tra 100 e 400 kHz. Il valore esatto evidentemente non è importante ma lo è l’ordine di grandezza, in quanto questo determina l’accuratezza della misura di capacità. Come si vede dalla discussione precedente, maggiore è la capacità dell’elettrodo minore è la frequenza dell’oscillatore. Questa può essere quindi misurata, come mostrato in figura 1, mediante due timer. Il primo, indicato con T0, serve per definire una base dei tempi, mentre il secondo (T1) consente di contare le commutazioni dell’oscillatore nell’intervallo stabilito. Evidentemente i prescaler dei due timer devono essere dimensionati in modo tale che il timer T1 non rolli entro la finestra di tempo delimitata da T0. Nella maggior parte delle applicazioni, questa finestra può essere fatta corrispondere al tempo di roll del timer T0. In questo modo si può utilizzare l’interruzione generata alla CPU conseguentemente a questo evento per richiedere la lettura del timer T1. La larghezza della finestra di conteggio influenza direttamente la risoluzione della misura; maggiore è il tempo di acquisizione, migliore sarà la precisione del circuito. Tuttavia, questo implica una frequenza di scansione dell’elettrodo inferiore; tale parametro deve essere tenuto in conto soprattutto nelle applicazioni con più di un elettrodo.
Una versione semplificata
La figura 3 mostra una versione semplificata del circuito di figura 1 che funziona con un solo comparatore ed un timer a 8 bit con prescaler; il prescaler è reso necessario per evitare che il timer rolli, garantendo una risoluzione a 16 bit nella misura. Il circuito si adatta, ad esempio, perfettamente alle caratteristiche dei micro della serie PIF10F. In questo caso, l’uscita del comparatore viene usata direttamente per pilotare l’elettrodo (non garantendo quindi isteresi) ed utilizzata per clockare il timer con prescaler. La finestra di acquisizione viene invece definita mediante istruzione software, non disponendo di un secondo timer; evidentemente questo comporta una minore precisione della misura. Al termine del periodo di acquisizione la CPU deve dapprima leggere il valore corrente del timer, quindi commutare il clock dello stesso sulla sorgente interna di riferimento a frequenza pari a FOSC/4, dove FOSC è la frequenza della CPU. Il valore del timer letto al termine della finestra di acquisizione rappresenta la parte alta della misura di frequenza a 16-bit. La parte bassa, invece, è data dal valore corrispondente del prescaler e viene stimata misurando il tempo necessario a che il timer si incrementi, una volta commutato sul segnale di clock di riferimento interno.
Algoritmi di rilevamento
Una volta misurata la frequenza, ovvero indirettamente la capacità dell’elettrodo, è necessario stabilire i criteri in base ai quali si può ritenere che l’elettrodo sia in contatto. Esistono per questo diversi metodi che assicurano diverse prestazioni. L’Application Note di Microchip citata nei riferimenti (si veda il punto [3]) suggerisce due soluzioni implementabili con i microcontrollori ad 8 bit delle serie PIC16F e PIC10F citate in precedenza. Nel caso più semplice, che potremo definire ‘Explicit Trip, Fixed Hysteresis’, la differenza tra il valore misurato e quello di riferimento corrente viene confrontato direttamente con il valore di trip, tenendo in conto l’isteresi specificata, per determinare se vi sia contatto sull’elettrodo. Il valore di riferimento viene quindi aggiornato come media pesata tra il valore corrente e la misura eseguita; a quest’ultima viene associato un peso di 1/16 mentre alla media corrente uno di 15/16. In questo modo, la formula per l’aggiornamento del valore corrente di riferimento (average) in funzione della misura eseguita (raw) diventa semplicemente:
average = average+ (raw – average)/16.
Presenta, come si vede, una sola divisione che può essere realizzata mediante shift, riducendo significativamente la complessità computazionale del calcolo. È solo il caso di osservare che eseguire una media pesata per aggiornare il valore di riferimento consente di compensare eventuali variazioni di lungo periodo del circuito, legate, ad esempio, a fluttuazioni della tensione di alimentazione, come tipicamente accade in applicazioni a batteria. Un sistema che adotti lo schema ‘Explicit Trip, Fixed Hysteresis’ deve essere opportunamente tarato per determinare i valori ottimali di trip ed isteresi che evitino di rivelare falsi contatti. mTouch Diagnostic Tool è un tool di riferimento fornito da Microchip che unitamente al PICkit Serial Analyzer supporta agevolmente le operazioni di caratterizzazione del proprio sistema. In alternativa al metodo ‘Explicit Trip, Fixed Hysteresis’, si può utilizzare uno schema del tipo ‘Percentage Trip’. In questo caso, la differenza tra la misura attuale ed il valore di riferimento corrente viene confrontata non direttamente con quest’ultimo ma con una sua percentuale. Per garantire isteresi adeguata, due diverse percentuali devono essere definite per le condizioni di contatto e rilascio dell’elettrodo. Valori tipici sono compresi tra 5% e 10%. Il vantaggio principale del metodo ‘Percentage Trip’ risiede nella migliore immunità rispetto a variazioni delle condizioni operative del sistema; lo svantaggio principale è, invece, la maggiore complessità computazionale che richieda maggiore spazio in memoria codice, rivelandosi così applicabile principalmente per i dispositivi delle serie PIC16F887 o PIC16F690. Entrambi i metodi elencati d’altra parte, non prevedendo alcun filtro della misura corrente, soffrono di possibili falsi contatti in presenza di variazioni repentine della corrente assorbita dal microcontrollore; questo determina, infatti, una riduzione significativa della frequenza dell’oscillatore. Tipicamente si verifica nei casi in cui il dispositivo pilota un carico con corrente elevata, come ad esempio un LED. Ove non possa essere evitato, utilizzando ad esempio un driver esterno per evitare che la corrente da erogare sia assorbita direttamente dal microcontrollore, è possibile intervenire così da modificare manualmente il valore di riferimento corrente per impostarlo ad un valore prossimo a quello di trip, evitando il falso contatto. Questo presuppone tuttavia di conoscere le finestre di tempo in cui c’è elevato assorbimento di corrente.