Simulación Arduino PWM pin vs pin digital PWM

¿Lo entiendo correctamente de este hilo? ¿ Por qué algunos pines tienen signos `~` junto a sus números? , que los pines PWM generan una señal de onda cuadrada independientemente de lo que hace el código cargado en el chip después de iniciar la salida PWM? En otras palabras, si mi código contiene todo tipo de delay()funciones que hacen una pausa más larga que el período de la señal PWM, la señal PWM aún se generará correctamente, ¿correcto?

Por otro lado, si decidiera implementar mi propio PWM en un pin digital cambiando el estado entre ALTO y BAJO en mi código a intervalos regulares, la presencia de otras llamadas en otras partes delay()del código afectaría directamente mi capacidad de generar la señal PWM consistente deseada. ¿Es esto correcto? Espero que esta pregunta tenga sentido (un poco difícil de hacer la pregunta).

Respuestas (1)

Entendiste bien. Los pines con el símbolo de tilde (~) son pines que están vinculados a un módulo PWM de hardware (es decir, un temporizador). Dado que es un módulo de hardware, es independiente de lo que haga su CPU. Como tal, si está atascado en un retraso, su PWM de hardware seguirá generando la señal de salida adecuada. Por otro lado, un PWM de software (uno que generaría con un cambio de pin manual) sería interrumpido por su retraso.

La mayoría de las veces, debería preferir hardware PWM sobre software PWM por muchas razones:

  1. Es más confiable;
  2. Consume menos energía (podría dormir su MCU mientras sigue generando PWM);
  3. Le permite hacer otra cosa en lugar de dar servicio a la conmutación;
  4. Permite frecuencias más grandes, porque normalmente puede obtener frecuencias hasta la frecuencia operativa de su MCU, mientras que una emulación de software implica algunas operaciones, por lo que no puede mantenerse al día;
  5. Es más preciso: el hardware PWM es simplemente un divisor en la frecuencia operativa de su MCU, mientras que el software PWM usa instrucciones de CPU, que requieren ramificación. Dado que es un código compilado, es más o menos determinista, por lo que su ciclo de trabajo no sería exactamente el que espera (cercano, pero no perfecto ni estable si está haciendo otra cosa al mismo tiempo).
Tengo una pregunta de seguimiento. Si usé registros para voltear el puerto digital ALTO y BAJO, como PORTB = 0b00000001;, ¿eso también pasará por la CPU como si estuviera usando digitalWrite (1, ALTO) o sería tan eficiente como usar el puerto PWM? Supongo que también es ineficiente, ¿verdad?
¡Esto en realidad está usando la CPU! Cuando usa bibliotecas integradas de la pila de Arduino, está usando registros para alternar las E/S. Las bibliotecas sólo os abstraen de este hecho. Esta es exactamente la razón por la cual las bibliotecas de Arduino (y en su mayoría cualquier capa de abstracción de hardware de alto nivel) son mucho más lentas que alternar los GPIO usando tales asignaciones. Cuando lea la hoja de datos, si siente que poner la MCU en modo de suspensión le impediría hacerlo, entonces es muy probable que esté relacionado con la CPU. Temporizadores y DMA (en otras MCU) incluso cuando la CPU está en modo de suspensión. Espero que esto te ayude.
Tiene sentido. ¡Aprendí cosas importantes de ti! ¡Gracias!