Modi intelligenti per rilevare un pulsante (meno consumo di energia)


28

Durante una riunione per un particolare progetto, mi è stato chiesto di pensare al modo di rilevare la pressione di un pulsante con un MCU. Il rilevamento dovrebbe consumare meno energia possibile. A prima vista, ho pensato al tipico circuito con un pull-up o un pull-down:

schematico

simula questo circuito - Schema creato usando CircuitLab

Non conto di alcune funzionalità anti-rimbalzo qui, poiché questo va oltre lo scopo di questa domanda. In entrambi i casi, quando si preme il pulsante, il valore corrente totale che scorre dipende dal valore della resistenza. Per minimizzarlo (la corrente), potrei aumentare il valore del resistore ma non tanto poiché, se ho ragione, dipende anche dal valore di dispersione del pin di ingresso. Inoltre, un grande resistore si riprenderà lentamente.

La mia domanda è la seguente: quali sono i modi intelligenti per rilevare un pulsante premuto che non consuma energia (in genere per un'applicazione ad alto consumo di energia)? Esistono metodi che consumano appena il pulsante quando si preme il pulsante?


5
Un pull-down di 10k non consuma quasi energia. 3.3V fornisce 330uA. E sulla maggior parte dei moderni MCU hai la possibilità di impostarne uno internamente, che avrà una resistenza ancora maggiore. Detto questo, è possibile attivare l'alimentazione dei pulsanti da un pin MCU attraverso un BJT o MOSFET. Attivalo solo durante la lettura e leggi con polling.
Lundin,

27
@Lundin In termini "moderni", 330 A può essere un'alta corrente ...μ
awjlogan

6
in effetti, molti microcontrollori possono ottenere correnti di sonno a partire da 2-10 μA. Sprecare 30 volte quello su un singolo pull-down è un po 'triste, specialmente in una situazione alimentata a batteria.
whatsisname

1
Quanto è grande una resistenza che puoi usare in un pull down dipende dall'impedenza dei pin e dalla tensione che commutano. Supponiamo che tu abbia un pin 3.3v in uno stato ad alta impedenza che commuta a 2.4v, tutto ciò di cui hai veramente bisogno è un'impedenza leggermente inferiore rispetto all'ingresso. Ti consiglierei di collegare un potenziometro e misurare quanto è alto il valore di un resistore che puoi usare affinché il pin continui a funzionare in modo affidabile, e poi riduci del 20% in valore per mantenere un margine.
Drunken Code Monkey il

Risposte:


29

Un metodo a bassa corrente che ho usato una volta era quello di collegare un interruttore tra due pin I / O del microcontrollore.

Un I / O è stato configurato come uscita (SWO). Il secondo è stato configurato come input (SWI) con il pull-up interno programmabile abilitato.

Lo stato dello switch è stato campionato di rado (ogni 10 ms) da una routine di interruzione del software. La sequenza di lettura era: drive SWO basso, lettura SWI, drive SWO alto.

Ciò significava che un interruttore premuto assorbiva la corrente di pull-down SWI attraverso se stesso e SWO per meno di 1 us durante la scansione, mentre un interruttore non compresso non assorbiva corrente. Questo assorbimento di corrente per <1 us ogni 10 ms ha comportato un consumo medio medio di corrente molto ridotto.


È discutibile il motivo per cui è necessario il pull-up usando questa tecnica. Sequenza SWO bassa, lettura SWI, SWO alta, lettura SWI potrebbe essere sufficiente per dire se i pin sono collegati insieme. È inoltre possibile condividere SWO tra numerosi switch.
Trevor_G,

8
@Trevor Lasciare l'ingresso mobile quando l'interruttore è aperto non è una buona idea. A seconda della tecnologia, il buffer di input può consumare energia se il suo input si trova in uno stato intermedio.
RoyC,

1
@Trevor Moltiplicando efficacemente la resistenza di pull up per il duty cycle sw1 sw2. Ancora un pull up che ci riporta allo schema del PO 1. Potrebbe funzionare in un ambiente a basso rumore.
RoyC,

2
Il fatto che l'MCU debba rimanere sveglio per eseguire il polling invece di fare affidamento su un interrupt annulla completamente qualsiasi salvataggio da cicli di commutazione più brevi?
AndreKR,

5
Ciao @AndreKR, avevamo un'applicazione di microcontrollore alimentato a batteria e aveva bisogno di più interruttori collegati, quindi abbiamo usato questa tecnica perché era abbastanza semplice. Non avevamo inserito un MCU solo per il rilevamento degli interruttori. L'MCU ha disegnato qualcosa come 900nA in modalità sleep tra i suoi 10ms interrupt, quindi i risparmi di pull-up sono stati utili.
TonyM

23

A SPDT ( S ingle P ole D ouble T hRow) pulsante sarebbe il pulsante ultra efficiente.

inserisci qui la descrizione dell'immagine

Fonte: http://www.ni.com/white-paper/3960/en/

Nel tuo caso, 1P andrebbe all'MCU, 1T a VCC, 2T a GND.


+1 .. mi ha sempre infastidito il fatto che gli SPDT in miniatura sono molto difficili da trovare o costano troppo ...
Trevor_G,

1
@Trevor Sì ... alcune cose sono purtroppo molto care. Mentre gli altri articoli sono sottovalutati (MCU per un esempio). Non puoi avere tutto.
Harry Svensson,

Questa è una grande idea. Purtroppo non sono riuscito a trovare un pulsante CMS SPDT adatto alle mie esigenze. Terrò presente questo circuito però
vionista il

10

Per quanto tempo verrà premuto il pulsante? Se non è un interruttore a levetta (che mantiene il suo stato) ma un interruttore momentaneo, la corrente che scorre quando si preme il pulsante è in gran parte irrilevante a causa del breve tempo in cui il pulsante è effettivamente chiuso.

Uno dei due circuiti che mostri è OK, non importa.

Si può presumere che la perdita di ingresso e / o la corrente in un ingresso MCU sia trascurabile . Tutti gli MCU sono attualmente in tecnologia CMOS e hanno una corrente di ingresso praticamente nulla. Quindi smetti di considerarlo, non è lì.

Invece di utilizzare un resistore esterno, è possibile utilizzare anche il resistore pull-up interno incorporato in molti ingressi MCU. Questo resistore potrebbe avere un valore relativamente basso (forse 50 kohm), quindi una piccola corrente scorrerà quando si preme il pulsante.

Puoi tranquillamente utilizzare anche una resistenza da 1 Mohm per un pull-up / pull-down. Solo in ambienti molto "sporchi" (elettricamente parlando) potresti aver bisogno di un valore inferiore. È inoltre possibile posizionare un condensatore da 100 nF in parallelo con l'interruttore per sopprimere le interferenze da altri circuiti nelle vicinanze.

Suggerimento professionale: riservare un posto per un tale condensatore sul PCB, ma non montare un cappuccio. ancora. In caso di problemi: posizionalo e vedi se aiuta.

Per rilevare lo stato dell'interruttore, utilizzare il polling (come nella risposta di TonyM) o utilizzare un interrupt . Dipende dall'applicazione quale è meglio per il consumo di energia (dell'MCU).


In realtà il pulsante sarà momentaneo, ma il tempo in cui verrà premuto potrebbe essere abbastanza lungo (minuti)
vionista

Se il dispositivo è attivo 24 ore su 24, 7 giorni su 7, un paio di minuti potrebbero non essere sufficienti. Ciò che è importante è il ciclo di lavoro, 5 minuti ogni ora è 5 x 60/3600 = 8,3%. Quindi, anche a una corrente di 100 uA lo switch consumerebbe in media 8,3 uA nel mio scenario. Il mio messaggio è: non concentrarti troppo sulla corrente utilizzata dallo switch quando viene premuto senza confrontarlo con il consumo corrente del sistema completo. Solo quando i contributi sono gli stessi, ha senso migliorare il consumo corrente dell'interruttore. Non serve fare un interruttore da 0,1 uA quando l'MCU usa 1uA in modo continuo.
Bimpelrekkie,

"Non serve fare un interruttore da 0,1 uA quando l'MCU usa 1uA in modo continuo." sembra fuori. Penso che intendi picco 1uA. Il 10% solo per l'interruttore sarebbe eccessivo;)
Trevor_G

@Trevor Non picco, intendo corrente media di 1uA per l'MCU ma 0,1uA quando si preme l'interruttore. Combinato con un interruttore da 0,1 A che verrà premuto solo per periodi (relativamente) brevi, l'interruttore non contribuisce quasi nulla al consumo medio totale di energia poiché la corrente media sarà: 100% x 1 uA + 8,3% * 0,1 uA = 1,0083 uA (8,3% riutilizzato dal commento sopra).
Bimpelrekkie,

2
Sì, ha appena letto come se avessi significato media 0.1uA sullo switch. Il che non sarebbe irragionevole come un dip-switch.
Trevor_G,

10

Un metodo che ho usato sfrutta la natura capacitiva degli ingressi CMOS.

schematico

simula questo circuito - Schema creato usando CircuitLab

Nel circuito sopra l'interruttore, quando chiuso, consente alla resistenza di pull-down di caricare / scaricare le capacità di ingresso del GPIO fino a terra.

Il trucco di questo circuito consiste nell'utilizzare la natura bidirezionale di un GPIO per mantenere alto l'ingresso logico a livello logico quando l'interruttore è aperto.

La routine di controllo trasforma periodicamente il perno di livello alto o abilita brevemente il pull-up, abbastanza a lungo da mantenere una carica dei tappi. Il pin di input si comporta quindi come un bit di memoria dinamica e, con la maggior parte dei dispositivi, mantiene tale carica per un periodo di tempo considerevole e utilizzabile.

Se configurato correttamente, se si preme il pulsante, la carica sul pin si scaricherà più velocemente della frequenza di aggiornamento. Tale condizione può quindi essere rilevata come parte dell'algoritmo di aggiornamento come operazione di lettura prima dell'aggiornamento o utilizzata per generare un interrupt.

L'alimentazione viene brevemente utilizzata durante l'impulso di aggiornamento, sia per ricaricare i condensatori che attraverso il resistore e passare se è chiuso. Tuttavia, la lunghezza dell'impulso di aggiornamento è breve e la frequenza di polling risulta nella corrente di aggiornamento relativamente insignificante.

Ovviamente questo metodo è attivo. Se il micro viene messo in sospensione, lo stato dell'interruttore sarà indeterminato al risveglio. Il primo ciclo di aggiornamento dopo il risveglio deve ignorare la lettura del pin. Inoltre, questo metodo non deve essere utilizzato per riattivare il micro. Prima di andare a letto, è anche consigliabile abilitare il pin come uscita bassa per parcheggiarlo in uno stato di corrente zero.

Per leggere più interruttori statici, come i dip-switch di impostazione, è possibile utilizzare una routine dedicata anziché un ciclo di aggiornamento continuo. Dopo la lettura, i pin GPIO dovrebbero quindi essere "parcheggiati" in uno stato di uscita basso attivo (corrente zero) per evitare il problema degli ingressi flottanti.

NOTA: questa tecnica soffre leggermente della sensibilità al rumore se le lunghezze della traccia sono lunghe e viaggiano in un'area rumorosa. Come tale R1 dovrebbe essere vicino al pin di ingresso. Tuttavia, non lo consiglierei per collegare un interruttore a una certa distanza su un pannello anteriore da qualche parte a meno che non si aggiunga capacità aggiuntiva vicino al pin.


1
Sembra davvero molto vulnerabile all'IME. Se una qualsiasi forma di energia radio entra nel circuito e penso che tutte le scommesse siano disattivate. La roba wireless non è così comune al giorno d'oggi :)
Lundin,

@Lundin non è così male come potresti pensare. 30pF e un mega fanno un filtro piuttosto buono.
Trevor_G,

8

Se il tuo pulsante è un interruttore piezoelettrico, l'unica potenza richiesta è quella generata premendo il pulsante.

Ad esempio: R2 / C1 raccoglie l'energia prodotta premendo il piezo. D1 impedisce che la tensione C1 diventi troppo alta. R1 scarica C1 quando il pulsante viene rilasciato. Il GPIO MCU deve essere in input, nessuna modalità pull. Voilà, pulsante rilevato con assorbimento di corrente zero dall'alimentazione.

schematico

simula questo circuito - Schema creato usando CircuitLab


3
Hmm, puoi fare / progettare un prototipo funzionante di questo e mostrare i vantaggi delle soluzioni con un normale interruttore che abbiamo usato negli ultimi 30 anni?
Bimpelrekkie,

Sicuro. Ho aggiunto un esempio schematico. Costruiscilo semplicemente. Il vantaggio è che non vi è assorbimento di corrente zero dall'alimentazione in stato chiuso o aperto. Gli svantaggi includono uno scarso controllo dello sforzo richiesto per attivare l'interruttore (un circuito attivo sarebbe migliore, ma ciò sventa il vantaggio molto marginale del circuito), ed è un design innovativo rispetto al normale 30 anni di progettazione dell'interruttore.
Heath Raftery,

Tuttavia, la mia calcolatrice ha molti pulsanti e funziona almeno 5 anni su una cella a bottone. Non riesco ancora a vedere come la tua soluzione possa apportare alcun vantaggio. Penso ancora che sia una "soluzione" a un problema inesistente. E anche più costoso.
Bimpelrekkie,

1
Oh sono d'accordo! Soddisfa i criteri originali "consuma meno energia possibile", ma è difficile immaginare perché salvare meno di un millijoule sia effettivamente utile.
Heath Raftery,

L'impedenza di ingresso dell'MCU non fa cose cattive a causa dell'elevata impedenza di uscita del piezo?
Scott Seidman,

5

Se il dispositivo deve essere in grado di rimanere in uno dei due stati indefinitamente, l'utilizzo di un interruttore SPDT rappresenterà l'approccio a più bassa potenza, poiché un circuito statico può essere fatto per assorbire corrente oltre la propria perdita interna e quella dell'interruttore. Un ulteriore vantaggio degli interruttori SPDT è che possono essere rimossi quasi alla perfezione, indipendentemente dalla velocità con cui vengono azionati o da quanto potrebbero essere scadenti i contatti, a condizione che solo un contatto smetta di rimbalzare prima che l'altro venga letto come chiuso.

Esistono due buoni approcci per cablare tali interruttori:

schematico

simula questo circuito - Schema creato usando CircuitLab

Il primo approccio richiede un resistore in meno rispetto al secondo, ma il secondo sarà più tollerante di sovrapposizione tra i due poli (assorbirà una corrente superiore al normale, ma non metterà un corto circuito sull'alimentazione). Si noti che se l'interruttore può entrare in uno stato moderatamente resistivo per un periodo di tempo prolungato, ciò potrebbe bruciare una corrente significativamente maggiore del normale, ma durante l'uso normale nessuno dei resistori trasporterà alcuna corrente significativa tranne durante il breve momento tra il quando l'interruttore cambia stato e l'uscita risponde.


2

Utilizzare il pull-up interno del microcontrollore e quando viene rilevata la stampa disabilitare il pull-up. Quindi occasionalmente riattivarlo brevemente per controllare lo stato del pulsante.

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.