Unterbrechungsentpreller für Schaltsensor

Ich möchte den Zustand eines Schaltsensors (Magnetkontakt) auslesen. Ich denke daran, den Schalter zwischen einem Interrupt-Pin meines Mikros und Masse zu verbinden und auf den CHANGE-Status zu lauschen. Auf diese Weise habe ich Entprellungsprobleme, daher frage ich mich, wie ich dieses Problem am besten lösen kann:

1 - Deaktivieren Sie das Interrupt-Listening, wenn es ausgelöst wird, und aktivieren Sie es, nachdem das Programm den Wert gelesen hat (0 -> Masse -> Schalter geschlossen ODER 1 -> Floating -> Schalter geöffnet). Ich glaube nicht, dass ein Floating-Zustand gut sein könnte. aber wenn ich den Interrupt-Eingangspin als INPUT_PULLUP setze, ist er nicht mehr schwebend und könnte gut sein, habe ich recht?

2 - Verbinden Sie den Schalter mit einem Interrupt-Pin und auch mit einem digitalen Eingangspin über einen Transistor als Schalter. Auf diese Weise lese ich beim Auslösen des Interrupts den Wert des digitalen Eingangspins. Andererseits erschwere ich auf diese Weise die Schaltung

3 - Verwendung einer Hardware-Entprellschaltung

Sind diese drei Lösungen gültig? Gibt es noch bessere als diese?

MEHR KONTEXT: Ich verwende diese Schalter als Endschalter für ein Garagentor. In meinem Code verwende ich einen Timer, um das Garagentor für zehn Sekunden anzuheben ODER bis der Endschalter-Interrupt ausgelöst wird

EDIT: Mit einer Änderung in meinem Code habe ich das Problem mit Interrupts gelöst. Sie schlagen jedoch vor, Polling zu verwenden, da es sich nicht um eine Echtzeitanwendung handelt. Daher frage ich mich: Ist es nicht besser, Interrupts zu verwenden, damit ich einen Energiesparmodus für mein Mikro verwenden und es nur bei einem Hardware-Interrupt aufwecken kann? wird ausgelöst? Wenn ich eine Polling-Lösung verwende, wäre das System nicht für eine Batteriestromversorgung geeignet; nicht wahr?

Es ist normalerweise mehr Kopfzerbrechen als es wert ist, Pin-Change-Interrupts zum Entprellen zu verwenden. Die Umstände spielen jedoch eine Rolle, daher kann ich keine pauschale Aussage dazu treffen. Normalerweise ziehe ich es vor, einen „Heartbeat“-Intervall-Timer einzurichten, der zum Abfragen und Entprellen des Eingangs verwendet wird, wobei der aktuelle Zustand und die entprellten Werte für den Schalter ausgegeben werden, die dann bei Bedarf vom Anwendungscode untersucht werden können. Es gibt Zeiten, in denen das Hardware-Entprellen Dinge erreichen kann, die keine noch so große Software erreichen kann. Auch hier kommt es auf die Umstände und Details an. Geben Sie hier mehr Kontext an?

Antworten (3)

Die wirkliche Antwort ist, dass Sie überhaupt keine Interrupts dafür verwenden sollten. Sie sollten den Schalter an einen Eingangspin anschließen und den Pin regelmäßig abfragen. Die Dauer des Abfragens sollte größer sein als das Zeitintervall, in dem die Schalttransiente (Prellen) abklingt.

Außerdem müssen Sie Ihren Pin mit einem Pullup-Widerstand hochziehen. Einfach den Schalter zwischen GND und dem Pin zu verbinden ist nicht gut genug; Einige Mikrocontroller haben interne Pull-up-Widerstände, die Sie per Software aktivieren können, sodass Sie keinen externen verwenden müssen.

Jetzt, wo Sie mehr Kontext gegeben haben, verstehe ich nicht einmal, warum Sie sich überhaupt Sorgen über das Abprallen machen. Wenn Sie den Motor 5 Mal in 10 ms ausschalten, was dann? Es wird so oder so ausgeschaltet, und das ist der Punkt. Fragen Sie einfach den Pin mit 100 ms ab und alles wird gut; Legen Sie einen 100-ms-Schlaf in einen Weilezyklus, der durchläuft, während der Pin HI ist und Ihr Timer nicht übergelaufen ist. Oder wenn Sie ein Betriebssystem verwenden, dann verwenden Sie den Scheduler; Erstellen Sie einen periodischen Timer mit einer Periode von 100 ms und planen Sie eine Aufgabe, die nach 10 s ausgeführt wird, wodurch ein Bool gesetzt wird. Überprüfen Sie den Pin und die Variable im periodischen Timer.
Sie kommentieren Ihre eigene Antwort. Klicken Sie auf den Link Bearbeiten unter der Frage und fügen Sie sie stattdessen als Update hinzu.
Sie sagen "Es wird so oder so ausgeschaltet, und das ist der Punkt." Theoretisch sollte ich bei geschlossenem Magnetkontakt LOW lesen und umgekehrt; Aufgrund von Entprellungen ist mir aufgefallen, dass die Logik manchmal invertiert ist und der letzte Wert, den ich gelesen habe, weiterhin LOW ist, auch wenn der Schalter wieder geöffnet ist
Ihr Design ist aktives LO, richtig? Der Schalter wird kurz, wenn die Tür stoppen sollte, richtig? Haben Sie den Pull-up-Widerstand bereits eingebaut, da dies genau das Problem verursachen würde, das Sie gerade beschrieben haben, wenn Sie dies nicht getan haben.
Ja, der Input-Interrupt-Pin ist als INPUT_PULLUP deklariert
Ist es nicht besser, Interrupts zu verwenden, damit ich einen Stromsparmodus für mein Mikro verwenden und es nur aufwecken kann, wenn ein Hardware-Interrupt ausgelöst wird? Wenn ich eine Polling-Lösung verwende, wäre das System nicht für eine Batteriestromversorgung geeignet; nicht wahr?

Ich verwende diese Schalter als Endschalter für ein Garagentor. In meinem Code verwende ich einen Timer, um das Garagentor für zehn Sekunden anzuheben ODER bis der Endschalter-Interrupt ausgelöst wird.

Dies ist eine Anwendung mit niedriger Geschwindigkeit, und ein Interrupt ist nicht erforderlich, um einen angemessenen Stopp zu erzielen. Die Auslaufzeit des Motors ist hundertmal länger, als eine einfache Eingangsabfrage- und Entprellschaltung bequem handhaben könnte.

Stellen Sie die Endschalter etwas vom Ende des Weges zurück und stellen Sie sie so ein, dass das Tor in den korrekten offenen und geschlossenen Positionen stoppt.

Ich denke an diese paar Punkte

  • Müssen Sie sich um die Entprellung kümmern, wenn Sie einfach warten, bis die Tür zum ersten Mal den Sensor berührt?
  • Die Hardwareschaltung könnte so einfach sein wie ein RC-Filter. RC Filter hilft sehr und ist sehr einfach.
  • Wenn Ihr Sensorkabel länger als einen Fuß ist, würde ich einen externen Pull-up empfehlen, um mindestens 10 mA zu erzeugen. Es ist viel robuster gegen EMP verursacht durch Stürme etc.
  • Der Interrupt ist besser für sehr kurze Ereignisse wie Millisekunden oder weniger. Das Anheben Ihres Garagentors wird sicherlich mehr Zeit in Anspruch nehmen. Ich würde empfehlen, den Pin alle, sagen wir, 20 ms zu lesen. Der gute alte ZX Spectrum tut dasselbe. Zumindest ist es ein guter Anfang.

Das RC-Filter mit externem Pull-up und Software-Entprellung ist hier die beste Option. Wenn Sie nach 20 ms denselben Wert lesen, können Sie sicher sein, dass er korrekt ist

Zurück zu deinen Fragen:

  1. Ich denke, Sie werden viel Zeit damit verbringen, dies zu tunen
  2. Wie Sie sagen, das macht die Sache kompliziert. Sie verschwenden auch mehr Stifte.
  3. RC-Filter mit Schmidt Gate ist die HiFi-Option, aber in diesem Fall unnötig.

Auf jeden Fall sammelt man Erfahrung, indem man scheitert. Darauf kommt es schließlich an.