J'utilise la sortie PWM matérielle avec le câblagepi. Il fournit la fonction pwmSetClock qui devrait permettre de changer la fréquence. ( https://projects.drogon.net/raspberry-pi/wiringpi/functions/ ). Je crois que puisque la valeur par défaut est de 200 Mhz, le réglage du diviseur sur 200000000 devrait rendre une LED connectée au flash de sortie de manière visible, mais ce n'est pas le cas.
Cela peut-il être changé?
pwmWrite()
. Pas quelque chose à quoi je m'attendraisRéponses:
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:
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()
etpwmSetRange()
. Comme indiqué dans l'une des autres réponses, la plage valide pourpwmSetClock()
semble aller de 2 à 4095, tandis que la plage valide pourpwmSetRange()
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:
Si vous utilisez les valeurs maximales autorisées pour
pwmSetClock()
etpwmSetRange()
, 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.la source
Selon cette formule:
Nous pouvons définir
pwmClock=1920
etpwmRange=200
obtenirpwmFrequency=50Hz
:Je le teste sur alarmpi:
Remarque: Mon servo attend un signal de 50 Hz .
la source
Ceci est le code que j'utilise. J'essaie de voir ce qui va changer à mesure que je change les paramètres.
D'après ce que j'ai testé, il semble que le diviseur passe de 2 à un nombre inférieur à 5000. Je suppose que cela a quelque chose à voir avec la représentation binaire de ces nombres qui sont directement définis dans le registre. Une fois que la représentation binaire des nombres a plus de bits que le registre ne peut en prendre, elle prend simplement les premiers bits et interprète les nombres de cette façon. C'est pourquoi l'étrange comportement survient lorsque l'on passe de 4000 à 5000.
la source