Ich habe diese Anleitung befolgt : Raspberry Pi GPIO-Interrupts im Kernelraum , um ein Kernelmodul zu erstellen, das GPIO-Interrupts verarbeitet. Das Problem ist, dass in diesem Code keine Software-Entprellung implementiert ist.
Können Sie mir bitte einen Rat geben, wie Software-Debouncing implementiert werden kann oder wie ein Hardware-Debouncing-System einfach implementiert werden kann?
Antworten:
Ich habe noch nie versucht, dies ohne das RPi zu tun, aber ich habe es mehrmals auf der Arduino-Plattform getan, und ich habe etwas in Anlehnung an diesen Arduino-Code verwendet. Beachten Sie, dass Sie eine ähnliche Funktion für die von Ihnen verwendete Sprache neu schreiben müssen:
quelle
Am einfachsten ist der Hardware-Debouncer, der aus einem RC-Filter gefolgt von einem Schmitt-Trigger oder nur einem RC-Filter besteht, wenn Sie faul sind. Teile sind billig, überall erhältlich und können problemlos in alle Schaltkreise eingebaut werden, die Sie an Ihren Raspberry Pi anschließen möchten.
quelle
Es gemacht!
quelle
Was ist, wenn Sie den vorherigen Wert / Zustand des Pins / GPIO überwachen?
Ich musste
usleep()
in der while-Schleife verwenden, um CPU-Thrashing / Racing zu vermeiden. Siehe diese Antwort auf C, Fehler beim Kompilieren während der Verwendung der Funktion "usleep" .Dies funktioniert für meinen Zweck:
quelle
Ich habe es getan, indem ich die Sekunden anstatt der Zeit überprüft habe. Ich denke, auf diese Weise entsteht weniger Aufwand. Ich versuche jedoch immer noch, den Entprellungsalgorithmus zu verbessern, da ich damit nicht ganz zufrieden bin: Es gibt immer noch Bounces, obwohl sie weniger häufig sind als zuvor.
Ich habe es geschafft, den Entprellungsalgorithmus weiter zu verfeinern. Ich löse jetzt den Interrupt aus, wenn die Leitung LOW erreicht, anstatt die Flanke zu fallen. Im Interrupt-Handler ändere ich dann den Interrupt so, dass er beim nächsten Mal auf HIGH, dann auf LOW und so weiter ausgelöst wird. Dies in Kombination mit der Jiffies-Methode von oben reduziert die Bounces erheblich.
Ich denke, es ist das Beste, was man mit Software erreichen kann. Für weitere Verbesserungen denke ich, dass dies tatsächlich in der Hardware gemacht werden muss. Wenn ich Zeit habe, versuche ich es mit einem Kondensator und ähnlichen Dingen.
Der vollständige Code unten:
quelle