GPIOs ununterbrochen abfragen

  • Hi,
    hab vor kurzem angefangen mit den GPIOs rumzuprogrammieren. Ich benutze dafür wiringPi und das funktioniert auch alles ganz super.
    Jetzt habe ich hier ein kleines Testprogramm dass mir ausgeben soll ob sich mein Drehimpulsgeber nach links oder rechts dreht.
    Der Code funktioniert auch ohne Probleme nur ist die Auslastung des CPUs bei fast 100% weil das ganze abgefrage der GPIOs in einer while-Schleife läuft.
    Wenn ich nun ein Delay anhänge geht zwar die Auslastung runter, aber dann kommt es natürlich auch vor, dass er nicht jeden Drehimpuls wahrnimmt.

    Gibt es da irgeneine sparsamere Methode für so ein Vorhaben?

    Danke schonmal :)


  • Wenn ich nun ein Delay anhänge geht zwar die Auslastung runter, aber dann kommt es natürlich auch vor, dass er nicht jeden Drehimpuls wahrnimmt.

    Gibt es da irgeneine sparsamere Methode für so ein Vorhaben?


    Du darfst halt nicht zu lange delayen. Aber das ist leichter gesagt, als getan. Letztendlich kommt es auf Impulsbreite und Frequenz Deines Drehimpulses an, ob Du Impulse noch sicher erfassen kannst oder nicht. Auch die Kernellatenz und der delay-Jitter spielen eine Rolle.
    Ist aber alles schon dagewesen. Siehe >>> hier <<<.

  • Ok, ich weiß nur noch nicht wie mir der verlinkte Thread weiterhelfen soll.
    Der Drehgeber hat ja in dem Sinne gar keine Drehzahl. Entweder ich dreh ihn ein Stück nach rechts, nach links oder halt gar nicht. Und selbst wenn ich nur ein Delay von einer Millisekunde habe, aber ausgerechnet gerade in dem Moment den Drehgeber drehe, nimmt mein Programm es gar nicht wahr.

  • Also mein Drehgeber hat 5 Pins.
    Gnd und + ist ja klar.
    Dann noch SW, der ist für den Taster im Drehgeber. (Erstmal nicht weiter wichtig)
    Und CLK und DT die sind ausschlaggebend um herauszufinden wie rum gedreht wurde.
    Solange er nicht bewegt wird habe ich auf beiden HIGH. Wenn er nun bewegt wird, ändert sich nun entweder DT oder CLK zu LOW. Woraus man dann ableiten kann in welche Richtung er gedreht wurde.

  • Ich empfehle den Rueckgriff auf PIGPIO. Das erledigt die Abfrage entkoppelt vom Scheduler in einem DMA-Kanal. Dadurch hast du erstmal keine CPU-Last mehr. Durch die Verwendung von gpioSetGetSamplesFunc(Ex) bekommst du dann einen Callback-Aufruf alle N Millisekunden, in dem du die Werte aggregieren kannst, und damit die relative Positionsveraenderung bestimmst.


  • Dann hänge einen Interrupt an CLK und DT, mit Python recht einfach


    Leider bin ich mit Python nicht so vertraut. Aber ich werde mal in die Richtung googlen.


    Ich empfehle den Rueckgriff auf PIGPIO. Das erledigt die Abfrage entkoppelt vom Scheduler in einem DMA-Kanal. Dadurch hast du erstmal keine CPU-Last mehr. Durch die Verwendung von gpioSetGetSamplesFunc(Ex) bekommst du dann einen Callback-Aufruf alle N Millisekunden, in dem du die Werte aggregieren kannst, und damit die relative Positionsveraenderung bestimmst.

    PIGPIO werde ich mir mal anschauen, danke.

  • Der Interrupt-Ansatz ist *nicht* zu empfehlen, da er auf die leider sehr traege & vom Scheduler abhaengige Linux-GPIO-Unterstuetzung aufsetzt. Das verlierst du schnell Schritte. Der DMA-Kanal-Ansatz von PIGPIO ist da *deutlich* ueberlegen!


  • Der Interrupt-Ansatz ist *nicht* zu empfehlen, da er auf die leider sehr traege & vom Scheduler abhaengige Linux-GPIO-Unterstuetzung aufsetzt. Das verlierst du schnell Schritte. Der DMA-Kanal-Ansatz von PIGPIO ist da *deutlich* ueberlegen!

    Oh, alles klar wollte mich nämlich gerade mit dem Interrupt auseinandersetzen.
    Dann setze ich mich stattdessen mal mit PIGPIO auseinander.

Participate now!

Don’t have an account yet? Register yourself now and be a part of our community!