I convertitori capacitance-to-digital consentono di convertire la variazione del valore di una capacità in un valore digitale elaborabile da un microcontrollore. Ecco come implementarli sia dal punto di vista digitale che analogico con i dispositivi della Analog Devices.
I chip AD7141 e AD7143 della Analog Devices integrano al loro interno dei convertitori Capacitance-to-Digital (CDC), ossia dispositivi che consento di leggere le variazioni del valore di una o più capacità. Questo è molto fruttato in tutti gli apparati elettronici, come palmari o computer portatili, che integrano al loro interno pulsanti, cursori o touchpad. Il principio di funzionamento è ben riassunto nella figura 1.
Molti avranno sperimentato, lavorando con circuiti ad alta frequenza, l’effetto di tuning dovuto alla capacità associata alla dita della mano. Mentre in tali applicazioni questo effetto è un problema per l’apparecchiatura elettronica (poiché la disturba), nel caso dei touch sensor si sfrutta proprio tale fenomeno, attraverso ovviamente un controllo affidabile e coerente. I chip della Analog Devices effettuano una ricalibrazione continua del convertitore A/D per adattarsi alle mutevoli condizioni ambientali. Come si nota dalla figura 1 esiste una sorgente di eccitazione integrata (tipicamente con un frequenza di 240KHz) ed un ricevitore. In cascata a quest’ultimo si trova il convertitore ∑-∆, il quale ha il compito di digitalizzare il segnale acquisito. La tipologia di convertitore utilizzata (∑-∆) assicura un elevatissima risoluzione (24-bit) ed linearità (0.01%) e precisione (±4fF). Le variazioni di capacità accettate sono ±4pF ed è ammesso un modo comune pari a 17pF. In figura 2 si riporta una tipica risposta del sensore al tocco della capacità. Tale variazione, digitalizzata, può essere acquisita tramite un microcontrollore e quindi gestita in maniera centralizzata.
Linee guida per la progettazione
Il principale vantaggio offerto dai CDC è quello di ridurre sensibilmente il numero di componenti esterni utilizzati. Essi, infatti, si interfacciano con una capacità esterna che può essere realizzata tramite qualsiasi materiale standard per PCB, compreso FR4, polyamide o PET. La struttura tipica è illustrata in figura 3a; sono presenti tre differenti strati: il supporto isolante tipicamente in tecnologia FR4, le piste in rame ed il supporto protettivo in vetro o plastica. In condizioni normali (tasto non premuto) il convertitore misurerà una capacità Cp (detta capacità di bulk); se il tasto è premuto, invece, si aggiunge anche la capacità del dito (Cf o CIN), creando il circuito equivalente riportato in figura 3c.
Il compito del CDC è proprio quello di misurare questa variazione Cf. La progettazione di tali sensori è quindi molto semplificata. L’importante è tenere ben in considerazione le dimensioni del sensore che si crea sul PCB. Il parametro fondamentale è l’area totale, piuttosto che le misure esatte e la forma. Ci sono dei valori massimi e minimi da rispettare. Con un sensore troppo piccolo si rischia di non rilevare la variazione di capacità. Il valore massimo dell’area è, invece, dettato dall’offset del DAC a bordo del AD714x; infatti, se il sensore risulta troppo esteso, il valore della capacità di bulk rischia di rendere trascurabile (ai fini della misura) quella del dito. In ogni caso il valore della capacità di bulk non deve superare i ±20pF. La tabella 1 riporta i valori minimi, massimi e tipici per differenti forme di sensore:
➤ Pulsante
➤ Switch a 2-vie
➤ Switch a 8-vie
➤ Cursore
➤ Wheel
➤ Key Pad
Realizzazione di un pulsante
In figura 4 è mostrato come realizzare un pulsante da interfacciare ai CDC AD714x. Si possono scegliere dimensioni comprese tra 5mm e 15mm di diametro.
Oltre alle forme illustrate, il pulsante potrà avere anche forma irregolare, purché soddisfi i requisiti di dimensioni sopra descritti. Ciascun sensore è costituito da due pad, uno connesso al pin SCR (quello di eccitazione) e l’altro al pin CIN. Entrambi i pad devono trovarsi sul top layer del PCB. In particolare, il sensore circolare mostrato in figura 4 presenta un’area al suo interno per il montaggio, ad esempio, di un LED che segnali la pressione del pulsante. La connessione del pulsante all’integrato della Analog Devices può essere effettuata con due modalità:
■ 1-single-ended, in cui un pulsante si attiva indipendentemente da altri che possano essere connessi allo stesso CDC.
■ 2-differenziale, questo metodo implica la presenza di due pulsanti connessi in maniera differenziale allo stesso convertitore. Questo permette di evitare che i due pulsanti possano essere attivati in contemporanea. Ad esempio, questa modalità potrebbe essere utile in quei casi in cui sono presenti un tasto di play ed uno stop. Entrambi i metodi sono illustrati in figura 5.
Quando si preme un tasto, un bit di stato viene impostato ad 1 all’interno del AD714x. Si può anche impostare un interrupt, in modo che il chip possa avvisare l’host processor dell’avvenuta pressione. L’host può quindi interrogare il CDC è capire quale tasto è stato premuto.
Realizzazione di uno switch a 8 vie
In figura 6 si riporta il layout di uno switch a 8 vie.
Questo sensore ha tipicamente dimensioni quadrate, comprese tra 8mm e 15mm. Necessita di quattro ingressi del AD714x. Questa topologia di sensore permette di rilevare 8 posizioni, indicate con nord, sud, est e overst, nordest, sudest, sudovest e nordovest. In tal caso sono necessari due differenti layer: i pad sul top layer sono connessi al pin SRC, mentre quelli sul secondo layer sono gli ingressi CIN. Le connessioni utilizzate sono di tipo differenziale, come mostrato in figura 7.
Anche in questo caso non cambia il principio di gestione rispetto al semplice pulsante. Un interrupt segnala all’host che è avvenuta una variazione. A questo punto, sarà compito del micro interrogare il registro di stato dell’AD714x è capire quale combinazione ha causato la variazione di capacità (vedere la tabella 2).
Realizzazione di un cursore
La figura 8 mostra il layout per realizzare un cursore.
La larghezza consigliata deve essere compresa tra 5mm e 12mm, mentre la sua lunghezza può variare tra 10mm e 60mm. Il layout può essere diritto (come quello mostrato) o anche curvo (a forma di ferro di cavallo o circolare). Esso è realizzato da un certo numero di segmenti di sensori, normalmente otto. Ciascun segmento deve essere collegato al pin di ingresso CIN dell’AD714x. La sorgente di eccitazione intreccia tutti gli otto segmenti. La modalità di funzionamento di ciascun segmento è la stessa vista per il pulsante. Quindi quando viene poggiato il dito lungo il percorso, più segmenti vengono attivati contemporanea mente. La figura 9 mostra come deve essere realizzata la connessione tra il sensore ed il dispositivo.
Come comunicare con AD714x
Funzionamento dell’AD714x
Lo schema a blocchi dell’AD714x è riportato in figura 10.
Come si nota esiste un unico convertitore A/D ed una matrice di commutazione che permette di condividerlo tra tutti gli ingressi attivati. Per realizzare un completo sistema di capsense è necessario, oltre al sensore ed al convertitore, anche un host processor che sia in grado di trattare ed elaborare i dati digitalizzati. La figura 11 riporta lo schema circuitale di una tipica applicazione, in cui si realizzano tre pulsanti ed una barra di scorrimento.
Non esiste un vincolo specifico sul processore da utilizzare. Si potrà quindi impiegare un semplice 8bit, purché dotato di interfaccia SPI o I2C. Eventualmente, nel caso in cui nessuna di tali porte dovesse risultare disponibile, sarà sempre possibile simularle via software. La tensione di alimentazione necessaria per far funzionare il chip deve essere compresa tra 2.6V e 3.6V. Sono possibili tre modalità di funzionamento:
➤ Full-powered, in cui il dispositivo rimane sempre alimentato. E’ particolarmente indicata per applicazioni (consolle per giochi) che dispongono di una sorgente di alimentazione da rete.
➤ Low power, in cui il dispositivo si spegne automaticamente. Permette di raggiungere consumi molto più bassi rispetto alla prima modalità. E’ adatta per applicazioni mobile.
➤ Shutdown, in cui il dispositivo è completamente spento.
Programmazione dell’AD714x
L’esempio proposto nel listato 1 mostra l’implementazione firmware di quattro pulsanti tramite AD714x e il processore ADuC841 della stessa Analog Devices.
BYTE ReadFromAD7142ViaI2C (BYTE DeviceAddress, const WORD RegisterStartAddress, const BYTE NumberOfRegistersToRead, WORD *DataBuffer, const WORD OffsetInBuffer) { WORD ReadData; BYTE LowByteAddress, HighByteAddress; BYTE LowByteData, HighByteData; BYTE r, AcknError; BYTE DeviceAddressHeader; AcknError=1; //No error on initialisation //Add the write bit to the device address DeviceAddressHeader=DeviceAddress<<1 | I2C_WR; //Split the address in two bytes HighByteAddress = (RegisterStartAddress & 0xFF00) >>8; LowByteAddress = RegisterStartAddress & 0x00FF; //Start the I2C transfer InitialiseI2CMaster(); StartI2CMaster(); //Send device address if(!SendByteI2CMaster(DeviceAddressHeader)) { //Send register address if(!SendByteI2CMaster(HighByteAddress)) { if(!SendByteI2CMaster(LowByteAddress)) { //Send the repeated start StartI2CMaster(); //Send device address again //changing the Rd/Wr bit DeviceAddressHeader=DeviceAddress<<1| I2C_RD; if(!SendByteI2CMaster(DeviceAddressHeader)) { //Perform block read, but first,we need to //know if we must send an ACKN or a NACK if(NumberOfRegistersToRead==1) { HighByteData=ReceiveByteI2CMaster(ACK); LowByteData=ReceiveByteI2CMaster(NACK); ReadData=((HighByteData & 0xFF)<<8) | Low- ByteData; DataBuffer[OffsetInBuffer]=ReadData; } else { for (r=0;r<(NumberOfRegistersToRead-1);r++) { HighByteData=ReceiveByteI2CMaster(ACK); LowByteData=ReceiveByteI2CMaster(ACK); ReadData=((HighByteData&0xFF)<<8|LowByteData; DataBuffer[OffsetInBuffer+r]=ReadData; } //Do the last read sending the NACK HighByteData=ReceiveByteI2CMaster(ACK); LowByteData=ReceiveByteI2CMaster(NACK); ReadData=((HighByteData&0xFF)<<8)|LowByteData; //Recombine 16-bit data DataBuffer[OffsetInBuffer+NumberOfRegistersToRead- 1]=ReadData; } //Stop transfer StopI2CMaster(); } else //No acknowledgement was found therefore //send the stop condition { StopI2CMaster(); AcknError=0; } } else //No acknowledgement was found therefore send //the stop condition { StopI2CMaster(); AcknError=0; } } else //No acknowledgement was found therefore //send the stop condition { StopI2CMaster(); AcknError=0; } } else //No acknowledgement was found therefore //send the stop condition { StopI2CMaster(); AcknError=0; } return(AcknError); }
Listato 1 |
In questo caso sono stati utilizzati gli ingressi 0, 1, 2, 3. I restanti CIN sono stati connessi a Vbias. In particolare, il listato 1 presenta la funzione ReadFromAD7142ViaI2C, la quale esegue la lettura tramite interfaccia I2C dei registri del AD7142. Tale funzione invia l’indirizzo del dispositivo, includendo il bit di scrittura, quindi l’indirizzo del registro da leggere ed infine attende che il CDC gli invii i dati richiesti. La funzione restituisce “1” se l’operazione si è conclusa con successo, altrimenti “0”. Per conclude la procedura, viene inviata la condizione di stop, così come prevede il protocollo I2C.