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

De acuerdo con esto :

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

Sin embargo, según 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?

Respuestas (2)

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 solo temporizador que activa 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

Entonces, ¿esencialmente simula PWM? Entonces, ¿cuál es el punto de los pines digitales con canales PWM?
En general, los pulsos de servo tienen una duración de aproximadamente 1 ms. Por lo tanto, deben estar impulsados ​​por frecuencias de alrededor de 1 kHz, que es muy fácil de generar por software en cualquier salida con un micro que funcione a varios MHz. Las salidas AVR PWM son generadas por hardware dedicado y pueden alcanzar la frecuencia de la CPU, pero la cantidad de canales es limitada. 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.
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.
@ user41158 Si tiene un tiempo de CPU ilimitado, puede usar cualquier salida digital como PWM y controlarla 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 de PWM es bastante baja, por lo que es práctico hacer un bit-bang del PWM en el software para crear salidas adicionales.

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 controlarse mediante interrupciones de software. Las interrupciones de software desaparecen del código que está ejecutando y ejecuta 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 algo de tiempo de procesamiento pero gana la capacidad de manejar más servos.

¿Puedes explicar (o vincular a) más? ¿Cómo se usa el UART para PWM?
Creo que sería mejor decir que la biblioteca PWM puede usar los pines de E/S de UART si lo desea. la biblioteca PWM no usará el UART en sí, pero los pines que usa el UART también se pueden usar como E/S digital estándar si no es necesario para el UART.