 |
Tasten entprellen, eine kleine Einführung
|
Einleitung
Durch Schwingungen neigen mechanische Kontakte dazu sich nach dem Schliessen
des Kontaktes noch ein- bis mehrmals zu öffnen und wieder zu schliessen.
Dieser Vorgang wird Prellen (von Abprallen) genannt und dauert typischerweise
nur wenige Mikro- bis Millisekunden; meist liegt die Zeit unter 3 ms.
Die hierbei auftretenden sehr kurzen Pulse, die das hauptsächliche Problem
sind, werden als Glitches bezeichnet.
Um diese Störungen zu beseitigen, gibt es verschiedene Strategien, die
entweder in Hardware oder Software realisiert sind. Wegen dem geringeren
Aufwand und den geringeren Kosten liegt im Folgenden der Schwerpunkt bei den
Software-basierten Entprell-Methoden, weil diese in der Praxis am häufigsten
sind. Der Grund hierfür ist, dass von den Herstellern generell alles
eingespart wird, was möglich ist.
Diese Methoden sind auch ohne mechanischen Schalter nicht unwichtig, da es
Schwingungen beim Umschalten nicht nur mechanisch sondern auch elektrisch
gibt.
Entprellen mit Hardware
Bei den meisten Mikrokontrollern, beispielsweise dem MSP430, reicht etwas
Software zum Entprellen meist völlig aus, so dass man den Aufwand zum
Entprellen mit Hardware meistens einsparen kann.
In einer störreichen Umgebung und bei einigen Mikrocontrollern wie
beispielsweise dem S3C2410 (ARM9-Kern) ist dieser Aufwand aber manchmal doch
nötig.
Entprellen durch Integration
Da die Preller nur kurzzeitig auftreten, kann man sie mit einem Tiefpass
(=Integration) herausfiltern. Reicht die Flanken-Steilheit hinter dem Tiefpass nicht, wird ein
Schmitt-Trigger hinter den Tiefpass geschaltet:
Hierbei ist noch ein Entlade-Widerstand R0 eingezeichnet, da der Entladungs-Puls
sonst induktiv Störungen verursachen kann. Es reicht aus R0 = R/10 einzusetzen.
Ein Beispiel ist ein Tiefpass mit C = 100 nF und R = 33 kOhm. Als
Schmitt-Trigger kann z. B. ein 74HCT14 verwendet werden.
Hierdurch braucht die Software nur den aktuellen Schalter-Zustand (nach
Filterung +ggf. Schmitt-Trigger) abzufragen, so dass der Software-Aufwand
hierbei Null ist. Der Nachteil ist der Hardware-Aufwand und der Strom-Verbrauch
für den Schmitt-Trigger.
Alternativ kann man auch die Flanken interrupt-gesteuert verarbeiten und das
regelmässige Abfragen des Schalter-Zustands sparen, aber hierfür muss
zumindest beim Initialisieren der Schalter-Zustand ermittelt werden.
Entprellen mit Flip-Flop
Beim Entprellen mit Flip-Flop werden die Ausgänge eines an Masse
angeschlossenen Umschalters/Tasters an die beiden Eingänge eines
RS-Flip-Flops (kurz RS-FF) angeschlossen:
Hierbei sind die FF-Eingänge mit Pullup-Widerständen an die Versorgungsspannung
angeschlossen. Das Prinzip hierbei ist, dass der FF-Ausgang nur dann umschaltet,
wenn sich beide Eingänge geändert haben, also der Umschalter sowohl den
einen Eingang freigegeben hat als auch den anderen auf Masse geschaltet hat.
Dabei ist der Nachteil, dass ein Umschalter aufwendiger ist als ein
Ein/Aus-Schalter/Taster und dass ein Flip-Flop etwas aufwendiger ist als ein
Schmitt-Trigger. Dafür ist diese Schaltung ohne Verzögerung, da der
verzögernde Tiefpass entfällt.
Neben der Geschwindigkeit gibt es auch andere Aspekte wie die Stromaufnahme.
Wenn man einen Taster verwendet, wird bei der zuletzt genannten
Schaltung ständig Strom durch einen Pullup-Widerstand verbraucht, was bei
Low-Power-Schaltungen nachteilig ist. Dem gegenüber ist die vorherige
Schaltung mit einem Taster, der nur beim Betätigen Strom durch den
Pullup-Widerstand zieht, günstiger. Allerdings kann man den Stromverbrauch
durch hohe Pullup-Widerstände (10 MOhm) stark reduzieren.
Entprellen durch Auswerten der Flanken von einem Umschalter
Das oben beschriebene Entprellen mit Flip-Flop kann man natürlich auch mit
Software und zwei interruptfähigen Eingängen in Software nachbilden, die negativ
flanken-getriggert sind, also nur auf fallende Flanken reagieren.
Der Grund ist, dass es beim Umschalter das Prellen nur an dem Ausgang gibt, an dem
sich der Umschalt-Kontakt gerade befindet.
Folglich reicht es immer aus, nur auf die fallenden Flanken zu
reagieren und nach dem Eintreffen einer solchen Flanke der betreffenden Ader
"low" zuzuordnen.
Dieses Verfahren ist ebenfalls verzögerungsfrei, aber um den Preis, dass
statt einem einfachen Schalter/Taster ein Umschalter benötigt wird und zudem
zwei interruptfähige Eingänge benötigt werden. Dieses Verfahren
verwendet kein Entprellen per Software, da die Software keine Glitches heraus
filtert.
Preller-Tolerantes Design
Beim Entprellen ist machmal auch das Design wichtig. Ein Beispiel hierfür
ist ein Winkelgeber, der den aktuellen Winkel binär codiert parallel
ausgibt: Wenn durch einfache binäre Codierung alle N Bits gleichzeitig
kippen können, muss der Ausgabe-Wert mittels Polling (oder anderer
Entprellung) und zusätzlichem Abwarten aller Zustandswechsel, also dem
Stabilisieren der N Signale, ermittelt werden. Hierfür ist es nötig, a)
jeden der N Eingänge zu entprellen und b) nach jeder Änderung an einer
Ader das Stabilisieren ALLER N Signale abzuwarten.
Ansonsten würden auch
völlig falsche Zwischen-Zustände eingelesen werden, beispielsweise beim
Wechsel von 0xff..f auf 0x00..0.
Verwendet man stattdessen eine Gray-Codierung, so kann zu jedem
Zeitpunkt maximal ein Bit kippen und auf daher meist auf Entprellen verzichtet
werden.
Durch den Gray-Code erstpart man sich aber in jedem Fall das zusätzliche
Abwarten aller Zustandswechsel, also Teil b) und kann schon hierdurch
höhere Auslese-Frequenzen erreichen.
Ein anderer Design-Punkt ist das Abschirmen, also Verhindern des Einkoppelns
von Störungen in die Signal-Adern und das Übersprechen, die hier aber
nicht weiter erläutert werden, da sie über das Entprellen weit hinaus gehen.
Entprellen mit Software
Der Zweck des Entprellens mit Software ist meist das Einsparen der Hardware zum
Entprellen. Deshalb ist dies die am häufigsten verwendete Methode zur Entprellung.
Hierbei wird üblicherweise an den betreffenden Eingang ein Pullup-Widerstand
von einigen Kiloohm angeschlossen und der Schalter zwischen Eingang und Masse
(= 0 V) angeschlossen.
Dabei teilt man die verwendeten Methoden ein in das (regelmässigen)
Einlesen des Schalter-Zustandes (Polling) und dem asynchronen
Interrupt-gesteuerten Einlesen.
Weil für das Herausfiltern der Glitches etwas Zeit benötigt wird, gibt es
hiebei immer eine Verzögerung.
Entprellen durch zweite Abfrage des Schalters
Eine einfache Entprellung per Software fragt kurz nach dem Ende der Prell-Zeit
ab, welcher Zustand vorhanden ist und setzt diesen als den aktuellen
Schalter-Zustand.
Die Strategie ist hierbei also, das Signal nach der ersten Flanke
nochmal einzulesen, wenn es sich
beruhigt hat.
Hierfür muss zunächst die erste Flanke per Interrupt registriert werden,
etwas länger als die Prell-Zeit gewartet werden und dann ein zweites mal
eingelesen werden. Hierfür wird meist ein Timer verwendet.
Entprellen durch Polling
Nur wenig aufweniger ist es den Schalter
regelmässig, beispielsweise alle 100 Mikrosekunden abzufragen, also zu
pollen. Das Prinzip hierbei ist, dass nur mehrfach eingelesene
Zustandsänderungen übernommen werden, also kurzzeitige Zustandswechsel
nicht übernommen und damit ausgefiltert werden. Diese Methode ist
dadurch zuverlässiger als nur eine zweite Abfrage und wird auch von den
meisten Tastatur-Controllern verwendet.
Als aktueller Zustand wird dann beispielsweise derjenige genommen, der zuletzt
mindestens N mal in Folge (d. h. ohne Unterbrechung) vorhanden war.
Der Nachteil dieses einfachen Algorithmus ist, dass er relativ langsam ist, da
er erst N Takte nach der letzten Zustandsänderung umschaltet.
Zur Beschleunigung kann man auch andere Algorithmen verwenden und beispielsweise einen
Tiefpass mit nachfolgenden Schmitt-Trigger nachbilden.
Ein anderer schneller Algorithmus ist das gesättigte Zählen von +1 bei
"aktuell geschlossen" und -1 bei "aktuell geöffnet". Hierbei wird der
Zähler nur bis maximal zum oberen Limit N inkrementiert und maximal bis zum
unteren Limit -N dekrementiert. Ein Zählerwert von > 1 bedeutet dann
"geschlossen" und einer von <= 0 bedeutet "offen".
Entprellen durch Auswerten aller Flanken beim Drehgeber
Beim gewöhnlichen zweiadrigen Drehgeber, machmal auch Drehimpulsgeber oder
Inkrementalgeber genannt, hat man beim Wechsel von einer Raster-Position
in die nächste zwei Flanken.
Ein Beispiel hierfür ist der Drehgeber mit der Best.-Nr. 705514 bei www.conrad.de.
Tritt Prellen auf, so hat man mehr Flanken, und
das zeigt sich dadurch, dass die Software statt dem aktuellen Wechsel der
Raster-Position häufig a) keine Änderung, b) eine zu grosse
Änderung oder c) eine Änderung in die falsche Richtung registriert.
Die einfache Auswertung des Drehgeber-Signals, die nur eine Sorte Flanken (steigend oder
fallend) auswertet, indem nur der Zustand der Signal-Ader abgefragt wird, von
der die Flanke nicht kam, ist hierfür besonders anfällig.
Deutliche Abhilfe bringt hier das Auswerten mit beiden Flanken und registrieren
der aktuelle Änderung (=halber Raster-Schritt).
Im Vergleich zu der einfachen Auswertung, bei der nur eine Sorte von Flanken
ausgewertet wird, ergibt sich hierdurch eine doppelt genaue Auswertung, die die
meisten Preller herausfiltert. Der Nachteil hierbei ist natürlich, dass
statt einer Flanken-Sorte beide ausgewertet werden müssen. Dafür hat man
beim Auswerten aller Flanken halbe Schritte, also doppelte Auflösung.
Dasselbe kann man mit Polling besser erreichen, also nur über Interrupts,
weil von sehr kurzzeitigen Glitches nicht alle Flanken registriert werden
können.
Schluss
Als Fazit ergibt sich, dass die Entprellung per Hardware prinzipiell
am zuverlässigsten und schnellsten ist, da die Software immer einige Zeit
zum Auswerten und Ausfiltern von Glitches benötigt.
Zudem kann mit Hardware verzögerungsfrei entprellt werden.
Von den Software-Entprell-Methoden ist das Polling am zuverlässigsten.
Daher sollte man generell Polling verwenden.
Das Entprellen mit Software ist zwar am billigsten, aber um den Preis einer
Verzögerung, die für die Auswertung benötigt wird.
In der Praxis hat die Verzögerung von wenigen Millisekunden aber praktisch
keine Bedeutung aussser vielleicht für das Marketing von Gaming-Zubehör oder
vielleicht militärischem Zubehör, wenn es auf jede Millisekunde ankommt,
und man schneller sein muss als der Gegner.
Links
Entprellen mit Hardware:
http://www.eng.uwaterloo.ca/~tnaqvi/downloads/DOC/sd192/SwitchDebouncing.htm
Prellen mit dem Oszilloskop sichbar gemacht und Entprellen mit Software:
http://www.eng.uwaterloo.ca/~tnaqvi/downloads/DOC/sd192/SwitchDebouncing.htm
Theorie +Implementierung der Gray-Codierung:
Buch Numerical Recipes in C, Kapitel 20.2.
In den anderen Bücher der Numerical Recipes-Serie sollte es ebenfalls in
Kapitel 20.2 stehen.
Selbstbauanleitung für einen Winkelgeber mit 8 Bit/Vollkreis und Gray-Codierung:
http://www.eng.uwaterloo.ca/~tnaqvi/downloads/DOC/sd192/SwitchDebouncing.htm
Anzeigen:
|