Ist es möglich, nur einen Kondensator zu verwenden, um eine Taste zu entprellen?

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.


schematisch

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 . D10steht 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.

Hier haben wir es bereits besprochen: electronic.stackexchange.com/questions/6884/…
Ist Ihnen klar, dass Sie einen Eingang entprellen können, indem Sie ihn einfach mit einem Intervall von mindestens 50 ms abfragen? Weniger Arbeit für Ihren aduino :)
50 Millisekunden würden reichen - guter Punkt Herr O
@Andyaka Ich habe das gesehen, aber es war, ob Hardware oder Software verwendet werden sollte, nicht wie man die wenigsten Teile verwendet, aber es gibt einige gute Punkte darin.
@WoutervanOoijen Also meinst du, wenn es zuerst ein "High" erkennt, dann tue delay()50;und dann tue, was immer du tun musst? (LEDs zum Leuchten bringen usw.)
Nein, ich meine, mit einem Intervall von mindestens 50 ms abfragen und alles tun, was Sie entsprechend dem erkannten Pegel tun müssen.
@AnnonomusPerson - eine Verzögerung () in einer Singlethread-Umgebung bedeutet, dass nichts anderes passieren kann. Während dies eine Option ist, besteht eine andere darin, andere nützliche Arbeiten zu erledigen, bis es Zeit für eine erneute Überprüfung ist.
Ich stimme Wouters Antwort zu - überprüfen Sie einfach den Schalter alle ~ 50 ms. Ich denke jedoch, dass Ihre obige Schaltung besser funktionieren würde, wenn der Widerstand zwischen dem Schalter und dem Kondensator wäre, dann ist es eine RC-Schaltung und Sie können die Zeitkonstante berechnen, um Ihnen eine schöne Entprellung zu geben.

Antworten (3)

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.

Also, wenn ich das +und das ändere -, würde es funktionieren?
@AnnonomusPerson es kommt darauf an. Wie ist die Grundeinstellung des Schalters?
Du meinst, wenn es nicht gedrückt wird, ob es Strom leitet? Wenn Sie das meinen, kann ich es aufgrund der Art des von mir verwendeten Schalters so oder so tun. Wenn Sie sich den Link in meiner Frage ansehen, leitet die Schaltfläche , wenn sie nichttop 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.
Okay. Dies bedeutet, dass Sie standardmäßig möchten, dass der Pin niedrig ist. Der Schalter sollte Kontakt zu + herstellen, damit der Kondensator aufgeladen wird, bevor Sie die Taste loslassen.
Entschuldigung, ich bin jetzt verwirrt. Sie sagten, dass Sie möchten, dass der Pin standardmäßig niedrig ist (was ich verstehe, wenn er nicht gedrückt wird), aber er sollte Kontakt mit + herstellen (was bedeutet, dass er hoch ausgeben sollte, wenn er nicht gedrückt wird)? Sind das nicht zwei verschiedene Aussagen oder lese ich das falsch? Noch etwas: Sitzen Widerstand und Kondensator an der richtigen Stelle? Das war einer meiner größten Zweifel, warum das nicht funktionieren würde.
@AnnonymusPerson Nein, der Schalter sollte Kontakt zu + herstellen. Es ist eine Art Jargon für das, womit sich der Schalter verbindet, wenn er gedrückt wird . Der Kondensator ist an der richtigen Stelle. Der Widerstand wäre besser direkt von Masse an den IO-Pin angeschlossen.
Was wäre das Problem bei der Verwendung eines Widerstands zwischen dem Ausgang des Schalters und dem Kondensator? Wenn der Schalter gedrückt wird, lädt er den Kondensator langsam auf, wenn er nicht gedrückt wird, entlädt er ihn langsam. Die Wirkung kurzlebiger Sprünge würde durch den Widerstand begrenzt.

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.

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.

Geben Sie hier die Bildbeschreibung ein

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.

Geben Sie hier die Bildbeschreibung ein

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.

Schöne Aktualisierung. Ich verwende einen Druckknopfschalter, um einen 74HC393 4-Bit-Zähler anzusteuern, und die einzige Möglichkeit, den Schalter bisher richtig zu entprellen, ist die Verwendung eines Schmitt-Trigger-Wechselrichters (74HC14) mit einem 100-nF-Kondensator über dem Schalter.

"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:

Schaltkreis

#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!