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:
pwmSetMode(PWM_MODE_MS);
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ührt pwmSetRange()
. Wie in einer der anderen Antworten angegeben, reicht der gültige Bereich für pwmSetClock()
anscheinend von 2 bis 4095, während der gültige Bereich für pwmSetRange()
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:
pwmFrequency in Hz = 19.2e6 Hz / pwmClock / pwmRange.
Wenn Sie die maximal zulässigen Werte für pwmSetClock()
und verwenden pwmSetRange()
, 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.
pwmWrite()
. Nichts, was ich erwarten würde