Sul blog di Elettronica Open Source puoi leggere non solo tutti gli articoli Premium riservati agli abbonati Platinum 2.0 e inseriti nella rivista Firmware 2.0 (insieme ad articoli tecnici, progetti, approfondimenti sulle tecnologie emergenti, news, tutorial a puntate, e molto altro) ma anche gli articoli della Rubrica Firmware Reload. In questa Rubrica del blog abbiamo raccolto gli articoli tecnici della vecchia rivista cartacea Firmware, che contengono argomenti e temi evergreen per Professionisti, Makers, Hobbisti e Appassionati di elettronica. La CTMU, acronimo di Charge Time Measurement Unit, è una periferica sviluppata da Microchip espressamente per le applicazioni basate sui sensori touch di tipo capacitivo. Disponibile su alcuni microcontrollori della serie PIC18F e PIC24F, la periferica CTMU rappresenta una soluzione efficace, performante, e a basso costo per gestire varie tipologie di applicazioni con sensori touch. In questo articolo verranno presentate le linee guide relative all’utilizzo di questa funzionalità, come configurarla per un corretto utilizzo, e alcune considerazioni relative all’hardware e al software disponibili.
La periferica CTMU, rispetto a soluzioni hardware di tipo custom, presenta alcuni vantaggi sostanziali che possiamo riassumere come segue:
- permette una configurazione semplice e immediata della parte hardware;
- permette di utilizzare degli algoritmi software molto efficienti, disponibili gratuitamente sul sito Microchip;
- consente di ottenere delle elevate velocità di scansione dei sensori touch capacitivi;
- rappresenta una soluzione economica che non richiede alcun componente addizionale.
SCHEMA A BLOCCHI
La CTMU è essenzialmente composta da una sorgente di corrente costante e da alcuni blocchi logici ad essa interconnessi in grado di garantirne la funzionalità.
Con riferimento alla Figura 1, possiamo evidenziare i seguenti blocchi:
- una sorgente di corrente costante, collegata al convertitore analogico-digitale del microcontrollore;
- uno switch collegato alla sorgente di corrente costante (e al convertitore A/D), in grado di prelevare la carica accumulata;
- due pin esterni utilizzati come trigger della sorgente di corrente costante;
- un pin di output sul quale è disponibile l’uscita prodotta dal modulo CTMU.
Per le applicazioni relative ai dispositivi touch di tipo capacitivo, sia i pin di ingresso utilizzati come trigger che il pin di uscita del modulo non vengono in realtà utilizzati.
IL PRINCIPIO DI FUNZIONAMENTO
Nelle applicazioni basate sui sensori capacitivi, la corrente costante prodotta dalla CTMU e successivamente applicata al pad del sensore di tocco soddisfa la seguente formula:
I x T = C x V
dove:
- I rappresenta la corrente costante prodotta dalla CTMU;
- T è un intervallo di tempo costante durante il quale la CTMU effettua la carica del circuito touch capacitivo;
- C rappresenta la capacità del circuito touch capacitivo;
- V è la tensione letta dal convertitore A/D quando il circuito touch capacitivo è completamente carico.
Ne consegue che una qualunque variazione della capacità del circuito (come ad esempio quella prodotta dall’avvicinamento di un dito) comporta come effetto una variazione della tensione V, effetto misurato dal convertitore analogico-digitale. Possiamo pertanto esplicitare la precedente formula nel modo seguente:
V = (I x T) / C
Poichè la corrente I è costante, la tensione V dipende soltanto da due grandezze: la capacità C del circuito e il periodo T durante il quale il circuito viene caricato. Se a questo punto si mantiene costante anche il tempo T, la tensione V risulterà dipendere soltanto dalla capacità C. Quando pertanto una persona avvicina un dito al sensore del circuito, si produrrà un aumento della capacità complessiva, e una conseguente riduzione della tensione V misurata dal convertitore A/D (I e T devono essere mantenute costanti).
LA CONFIGURAZIONE
In una tipica applicazione touch, come quella visibile in Figura 2, avremo a disposizione più sensori, ciascuno dei quali dovrà essere collegato direttamente a un singolo canale del convertitore A/D. Si osservi come la CTMU internamente sia collegata al convertitore A/D e permetta la selezione di uno qualunque tra i canali disponibili tramite un multiplexer (A/D MUX). Utilizzando questo tipo di configurazione, un singolo modulo CTMU è in grado di gestire diversi sensori capacitivi. Il segnale “Trigger” visibile in Figura 2 è controllato manualmente via software (agendo su opportuni bit del registro di controllo CTMU) e ha la funzione di controllare la sorgente di corrente.
Sono disponibili tre range di corrente: 0,55μA, 5,5μA, e 55μA, ciascuno caratterizzato da una precisione pari a ±20%. La selezione del range di corrente viene compiuta agendo sul registro CTMUICON, in cui è anche possibile regolare il valore di corrente con step pari a ±2%, fino a un massimo di ±62%. Il valore più adatto alla maggior parte delle applicazioni è quello corrispondente a 55μA, in quanto permette di conseguire i tempi di carica più rapidi del circuito di touch capacitivo. L’abilitazione/disabilitazione della sorgente di corrente CTMU è anch’essa eseguita a livello software attraverso i bit di controllo EDG1STAT e EDG2STAT del registro di controllo CTMU. L’abilitazione è determinata dall’OR esclusivo dei due bit: se entrambi sono impostati a 0 oppure 1, la sorgente di corrente è disabilitata, se invece uno solo dei due bit vale 1, la sorgente di carica è abilitata e permette di caricare il circuito. Il bit IDISSEN, quando impostato, indica che il circuito è collegato a VSS (ground), e serve ad assicurare che il processo di carica inizi a un potenziale pari a 0. Si noti, tuttavia, come la scarica del circuito completo non avvenga agendo su questo bit: ciò è dovuto al fatto che il convertitore A/D non è sempre collegato al circuito esterno, cioè ai sensori touch. Il registro di configurazione della CTMU (CTMUCON) deve inoltre essere impostato in modo tale da non utilizzare i trigger esterni (che possono essere pertanto impiegati come GPIO) e il pin di output della CTMU. I registri che controllano la CTMU sui dispositivi PIC18F sono analoghi a quelli appena citati, con la differenza che in questo caso i registri sono a 8-bit; avremo pertanto i registri di configurazione CTMUCONH e CTMUCONL. Come esempio di configurazione della CTMU, in Figura 3 è riportato il codice relativo a un dispositivo appartenente alla famiglia PIC24F. Il codice corrispondente per i dispositivi della serie PIC18F (le modifiche, come già accennato in precedenza, sono minime) è invece visibile in Figura 4. Maggiori informazioni sul layout completo dei registri di configurazione possono essere reperite sui datasheet dei rispettivi componenti.
LA DEMONSTRATION BOARD
Tutti gli esempi applicativi proposti nell’articolo utilizzano la piattaforma hardware PICDEM™ Touch Sense 2 Demonstration Board, basata su un microcontrollore della serie PIC24F. Occorre tuttavia osservare come l’utilizzo della board non sia strettamente necessario per comprendere il funzionamento della CTMU e le linee guide esposte nell’articolo. La scheda, visibile in Figura 5, dispone di 16 sensori touch capacitivi, collegati ad altrettanti canali del convertitore analogico-digitale. La lettura del valore di ciascun canale è controllata a livello software dal Timer1, programmato con una durata pari a 1ms. Ad ogni esecuzione della routine di risposta all’interrupt del timer (che avviene, quindi, alla frequenza di 1000Hz), viene incrementato l’indice del canale da cui acquisire la misura del sensore. Quando la misura di tutti e 16 i canali è stata completata, la routine di risposta all’interrupt alza una flag (“dataReadyCTMU”), utilizzata dal modulo principale dell’applicazione per triggerare l’elaborazione dei dati acquisiti.
IL SOFTWARE
La procedura software che esegue la lettura di ciascun sensore può essere schematizzata dal diagramma di flusso visibile in Figura 6. Come evidenziato nella figura, possiamo identificare 13 step principali sui quali si articola il codice della procedura:
1. Impostare tutti i canali del convertitore analogico-digitale come pin di I/O digitali, e inizializzarli al livello logico 0. L’effetto è quello di collegare a massa tutti i sensori capacitivi, che quindi assumeranno un potenziale pari a zero Volt;
2. Impostare il canale del convertitore A/D da cui eseguire la lettura come ingresso analogico;
3. Impostare il convertitore A/D sul canale selezionato;
4. Impostare a “1” il bit di scarica (IDISSEN) del registro CTMUCON. Questa operazione garantisce che la capacità interna del convertitore analogico-digitale parta da un potenziale di 0 Volt;
5. Attendere che il processo di scarica venga completato (sono sufficienti alcune istruzioni NOP);
6. Impostare a “0” il bit di scarica, IDISSEN;
7. Impostare a “1” il bit di acquisizione (SAMP) del registro AD1CON1 in modo tale da iniziare l’acquisizione dal canale selezionato. Questo step è richiesto soltanto sulle MCU della serie PIC24F;
8. Impostare uno qualsiasi tra i bit “edge status” della CTMU. Nel caso del PIC24F, questi corrispondono ai bit EDG1STAT e EDG2STAT del registro CTMUCON. Nel caso invece del PIC18F, i bit sono gli stessi, ma appartengono al registro CTMUCONL. L’effetto è quello di abilitare la sorgente di corrente della CTMU sul canale selezionato del convertitore A/D, in modo tale da iniziare la carica del sensore touch capacitivo;
9. Ciclo di attesa per un periodo prefissato. Per la maggior parte delle applicazioni, questo intervallo corrisponde a circa 2-10 μs;
10. Riportare a “0” il bit “edge status” precedentemente impostato a “1”. Valgono in questo caso le stesse considerazioni espresse al punto 8 per quanto riguarda i registri da utilizzare sul PIC24F e sul PIC18F. Come conseguenza, la sorgente di corrente della CTMU viene disabilitata, e si interrompe la carica del sensore touch capacitivo ad essa collegato;
11. Inizio della conversione analogico-digitale sul canale selezionato. Nel caso di PIC24F, l’operazione viene eseguita azzerando il bit SAMP del registro AD1CON1. Sul PIC18F, invece, occorre impostare a “1” il bit GO/DONE del registro ADCON0;
12. Attendere il completamento della conversione;
13. Memorizzare il valore letto dal convertitore analogico-digitale.
Nelle Figure 7 e 8 è riportato il codice di esempio completo, applicabile ai microcontrollori della serie PIC24F e PIC18F, rispettivamente. Le istruzioni riflettono le linee guida presentate precedentemente. Aggiungiamo soltanto qualche nota esplicativa:
- la variabile “Index” serve a indirizzare il numero di canale dal quale si acquisisce il valore della misura;
- l’array “ADSELECT” è impostato in modo tale da configurare ciascun canale (a sua volta indirizzato dalla variabile “Index”) come un ingresso analogico del convertitore A/D;
- il valore letto dal convertitore analogico-digitale viene temporaneamente memorizzato nella variabile “immediateValue”;
- il valore della variabile “loopCount” determina per quanto tempo la sorgente di corrente dalla CTMU carica il circuito touch capacitivo.
La funzione “main()” dell’applicazione dovrà poi includere un ciclo infinito “while( 1)” all’interno del quale verrà monitorato il valore della flag “dataReadyCTMU” (a sua volta settato dalla ISR del Timer1): quando questa flag viene trovata al valore “1”, la funzione “main()” provvede a resettarla, e chiama le funzioni che processano i dati appena acquisiti. Durante questa fase il Timer1 viene temporaneamente disabilitato, evitando così che nuove misure arrivino durante l’elaborazione dei valori acquisiti precedentemente. Il Timer1 verrà nuovamente abilitato quando l’elaborazione di tutti i valori acquisiti è completata, in modo tale da iniziare un nuovo ciclo di acquisizione ed elaborazione dei dati provenienti dai sensori touch. Programmando il periodo del Timer1 a 1ms, si ottiene che il tempo totale necessario per elaborare tutti e 16 i valori misurati dai corrispondenti canali del convertitore A/D è di poco superiore a 16ms, e si ottiene in questo modo un comportamento ripetitivo e deterministico.
ALGORITMI DI OTTIMIZZAZIONE
Chi ha avuto modo di lavorare su circuiti basati sull’utilizzo di sensori touch di tipo capacitivo sa che tali circuiti possono essere affetti da problemi di falsi contatti. Per risolvere questo tipo di inconveniente, che ne pregiudica pesantemente l’affidabilità, è conveniente ricorrere a particolari tipi di algoritmi software, che ora andremo ad esaminare in dettaglio.
Primo algoritmo
Questo primo metodo è basato sul calcolo della media “lenta” di ogni canale dell’A/D (sensore). Il termine “lenta” indica che questa media non viene aggiornata in corrispondenza di ogni nuovo valore letto dallo specifico canale, ma bensì ogni “n” letture dello stesso. Ad esempio, sulla scheda PICDEM™ Touch Sense 2 un ciclo completo di acquisizione di tutti e 16 i canali richiede 16ms. La media non viene aggiornata ad ogni nuova lettura del canale (cioè ogni 16ms), ma ogni 16 letture (quindi ogni 256ms). Il valore di questa media “lenta” viene confrontato con il valore istantaneo appena letto. Se la differenza tra questi valori supera una certa soglia determinata sperimentalmente, il sensore viene considerato come “toccato” o “premuto”. Per maggiori informazioni su questo algoritmo, si rimanda all’Application Note AN1103 (Riferimento 2).
Secondo algoritmo
Questo secondo algoritmo è in sostanza una routine di debouncing, molto simile a quelle normalmente utilizzate per eliminare i rimbalzi sulle letture degli interruttori meccanici. Nel caso specifico dei sensori di tocco capacitivi, il fenomeno del rimbalzo si presenta sotto forma di rumore. Poichè, per definizione, il rumore è non periodico, esso non dovrebbe ripresentarsi in modo ripetitivo durante letture multiple di un canale collegato a un sensore capacitivo. In Figura 9 possiamo vedere il diagramma di flusso relativo alla routine di debouncing, sia per la condizione di sensore “toccato” (premuto) sia “non toccato” (rilasciato). In entrambi i casi l’algoritmo richiede la lettura consecutiva di 3 valori nel medesimo stato, prima di asserire all’esterno lo stato stesso (premuto o non premuto). Ovviamente, il numero 3 scelto in questo caso può essere adattato alla specifica applicazione (ad esempio incrementato), tenendo conto che ciò impatterà sui tempi di risposta dell’applicazione (più alto è il valore di questa costante, maggiore sarà il tempo richiesto per determinare lo stato del sensore).
Terzo algoritmo
Questo algoritmo viene utilizzato per migliorare l’affidabilità del sensore touch in condizioni di sovracampionamento. Poichè la CTMU è caratterizzata da un’elevata velocità di campionamento (nel caso della board PICDEM™ Touch Sense 2 sono richiesti soltanto 12μs per eseguire l’acquisizione di ciascuno dei 16 canali disponibili), è lecito pensare di sfruttare questa caratteristica per migliorare il grado di affidabilità. Poichè la velocità di scansione è determinata dal periodo prescelto per il Timer1 (1ms), esiste un margine di tempo sufficiente per rileggere più volte il valore di uno stesso canale (oversampling, o sovracampionamento). Nel caso della board PICDEM™ Touch Sense 2, ciascun canale viene ad esempio riletto per 64 volte. Viene successivamente calcolata la media di queste 64 letture, e questo valore viene utilizzato nel resto dell’applicazione. Questo algoritmo si comporta quindi come un filtro passa-basso, e ha l’effetto di ridurre sostanzialmente il rumore che può inficiare alcune misure (il rumore viene in pratica “spalmato” su una serie di acquisizioni consecutive, riducendone l’entità).
Quarto algoritmo
È molto simile all’algoritmo della media “lenta”. I valori acquisiti vengono memorizzati all’interno di un array di dimensione opportuna, seguendo una politica di tipo FIFO: ogni nuovo valore letto viene inserito nell’array, e viene rimosso il valore più “vecchio”. Il valore medio calcolato sui campioni presenti nell’array viene poi utilizzato come valore effettivo della misura e passato alle altre routine dell’applicazione. Si noti come un valore errato (o “spurio”) comporti un effetto limitato sul valore finale, determinato invece dalla maggioranza delle letture corrette. Il software che equipaggia la board di valutazione PICDEM utilizza tutti e quattro gli algoritmi appena esaminati, ed è pertanto in grado di fornire la soluzione più affidabile ed efficace per la misura.
CONCLUSIONI
La soluzione di Microchip per i sensori capacitivi basata sulla periferica CTMU rappresenta una scelta affidabile ed economica, che richiede un’aggiunta minima di hardware esterno. La periferica CTMU è veloce e performante, ed il software richiesto per la sua configurazione richiede un’implementazione semplice e immediata. Come conclusione riportiamo il tracciato visibile all’oscilloscopio relativo a un’applicazione basata sulla CTMU. Possiamo subito evidenziare quattro punti, o tratti, che caratterizzano il tracciato. Nel punto 1 viene disattivata la sorgente di corrente della CTMU, nel tratto 2 avviene la conversione dell’ADC, nel tratto 3 avviene la scarica del circuito capacitivo, e infine nel punto 4 viene nuovamente attivata la sorgente di corrente della CTMU per riprendere un nuovo ciclo.
Articolo della rivista cartacea Firmware Anno 2015 - Numero 111