¿Puedo usar el GPIO para la modulación de ancho de pulso (PWM)?

97

¿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?

berry120
fuente
Probablemente necesite especificar qué modelo está utilizando. Todos son ligeramente diferentes.
not2qubit
2
@ user1147688 ¡Se volvió a hacer esta pregunta cuando solo había un modelo!
berry120

Respuestas:

76

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.

¿Cuándo podría ser adecuado el software PWM?

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.

¿Cuándo podría ser adecuado el hardware PWM?

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.

¿Qué sucede si necesito más salidas PWM de hardware?

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.

Mark Booth
fuente
¿Puedo usar el enfoque de software PWM para ejecutar motores de CC?
Gedeón
@Gideon: Sí, los amplificadores de potencia del motor que he utilizado han tomado PWM como su entrada.
Mark Booth
2
Para su información, la biblioteca RPI ( pythonhosted.org/RPIO/pwm_py.html ) parece tener una resolución mucho mejor (1us) en comparación con WiringPi con una resolución de
100us
@ MarkBooth: sin problemas. La biblioteca está muy bien escrita y se puede usar como reemplazo directo para RPi.GPIO, lo cual es muy útil si comenzó un proyecto con este último y luego se dio cuenta de que se necesitaban señales PWM ...
dm76
Creo que RPIO.PWM ya no funciona para modelos pi más nuevos.
heather
39

Hardware PWM

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 ).

Código de ejemplo

Puede usar la biblioteca WiringPi para controlar el pin PWM; puede mirar el código para evitar incluir toda la biblioteca.

Software PWM

El Raspberry Pi no es adecuado para ningún software serio PWM ya que Linux no es un sistema operativo en tiempo real.

Alex Chamberlain
fuente
1
Pregunta, ¿cuál es la definición o un ejemplo de software serio PWM? ¿Y qué son los "sistemas operativos en tiempo real"? ¿Hay alguna posibilidad de obtener uno en un Pi
AnthonyBlake
@AnthonyBlake Bueno, probablemente puedas controlar el brillo de una luz usando el software PWM, pero sospecho que un motor se detendrá. Sin embargo, no es necesario hacer PWM de software, el hardware es más simple y más efectivo. Google explicará mejor los sistemas operativos en tiempo real; garantizan ciertas cosas sobre cuánto tiempo y con frecuencia se ejecuta el software.
Alex Chamberlain
2
@AnthonyBlake Un "SO en tiempo real" (RTOS) es un sistema operativo que le ofrece una garantía sobre el límite superior de tiempo de ejecución. Como decirle al programa "Sí, tendrá un tiempo de ejecución en 33 ms (más o menos tolerancia de 2 ms) para voltear ese bit pin GPIO para darle a su motor paso a paso una señal en el intervalo de tiempo exacto cuando lo necesite. Y puede confiar ¡en ese!" Hay un RT Linux por ahí. No sé si ha sido portado al RPi (todavía).
orithena
Lo siento Alex, no robé intencionalmente otra parte de tu respuesta, pero acabo de notar que llegamos a la misma publicación del foro a través de diferentes rutas.
Mark Booth
2
Los modelos más nuevos con 40 pines tienen un segundo PWM de hardware conectado a GPIO19 (pin 35).
Kevin
12

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.

joan
fuente
¡Buena respuesta! ¿Cómo puedo usar esos dos HW PWM? Necesito controlar 2 servos, sé que dices que servoblaster y pigpio están bien para eso, pero me pregunto sobre el HW PWM, porque no puedo encontrar nada sobre ellos ... ¿hay algunos documentos para eso? Tengo un RPi 2 V1.1 para pruebas.
Kozuch
2
La carga pesada de la CPU no debería hacer la diferencia. Una gran carga de red puede marcar la diferencia en gpioServo, especialmente si se toma una muestra a 1MHz en lugar de los 200kHz predeterminados. La frecuencia es 50 (Hz), el rango de ciclos de trabajo será 0 - 1000000 (asignado al verdadero valor subyacente de 0 - 5000000). 1 ms es 1 ms en 20 ms, por lo que un ciclo de trabajo del 5% para 50000, 1.5ms-> 7.5% -> 75000, 2ms-> 10% -> 100000.
Jan
1
La página 102 de BCM2835 ARM Peripherals muestra los diversos modos que se pueden asignar al GPIO. Mire en línea qué GPIO se dirige a los diversos encabezados de expansión del modelo Pi.
joan
1
@ user1147688 PLLD (500MHz) se utiliza como el reloj PWM central. Debido a la forma en que funciona, la frecuencia del núcleo PWM es de 250 MHz. Para poder encender y apagar (bastante esencial para PWM) el máximo es de 125 MHz. Puede duplicar las cifras usando PLLC (1000 MHz) pero ese PLL varía con la velocidad del reloj central.
joan
2

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.

John
fuente
Leí en alguna parte que también hay un límite de hardware en cuanto a la frecuencia de conmutación de un pin de salida. Creo que fue alrededor de 20 MHz. Por lo tanto, no espere poder extraer PWM de 300 MHz ni nada por el estilo, incluso con un uso del 100% de la CPU.
Ponkadoodle
@Wallacoloo: ¿Qué aplicaciones requieren 300 MHz PWM?
Peter Mortensen
2
@PeterMortensen: Bueno, no sé cómo los transmisores de radio y demás generan sus señales, pero algunos podrían hacerlo con PWM. PiFM hace eso a 100 MHz. Sin embargo, eso parece contradecir mi comentario, por lo que me pregunto si tal vez el pin todavía se puede ordenar a esa frecuencia, pero es solo que la capacitancia del pin atenúa tales señales, de modo que una onda cuadrada de 100 MHz podría oscilar, por ejemplo, desde (1.0 V , 2,3 V) en lugar del rango completo (0 V, 3,3 V).
Ponkadoodle
2

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)

Glantucan
fuente
He estado intentando esto pero hasta ahora no tuve suerte. Por lo que puedo decir, ¿en realidad no cambia el hardware?
MrMowgli
1
Solo quiero topar esto. Pi-blaster ha funcionado para mí donde estas otras respuestas no.
Seph Reed