Collegamento del pulsante a un pin del controller


8

Questo problema è vecchio di decenni ma su questo sito non vedo una risposta diretta. Voglio quanto segue:

inserisci qui la descrizione dell'immagine

Questo circuito consente solo di controllare lo stato del pulsante dall'interno del microcontrollore. Nulla di bello. Le mie domande:

  1. C'è qualcosa di meglio di questo semplice design?
  2. Il valore di una resistenza da 100 kg ohm è adeguato per i nostri dispositivi CMOS ai nostri giorni, come dsPIC30FXXXX e non è un'applicazione ad alta potenza?

2
1) Non proprio, a meno che non stia cercando il debouncing dell'hardware. 2) Sì
NickHalden,

Risposte:


6

Innanzitutto, molti microcontrollori e controller di segnale digitali avranno resistori pull up interni. Ecco un esempio, Atmel ATMega164.Porta GPIO ATMega164p

Generalmente ci sarà un registro che consente di attivare e disattivare i pull up interni. A causa delle variazioni del processo di fabbricazione, questi pullup interni sono disponibili in una gamma molto ampia e non sono una buona scelta se si necessita di un controllo molto stretto sull'assorbimento di corrente in applicazioni a bassissima potenza. Se è importante mantenere basso il numero dei componenti, questo è un modo semplice per farlo. L'uso di pull up interni per il debounce dell'hardware non sarebbe una buona idea, dal momento che non è possibile prevederne il valore esatto.

Se il valore di 100 è adeguato dipende. Se è solo un interruttore che verrà periodicamente lanciato da un utente, allora 100 sarebbe una buona scelta per ridurre al minimo il consumo di energia. Per le cose che cambieranno più rapidamente, come gli encoder rotativi, il processo che vorrei seguire èkΩkΩ

  1. Trova la massima corrente di dispersione nella scheda tecnica
  2. Calcola un valore pull up usando la legge di Ohm
  3. Scegli un resistore di dimensioni standard di alcune dimensioni più grande, a seconda della velocità effettivamente necessaria
  4. Testare e vedere se la dimensione della resistenza scelta fornisce i tempi di salita e discesa richiesti
  5. Regola di conseguenza

Quindi, se la corrente massima del sink per pin GPIO fosse 10 mA e funzionasse a 5 V: . Mantenere questo valore R il più piccolo possibile consentirà di ottenere i bordi più nitidi e le frequenze di commutazione più elevate.R=VI=5V10mA=500Ω


Stai dicendo che a causa della capacità di filo / traccia avrai un circuito RC che causerà ritardi di propagazione del segnale all'UC e che con una R maggiore questi ritardi di propagazione possono effettivamente causare la lettura errata di un encoder rotativo?
angelatlarge

Sì, le reattanze parassitarie sono solo un dato di fatto della vita che devono essere affrontate sempre di più con l'aumentare della frequenza.
Matt Young,

Interessante! Sono confuso però: supponendo che la capacità paracitica sia inferiore a 1 uF, dato un resistore di 100k Ohm e ipotizzando 0,1uF parassita C, otteniamo una costante di tempo di circa 23mS (input = 5V, output = 4.5V). In altre parole in un circuito a 5 V, l'uC vedrà 4,5 V sull'ingresso in un impulso ascendente in meno di 25 ms. Per gli uC che lo mancano (supponendo che non stia eseguendo il polling), l'encoder genererebbe impulsi a circa 40Hz. È qualcosa di cui dovremmo preoccuparci?
angelatlarge

La capacità parassitaria è tipicamente nella gamma nano o pico di Farad. Questo diventa un problema con gli encoder rotativi a velocità più elevate. Considera un encoder ottico che emette 24 impulsi per giro e gira a 1500 RPM. Le onde quadrate di uscita saranno di 600Hz con un periodo di circa 1,2 ms. Questo è ancora abbastanza lento da rendere superfluo il pull up di dimensioni minime, ma 100 comporterebbe tempi di salita e discesa che difficilmente sarebbero accettabili. Questo vale da solo una domanda. kΩ
Matt Young,

Vero e vero Stavo pensando agli encoder rotativi manuali.
angelatlarge

4

Puoi essere più semplice di così.

Basta usare una resistenza pull-up / pull-down interna nel microcontrollore.

100k è adeguato, ma i pullup interni potrebbero essere leggermente inferiori in alcuni MCU, ad esempio in AVR atmega8 è 30-80kOhm per il ripristino del pull-up e 20-50kOhm per tutti gli altri pin I / O.


Non puoi dire che 100k siano adeguati. Non esiste una ricevuta universale, è necessario calcolare il valore in base all'MCU e al dispositivo che guida il pin sull'altro lato.
Blup1980,

1
La persona che ha posto la domanda ha specificato un pulsante. Non vedo problemi con questa risposta.
mjh2007,

1
  1. C'è qualcosa di meglio di questo semplice design?


    Meglio non si può rispondere senza criteri specifici su cui misurare, che non sono stati forniti. Nella maggior parte dei casi, la topologia che mostri va bene. Due variazioni potrebbero essere "migliori" a seconda della situazione:

    Molti microcontrollori hanno pullup interni su alcuni dei loro pin. Questi sono pensati proprio per questo tipo di situazione. Il resistore è quindi interno al micro e si imposta un po 'da qualche parte per abilitarlo. L'unica parte esterna richiesta è solo il pulsante stesso.

    Un'altra variante utile da tenere a mente è per i progetti a bassa potenza in cui il pulsante potrebbe essere un interruttore che può essere chiuso per lunghi periodi di tempo. In tal caso, si desidera ridurre al minimo la corrente media a lungo termine attraverso la resistenza di pullup. Lo rendi il più grande possibile, ma ci sono limiti e svantaggi per renderlo troppo grande. Invece, si attiva il pullup per pochi µs alla volta per prendere una lettura del pulsante. Se si controlla il pulsante ogni 1 ms e il pullup è attivo per 10 µs, la corrente di pullup media viene ridotta di 100x. Con una resistenza esterna si utilizza un altro pin per guidare il lato superiore del pullup. Con un pullup interno, lo si abilita / disabilita nel firmware secondo necessità.

  2. Il valore di una resistenza da 100 kg ohm è adeguato per i nostri dispositivi CMOS ai nostri giorni, come dsPIC30FXXXX e non è un'applicazione ad alta potenza?


    Ho già risposto a lungo qui .


0

Meglio di quel semplice design? Sì. Getta un tappo e hai un semplice interruttore debounce hardware.

inserisci qui la descrizione dell'immagine

Il condensatore sarebbe un comune tappo in ceramica da 0,1uf. Il resistore sarebbe un 10k. Questo sito contiene tutti i dettagli sul perché. In breve, un circuito di debounce impedisce al microcontrollore di registrare erroneamente più pressioni quando si preme il pulsante. L'impostazione del resistore / condensatore attenua il rimbalzo meccanico del pulsante in modo che sia una transizione costante.


Le protezioni elettrolitiche non amano essere messe in corto circuito. Uso regolarmente 100nF che funziona bene per le mie applicazioni.
jippie,

1
@jippie il simbolo era ciò che l'immagine aveva, ma è necessaria una ceramica da 100 nf o 0,1uf.
Passerby

3
Questo non è un buon circuito di rimbalzo. In primo luogo, questo rimbalza solo una pausa, non una marca. Quando si preme il pulsante, il cappuccio viene immediatamente messo in corto circuito. In secondo luogo, la costante di tempo di 1 ms è troppo breve per essere molto utile. Terzo, questo dovrebbe essere inserito solo in un input di trigger Schmidt. Agli ingressi normali non piacciono i segnali in lento aumento. Basta lasciare il tappo e fare il debouncing nel firmware, che dovresti fare comunque anche con il tappo.
Olin Lathrop,

Sì, al momento della messa il cappuccio viene immediatamente messo in corto circuito, ma qualsiasi ricarica a causa del rimbalzo viene filtrata passa-basso, rimuovendo gli effetti del rimbalzo. Forse più precisamente, il debounce on make è un meccanismo molto diverso rispetto al debounce in break. Un ms è troppo veloce però. Non mi piace usare questo circuito per una serie di motivi. Tuttavia, se stai guidando un interrupt con il pin in questione, il debounc nel firmware spesso non è la soluzione migliore. Passare a un DPST e rimbalzare con un flipflop SR è un metodo abbastanza buono per quel caso.
Scott Seidman,

0

EDIT - il commento che ho fatto di seguito aveva lo scopo di dare seguito a ciò che Olin aveva detto in seguito sul circuito con un condensatore per aggiungere presumibilmente il rimbalzo. Mi dispiace che appaia nel posto sbagliato - forse qualcuno può sistemarlo perché ovviamente sono troppo cieco o stupido per vedere come avrei dovuto farlo !!

Sono d'accordo con Olin - non fornisce un buon rimbalzo. Vorrei anche aggiungere che cortocircuitare il condensatore può causare un forte aumento di corrente che può resettare il microprocessore se il layout del PCB non è davvero buono. Alcuni interruttori hanno bisogno di una corrente di bagnatura per funzionare correttamente e in modo affidabile e 100k potrebbero essere troppo alti per alcuni interruttori (specialmente interruttori a membrana).

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.