¿Cómo puede el Arduino Uno admitir hasta 12 servos si solo tiene 6 pines PWM digitales?

10

De acuerdo a esto :

La biblioteca Servo admite hasta 12 motores en la mayoría de las placas Arduino y 48 en el Arduino Mega. En placas que no sean Mega, el uso de la biblioteca deshabilita la funcionalidad analogWrite () (PWM) en los pines 9 y 10, ya sea que haya o no un Servo en esos pines. En el Mega, se pueden usar hasta 12 servos sin interferir con la funcionalidad PWM; El uso de 12 a 23 motores deshabilitará PWM en los pines 11 y 12.

Sin embargo, de acuerdo con esto :

Pines de E / S digital 14 (de los cuales 6 proporcionan salida PWM)

Entonces, ¿cómo puede el Uno controlar más de 6 servos si solo tiene 6 pines de E / S digitales que pueden proporcionar salida PWM?

usuario41158
fuente

Respuestas:

8

La biblioteca Servo no usa PWM. Cuando llama a write () , calcula un ancho de pulso en microsegundos y lo almacena en una matriz global. Luego hay un temporizador único que dispara regularmente una interrupción que cambia las señales de salida de acuerdo con el ancho de pulso deseado de cada canal.

Puede encontrar el código fuente a continuación: enlace de Github

Grapsus
fuente
1
Entonces, ¿esencialmente simula PWM? ¿Cuál es el punto de los pines digitales con canales PWM entonces?
user41158
2
En general, los servopulsos tienen aproximadamente 1 ms de longitud. Por lo tanto, deben ser controlados por frecuencias de alrededor de 1 kHz, lo cual es muy fácil de generar por software en cualquier salida con un micro funcionando a varios MHz. Las salidas AVR PWM son generadas por un hardware dedicado y pueden alcanzar la frecuencia de la CPU, pero el número de canales es limitado. Supongo que los autores del módulo Servo decidieron usar un solo temporizador para manejar tantos canales como pines y guardar el hardware PWM para otros usos.
Grapsus
1
El PWM de las salidas Arduino es para salidas de potencia variable con ciclos de trabajo entre 0 y 100%. El control "PWM" de estilo RC tiene un rango de ciclo de trabajo muy limitado: 1000 us a 50 Hz es 5%, 2000 us a 50 Hz es 10%. Piense en RC PWM como un "tren de pulsos" en lugar de un "PWM" tradicional.
Jon Watte
@ user41158 Si tiene un tiempo de CPU ilimitado, puede usar cualquier salida digital como PWM y controlarlas en el software, no solo PWM, en teoría puede crear cualquier sistema de comunicación digital escribiendo un programa y alternando estas salidas, se llama " bit- golpeando ". Pero en la práctica, el tiempo de CPU no es ilimitado y es mejor resolver las tareas de hardware por hardware. Para el control de servo, la frecuencia PWM es bastante baja, por lo que es práctico golpear el PWM en el software para crear salidas adicionales.
盖子
2

Los 6 pines PWM usan el UART incorporado en el ATmega328P para producir su salida. Esto hace que los pulsos sean muy rápidos para una salida "analógica" de mayor calidad. Debido a que los servos se comunican a una velocidad lo suficientemente lenta, pueden manejarse mediante interrupciones de software. Las interrupciones de software desaparecen del código que está ejecutando y ejecutan el código incluido con la biblioteca de servos. Este código utiliza medios estándar para cambiar el estado de los pines. Al hacerlo usando interrupciones en lugar de usar el UART, pierde tiempo de procesamiento pero gana la capacidad de conducir más servos.

John Dood
fuente
¿Puedes explicar (o vincular a) más? ¿Cómo se usa el UART para PWM?
Martin Thompson
Creo que sería mejor decir que la biblioteca PWM puede usar los pines de E / S UART si lo desea. la biblioteca PWM no usará el UART en sí, pero los pines utilizados por el UART también se pueden usar como E / S digitales estándar si no se requieren para el UART.
Peter Bennett