Ich habe mich gefragt: Warum können Sie nicht einfach einen Kondensator an einen Knopf anschließen, um ihn zu entprellen? Ich habe herausgefunden, wie ich die Arbeit meines Mikroprozessors reduzieren kann, aber ich habe sehr wenig Platz auf einer von mir entworfenen Leiterplatte, daher möchte ich keine vollständige Entprellschaltung erstellen, die das Design verkomplizieren würde.
Simulieren Sie diese Schaltung – Mit CircuitLab erstellter Schaltplan
Das ist eine Beispielschaltung; Entschuldigung für etwaige Fehler (ich bin nicht gut darin, Schaltungen mit Kondensatoren zu entwerfen). Würde das überhaupt funktionieren? Für den Wendeschalter konnte ich keinen finden, der dem entspricht, was er im wirklichen Leben ist, aber er funktioniert in dieser Situation. Die Schaltfläche ist wie die, die Sie hier finden . D10
steht für Digital Pin 10
, aber es spielt keine Rolle; es bedeutet nur den Arduino-Eingang. Ich weiß auch nicht, wie groß der Kondensator sein würde, den ich brauchen würde. Wenn diese Schaltung also funktioniert, welche Größe brauche ich?
Auch hier versuche ich nur, dies zu vereinfachen, um das Erstellen zu vereinfachen, ohne dass eine Software-Entprellung durchgeführt werden muss. Wenn man sich ansieht, wie Kondensatoren funktionieren, scheint dies zu funktionieren, aber es kann auch dazu führen, dass der Knopf länger gedrückt / verzögert wird, wenn die Kapazität zu groß ist. Sie werden häufig verwendet, um Rauschen in Netzteilen zu "glätten". Ist dies also nicht ähnlich, wenn es das Prellen "glättet"? Alle Schaltungsmodifikationen, damit es funktioniert (falls erforderlich), würden ebenfalls geschätzt.
Es hängt davon ab, wie der Standardzustand des Schalters ist. Ein Kondensator lädt sich nur auf, wenn man ihm eine positive Spannung gibt. Normalerweise verwenden wir in einer eingebetteten Umgebung einen Pull-up, um einem Pin einen Standard-High-Zustand zu geben, und verbinden den Schalter mit Masse. Das Hinzufügen eines Kondensators hilft hier nicht, da er den Grundzustand nicht "speichert".
Sie können jedoch auch einen Pulldown verwenden. Dies würde bedeuten, dass der Pin standardmäßig niedrig ist. Wenn Sie es durch Drücken des Schalters hoch machen, wird der Kondensator aufgeladen. Nach dem Loslassen hält der Kondensator den Pin für eine Weile hoch, also ja, das würde funktionieren. Ich bin mir nicht sicher, ob 1uF genug, zu wenig oder zu viel ist. Ich würde Ihnen empfehlen, mit einem Zielfernrohr nachzusehen und es ein wenig auszuprobieren.
+
und das ändere -
, würde es funktionieren?top left to the bottom left
gedrückt wird, von und the top right to the bottom right
. Wenn sie gedrückt wird, leitet sie von top left to the bottom right
, und top right to the bottom left
.Ich denke, die akzeptierte Antwort besagte, dass Sie nur einen RC-Trick verwenden können, um einen Schalter zu entprellen, der an Low gebunden ist, aber ich denke, das stimmt nicht. Sie können es auch für High tun. Hier sind die Schaltpläne. Es gibt eine wahre Bibel zum Entprellen , die die folgenden Schemata empfahl:
RC-Entprellung, R1 auf High gebunden, Betätigung des Schalters erdet es. Es gibt jedoch einen Kondensator parallel zum Schalter gegen Masse und einen R2, der den Schalter mit dem Kondensator und dem Logikgatter verbindet, das Sie speisen möchten. Hier ist ein Inverter gezeigt, aber es könnte ein Puffer oder irgendein Logikgattereingang sein.
Wenn C vollständig geladen ist und Sie den Schalter betätigen, wird die Ladung durch R2 abfließen, hoffentlich bis sich der Schalter beruhigt hat, bevor Sie den logisch niedrigen Pegel am Eingang erreichen.
Wenn C vollständig entladen ist und Sie den Schalter öffnen, wird C über R1 + R2 aufgeladen, bis der logisch hohe Pegel erreicht ist.
Da der normale logisch hohe TTL-Pegel bei 2 V im Vergleich zum logisch niedrigen Pegel von 0,8 V relativ niedrig ist, ist es sinnvoll, dass R1 + R2 die Ladezeit länger als die Entladezeit nur durch R2 machen.
Die Verwendung eines Schmitt-Trigger-Eingangs würde die Logik hoch auf 4 V drücken (was einige Quellen möglicherweise nicht einmal zuverlässig treffen, ein Schalter jedoch).
Ich werde das jetzt auf meinem Steckbrett und (analogem) Oszilloskop ausprobieren. Ich hoffe, ich kann sehen, wie die Bounces auf Kanal 1 ausgelöst werden, und ich hoffe, ich kann es sehen, ohne dass es sich um einen Speicherbereich handelt. Aber ich kann auch einen 74LS161 4-Bit-Zähler verwenden, um Bounces abzufangen. Und siehe da, ich habe sowohl den 74LS04 TTL-Hex-Inverter als auch den 74LS14 Schmitt-Trigger-Hex-Inverter zum Spielen zur Hand.
Update: Experimentelle Ergebnisse
Da ich kein digitales Speicheroszilloskop habe, konnte ich das gar nicht verwenden. Stattdessen habe ich einen 74LS161-Zähler mit 4 LEDs verwendet und nur darauf geachtet, dass jede Betätigung des Schalters genau einen Schritt zählt.
Ich kann deutlich die Sprungkraft des Schalters sehen. Die Basislinie ist also positiv, was bedeutet, dass ich sagen kann, wann meine Gegenmaßnahmen wirksam sein werden.
Ich konnte keine Kombination aus R1, R2 und C finden, die funktionieren würde, wenn ich einen normalen TTL-Eingang am 74LS04 habe. Mit einem Schmitt-Trigger-Eingang des 74LS14 habe ich jedoch ein ziemlich gutes Setup, wenn R1 und R2 beide 1 kΩ und C = 1 μF oder besser sogar 4,7 μF sind. Kommt natürlich auch auf den Schalter an.
Ich fand einige Gummiknopfschalter, die einen zu hohen Innenwiderstand hatten, um die Eingangsspannung nicht genug zu senken. Mit zwei mäßigen Qualitätsschaltern habe ich mehrere Läufe von 16 gezählt und hatte nur wenige Störungen bei 100 nF, 1 μF und keine bei 4,7 μF.
Mit dem normalen TTL-Eingang konnte ich es nicht zum Laufen bringen.
Wenn Ihr Eingang jedoch ein Arduino ist, sollten Sie vielleicht noch einmal überprüfen, ob es sich bei den digitalen Eingängen tatsächlich um Schmitt-Trigger handeln könnte, und Sie könnten also damit einverstanden sein, dass R1 und R2 beide 1 kΩ und C = 1 μF und möglicherweise sogar sind 100nF.
Schließlich komme ich nach weiteren frustrierenden Experimenten und Recherchen zu dem Schluss, dass es bei normalen TTL-Pegeln einfach unmöglich ist, die RC-Methode zum Entprellen zu verwenden. Und es spielt keine Rolle, ob Sie Ihren Schalter hoch oder niedrig binden.
Dazu benötigen Sie einen Schmitt-Trigger. Ich bezweifle, dass sogar CMOS funktioniert.
Hier ist ein kurzes Video von TI (sie sollten es wissen), in dem steht, dass Sie hier den Schmitt-Trigger-Inverter benötigen.
Und hier ist eine alternative Schaltung mit Schmitt-Trigger , die noch interessanter ist, da sie keinen Kondensator benötigt.
Ich habe es jedoch versucht und festgestellt, dass es nicht funktioniert. Geht einfach nicht.
Das gleiche Whitepaper bietet auch eine Lösung mit zwei Wechselrichtern und ohne Widerstand oder Kondensator jeglicher Art, es erfordert nur einen Knopf mit zwei Positionen.
Ich habe es versucht und es funktioniert auch nicht auf diese magische Weise. Es funktioniert fast, aber ich bekomme immer noch viel häufiger Doppelbetätigungen als mit dem RC 1k/1k/100nF und Schmitt-Trigger. Auch wenn ich dieses Doppelinverter-Setup mit dem Schmitt-Trigger-Inverter 74LS14 verwende, funktioniert es nicht besser. Es funktioniert also einfach nicht, Punkt.
"Also möchte ich keine ausgewachsene Entprellschaltung bauen, die das Design verkomplizieren würde."
Ich verstehe wirklich nicht, warum du es so kompliziert gemacht hast oder so kompliziert denkst. Sie erwähnen nicht, welche Art von MCU Sie verwenden, aber ich kann sehen, dass es sich um ein Arduino handelt. Sie können dies per Software tun input( pin, INPUT_PULLUP );
(damit Sie keine externen Komponenten benötigen) oder Sie können einen Pullup- oder Pulldown-Widerstand (SMD ist wirklich klein) von 10 K bis GND oder 5 V verwenden, was Sie bevorzugen.
Das einzige, was Sie tun müssen, ist, einen Wert vom Eingang mit einer Entprellrate in ms zu lesen, millis()
dafür zu verwenden (nicht verwenden delay()
!) und in der Funktion loop() zu verwenden. Das sind Peanuts für jeden Arduino.
Zum Beispiel:
#define BTM_PIN_BTN_BT_POWER 10 // Tactile switch to power on/off/
#define BTM_POW_BTN_DEBOUNCE 200 // in ms
//#define BTM_POW_BTN_NO_WAIT // uncomment if you don't want to wait for a release
bool getPowerButtonPressed() // I dunno if your button is power, this is just an example
{
static uint32_t iDebounceTime = millis();
bool bResult = false;
if( millis()-iDebounceTime >= BTM_POW_BTN_DEBOUNCE )
{
#ifndef BTM_POW_BTN_NO_WAIT
while( digitalRead( BTM_PIN_BTN_BT_POWER ) == HIGH )
{
bResult = true;
}
#else
bResult = ( digitalRead( BTM_PIN_BTN_BT_POWER ) == HIGH );
#endif
iDebounceTime = millis();
}
return bResult;
}
void loop()
{
if( getPowerButtonPressed() )
{
// do something
}
// other code
.....
.....
}
Das ist es!
Andi aka
Wouter van Ooijen
Andi aka
Anonymer Pinguin
Anonymer Pinguin
delay()50;
und dann tue, was immer du tun musst? (LEDs zum Leuchten bringen usw.)Wouter van Ooijen
Chris Stratton
John u