¿Puedo usar el GPIO como salida de modulación de ancho de pulso ?
Si es así, ¿cómo lo haría y cuántas salidas PWM distintas y concurrentes puedo tener?
¿Puedo usar el GPIO como salida de modulación de ancho de pulso ?
Si es así, ¿cómo lo haría y cuántas salidas PWM distintas y concurrentes puedo tener?
Respuestas:
Como sugirió Alex Chamberlain , la biblioteca WiringPi parece admitir tanto la salida PWM de hardware en uno o dos pines GPIO según el modelo, como el PWM de software en cualquiera de los otros pines GPIO. Mientras tanto, la biblioteca RPIO.PWM hace PWM por DMA en cualquier pin GPIO. Efectivamente, este es un punto intermedio entre el hardware y el software PWM, que proporciona una resolución de temporización de 1 µs en comparación con 100 µs con el software PWM de WiringPi [1] .
Cuál de estos es adecuado para sus aplicaciones depende de cuántas salidas PWM necesita y qué rendimiento desea de esas salidas.
Si su aplicación tolera la baja resolución de tiempo y el alto jitter, entonces podría usar un software o un bucle de sincronización asistido por DMA. Si desea mayor precisión / menor fluctuación de fase PWM, es posible que necesite asistencia de hardware.
Si desea flashear un montón de LED con diferentes cadencias visibles para humanos (10 hertzios) con requisitos suaves de respuesta en tiempo real, entonces el bucle de software podría manejar tantos PWM como pines GPIO.
Si desea controlar un servomotor con requisitos de respuesta en tiempo real, deberá utilizar hardware PWM. Incluso entonces puede tener problemas para garantizar una respuesta en tiempo real para el servo loop que vincula la entrada del codificador a la salida PWM.
Un servo loop estable necesita leer codificadores a una velocidad regular (jitter bajo), escribir valores de salida PWM revisados a una velocidad regular y la latencia entre estos debe ser fija (jitter bajo en general). Si no puede hacer esto, entonces tendrá que afinar (sintonizar suavemente) su motor para evitar que se vuelva inestable bajo carga. Esto es difícil de hacer con un sistema operativo multitarea sin soporte de bajo nivel.
Si necesita ejecutar más servo loops de los que tiene salidas PWM de hardware, entonces probablemente tendrá que descargarlos a otro dispositivo para garantizar un rendimiento en tiempo real, relegando su Raspberry Pi a un supervisor en tiempo real .
Una opción, sería algo como el controlador de servo PWM / 12 canales de 16 bits Adafruit - interfaz I²C - PCA9685 que le permitiría controlar 16 salidas PWM con solo unos pines de GPIO para el bus I²C. Para ver un ejemplo de su uso, consulte el I²C 16 Channel PWM / Servo Breakout - Publicación de trabajo en los foros de Raspberry Pi.
1. Gracias a dm76 por la sugerencia, sin embargo, Heather dice que RPIO.PWM ya no funciona para los nuevos modelos pi.
Sí, hay una salida PWM de hardware en la Raspberry Pi, conectada a P1-12 (GPIO18). Además, las salidas PWM podrían agregarse utilizando una interfaz I²C o SPI ; Algunas personas han tenido éxito con esto ( publicación en el foro ).
Puede usar la biblioteca WiringPi para controlar el pin PWM; puede mirar el código para evitar incluir toda la biblioteca.
El Raspberry Pi no es adecuado para ningún software serio PWM ya que Linux no es un sistema operativo en tiempo real.
Pis reciente tiene dos canales PWM de hardware. Además, los pulsos PWM temporizados por hardware pueden generarse independientemente en todos los GPIO conectados al encabezado de expansión de 40 pines.
En la práctica, esto significa que hay dos canales PWM de alta precisión y todos los demás GPIO pueden tener PWM estilo Arduino (800 Hz, 0 apagado - 255 completamente encendido).
Por ejemplo, servoblaster y mi pigpio , etc.
No es un sistema operativo en tiempo real, pero el sistema operativo RISC para Raspberry Pi es multitarea cooperativa, por lo que puede ejecutar fácilmente una aplicación que tiene un 100% de CPU para que pueda administrar sus tiempos mucho mejor. Simplemente no esperes hacer nada más que tu propio código.
He encontrado esta biblioteca ( pi-blaster ) que dice ser "extremadamente eficiente: no usa la CPU y da pulsos muy estables".
Todavía no lo he probado, pero lo actualizaré tan pronto como lo haga (probablemente hoy)