Gibt es eine Möglichkeit, ein PWM- Signal von den Pins des Raspberry Pi zu lesen ?
Ich habe versucht, es zu googeln, aber ich habe nur die PWM- Ausgabe und nicht die Eingabe gefunden .
Die kurze Antwort: Sie können PWM auf Raspberry Pi NICHT zuverlässig lesen.
Das Lesen von PWM erfordert eine Genauigkeit von Mikrosekunden (es sei denn, Sie lesen eine sehr, sehr langsame PWM). Dies ist auf Raspberry Pi für Userland-Software nicht verfügbar, ohne an Kernelmodulen zu basteln.
Der einfachste Weg, PWM zu erfassen, besteht darin, einen billigen (<$ 0,5) Mikrocontroller mit seriellem oder I 2 C- Ausgang zu erwerben, ihn an Ihren Raspberry Pi anzuschließen und die tatsächlichen Werte vom Mikrocontroller zu lesen. Dies funktioniert sehr zuverlässig und ist sehr präzise.
Dies ist eine interessante Frage, bei der Sie zu Recht sagen, dass die Google-Suche keine offensichtliche Lösung bietet! (Ich vermisse die Tage, an denen Google innerhalb von Sekunden alles beantworten konnte, was ich für meine Ausbildung / Aufgaben wissen wollte.)
Ich gehe davon aus, dass Sie die Prinzipien von PWM verstehen . Deshalb werde ich nicht darauf eingehen. Ich glaube jedoch, dass Sie theoretisch einen PWM-Wert auf einem normalen digitalen Eingangspin mit einer cleveren Codierung lesen können.
Ich gebe zu, dass ich dies nicht selbst versucht habe, aber Sie sollten in der Lage sein, die Zeit zu messen, in der der Pin hoch und die Zeit, in der er niedrig ist (was Ihnen Ihren PWM-Wert gibt), und dann die vom Lieferanten des Sensors bereitgestellte mathematische Formel zu verwenden um dies in den tatsächlichen Messwert umzuwandeln.
Diese Methode funktioniert bei einem ähnlichen Problem, bei dem ich die Pulslänge eines Ultraschallmoduls ablesen und dann in die Entfernung umwandeln musste. Zu den Problemen, die ich mir vorstellen kann, gehört die Gewährleistung zuverlässiger Messwerte!
Wenn Sie glauben, dass es helfen wird und Sie den Code sehen möchten, den ich für das Ultraschallmodul verwendet habe, sagen Sie es einfach und ich kopiere es weiter, wenn ich nach Hause komme.
Ich habe angefangen, den Code zu kopieren, aber aus irgendeinem Grund kann ich ihn auf der Website immer nur in einem kleinen Abschnitt kopieren (und ich bin zu faul, um meinen Pi aus der Garage zu holen). Hier ist also der Link dazu. Ignorieren Sie die meisten Funktionen unten, da sie sich auf die Verwendung des Moduls als Näherungssensor beziehen. http://pibot.webnode.com/products/ultrasonic-range-sensor/
quelle
Mit der piGpio C-Bibliothek kann ich eine ziemlich genaue Pulsweitenmessung durchführen: http://abyz.me.uk/rpi/pigpio/index.html
Mit dieser Bibliothek können Sie eine Rückruffunktion installieren, die bei jedem Kantenübergang auf einem GPIO-Pin ausgelöst wird und Ihnen für jeden Übergang einen Zeitstempel auf Mikrosekundenebene gibt. Denken Sie nicht, dass Sie sich bei der Genauigkeit von Mikrosekunden darauf verlassen können - aber meine Tests legen nahe, dass die Genauigkeit mindestens +/- 10 us beträgt, vielleicht sogar besser.
Viel besser als eine Besetztschleife auszuführen, die ein GPIO nach dem Levelwechsel abfragt.
quelle
Die lange Antwort: Sie können tatsächlich! (gut mit ein wenig Hilfe von unseren Freunden Widerstand und Kondensator)
Sie können einen PWM-Ausgang in einen analogen Spannungspegel (DAC) umwandeln und ihn mit dem ADC-Pin auf Ihrem Himbeer-Pi lesen.
Was Sie brauchen, ist ein 4k7-Widerstand und ein 0,1uF-Kondensator:
simulieren Sie diese Schaltung - Schema erstellt mit CircuitLab
Das oben beschriebene einfache RC-Tiefpassfilter wandelt das PWM-Signal in eine Spannung um, die proportional zum Arbeitszyklus ist und von Ihrem Himbeer-Pi als Analogwert gelesen werden kann.
quelle
Wenn Sie mit einer langsamen Antwort zufrieden sind, können Sie eine schnelle PWM durch Unterabtastung lesen. Lesen Sie einfach den GPIO in einer Schleife und wenden Sie einen Tiefpassfilter an. Die Wahrscheinlichkeit, in jedem Zyklus eine 1 zu lesen, ist proportional zur Impulsbreite. Ein einfach zu implementierendes IIR-Tiefpassfilter ist:
Wenn k abnimmt, verbessert sich die Auflösung, aber die Bandbreite nimmt ab.
quelle
Obwohl meine Antwort nicht von den Pins stammt, könnten Sie etwas verwenden, das auf einem Soundkarten-Oszilloskop basiert, um einen gepulsten Eingang zu lesen.
Menschen verwenden seit Jahren Soundkarten in Desktop-PCs, um Oszilloskope herzustellen. Es scheint, dass Sie mit einer modernen internen Soundkarte brauchbare Ergebnisse bis zu 10 kHz erzielen können. Mit einer über Raspberry Pi USB angeschlossenen Soundkarte ist Ihre maximale Frequenz möglicherweise niedriger.
Hier ist ein Beispiel für ein Soundkarten-Oszilloskop-Projekt für Linux: http://www.yann.com/de/diy-turn-your-gnulinux-computer-into-a-free-oscilloscope-29/09/2010.html
quelle
Dieses von mir geschriebene Python-Skript eignet sich gut zum Lesen von PWM-Signalen eines RC-Empfängers. Hochfrequenz-PWM-Signale funktionieren offensichtlich nicht, wie bereits erwähnt.
Ich habe die zehn Signalausgangspins des RC-Empfängers direkt mit den Raspberry GPIO-Pins verbunden. Der Empfänger wird über die + 5V- und GND-Pins des RPI mit Strom versorgt.
Ich habe das Skript vereinfacht, da es viele andere Dinge erledigt. Wenn Sie Fehler oder Reste finden, lassen Sie es mich wissen
quelle
Einfache Lösung mit hoher Genauigkeit:
Die Verwendung eines Arduino als iic-Slave oder UART-Gerät scheint einwandfrei zu funktionieren. Der Mikrocontroller kann die Informationen über die pulsIn-Methode lesen.
Für detaillierte Informationen: https://www.youtube.com/watch?v=ncBDvcbY1l4
quelle