Recientemente tuve alguna razón para comenzar a experimentar con PWM yo mismo, y descubrí que (como lo señala uno de los comentarios) la frecuencia parece variar con el ciclo de trabajo: bizzare, ¿verdad? Resulta que Broadcom implementó PWM "equilibrado" para hacer que los pulsos PWM de encendido y apagado se distribuyan de la manera más uniforme posible. Dan una descripción del algoritmo y un poco más de discusión en la página 139 de su hoja de datos:
http://www.element14.com/community/servlet/JiveServlet/downloadBody/43016-102-1-231518/Broadcom.Datasheet.pdf
Entonces, lo que realmente quiere es poner PWM en modo de espacio de marca, que le dará el PWM tradicional (y fácilmente predecible) que está buscando:
pwmSetMode(PWM_MODE_MS);
El resto de la respuesta supone que estamos en modo de espacio de marca.
También experimenté un poco con el rango permitido de valores para pwmSetClock()
y pwmSetRange()
. Como se señaló en una de las otras respuestas, el rango válido para pwmSetClock()
parece ir de 2 a 4095, mientras que el rango válido pwmSetRange()
es de hasta 4096 (no intenté encontrar un límite inferior).
El rango y el reloj (un mejor nombre es probablemente divisor) afectan la frecuencia. El rango también afecta la resolución, por lo que si bien es posible usar valores muy bajos, existe un límite práctico para lo bajo que probablemente querrá ir. Por ejemplo, si usó un rango de 4, podría lograr frecuencias más altas, pero solo podrá establecer el ciclo de trabajo en 0/4, 1/4, 2/4, 3/4 o 4/4.
El reloj Raspberry Pi PWM tiene una frecuencia base de 19.2 MHz. Esta frecuencia, dividida por el argumento de pwmSetClock()
, es la frecuencia con la que se incrementa el contador PWM. Cuando el contador alcanza un valor igual al rango especificado, se restablece a cero. Mientras que el contador es menor que el ciclo de trabajo especificado, la salida es alta, de lo contrario la salida es baja.
Esto significa que si desea configurar el PWM para que tenga una frecuencia específica, puede usar la siguiente relación:
pwmFrequency in Hz = 19.2e6 Hz / pwmClock / pwmRange.
Si usa los valores máximos permitidos para pwmSetClock()
y pwmSetRange()
, terminará con la frecuencia PWM de hardware mínima alcanzable de ~ 1.14 Hz. Esto ciertamente dará un parpadeo visible (más de un flash, realmente) a un LED. Confirmé la ecuación anterior con un osciloscopio, y parece sostenerse. El límite superior de frecuencia se verá afectado por la resolución que necesita, como se describió anteriormente.
pwmWrite()
. No es algo que esperaría que suceda