Kann ich den GPIO zur Pulsweitenmodulation (PWM) verwenden?


97

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?


Sie müssen wahrscheinlich angeben, welches Modell Sie verwenden. Sie sind alle leicht unterschiedlich.
not2qubit

2
@ user1147688 Diese Frage wurde zurück gestellt, als es nur ein Modell gab!
Berry120

Antworten:


76

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.

Wann könnte Software-PWM geeignet sein?

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.

Wann könnte Hardware-PWM geeignet sein?

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.

Was ist, wenn ich mehr Hardware-PWM-Ausgänge benötige?

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.


Kann ich den Software-PWM-Ansatz zum Betreiben von Gleichstrommotoren verwenden?
Gideon

@gideon - Ja, die von mir verwendeten Motorleistungsverstärker haben alle PWM als Eingangssignal verwendet.
Mark Booth

2
Zu Ihrer Information , die RPI-Bibliothek ( pythonhosted.org/RPIO/pwm_py.html ) scheint eine viel bessere Auflösung (1us) zu haben als WiringPi mit 100us Auflösung
dm76

@ MarkBooth - Keine Probs. Die Bibliothek ist wirklich gut geschrieben und kann als Ersatz für RPi.GPIO verwendet werden, was sehr praktisch ist, wenn Sie ein Projekt mit letzterem gestartet haben und später realisierte PWM-Signale benötigt wurden ...
dm76

RPIO.PWM funktioniert möglicherweise nicht mehr für neuere Pi-Modelle, denke ich.
Heather

39

Hardware-PWM

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 ).

Beispielcode

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.

Software PWM

Der Raspberry Pi eignet sich nicht für seriöse Software-PWMs, da Linux kein Echtzeitbetriebssystem ist.


1
Frage, was ist die Definition oder ein Beispiel für seriöse Software-PWM? Und was sind „Echtzeit - Betriebssysteme“ und gibt es immer eine Chance auf einen immer auf einem Pi
AnthonyBlake

@AnthonyBlake Nun, Sie können die Helligkeit eines Lichts wahrscheinlich mit der Software PWM steuern, aber ich vermute, dass ein Motor blockiert. Es ist jedoch kein Software-PWM erforderlich, da die Hardware einfacher und effektiver ist. Echtzeitbetriebssysteme werden von Google besser erklärt. Sie garantieren bestimmte Dinge darüber, wie lange und oft Software ausgeführt wird.
Alex Chamberlain

2
@AnthonyBlake Ein "Real-Time OS" (RTOS) ist ein Betriebssystem, das Ihnen eine Garantie auf die maximale Ausführungszeit gibt. Zum Beispiel zu dem Programm sagen: "Ja, Sie haben eine gewisse Ausführungszeit in 33 ms (Toleranz von 2 ms), um dieses GPIO-Pin-Bit zu kippen und Ihrem Schrittmotor ein Signal im genauen Zeitfenster zu geben, wenn er es benötigt. Und Sie können sich darauf verlassen auf diesem!" Es gibt ein RT Linux da draußen. Ich weiß nicht, ob es (noch) auf das RPi portiert wurde.
Orithena

Entschuldigung Alex, ich habe nicht absichtlich einen anderen Teil Ihrer Antwort gestohlen, aber ich habe gerade bemerkt, dass wir über verschiedene Wege zum selben Forumsbeitrag gekommen sind.
Mark Booth

2
Neuere Modelle mit 40 Pins haben ein zweites Hardware-PWM, das an GPIO19 angeschlossen ist (Pin 35).
Kevin

12

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.


Gute Antwort! Wie kann ich diese beiden HW-PWMs verwenden? Ich muss 2 Servos steuern, ich weiß, dass Sie sagen, dass Servoblaster und Pigpio dafür in Ordnung sind, aber ich frage mich nur über die HW PWM, weil ich nichts über sie finden kann ... gibt es einige Dokumente dafür da draußen? Ich habe ein RPi 2 V1.1 für Tests.
Kozuch


2
Starke CPU-Auslastung sollte keinen Unterschied machen. Eine hohe Netzwerklast kann sich auf gpioServo auswirken, insbesondere wenn die Abtastung mit 1 MHz statt mit den Standardwerten von 200 kHz erfolgt. Die Frequenz beträgt 50 (Hz), der Bereich der Arbeitszyklen liegt zwischen 0 und 1000000 (dem wahren zugrunde liegenden Wert von 0 bis 5000000 zugeordnet). 1 ms ist 1 ms in 20 ms, also ein Arbeitszyklus von 5%, also 50000, 1,5 ms -> 7,5% -> 75000, 2 ms -> 10% -> 100000.
Joan

1
Seite 102 von BCM2835 ARM-Peripheriegeräte zeigt die verschiedenen Modi, denen das GPIO zugewiesen werden kann. Suchen Sie online, für welche GPIOs die verschiedenen Pi-Modellerweiterungs-Header ausgegeben werden.
Joan

1
@ user1147688 PLLD (500 MHz) wird als Kern-PWM-Takt verwendet. Aufgrund der Funktionsweise beträgt die PWM-Kernfrequenz 250 MHz. Zum Ein- und Ausschalten (ziemlich wichtig für PWM) beträgt das Maximum 125 MHz. Sie könnten die Zahlen mit PLLC (1000 MHz) verdoppeln, aber diese PLL variiert mit der Kerntaktrate.
Joan

2

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 irgendwo gelesen, dass es auch eine Hardware-Grenze für die Schaltfrequenz eines Ausgangspins gibt. Ich denke, es war um die 20 MHz. Erwarten Sie also nicht, dass Sie 300-MHz-PWM oder ähnliches nutzen können, auch wenn die CPU zu 100% ausgelastet ist.
Ponkadoodle

@ Wallacoloo: Welche Anwendungen erfordern 300 MHz PWM?
Peter Mortensen

2
@PeterMortensen: Nun, ich weiß nicht, wie Funksender und solche ihre Signale erzeugen, aber einige könnten es mit PWM tun. PiFM macht das bei 100 MHz. Das scheint meiner Bemerkung zu widersprechen, also frage ich mich, ob der Pin vielleicht noch bei dieser Frequenz kommandiert werden kann, aber es ist nur so, dass die Pin - Kapazität solche Signale abschwächt, so dass eine 100 MHz - Rechteckwelle tatsächlich von zB (1,0 V) schwingen könnte 2,3 V) anstelle des vollen (0 V, 3,3 V) Bereichs.
Ponkadoodle

2

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)


Ich habe es versucht, aber bisher kein Glück. Soweit ich das beurteilen kann schaltet sich die Hardware eigentlich nicht um?
MrMowgli

1
Ich will das nur stoßen. Pi-Blaster hat für mich gearbeitet, wo diese anderen Antworten nicht taten.
Seph Reed
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.