PWM-Signal auf dem Raspberry PI PINs läst sich nicht ansteuern

Beim Prüfen der PWM-Ausgänge musste ich feststellen, dass sich die Pins nicht ansprechen ließen.

Hierfür habe ich ein C#-Projekt mit .NET erstellt, das auf die GPIOs zugreift und ein PWM-Signal zur Steuerung von zwei Servos einrichtet.
Selbst mit direkten Shell-Kommandos ließen sich die PWM Pins auf dem Raspberry Pi nicht einstellen.


Verwendete Hardware

  • Raspberry Pi 4
  • Raspbian OS
  • Mini-Servo

Ziel

Einen GPIO-Pin für PWM-Signale korrekt einrichten, sodass ein Servo zuverlässig gesteuert werden kann.

  • GPIO12 auf PWM festlegen
  • GPIO13 auf PWM festlegen


Welche Version von Raspbian OS ist installiert?

Mit folgendem Befehl werden mehrere Zeilen ausgegeben, die Informationen über die aktuell verwendete Linux-Version liefern:

 hostnamectl  




PWM zunächst einrichten

Über die config.txt kann der PWM-Eintrag gesetzt werden.
In älteren Raspbian-Versionen befand sich diese Datei unter /boot/config, der Pfad hat sich jedoch geändert zu:

 /boot/firmware/config.txt  

Bearbeiten der Datei:

 sudo nano /boot/firmware/config.txt  

Ganz nach unten scrollen und folgenden Eintrag setzen:

 dtoverlay=pwm-chan  

HINWEIS: Dieser Eintrag ist Teil des Problems. Die korrekte Lösung wird im letzten Abschnitt unter „Dauerhaft einstellen“ beschrieben.

Speichern mit STRG + O, bestätigen mit ENTER.
Nano mit STRG + X verlassen.

Anschließend muss das Betriebssystem neu gestartet werden:

 sudo reboot  

Servo anschließen

Der Servo kann nun am Raspberry Pi angeschlossen werden.
Die Stromversorgung sollte jedoch nicht über die GPIO-Pins des Raspberry Pi erfolgen. Eine Ausnahme gilt nur für Mini-Servos ohne nennenswerte Last und mit sehr geringem Stromverbrauch.

Zwar kann die USB-C-Stromversorgung bis zu 3 A liefern, dennoch empfiehlt es sich, unter 500 mA zu bleiben und die Stromaufnahme nicht auszureizen.


Einrichtung über die Shell

Zunächst ein einfacher Test, um einen Servo direkt über die Shell anzusteuern.

Prüfen, ob der PWM-Chip verfügbar ist

 ls /sys/class/pwm  

Das erwartete Ergebnis ist pwmchip0.
Andernfalls muss der Chip über die config.txt korrekt eingerichtet werden.




Prüfen, ob pwm0 vorhanden ist

 ls /sys/class/pwm/pwmchip0  

In meinem Fall wurde nur pwm1 angezeigt.




PWM-Kanal exportieren

 echo 0 | sudo tee /sys/class/pwm/pwmchip0/export  

Danach sollte auch pwm0 verfügbar sein.




PWM für Servo einstellen

Periode: 20 ms

 echo 20000000 | sudo tee /sys/class/pwm/pwmchip0/pwm0/period  

Pulsweite für Mittelstellung (1,5 ms)

 echo 1500000 | sudo tee /sys/class/pwm/pwmchip0/pwm0/duty_cycle  

PWM aktivieren

 echo 1 | sudo tee /sys/class/pwm/pwmchip0/pwm0/enable  

An dieser Stelle sollte der Servo in die Mittelstellung fahren.

Servo nach links bewegen (Pulsweite 1 ms)

 echo 1000000 | sudo tee /sys/class/pwm/pwmchip0/pwm0/duty_cycle  

Servo bewegt sich weiterhin nicht

Wenn sich der Servo trotz dieser Einstellungen nicht bewegt, liegt die Ursache sehr wahrscheinlich an der Pin-Konfiguration.
Als Nächstes wird der Status des GPIO-Pins geprüft:

 raspi-gpio get 12  

In meinem Fall erschien die Meldung „command not found“.




Alternative Prüfung

 pinctrl get 12  

Damit lässt sich ebenfalls die aktuelle Konfiguration von GPIO12 auslesen.
In meinem Fall ergab sich folgendes Ergebnis:



raspi-gpio-Paket installieren?

In aktuellen Versionen von Raspbian OS ist das Paket raspi-gpio nicht mehr standardmäßig installiert.
Ein Nachinstallieren ist grundsätzlich möglich:

 sudo apt update  
 sudo apt install raspi-gpio  

In meinem Fall trat dabei jedoch ein Fehler auf.


Offenbar ist hier entweder eine Anpassung seitens der Distribution erforderlich – oder das Paket wird nicht mehr vorgesehen.


Pin umstellen (Pin-Multiplexing)

In meinem Fall war GPIO12 als INPUT konfiguriert und musste über Pin-Multiplexing umgestellt werden.

GPIO12 auf PWM0 setzen:

 sudo pinctrl set 12 a0  

Die Änderung sollte ohne Neustart wirksam sein.
Bei mir bewegte sich der Servo danach endlich wie erwartet.


Dauerhaft einstellen

Rückblickend hätte ich diese Konfiguration direkt zu Beginn vollständig setzen sollen.
Hätte ich das früher gewusst, hätte ich mir viele Zwischenschritte erspart, da sich die meisten Lösungsansätze nur auf kurzfristige Workarounds beziehen.

Für eine dauerhafte PWM-Konfiguration muss folgender Eintrag in der Datei
/boot/firmware/config.txt gesetzt werden:

 dtoverlay=pwm-2chan,pin=12,func=4,pin2=13,func2=4  

Danach speichern mit STRG + O, bestätigen mit ENTER, Nano mit STRG + X beenden und anschließend neu starten:

 sudo reboot  

Fazit

Offensichtlich wurde mit der neuen Betriebssystemversion deutlich aufgeräumt. Viele Funktionen scheinen heute durch unterschiedliche Bibliotheken mehrfach vorhanden zu sein oder wurden neu strukturiert.

Erst mit Unterstützung von Microsoft Copilot und ChatGPT bin ich – nach zahlreichen Fragen und Fehlversuchen – auf diese Lösung gestoßen.
Über die klassische Google-Suche bzw. Gemini führte der Weg ebenfalls nicht direkt zum Ziel.

Ein möglicher Grund dafür ist der Wechsel des Raspbian OS von Bookworm auf Trixie, der intern offenbar einige Änderungen an der GPIO- und PWM-Konfiguration mit sich gebracht hat.

Kommentare

Beliebte Posts aus diesem Blog

Wie schließe ich ein Brushless Motor an

Arduino Control (Teil 5) - PWM Signal einlesen

RC Fahrtenregler für Lego Kettenfahrzeug