Ich verwende den Hardware-PWM-Ausgang mit Wiringpi. Es bietet die Funktion pwmSetClock, die es ermöglichen soll, die Frequenz zu ändern. ( https://projects.drogon.net/raspberry-pi/wiringpi/functions/ ). Ich glaube, da die Standardeinstellung 200 Mhz ist, sollte der Divisor auf 200000000 eingestellt werden, damit eine an den Ausgang angeschlossene LED sichtbar blinkt, aber das ist nicht der Fall.
Kann das geändert werden?
pwmWrite()
. Nichts, was ich erwarten würdeAntworten:
Ich hatte kürzlich einen Grund, selbst mit PWM zu experimentieren, und stellte fest, dass (wie in einem der Kommentare hervorgehoben) die Häufigkeit mit dem Arbeitszyklus zu variieren scheint - bizzare, richtig? Es hat sich herausgestellt, dass Broadcom "symmetrisches" PWM implementiert hat, um die Ein- und Ausschalt-PWM-Impulse so gleichmäßig wie möglich zu verteilen. Sie geben eine Beschreibung des Algorithmus und weitere Informationen auf Seite 139 ihres Datenblattes: http://www.element14.com/community/servlet/JiveServlet/downloadBody/43016-102-1-231518/Broadcom.Datasheet.pdf
Was Sie also wirklich wollen, ist, PWM in den Mark-Space-Modus zu versetzen, wodurch Sie das traditionelle (und leicht vorhersehbare) PWM erhalten, das Sie suchen:
In der restlichen Antwort wird davon ausgegangen, dass wir uns im Leerzeichenmodus befinden.
Ich habe auch einige Experimente mit dem zulässigen Wertebereich für
pwmSetClock()
und durchgeführtpwmSetRange()
. Wie in einer der anderen Antworten angegeben, reicht der gültige Bereich fürpwmSetClock()
anscheinend von 2 bis 4095, während der gültige Bereich fürpwmSetRange()
bis 4096 reicht (ich habe nicht versucht, eine Untergrenze zu finden).Der Bereich und die Uhr (ein besserer Name ist wahrscheinlich ein Teiler) beeinflussen beide die Frequenz. Der Bereich wirkt sich auch auf die Auflösung aus. Obwohl möglicherweise sehr niedrige Werte verwendet werden können, gibt es eine praktische Grenze dafür, wie niedrig Sie wahrscheinlich sein möchten. Wenn Sie beispielsweise einen Bereich von 4 verwenden, können Sie höhere Frequenzen erzielen, das Tastverhältnis kann jedoch nur auf 0/4, 1/4, 2/4, 3/4 oder 4/4 eingestellt werden.
Der Raspberry Pi PWM-Takt hat eine Grundfrequenz von 19,2 MHz. Diese Frequenz, geteilt durch das Argument bis
pwmSetClock()
, ist die Frequenz, mit der der PWM-Zähler inkrementiert wird. Wenn der Zähler einen Wert erreicht, der dem angegebenen Bereich entspricht, wird er auf Null zurückgesetzt. Während der Zähler kleiner als der angegebene Arbeitszyklus ist, ist die Ausgabe hoch, andernfalls ist die Ausgabe niedrig.Das heißt, wenn Sie die PWM auf eine bestimmte Frequenz einstellen möchten, können Sie die folgende Beziehung verwenden:
Wenn Sie die maximal zulässigen Werte für
pwmSetClock()
und verwendenpwmSetRange()
, erhalten Sie die minimal erreichbare Hardware-PWM-Frequenz von ~ 1,14 Hz. Dies verleiht einer LED mit Sicherheit ein sichtbares Flackern (eigentlich eher ein Blitz). Ich habe die obige Gleichung mit einem Oszilloskop bestätigt, und es scheint zu gelten. Die obere Frequenzgrenze hängt von der Auflösung ab, die Sie wie oben beschrieben benötigen.quelle
Nach dieser Formel:
Wir können einstellen
pwmClock=1920
undpwmRange=200
bekommenpwmFrequency=50Hz
:Ich teste es auf alarmpi:
Hinweis: Mein Servo erwartet ein 50Hz- Signal.
quelle
Dies ist der Code, den ich verwende. Ich versuche zu sehen, was sich ändern wird, wenn ich die Einstellungen ändere.
Nach dem, was ich getestet habe, scheint der Divisor von 2 auf eine Zahl kleiner als 5000 zu gehen. Ich würde vermuten, dass dies etwas mit der binären Darstellung dieser Zahlen zu tun hat, die direkt im Register eingestellt werden. Sobald die Zahlen-Binärdarstellung mehr Bits enthält, als das Register aufnehmen kann, werden nur die ersten Bits verwendet und die Zahlen auf diese Weise interpretiert. Das ist der Grund, warum das seltsame Verhalten auftritt, wenn von 4000 auf 5000 gewechselt wird.
quelle