¿Por qué puedo enviar señales PWM con todos los pines GPIO en la Raspberry Pi con un programa Python?

Puede crear sus propias señales PWM en el software, si lo desea. Contribuirá a la carga de la CPU, ya que la CPU decide cuándo subir y bajar el voltaje del pin de su elección, pero es factible. Sin embargo, a menos que esté ejecutando un sistema operativo en tiempo real, el tiempo entre los pulsos variará (“fluctuación”), y es posible que pueda lograr una resolución de tiempo para las subidas / caídas de pulsos de hasta 100 microsegundos más o menos. .

También existe la opción de dar a la CPU un solo comando que solo especifica el ciclo de trabajo y dejar que el hardware dedicado fuera de la CPU cree el PWM. La CPU ya no está involucrada en esos problemas de tiempo y puede pasar su tiempo trabajando en otras tareas. El hardware PWM es mucho más preciso cuando ocurren los flancos ascendentes / descendentes. Sin embargo, la frambuesa solo lleva un conjunto de ese hardware, y eso está conectado al pin 18 de GPIO.

La biblioteca “cableado” (enlace) parece admitir PWM en todos los pines GPIO: PWM basado en hardware si es posible, y software * de lo contrario.


* En realidad, parece estar usando DMA (acceso directo a memoria) de alguna manera en lugar de un simple bucle de software. Eso debería hacer que el PWM sea más preciso que si hiciera un bucle simple con “encender, esperar, apagar, esperar, …”, pero aún no es tan preciso como el PWM de hardware.

Se trata de la diferencia entre hardware PWM y software PWM. En el pin 18, puede usar PWM proporcionado por el chip, y casi no hay costo en la carga de la CPU. Si hace PWM en otros pines, debe hacerse a través de software (como pi-blaster o equivalente), y causa una carga de CPU no trivial, y puede haber otros efectos secundarios desafortunados, como las interrupciones que se pierden.

Hay complementos de hardware que le dan al Pi más canales PWM de hardware (Adafruit vende uno).

El motor DMA puede controlar 64 “pines” GPIO (no todos los 64 GPIO se ponen en pines en la Raspberry Pi) y tiene un jitter muy bajo. Una vez configurado, no requiere interacción de la CPU.

https://github.com/Wallacoloo/Ra … dice que el motor DMA puede sufrir muy poco por la contención del bus a 250Khz, si hay mucha comunicación en el mismo bus de memoria interna. 1 Mhz funciona si no está haciendo mucho tráfico de tarjeta SD y USB. No sé cómo maneja el sistema la contención del bus. Para algunas aplicaciones, el DMA fallido sería muy malo, otros usos pueden tolerar algunos errores.

Sin embargo, tenga en cuenta que esto fue escrito para la Raspberry Pi original. Los Pi 2 y 3 registran la GPU más rápido y, por lo tanto, tienen buses internos más rápidos. No sé la velocidad máxima para DMA en las partes más modernas.

El motor DMA puede sincronizarse desde varias fuentes. Si lo registra desde el reloj PWM, tendrá la misma fluctuación de fase que el sistema PWM.