Pulsanti di debouncing


32

Di recente ho letto un articolo sul rimbalzo dei pulsanti e mi chiedevo se avrei dovuto tenerlo a mente quando lavoro con, ad esempio, un Arduino (ATMega mC)? Presumo che sia un problema, specialmente quando si lavora con gli interrupt.

Quindi è meglio rilevare il rimbalzo nel codice o questo dovrebbe essere curato con l'hardware? Per favore, elabora.


Risposte:


17

Consiglio vivamente di collegare un ambito (si spera che tu ne abbia uno o che tu ne possa mettere uno da usare) fino al tuo interruttore. Ho visto un progetto di uno studente che ha avuto un rimbalzo sul suo interruttore che è passato da 5v fino a -5v fino a 4v fino a -3v, quindi fino a 2v, quindi di nuovo a 0v. Quando abbiamo osservato l'attuale disegno su un ambito, si è verificato un picco molto grande.

Nel suo caso particolare, era molto necessario che rimbalzasse il suo interruttore sull'hardware.

Tuttavia, d'altra parte, ho visto interruttori che hanno un effetto molto più piccolo che potrebbe essere facilmente rimosso dal software.

Tuttavia, devi valutare le tue opzioni. Se disponi di una quantità di firmware molto complessa, aggiungere l'overhead sia come programmatore che l'utilizzo della CPU potrebbe non valerne la pena e sarebbe meglio aggiungere solo un po 'di hardware. D'altra parte, se stai cercando di ridurre i costi e le dimensioni, ti consigliamo di rimuovere quanto più hardware possibile e fare tutto nel firmware se puoi.


Ho individuato un'immagine di switch bounce e l'ho pubblicato su Wikipedia: en.wikipedia.org/wiki/File:Switch_bounce.JPG
Thomas O

@Thomas O questa è una foto piuttosto divertente di rimbalzo. Voglio solo assicurarmi che @ Vincent Van Den Berghe capisca che non tutti i rimbalzi saranno così. Quel rimbalzo è limitato a 0-5 v, non sarà sempre così.
Kellenjb,

2
@Thomas O, come nota a margine, abbiamo creato una pratica di studenti che non riescono che prendono immagini di Oscope in quel modo. Il flash su uno schermo è orribile. Facciamo anche un ulteriore passo avanti e spingiamo gli studenti a raccogliere punti dati effettivi, usando qualcosa come CSV o labview, in modo che possano essere facilmente utilizzati nei report e nell'analisi dei dati.
Kellenjb,

@Kellenjb, presto riceverò una stampante per il mio ambito che supporta HP-IB. Inoltre ho scoperto che la modalità "Sport" sulla mia fotocamera può scattare buone foto dello schermo dell'oscilloscopio senza flash e senza sfocatura.
Thomas O

1
@Lundin In un ambiente in tempo reale dipendi molto dagli interrupt. Se si preme un pulsante su un interrupt, non si desidera che il sistema in tempo reale venga interrotto più volte premendo un solo pulsante. Inoltre, non devi dedicare risorse per attendere 10 ms.
Kellenjb,

15

Se sei un designer di elettronica professionale, è probabile che il tuo capo non ti permetta nemmeno di farlo nell'hardware. Il motivo è semplice: se il batch di produzione è abbastanza grande, il software è praticamente gratuito , mentre l'hardware deve essere pagato per ogni unità prodotta. E mentre resistori e condensatori sono a buon mercato, il loro montaggio su un PCB può costare fino a 20 volte il loro prezzo di acquisto.

Sia che si rimbalzi nel software o nell'hardware, è comunque necessario selezionare pulsanti di qualità. Il famigerato pulsante da 157ms dell'articolo non è adatto a nessuna applicazione.
Di solito campiono il pulsante a intervalli di 32 ms , il che è sufficiente per colmare il tempo di rimbalzo di qualsiasi buon pulsante. Sono un grande fan degli switch SKQG TACT di Alps .

Alps tact switch

Sui pochi dispositivi che ho testato aveva un tempo di rimbalzo iniziale inferiore a 10 ns. Sebbene abbia una durata operativa di 100000 cicli, lo abbiamo testato 200 000 cicli e anche allora il 32ms debouncing era sufficiente. (Immagino che avrei dovuto misurare il livello effettivo di rimbalzo, ma il nostro interesse principale all'epoca era il comportamento del prodotto finale. Comunque, lo stavamo usando fuori specifica.)

Se vuoi davvero una soluzione hardware, secondo la soluzione flip-flop SR menzionata nell'articolo come la soluzione tecnicamente migliore:

debounce circuit

Il flip-flop può essere costruito con una doppia porta NAND , disponibile ad esempio in un piccolo pacchetto VSSOP8. Il principale svantaggio di questa soluzione è la necessità di un pulsante SPDT, in cui SPST è molto più comunemente disponibile.


12

Esistono molti (e molti) modi diversi di rimbalzare i pulsanti. Se lo fai in software o hardware dipenderà dai requisiti del tuo progetto e dal tipo di switch.

Ecco alcuni link a diversi metodi:

http://www.ganssle.com/debouncing.htm

http://hackaday.com/2010/11/09/debounce-code-one-post-to-rule-them-all/


Stavo per ottenere un link a Ganssle quando ho visto la domanda.
Kortuk,

L'articolo di Ganssle è stato il motivo per cui ho posto questa domanda, è collegato alla mia domanda :) Grazie per il link agli snippet di codice di rimbalzo.
Vincent Van Den Berghe,

Ti dispiacerebbe riassumere alcuni casi d'uso per illustrare quando utilizzare software / hardware? (Questo è probabilmente soggettivo, ma vorrei comunque degli esempi)
Vincent Van Den Berghe,

1
@Vincent, Kellenjb ha riassunto nella sua risposta come decidere. Non ho cliccato sul tuo link perché aveva un nome divertente, ora che ho cliccato vedo ganssle!
Kortuk,

Se questa è la regola generale / di consenso, in effetti, non sono necessari ulteriori esempi.
Vincent Van Den Berghe,

6

Quell'articolo è la "bibbia" sul rimbalzo. Il rimbalzo del contatto può essere un problema con qualsiasi applicazione.

In genere è meglio rimbalzare gli interruttori nel software in quanto è più facile regolare i ritardi per determinati interruttori, poiché differiscono nella quantità di rimbalzo dei contatti. Spesso è anche necessario rimandare il rilascio della chiave. I produttori di switch spesso specificano la quantità di rimbalzo per i loro prodotti, in genere si aggira intorno ai 10ms - 20ms.


Perché le persone lo votano?
Toby Jaffey,

Un buon punto sul debouncing rilascio chiave!
Vincent Van Den Berghe,

1
Non l'ho sottovalutato, ma solo dire di farlo nel software è una pessima idea. È una buona idea caratterizzare.
Kortuk,

Ho detto "generalmente", che è il caso, e ho spiegato il motivo. Riduce inoltre al minimo il costo della distinta base e aumenta l'affidabilità.
Leon Heller,

aumenta l'affidabilità solo se il segnale rimane entro i limiti di sicurezza del controller. Questa azione aumenterà l'affidabilità se si riduce il conteggio dei componenti senza aumentare l'usura dei componenti. Non stavo dicendo che non ero d'accordo con il tuo concetto di post, ma lavoro costantemente con gli ingegneri appena entrati in campo e una risposta come questa e rimbalzeranno tutto nel software. Devi sempre caratterizzare. Inoltre, non ho votato per il downgrade, ma non ho neanche votato, penso che una risposta ampia come il software rischia che i nuovi sviluppatori rischino il loro hardware.
Kortuk,

1

Il cambio di rimbalzo può andare avanti per decine di millisecondi. Se stai eseguendo il polling di uno switch da una routine di interrupt che viene eseguita su un timer, il rimbalzo non sarà un problema, perché anche se ti capita di eseguire il polling dello switch nel mezzo di una tempesta di rimbalzo, ottieni subito il nuovo stato o, nel peggiore dei casi, ottenere il vecchio stato e non vedere il nuovo stato fino al prossimo sondaggio basato sul timer. Il polling da un ISR temporizzato come questo costituisce una forma di rimbalzo del software.

Tuttavia, se si utilizza tale switch per causare l'interruzione e si prevede che la routine del servizio di interrupt venga eseguita rapidamente, in meno di 10 millisecondi, sarà necessario il debounc dell'hardware, altrimenti un evento switch potrebbe comportare un numero alquanto casuale di interrompe, e sicuramente spesso più di quello previsto. D'altra parte, se la routine di interruzione dura abbastanza a lungo, il rimbalzo dell'interruttore si risolverà prima che l'ISR finisca e andrà bene, ma gli ISR ​​ben costruiti non impiegheranno così tanto tempo.


Avere l'interruttore per causare l'interruzione è una buona idea. Ma una volta ottenuto, non consentire ulteriori interruzioni: spegnili e avvia invece un timer per il tempo di rimbalzo specificato.
Lundin,

@Lundin - se i timer sono disponibili, puoi semplicemente utilizzare il timer per implementare l'approccio polling e non preoccuparti che l'interruttore generi interruzioni.
JustJeff,

0

Il modo migliore per fare qualsiasi cosa è il modo più adatto a te. Ma quando hai già un microcontrollore puoi rimbalzare nel software al solo costo di un po 'di sforzo sul codice.

Il modo più logico di rimbalzare nel software è di controllare i pulsanti in momenti che sono più distanti rispetto al tempo di rimbalzo più lungo. 50 ms sembra essere un limite superiore al tempo di rimbalzo degli switch "normali", quindi quando puoi organizzare il tuo software in questo modo sei in chiaro:

forever loop
   wait (at least) 50 ms
   check buttons
   do procesing
end loop

E usa i timer on-chip sul tuo MCU per questo.
Lundin,

Questo è ovviamente possibile, ma puoi scrivere molti programmi senza.
Wouter van Ooijen,

3
Il software professionale in prodotti di qualità utilizzerà sempre timer su chip. Gli hobbisti possono cavarsela con qualche "NOP" per loop o dead polling. Ma non c'è motivo di farlo in prodotti reali, indipendentemente dalle esigenze in tempo reale. "Non so come funziona il timer e questo ciclo morto impiega 10 secondi per scrivere il mio io pigro" non è un argomento valido per un ingegnere.
Lundin,

Buoi. I professionisti devono essere efficaci, il che (a seconda del progetto in corso) può significare (tra le altre cose) "utilizzare l'hardware nel modo più efficace possibile" o "utilizzare il tempo del professionista nel modo più efficace possibile". Quindi la tua venuta certamente si applica in alcuni casi (probabilmente in tutti i casi che hai affrontato) certamente non si applica in tutti i casi.
Wouter van Ooijen,

L'implementazione del timer on-chip richiede al massimo un'ora del tuo tempo. Non è certo qualcosa di complesso, è l'ingegneria quotidiana del pane e del burro. Non puoi nemmeno investire un'ora nel tuo progetto per ottenere una soluzione significativamente migliore e una qualità complessivamente migliore? Sì bene ... se non sai molto sulla programmazione, potrebbe volerci una settimana. Ma allora forse non dovresti lavorare con il software in primo luogo ... o forse dovresti lavorare di più con esso, quindi imparerai a implementare questa semplice piccola cosa in pochissimo tempo.
Lundin,

0

Un approccio al rimbalzo che non è stato ancora menzionato è quello di utilizzare un interruttore a doppio lancio con un tiro legato a VDD e l'altro a terra. Inseriscilo in un pin che (tramite software o hardware) verrà debolmente portato allo stato attuale. Tale approccio fornirà i vantaggi di un interruttore a doppio lancio, ma richiederà solo un pin I / O anziché due.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.