J'ai récemment eu des raisons de commencer à expérimenter moi-même avec PWM, et j'ai constaté que (comme l'a souligné l'un des commentaires) la fréquence semble varier avec le rapport cyclique - bizzare, non? Il s'avère que Broadcom a implémenté un PWM "équilibré" afin de rendre les impulsions PWM activées et désactivées aussi uniformément réparties que possible. Ils donnent une description de l'algorithme et quelques discussions supplémentaires à la page 139 de leur fiche technique:
http://www.element14.com/community/servlet/JiveServlet/downloadBody/43016-102-1-231518/Broadcom.Datasheet.pdf
Donc, ce que vous voulez vraiment, c'est mettre le PWM en mode espace de marque, ce qui vous donnera le PWM traditionnel (et facilement prévisible) que vous recherchez:
pwmSetMode(PWM_MODE_MS);
Le reste de la réponse suppose que nous sommes en mode espace de marque.
J'ai également fait quelques essais avec la plage de valeurs autorisée pour pwmSetClock()
et pwmSetRange()
. Comme indiqué dans l'une des autres réponses, la plage valide pour pwmSetClock()
semble aller de 2 à 4095, tandis que la plage valide pour pwmSetRange()
est jusqu'à 4096 (je n'ai pas essayé de trouver une limite inférieure).
La plage et l'horloge (un meilleur nom est probablement un diviseur) affectent toutes deux la fréquence. La plage affecte également la résolution.Par conséquent, bien qu'il soit possible d'utiliser des valeurs très faibles, il existe une limite pratique au niveau auquel vous souhaiterez probablement descendre. Par exemple, si vous avez utilisé une plage de 4, vous pourriez obtenir des fréquences plus élevées, mais vous ne pourrez régler le rapport cyclique que sur 0/4, 1/4, 2/4, 3/4 ou 4/4.
L'horloge PWM du Raspberry Pi a une fréquence de base de 19,2 MHz. Cette fréquence, divisée par l'argument de pwmSetClock()
, est la fréquence à laquelle le compteur PWM est incrémenté. Lorsque le compteur atteint une valeur égale à la plage spécifiée, il revient à zéro. Alors que le compteur est inférieur au rapport cyclique spécifié, la sortie est élevée, sinon la sortie est faible.
Cela signifie que si vous souhaitez définir le PWM pour avoir une fréquence spécifique, vous pouvez utiliser la relation suivante:
pwmFrequency in Hz = 19.2e6 Hz / pwmClock / pwmRange.
Si vous utilisez les valeurs maximales autorisées pour pwmSetClock()
et pwmSetRange()
, vous vous retrouverez avec la fréquence PWM matérielle minimale réalisable de ~ 1,14 Hz. Cela donnera certainement un scintillement visible (plus d'un flash, vraiment) à une LED. J'ai confirmé l'équation ci-dessus avec un oscilloscope, et elle semble tenir. La limite de fréquence supérieure sera affectée par la résolution dont vous avez besoin, comme décrit ci-dessus.
pwmWrite()
. Pas quelque chose à quoi je m'attendrais