Kann ich den GPIO als Impulsbreitenmodulationsausgang verwenden ?
Wenn ja, wie würde ich vorgehen und wie viele unterschiedliche PWM-Ausgänge kann ich gleichzeitig haben?
Kann ich den GPIO als Impulsbreitenmodulationsausgang verwenden ?
Wenn ja, wie würde ich vorgehen und wie viele unterschiedliche PWM-Ausgänge kann ich gleichzeitig haben?
Antworten:
Wie von Alex Chamberlain vorgeschlagen , scheint die WiringPi- Bibliothek sowohl Hardware-PWM-Ausgabe auf einem oder zwei GPIO-Pins je nach Modell als auch Software-PWM auf einem der anderen GPIO-Pins zu unterstützen. Währenddessen führt die RPIO.PWM-Bibliothek PWM by DMA auf jedem GPIO-Pin aus. Tatsächlich handelt es sich hierbei um eine Zwischenlösung zwischen Hardware- und Software-PWM, die eine Zeitauflösung von 1 µs im Vergleich zu 100 µs mit WiringPis Software-PWM bietet [1] .
Welche davon für Ihre Anwendungen geeignet ist, hängt davon ab, wie viele PWM-Ausgänge Sie benötigen und welche Leistung Sie von diesen Ausgängen erwarten.
Wenn Ihre Anwendung eine niedrige Zeitauflösung und einen hohen Jitter toleriert, können Sie eine Software oder eine DMA-unterstützte Zeitschleife verwenden. Wenn Sie eine PWM mit höherer Präzision und geringerem Jitter wünschen, benötigen Sie möglicherweise Hardware-Unterstützung.
Wenn Sie eine Reihe von LEDs mit unterschiedlichen vom Menschen sichtbaren Kadenzen (10 Hertz) mit weichen Echtzeit- Reaktionsanforderungen blinken lassen möchten, kann die Softwareschleife so viele PWMs verarbeiten, wie Sie über GPIO-Pins verfügen.
Wenn Sie einen Servomotor mit harten Echtzeit- Reaktionsanforderungen steuern möchten, müssen Sie Hardware-PWM verwenden. Selbst dann haben Sie möglicherweise Probleme, eine Echtzeitantwort für die Servoschleife zu gewährleisten, die den Encodereingang mit dem PWM-Ausgang verbindet.
Eine stabile Servoschleife muss Encoder mit einer regulären Rate lesen (niedriger Jitter), überarbeitete PWM-Ausgabewerte mit einer regulären Rate ausgeben und die Latenz zwischen diesen sollte fest sein (insgesamt niedriger Jitter). Wenn Sie dies nicht tun können, müssen Sie Ihren Motor abstimmen (sanft abstimmen), um zu verhindern, dass er unter Last instabil wird. Dies ist mit einem Multitasking-Betriebssystem ohne Low-Level-Support nur schwer möglich.
Wenn Sie mehr Servoschleifen ausführen müssen als Hardware-PWM-Ausgänge, müssen Sie diese wahrscheinlich auf ein anderes Gerät auslagern, um eine harte Echtzeitleistung zu gewährleisten, und Ihren Raspberry Pi zu einem weichen Echtzeit- Supervisor machen .
Eine Option wäre etwa der Adafruit-16-Kanal-12-Bit-PWM / Servotreiber - I²C-Schnittstelle - PCA9685, mit dem Sie 16 PWM-Ausgänge mit nur wenigen GPIO-Pins für den I²C-Bus steuern können. Ein Beispiel für seine Verwendung finden Sie im I²C-16-Kanal-PWM / Servo-Breakout - Arbeitsposten in den Raspberry Pi-Foren.
1. Dank dm76 für den Vorschlag, jedoch sagt Heather , dass RPIO.PWM für neuere Pi-Modelle möglicherweise nicht mehr funktioniert.
Ja, auf dem Raspberry Pi ist ein Hardware-PWM-Ausgang vorhanden, der mit P1-12 (GPIO18) verbunden ist. Außerdem können PWM-Ausgänge über eine I²C- oder SPI- Schnittstelle hinzugefügt werden . Einige Leute hatten Erfolg damit ( Forumsbeitrag ).
Sie können die WiringPi-Bibliothek verwenden , um den PWM-Pin zu steuern. Sie können sich den Code ansehen, um zu vermeiden, dass die gesamte Bibliothek eingeschlossen wird.
Der Raspberry Pi eignet sich nicht für seriöse Software-PWMs, da Linux kein Echtzeitbetriebssystem ist.
Aktuelle Pis haben zwei Hardware-PWM-Kanäle. Zusätzlich können Hardware-zeitgesteuerte PWM-Impulse auf allen an den 40-Pin-Erweiterungs-Header angeschlossenen GPIOs unabhängig erzeugt werden.
In der Praxis bedeutet dies, dass es zwei hochpräzise PWM-Kanäle gibt und alle anderen GPIOs möglicherweise über PWM im Arduino-Stil verfügen (800 Hz, 0 aus - 255 voll eingeschaltet).
ZB Servoblaster und mein Pigpio usw.
Nicht ganz ein Echtzeit-Betriebssystem, aber RISC OS für Raspberry Pi ist kooperatives Multitasking. Sie können also problemlos eine Anwendung mit 100% CPU ausführen, um Ihre Timings viel besser zu verwalten. Erwarten Sie nur nichts anderes als Ihren eigenen Code.
Ich habe diese Bibliothek ( Pi-Blaster ) gefunden, die behauptet, "extrem effizient zu sein: sie nutzt die CPU nicht und gibt sehr stabile Impulse aus."
Ich habe es noch nicht getestet, werde es aber aktualisieren, sobald ich es tue (wahrscheinlich heute)