Salve, avrei una domandina semplice e rapida, nello schema allegato, come posso dimensionare il condensatore di debounce?
Grazie
Se il pulsante non é assegnato ad un interrupt farei il debonce via Software nello Sketch.
Ciao Uwe
Siamo proprio nel caso di un interrupt, la parte software risulta particolarmente annidata, per via di modalità e sotto modalità di funzionamento, mi è comodo aver un pulsante on/off che mi vada ad influire su una singola variabile.
RobertoBochet:
Salve, avrei una domandina semplice e rapida, nello schema allegato, come posso dimensionare il condensatore di debounce?
Grazie
Sebbene quello schema è riportato su molti siti è sbagliato
Quello corretto è questo.
Le due R e C vanno dimensionati per ottenere un tempo di carica, per arrivare alla tensione minima del 1 logico, non minore di 10 ms.
Per un Atmega 328 alimentato a 5V puoi usare R1 da 150k (va bene anche maggiore), R2 da 10-15k, il condensatore da 100 nF.
Grazie Astro. In effetti avevo qualche dubbio vedendo quel condensatore in corto. Cavoli, il PCB è gia stato stampato, prevedo altre versioni in futuro dello stesso, terrò conto della modifica da fare. Ma per ora quel condensatore può creare problemi? Oppure posso inserirlo senza pretendere un funzionamento perfetto? Provando lo schema che ho riportato su breadboard noto notevoli miglioramenti, sto martoriando l'ATmega?
Il condensatore viene comunque cortocircuitato, pero' attraverso la resistenza di valore piu basso, il che impedisce all'energia accumulata nel condensatore di scaricarsi di colpo sui contatti (ed inoltre introduce un minimo ritardo, per cui se lo usi come interrupt e ti serve molto veloce, puoi usare una R2 anche solo da 470 ohm o simile) ...
Nel caso di condensatori cosi piccoli e di pulsanti, non influisce piu di tanto (la corrente impulsiva data dalla scarica non e' in grado di danneggiare un normale pulsante o interruttore, con 100nF), pero' se si usassero ad esempio contatti REED miniatura da pochi mA di portata, sarebbe da prendere in considerazione anche quella, quindi come nello schema postato da Astro, mai cortocircuitare "secco" un condensatore senza metterci una resistenza, anche di basso valore
Da bravo scout ho corretto lo schema e il master del PCB, così per la prossima stampa l'errore non ci sarà più.
Ok allora il condensatore lo lascio, con la sua bella resistenza di pull-up. Dimensioni per queste? Le stesse proposte per lo schema corretto?
Grazie Etemenanki, ma come mai tu ed Astro suggerite valori cosi diversi per la R2? Mai Astro mi ha dato idea di sparare valori a caso.
Ho usato diverse volte lo schema proposto da RobertoBochet con un condensatore da 1uF e per la resistenza di pullup ho attivato quella interna del microcontrollore... sembra funzionare bene.
Che danni devo aspettarmi?
Meno male... e io che pensavo di trovarmi la macchina rigata
Molto gentilmente si potrebbe sapere perchè non è corretto quello schema?
@astro non hai usato un trigger?
con un trigger è meno influenzato dalla resistenza+condensatore a monte giusto?
Io almeno l'ho sempre vista così ma finalmente posso approfondire con uno che ne capisce....
Spero che era un arduino.org
(non potevo resistere)
Entrate digitali se non hanno la funzione Schmitt Trigger possono avere problemi (non riconoscono un cambio di stato) con segnali che variano molto lentamente. Mettendo un invertitore con funzione Schmitt Trigger migliori l' affidabilitá.
Ciao Uwe
vbextreme:
@astro non hai usato un trigger?
Quella è solo la prima immagine pronta che ho trovato del corretto circuito RC di debouncing, è sottinteso che va direttamente sul pin di Arduino, o altro micro, senza la porta not in mezzo che è presente solo per fini illustrativi.
Sono anni che tutti i micro hanno gli input digitali con Trigger di Schmitt.
uwefed:
Entrate digitali se non hanno la funzione Schmitt Trigger possono avere problemi (non riconoscono un cambio di stato) con segnali che variano molto lentamente.
Questo non è corretto, il Trigger di Schmitt garantisce i livelli delle soglie, ovvero l'isteresi, pertanto hai il riconoscimento del livello logico solo quando la tensione arriva ai livelli previsti con un errore massimo di 40-50 mV.
Negli input senza Trigger di Schmitt non c'è nessuna garanzia dei livelli logici, salvo i valori massimi di riconoscimento, qualunque tensione all'interno della soglia può essere interpretata sia come uno che come zero, dipende dalle tolleranze costruttive, però tale valore è stabile ad un certo livello e non porta ad errati riconoscimento, od oscillazioni, se la tensione varia lentamente.
In passato la stragrande maggioranza delle porte logiche TTL non aveva input con Schmitt Trigger eppure funzionavano benissimo, se c'era la reale esigenza si usavano appositi port/buffer dotati di quella funzione.
pelletta:
Molto gentilmente si potrebbe sapere perchè non è corretto quello schema?
Perché non è mai una buona idea cortocircuitare un condensatore, inoltre evita i picchi di tensioni negativa dovuti al naturale ciclo di carica/scarica dei condensatori, c'è una variante di quello schema con un diodo in parallelo a R2 proprio per eliminare ogni possibile picco negativo, gli input logici sono molto sensibili alle tensioni negative, è un ottimo modo per distruggere un pin.
Se lo switch è un fine corsa si può abbassare il valore di R2 fino 220 ohm, in modo da ridurre il tempo di risposta, con i valori consigliati è circa 1 mS.
Se serve un tempo di risposta quasi istantaneo allora tocca usare la configurazione con flip flop SR e switch deviatore, questa è la soluzione ottimale però è la più complessa da implementare.
Rammento che esistono appositi IC per il debouncing, utilissimi quando si deve "litigare" con molti pulsanti e/o encoder meccanici.
RobertoBochet:
... come mai tu ed Astro suggerite valori cosi diversi per la R2? ...
Perche' quei valori possono variare anche di parecchio, in funzione delle caratteristiche degli ingressi e dei tempi di risposta necessari ...
Una rete RC introduce sempre un minimo di ritardo, anche se poco, quindi per dimensionare quei valori si deve sempre prendere in considerazione il tipo di utilizzo, la velocita' di risposta richiesta, ed anche l'impedenza di ingresso tipica del circuito a cui va collegato ... per l'impedenza di ingresso, in questo caso puo essere ignorata, perche' l'impedenza tipica degli ingressi di Arduino (circa 100 megaohm) e' talmente alta da non influire praticamente per nulla sul comportamento del circuito di debounce ... quindi consideri solo il circuito in se, e la velocita' a cui deve reagire ...
Ci sono piu tipi di schema valido di debounce, sia con che senza protezione, ad esempio anche quelli che allego funzionano senza problemi ... e come dicevo, i valori possono essere anche molto diversi ... per esempio, per pulsanti o finecorsa meccanici, un ritardo di un millisecondo o simile non e' poi molto influente, quindi anche se si usa un condensatore da 100nF ed una resistenza un po piu alta, non succede nulla ... se invece l'ingresso fosse, ad esempio, collegato ad un contatto REED che deve rilevare piu chiusure al secondo, e necessita di ritardi minori, si puo ridurre il condensatore a 22nF o simili ed anche la resistenza in serie puo essere ridotta a tipo 100 ohm e quella di pull-up (o pull-down) a tipo 3K3 o simile, il che causa un ritardo molto minore, anche se a scapito di una minore protezione dai rimbalzi (ma con i REED di rimbalzi in genere ce ne sono pochi, quindi la cosa e' accettabile) ...
Come protezione, invece, o il diodo suggerito da Astro, oppure un semplice zener in parallelo al condensatore (anodo a massa e catodo al pin di ingresso), scelto con la stessa tensione di alimentazione della logica (in questo caso, 5V), che proteggerebbe sia dagli impulsi negativi (cortocircuitandoli a massa come diodo normale) sia fino ad un certo punto dalle sovratensioni (andando in conduzione verso massa per la parte eccedente i 5V)
Poi il fatto di usarli o meno, dipende ancora una volta dalle circostanze ... esempio, se il tuo sketch non ha problemi se viene bloccato per alcune decine di mS, ed hai uno o due ingressi al massimo, si puo anche optare per un debounce hardware (orrore, come hardwarista, non riesco a credere di aver scritto davvero una cosa del genere
), se invece lo sketch non si puo fermare, o se i cicli di delay creano problemi, o se ci sono parecchi ingressi, allora la soluzione hardware e' ancora la migliore ... vero che prevede componenti in piu da mettere sullo stampato, ma toglie tutta la gestione dei debounce ed i ritardi conseguenti dallo sketch (che per parecchi ingressi potrebbe diventare incasinata ed interferire con il resto del programma), ed inoltre, una volta che i componenti sono li, lo sketch lo puoi modificare a piacere senza dover tenere conto ogni volta di cosa potrebbero fare i delay alla nuova parte di programma ...
Etemenanki:
si puo anche optare per un debounce hardware (orrore, come hardwarista, non riesco a credere di aver scritto davvero una cosa del genere![]()
![]()
![]()
)
Probabilmente volevi dire software
Però il debounce software non richiede necessariamente lo stop del programma, anzi chi usa la delay per il debounce è da "randellare" , si fa tranquillamente tramite un task/funzione dedicato che viene richiamato periodicamente, p.e. ogni 20 ms, testa lo stato dei pulsanti, se c'è una variazione la memorizza e ignora lo stato del pulsante per il seguente ciclo, in questo modo cancelli tutti i rimbalzi e puoi rilevare lo stato di pressione continua, il tutto senza impegnare la cpu per più di pochi cicli macchina.
Grazie mille per le spiegazioni, adesso vado ad acculturarmi su questo Trigger di Schmitt. Ma perché tu ed astro siete sempre in disaccordo, il tuo schema è diverso dal suo per la posizione della resistenza di pullup, nel suo la resistenza è posizionata sul pulsante, nel tuo direttamente sul pin.
No, @astro e @etem sono come Vianello e Sandra Mondaini... litigano ma in realtà si "amano"
Ahahah, non lo sapevo, i retroscena di Arduino Italia, mhh comunque è poco professionale. Vuol dire che vanno bene entrambi gli schemi? Oppure uno dei due si farà avanti smentendo la propria proposta o accusando l'altro?