Debouncing

La corretta acquisizione dello stato di un ingresso digitale pilotato da un contatto meccanico, può rivelarsi assai meno semplice di quanto si possa immaginare. Questa situazione è comune a pulsanti, interruttori, tastiere, contatti di relé.

La chiusura o apertura di un contatto meccanico non è mai istantanea e decisa. Per quanto possa essere veloce, è sempre accompagnata da fenomeni di rimbalzo, brevi istanti in cui lo stato del contatto oscilla tra aperto e chiuso. La figura 1 di entrambe le Application Notes rif. 1 e 2, presenta oscillogrammi relativi alla manovra di contatti che rendono conto del loro comportamento meglio di molte parole.

Figura 1: hardware debouncing di un contatto singolo.

Figura 1: Hardware debouncing di un contatto singolo.

Chiaramente, forme d’onda simili, presentate direttamente ad un ingresso digitale, possono essere interpretate come una serie di transizioni di livello logico, invece che una sola transizione unidirezionale, ad esempio tra ‘0’ ed ‘1’. La cosa è ulteriormente complicata dalle problematiche tipiche di ogni ingresso di apparecchiature a microcontrollore. Occorre infatti prevedere protezione contro ESD e sovratensioni che, nel caso di lettura di contatti possono essere anche autogenerati. Le induttanze e capacità intrinseche e/o parassite dei cablaggi possono infatti innescare oscillazioni smorzate sovrapposte al segnale utile. Spesso occorrerà quindi prevedere un qualche tipo di condizionamento del segnale. Affidarsi a tecniche puramente software è certamente più economico, ma come vedremo la soluzione hardware consente di integrare anche i componenti di protezione, comunque necessari. Le soluzioni software per il debouncing sono relativamente semplici da implementare ma richiedono alcune precauzioni (vedi discussione in rif. 2). Sostanzialmente si tratta di campionare periodicamente la linea digitale ed accettare il nuovo stato stabile solo dopo che un certo numero di letture restituisce il medesimo risultato, rassicurandoci cosi circa l’esaurimento del transitorio meccanico.

La cosa funziona bene in particolare con un numero limitato di ingressi e quando il tempo di reazione al cambiamento di stato sia molto maggiore del tempo di esaurimento dei rimbalzi. L’AN287 in rif 2 contiene vari suggerimenti su come scrivere una routine software di debouncing. Sostanzialmente, occorre trattare sia la transizione in apertura che in chiusura, considerare non solo lo stato chiuso ed aperto ma anche lo stato “in manovra” (o “bouncing”), verificando che quest’ultimo abbia una durata massima definita. Occorre inoltre un qualche tipo di protezione contro stati dovuti a guasti o situazioni anomale, dove l’ingresso sembri commutare ad alta frequenza, cosa fisicamente impossibile per un contatto meccanico reale. Nelle applicazioni in cui viene richiesta una rapida reazione, la soluzione hardware diviene più efficace. Caso per caso, un accurato bilanciamento tra debouncing hardware e software condurrà alla soluzione ottimale bilanciando costi e performance. Le figure 1 e 2 presentano due tipici circuiti usati per il debouncing hardware, entrambi molto noti. Il circuito di figura 1 assume sia disponibile un contatto a due posizioni (interruttore). Il transzorb D1 cortocircuita a massa sovratensioni e scariche elettrostatiche, proteggendo la logica a bassa tensione seguente. Un filtro RC è usato per eliminare transienti veloci dal segnale di ingresso e con essi, sovratensioni e  rimbalzi. R1/C1 formano la costante di tempo con l’interruttore in apertura, R2/C1 la costante di tempo con l’interruttore in chiusura. L’inverter con ingresso a trigger di Schmitt contribuisce con la sua isteresi ad ottenere in uscita un segnale digitale pulito, rendendo inefficaci fluttuazioni della tensione ai capi di C1 dovute ai rimbalzi verso massa e positivo. R2 ha un duplice scopo. Evita di scaricare il condensatore brutalmente in corto circuito alla chiusura del contatto meccanico e limita la corrente eventualmente iniettata nell’ingresso dell’inverter da sovratensioni residue dopo D1. Si impedisce o limita in questo modo il rischio di latch-up. Il diodo D2 cortocircuita R2 durante la carica del condensatore consentendo, se desiderato, di bilanciare i tempi di carica e scarica. La figura 2 lavora invece nella più favorevole situazione in cui sia disponibile un contatto in deviazione, invece che un semplice interruttore. Anche in questo caso avremo rimbalzi meccanici ma mai tali da chiudersi sul polo opposto.

Figura 2: Hardware debouncing di un contatto in deviazione.

Figura 2: Hardware debouncing di un contatto in deviazione.

Nella posizione indicata, l’uscita del latch è a ‘0’. Durante la manovra, quando il contatto mobile è per un breve istante sospeso tra le due posizioni stabili, il latch mantiene la posizione corrente per cambiare poi stato da 0 a 1. L’uscita del latch è quindi pulita, priva di transizioni spurie. Anche in questo caso, è consigliabile mettere sull’ingresso delle gate un soppressore di transienti ed una piccola resistenza serie, specialmente in presenza di lunghi cablaggi e/o ambiente elettricamente rumoroso. L’architettura a due gate di figura 2 crea sempre un minimo di apprensione ed incertezza. Vediamone il comportamento più da vicino, con un occhio alla tabella degli stati di una porta NAND (ricordiamo che l’uscita di una porta NAND è a ‘0’ solo quando tutti i suoi ingressi sono a ‘1’). Il pull-down impone uno stato ‘0’ al pin 5, quindi l’uscita pin 6 si porta a ‘1’, indipendentemente dal valore logico sul pin 4. Il deviatore come da schema, impone uno stato ‘1’ sul pin 1, un ‘1’ è imposto sul pin 2 dalla seconda gate, l’uscita 3 si porta quindi allo stato ‘0’. Tutto questo nel caso ideale di ritardi di propagazione e tempi di assestamento delle alimentazioni nulli. In realtà un breve transitorio logico al power-up non può essere escluso e bisogna tenere presente questo fatto. Nel caso il circuito sia destinato al condizionamento di segnali provenienti da contatti meccanici per un microprocessore, tale transitorio viene certamente esaurito entro il tempo di inizializzazione del micro. Quando questo inizia l’acquisizione degli input, si trova in presenza di stati stabili (a meno di manovre meccaniche dei contatti). Invece di ricorrere ad una manciata di componenti, è possibile ricorrere a circuiti integrati che rendono disponibili protezioni e debouncing in un singolo, piccolo package. Questa soluzione è in particolare interessante quando si abbiano molti ingressi da gestire. Come richiamato nelle stesse AN in rif 1 e 2, si può pensare di impiegare la sola funzione debouncing di un integrato prodotto per la gestione del reset di microcontrollori, quale il dispositivo MAX811 o le funzioni equivalenti prodotte da altri fornitori. Questa soluzione può essere conveniente per semplificare la reperibilità dei componenti e ridurre la Bill of Material ma è meglio adatta al debouncing di contatti locali e non risulta adatta per ingressi digitali in ambiente industriale.

Manca infatti di sofisticate protezioni ESD e sovratensioni disponibili su dispositivi appositamente progettati per il debouncing, quali gli appartenenti alla famiglia MAX6816, MAX6817, and MAX6818. La differenza tra i dispositivi citati consiste nel numero di ingressi trattato, uno (MAX6816), due (MAX6817) o addirittura otto (MAX6818). Questi notevoli dispositivi lavorano con tensioni di ingresso fino a 25V, sostengono spikes fino a +/-15kV e lavorano su entrambe le transizioni degli ingressi. Lo stato logico in uscita è garantito durante il power up, caratteristica molto utile. MAX6818 presenta inoltre due interessanti caratteristiche aggiuntive. È pin-to-pin compatibile con il latch LS573 (eccetto per un pin) e dispone di un uscita che viene attivata quando uno degli ingressi cambia stato, semplificando la supervisione da parte di una CPU. Il debouncing si basa su un contatore che verifica l’ingresso sia in uno stato stabile per un periodo predefinito, prima che l’uscita sia aggiornata al nuovo stato (vedi schema a blocchi nel datasheet MAX6816). Si tratta quindi dell’implementazione hardware dello stesso concetto di filtraggio visto per la soluzione software. Il ritardo con cui il cambio stato viene riconosciuto è fisso a 40msec, cosa di cui bisogna tener conto applicazione per applicazione. In altre parole, qualora confermato stabile, il cambio stato viene propagato in uscita 40msec dopo l’esaurimento dei transitori di manovra. Purtroppo i MAX681x non hanno equivalenti. Un integrato con funzioni similari esiste da tempo, MC14490 inizialmente prodotto da Motorola ed ora da ON Semiconductor. MC14490 ha sei canali debouncer, protezioni di ingresso meno sofisticate ma il vantaggio di non introdurre un ritardo fisso. Il periodo di conferma dato è infatti programmato a partire da un clock esterno o un oscillatore interno il cui periodo è definito da un condensatore. È stato riportato qualche problema di reperibilità e prezzo. Occorre prestare attenzione ad un particolare poco evidente. Non sarebbe richiesta una corrente significativa scorrere nei contatti metallici, essendo il segnale acquisito in tensione. Può quindi venire a mancare il naturale effetto di auto-pulitura dei contatti. È quindi consigliabile che una corrente almeno pari ad alcuni milliAmpere scorra nel circuito comprendente i contatti. In alternativa è possibile usare dispositivi di commutazione autopulenti o con finiture tali (normalmente in oro) da consentire operazioni affidabili anche a correnti prossime allo zero (le cosiddette “manovre a secco”).

 

Una risposta

  1. Giovanni Di Maria Giovanni Di Maria 18 maggio 2019

Scrivi un commento