Estoy usando la salida PWM de hardware con cableadopi. Proporciona la función pwmSetClock que debería permitir cambiar la frecuencia. ( https://projects.drogon.net/raspberry-pi/wiringpi/functions/ ). Creo que dado que el valor predeterminado es 200 Mhz, configurar el divisor en 200000000 debería hacer que un LED conectado a la salida parpadee visiblemente, pero ese no es el caso.
¿Se puede cambiar esto?
pwmWrite()
. No es algo que esperaría que sucedaRespuestas:
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:
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()
ypwmSetRange()
. Como se señaló en una de las otras respuestas, el rango válido parapwmSetClock()
parece ir de 2 a 4095, mientras que el rango válidopwmSetRange()
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:
Si usa los valores máximos permitidos para
pwmSetClock()
ypwmSetRange()
, 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.fuente
De acuerdo con esta fórmula:
Podemos configurar
pwmClock=1920
ypwmRange=200
obtenerpwmFrequency=50Hz
:Lo pruebo en alarmpi:
Nota: Mi servo espera una señal de 50Hz .
fuente
Este es el código que estoy usando. Estoy tratando de ver qué cambiará a medida que cambie la configuración.
Por lo que probé, parece que el divisor va de 2 a un número menor que 5000. Supongo que tiene algo que ver con la representación binaria de esos números que se establecen directamente en el registro. Una vez que la representación binaria de los números tiene más bits de los que el registro puede tomar, solo toma los primeros bits e interpreta los números de esa manera. Es por eso que el comportamiento extraño se produce al pasar de 4000 a 5000.
fuente