Taktrate GPIO

  • Moin alle miteinander,

    ich bin absoluter RaspberryPi- und Forenneuling.
    Nachdem ich im Netz umher gesucht habe aber keine Antwort fand wollte ich dann doch mal direkten Kontakt aufnehmen.

    Es geht ganz einfach darum, dass ich mit meinem Pi ein 50 kHz Rechtecksignal erstellen mnöchte. Ich wollte dazu mit Python arbeiten, jedoch komme ich maximal an die 25 kHz...
    ist das normal? Muss ich einene anderen Weg gehen?

    Vielen Dank im Voraus.

  • Immer wieder gerne verlinkt: GPIO-Benchmark
    Mit RPi.GPIO hast du prinzipiell genügend Speed für ein 50 KHz Signal - Du musst nur sehen, dass dein sonstiger Programmoverhead nicht zu groß ist. Wenn du vor jedem Signalwechsel erst eine umfangreiche Berechnung machst, klappt es natürlich nicht.

    Oh, man kann hier unliebsame Nutzer blockieren. Wie praktisch!

  • Servus Nuck,

    Zitat von "Nuck" pid='294963' dateline='1502448015'


    ... ein 50 kHz Rechtecksignal ...


    das kommt u.a. darauf an, ob das Signal über einen längeren Zeitraum absolut gleichförmig sein muss.
    Durch die Latenzzeiten durch das Scheduling kannst Du da durchaus auch mal Aussetzer im ms-Bereich bekommen.
    Das hängt halt auch davon ab, was da sonst noch auf dem Pi läuft.
    Wenn es sauber und genau sein soll, kommst Du imho um eine Hardware-Lösung, und sei es ein µController wie ein Arduino, nicht drumherum.

    cu,
    -ds-

  • Ein 50 KHz Rechtecksignal... wenn du nicht zu Anspruchsvoll bist, müsstest du dir das mit einem NE555 und ein paar Widerständen und Kondensatoren basteln können...

    Oh, man kann hier unliebsame Nutzer blockieren. Wie praktisch!

  • Erstmal danke für die verschiedenen Antworten und Lösungsansätze.
    Am Vorhead des Programms kann es meiner Meinung nach nicht liegen, da ich lediglich den GPIO ein und ausschalte und zwischendurch mit einer time Anweisung arbeite.


    Diese 5 kHz bringt mein Pi zwar etwas ungenau aber für mich im Rahmen.
    Wenn ich jedoch die Zeit nochmals durch 10 teile, um auf 50 kHz zu kommen, liefert mir mein Oszilloskop trotzdem nur die 5 kHz, was mich stark wundert da diese Abfolge von Befhlen meiner Meinung nach kein bisschen komplex ist.

  • Hallo Nuck,

    Zitat von "Nuck" pid='295114' dateline='1502525086'


    Wenn ich jedoch die Zeit nochmals durch 10 teile, um auf 50 kHz zu kommen, liefert mir mein Oszilloskop trotzdem nur die 5 kHz, was mich stark wundert da diese Abfolge von Befhlen meiner Meinung nach kein bisschen komplex ist.

    Na ja, so einfach, wie Du Dir das jetzt gerade vorstellst, ist das nun nicht.

    Was passiert denn bei einem Funktionsaufruf wie dem von time.sleep(d)?

    Ganz kurzgefasst:
    - Sicherung des Stapelspeichers (Stack)
    - Sicherung des Registers Program Counter
    - Übergabe von Parametern der aufzurufenden Funktion und deren Ablage auf den Stack
    - Setzen des Registers Program Counter auf die Adresse, an der sich die Funktion befindet
    - Abarbeiten des Funktionsinhaltes, h ier also dem Scheduler Bescheid geben, wann man wieder bei der Vergabe von Prozessortakten bedacht werden möchte
    - Abbau des Stacks
    - Wiederherstellen des Stacks, wie er vor Aufruf der Funktion gültig war
    - Wiederherstellen des Registers Program Counter auf den vorigen Wert

    Ob Du da jetzt mit 100 µs Verzögerung oder mit 10 µs Verzögerung arbeitest, hat auf die Frequenz des Gesamtsystems praktisch keinen Einfluss. Du drehst nämlich nicht an der Stellschraube mit dem geschwindigkeitsbestimmenden Schritt (d.h. dem langsamsten Schritt) sondern irgendwo anders.

    Ein simples Verringern der Verzögerung funktioniert nur bei Verzögerungszeiten, die um etliche Größenordnungen größer als ein Prozessortakt liegen.

    Probiere es mal mit 1 Sekunde und 100 ms aus. Dann wird der Zyklus recht genau um den Faktor 10 schneller laufen (von Schwankungen in einem NOT-Realtime-OS mal abgesehen, was beim RPI rund 40 % - bei einem normalen PC ungefähr 3 % - ausmachen kann).


    Beste Grüße

    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.

    Einmal editiert, zuletzt von Andreas (12. August 2017 um 10:25)

  • Okay vielen Dank.

    Ja bei größeren Zeiten ist es ziemlich genau.
    Dann werde ich mich dochmal an eine andere Sprache wenden oder an andere Hardware.

    Vielen Dank an alle!

  • AFIK macht sleep unter Linux minimum 1msec.

    Prinzipiell ist der Raspi für sowas wenig geeignet, versuch doch mal ein größeres Programm, z.B. den Firefox zu starten und schau mal, was Dein Takt in der Zeit macht.

    Entweder nimmt man da einen Mikrocontroller, oder ganz einfach einen Rechteckgenerator (ICL7555, 74HC00, 74HC4060 mit Quarz) und startet / stoppt den über ein Raspi-GPIO.

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!