Domanda:
Antirimbalzo hardware della matrice chiave con componenti passivi minimi
DEKKER
2018-02-12 18:09:21 UTC
view on stackexchange narkive permalink

Di recente ho acquistato questa matrice per tastiera 4x4 economica.Ha solo i pulsanti e nient'altro quindi voglio aggiungere un antirimbalzo adeguato.Il debouncing nel software è qualcosa che voglio evitare perché richiede una certa potenza di elaborazione dalla mia applicazione.

enter image description here

So che il debouncing può essere eseguito utilizzando un resistore e un condensatore (ho ragione?) o un trigger schmit (che richiede un altro IC immagino ed è fuori discussione per me), quindi la domanda è: dovrò aggiungere R/ C per ogni chiave o posso farla franca con una sola coppia R / C per riga o per colonna?

Qualche suggerimento?

Immagino che tu sia (nel peggiore dei casi) disposto a saldare sul modulo stesso, se una soluzione multiplex non è possibile?
@pipe sì, salderò la soluzione sul lato inferiore della stessa scheda utilizzando componenti SMD ... almeno questo è il piano!
Il debouncing dovrebbe funzionare non solo con i nuovi tasti, ma anche con i tasti vecchi con alcune centinaia o migliaia di battute.
Penso che dovresti rivisitare la questione del debounce del software.Esistono tecniche che utilizzano pochissimi cicli.L'aggiunta di resistori e / o tappi a una tastiera di scansione potrebbe avere risultati imprevedibili.Se hai ancora bisogno di aiuto per farlo, devi fornirci maggiori informazioni, velocità di scansione e tempo minimo richiesto per la pressione dei tasti.
Questo è un problema XY.Spiega perché secondo te il polling dei pulsanti è un'elaborazione eccessiva.
Sono d'accordo con DEKKER sul fatto che ridurre il codice aggiungendo componenti hardware è sempre una buona idea.IMO, 0,01 o anche 0,1 uF cap o varistore prima di un resistore non darà risultati inaspettati.Ma deve essere testato.
La scansione e il debouncing del firmware di una piccola matrice di chiavi dovrebbero richiedere meno dell'1% della larghezza di banda di un piccolo micro che opera a pochi MHz.Può aumentare la latenza nel caso peggiore se il processore non dispone di interruzioni di priorità annidate.Ecco perché praticamente ogni applicazione pratica di tale matrice di chiavi utilizza il debouncing del firmware.
Se il rimbalzo di una matrice 4x4 è troppo impegnativo dal punto di vista computazionale, stai facendo qualcosa di sbagliato.
L'antirimbalzo del software può essere semplice come eseguire il polling della tastiera non più veloce di ogni X ms, dove X è il tempo massimo di antirimbalzo.
dedicare un microcontrollore separato per l'interfaccia della tastiera.se hai anche un LCD, usa lo stesso controller per quello
controlla il chip HT16K33
Forse notare che il debouncing del software richiede un segnale elettrico elaborabile dal circuito di ingresso del controller.Transitori veloci nel range ns possono verificarsi durante il rimbalzo e potrebbero causare problemi ai circuiti di ingresso.L'antirimbalzo del software non è un sostituto equivalente dell'antirimbalzo dell'hardware.
Cinque risposte:
Andy aka
2018-02-12 18:38:52 UTC
view on stackexchange narkive permalink

Siamo chiari su questo. Se si dispone di una matrice della tastiera, si sta già utilizzando la potenza di elaborazione per applicare tensioni logiche sequenziali alle righe o alle colonne, quindi rileggendo le colonne o le righe per determinare il pulsante premuto.

Quindi, ogni volta che ottieni un "risultato" cioè rilevi che un pulsante è stato premuto, contrassegni quell'evento come "in sospeso" e qualche tempo dopo (da 10 a 20 ms) controlli di nuovo per vedere se il pulsante è stato premuto contrassegnato come "in sospeso" può essere considerato "effettivo".

Secondo me, il tempo di elaborazione necessario è molto piccolo nello schema più grande e se sei così vicino al limite al quale la tua CPU può funzionare, allora prendi una CPU più grande / più veloce o aumenta la velocità di clock.

L'uso di Rs e Cs può funzionare ma, in tutti i casi, produrrà un output "lento" che dovrebbe essere attivato da schmitt per ripulire il fronte lento fino a un fronte veloce adatto alla logica che segue. Potresti farla franca, naturalmente, ma poi hai una soluzione fissa senza flessibilità.

Detto tutto quanto sopra, potresti anche aver bisogno di condensatori da ciascuna linea della matrice a terra per evitare problemi di ESD / EMC.

Dipende da cosa si intende per lento.Un trigger shmitt sembra semplice su uno schema ma su un PCB aggiunge molte connessioni e tracce.Vorrei prima testare se è davvero necessario.In caso affermativo, cercherò un IC trigger quad shmitt (o ottale se esiste) per risparmiare spazio sulla scheda e contare i componenti.
Hai ragione ... Sto comunque cercando i pulsanti nel firmware, quindi un po 'più di cicli sprecati non farebbe così male!quel problema di EMC è un bel punto a cui non avevo nemmeno pensato.Grazie
Potete per favore dare un suggerimento su quanto dovrebbe essere grande il condensatore per EMC e perché quel particolare valore?anche per quanto riguarda le resistenze?
100 pF dovrebbero essere ok.Nessun vero calcolo o teoria, solo una buona pratica.
Non dimenticare anche i pull up o i pull down sugli input.
MCG
2018-02-12 18:21:12 UTC
view on stackexchange narkive permalink

Per ottenere le migliori prestazioni di antirimbalzo, sarebbe probabilmente meglio avere un R / C per ogni pulsante.Tuttavia, dovresti comunque ottenere risultati decenti con uno per riga / colonna.Dipende solo da quanto sia veramente critico.Se vuoi farlo con la quantità minima di componenti, perché non provi prima a farne uno per riga / colonna, quindi prendi alcune misurazioni e vedi se il risultato è abbastanza buono per la tua applicazione?

Se i risultati non sono quelli che volevi, vai avanti e aggiungine alcuni su ciascun pulsante, quindi riprova.

Graham
2018-02-13 00:35:27 UTC
view on stackexchange narkive permalink

Essendo un ingegnere di software embedded di lunga data, devo dire che la tua supposizione che il debounc toglierà un po 'di potenza di elaborazione dalla mia applicazione è semplicemente errata. Questo non sarà mai vero per nessun firmware scritto in modo competente.

Naturalmente, il debouncing richiederà una certa elaborazione. Tuttavia l'elaborazione è banale e per l'input dell'utente avverrà a un tasso di aggiornamento così basso da essere del tutto trascurabile. Se fosse necessario eseguire l'antirimbalzo degli input con velocità di aggiornamento in decine di kHz, forse l'elaborazione per l'antirimbalzo sarebbe significativa, ma un essere umano che preme i pulsanti non ha bisogno di nulla di simile a quel tipo di risoluzione. Nel tuo caso, il campionamento a 100 Hz sarebbe abbastanza veloce e potresti quasi certamente ridurre il campionamento a 10 Hz senza compromettere seriamente la tua interazione con l'utente.

Se stai cercando di eseguire l'elaborazione degli input in un ciclo di controllo principale che funziona a decine di kHz, ovviamente risuccherai potenza di elaborazione. La soluzione corretta è scrivere un firmware che non lo faccia in questo modo, non utilizzare una soluzione hardware per correggere un anti-pattern software. Un uso appropriato dei timer e delle priorità di interrupt ti darà ciò di cui hai bisogno.

Puoi ottimizzare l'elaborazione assicurandoti che la rilettura sia tutta su una porta I / O. Supponendo che tu stia impostando i livelli sulle colonne e rileggendo le righe, quindi bit-AND, bit-shift e bit-OR per creare un valore a 16 bit per i 16 pin. XOR questo con il precedente valore a 16 bit, e se questo è diverso da zero, qualcosa è cambiato. Un semplice algoritmo antirimbalzo è solo quello di impostare un contatore su un valore se i pin cambiano stato, scegliere uno stato se i pin hanno mantenuto il loro stato e il contatore è zero e decrementare se non è zero.

Devi controllare che sia premuto un solo pulsante, ovviamente. Se hai un processore ARM, l'ARM ha un'istruzione per segnalare quanti bit sono impostati, il che è l'ideale per questo. Parlo solo per un'ulteriore ottimizzazione.

Michel Keijzers
2018-02-12 18:50:09 UTC
view on stackexchange narkive permalink

Inoltre, ci sono circuiti integrati che possono eseguire l'antirimbalzo "automaticamente", ad es.MC14490, chiamato Switch Debouncer.

Ciò eviterà di aver bisogno di potenza della CPU, ma costerà un po 'di spazio aggiuntivo per il cablaggio / PCB.

Inoltre costeranno una grossa somma di denaro.Questi antimacchia sono terribilmente costosi.
@Fredled: Large come in "probabilmente meno di $ 10".Sono d'accordo che è un sacco di soldi per quello che fa, ma per un progetto a corsa singola potrebbe valere il tempo risparmiato ... per un progetto con una serie di migliaia sarebbe una questione diversa :-)
A AliExpress 2 euro, quindi probabilmente circa il doppio in posti "migliori".
l'MC14490 sembra essere inutilizzabile per le tastiere a matrice
Mi dispiace sentire ... non l'ho provato da solo (nemmeno su un normale interruttore).mi chiedo quale sia il problema, dal momento che qualsiasi segnale dovrebbe essere in grado di essere antirimbalzo da esso.
Anthony X
2018-02-13 08:30:30 UTC
view on stackexchange narkive permalink

Il vero debouncing implica l'aggiunta di isteresi.Non puoi farlo con componenti passivi, ad es.resistori e condensatori.È qui che entra in gioco un software o una soluzione di componenti attivi (latch).

Sono d'accordo se miri a un segnale perfetto.Tuttavia, se cerchi una soluzione economica e piccola, i componenti passivi possono dare un risultato accettabile.


Questa domanda e risposta è stata tradotta automaticamente dalla lingua inglese. Il contenuto originale è disponibile su stackexchange, che ringraziamo per la licenza cc by-sa 3.0 con cui è distribuito.
Loading...