banner
Centro de Noticias
Servicio excepcional

ESP32 en MicroPython: PWM y el ciclo de trabajo

Oct 02, 2023

El hardware PWM disponible en el ESP32 es un poco más complicado de lo que cabría esperar y algunas cosas podrían lograrse mejor utilizando el RMT. Este extracto es deProgramando el ESP32 en MicroPython,parte de la biblioteca del programador I y le muestra cómo usar el hardware PWM.

Compra en Amazon.

Prefacio

El ESP32 tiene dos implementaciones de hardware PWM. Uno está diseñado para usarse en el control de motores y tiene características adicionales como una zona muerta y frenado automático. Esto no es compatible con MicroPython y si desea utilizarlo, debe pasar a C. El segundo, LEDC, está diseñado específicamente para controlar LED con funciones como atenuación automática y características más exóticas. Si bien MicroPython admite las operaciones LEDC básicas, no proporciona acceso a todas sus funciones adicionales.

Se puede asignar un generador PWM a cualquier pin GPIO. La cantidad de generadores PWM que tiene un ESP32 depende de su modelo exacto. Vienen en dos grupos: rápidos y lentos. El tipo rápido tiene funciones de atenuación automática y puede cambiar suavemente la frecuencia y el ciclo de trabajo. El tipo lento carece de estas características y depende del software cambiar su frecuencia y ciclo de trabajo. Cada grupo también tiene un número determinado de temporizadores que determinan cuántas frecuencias diferentes se pueden generar y un número determinado de canales.

La placa de desarrollo más común que utiliza un EP32 tiene dos grupos, uno rápido y otro lento, de PWM con ocho canales en cada grupo. El ESP32-S2 sólo tiene un grupo rápido, pero por lo demás es idéntico. El ESP32-C3, basado en RISC, es igual que el ESP32-S2, pero con sólo seis canales. Todos los dispositivos ESP32 tienen cuatro temporizadores en cada grupo, lo que significa que puedes configurar cuatro frecuencias diferentes.

La distinción entre los dos grupos es irrelevante desde el punto de vista de MicroPython, ya que no utiliza las funciones adicionales del grupo rápido. Lo que esto significa es que, desde el punto de vista de MicroPython, un ESP32 tiene 16 canales PWM que pueden funcionar en ocho frecuencias diferentes. Todos los canales pueden funcionar en diferentes ciclos de trabajo.

No es necesario que sepas cómo funciona el hardware PWM, pero te ayudará a comprender algunas de las restricciones.

Para crear un objeto PWM tienes que pasarle a su constructor un objeto Pin. Por ejemplo:

Crea un objeto PWM asociado con GPIO4. Puede configurar la frecuencia usando:

que establece la frecuencia en Hz. El hardware PWM no está habilitado en este momento. Para que comience a generar una señal, debe configurar el ciclo de trabajo. Esto se hace usando:

donde el derecho es un valor comprendido entre 0 y 65.535, correspondiente al 0 y el 100%.

También hay:

que establece el tiempo en que la línea está alta en nanosegundos. Esto no es tan útil para uso general y si especifica un tiempo mayor que el período establecido, generará una excepción.

Alternativamente, puedes usar el constructor para especificar todas las características del PWM:

Al momento de escribir este artículo, hay un error en MicroPython 1.19 que hace que el ciclo de trabajo se configure incorrectamente si la frecuencia se configura usando freq(). Una solución es utilizar siempre el constructor para establecer una frecuencia inicial.

La implementación MicroPython de PWM asigna temporizadores a los canales de forma inteligente. Si crea un objeto PWM que funciona a una frecuencia particular, primero mira si hay un temporizador en el mismo grupo funcionando a esa frecuencia. Si lo hay, lo asigna al objeto PWM. Si no hay un temporizador que funcione en esa frecuencia, se asigna uno libre y se configura para que funcione en la nueva frecuencia. Si no quedan temporizadores libres y ninguno se ejecuta con la frecuencia requerida, se genera una excepción. Lo que esto significa es que puedes asignar frecuencias sin preocuparte hasta que hayas agotado todos los temporizadores y luego tendrás que configurar las frecuencias que ya has utilizado. Esto significa que para un ESP32 puedes configurar hasta ocho frecuencias diferentes para los 16 canales diferentes.

Puede crear fácilmente sus propios métodos de ciclo de trabajo que funcionen en términos de porcentajes o de cualquier forma que desee especificar el ciclo de trabajo. Por ejemplo, puede crear una nueva clase que tenga un ciclo de trabajo establecido como porcentaje:

En este caso, el porcentaje se especifica multiplicado por 10. Por ejemplo, para establecer un ciclo de trabajo del 50%, usaría:

Una vez que haya configurado el ciclo de trabajo, el generador PWM comienza a emitir la señal PWM especificada en el pin. Tenga en cuenta que esto funciona incluso después de que se haya completado el programa. Para detener el uso de la señal PWM:

Puede cambiar la frecuencia o el ciclo de trabajo en cualquier momento. Por ejemplo:

produce una señal PWM en GPIO4 y GPIO16 a la misma frecuencia de 250 Hz y 500 Hz y ciclos de trabajo del 50% y 25% respectivamente. Puede ver el resultado en esta pantalla del analizador lógico:

Puede ver en este rastro que los pulsos en cada línea comienzan su ciclo de trabajo exactamente al mismo tiempo.

Programando el ESP32 en MicroPython,Programaciónel ESP32PrefacioEl ESP32 – Antes de comenzarEmpezandoComenzando con el GPIOSalida sencillaAlgo de electrónicaEntrada sencillaEntrada avanzada: interrupcionesExtracto de modulación de ancho de pulso:***¡NUEVO!***¡NUEVO!Control de motores y servosPrimeros pasos con el bus SPIUsando sensores analógicosUsando el extracto del bus I2CProtocolos de un solo cableEl puerto serieUsando extracto de WiFi:EnchufesAsyncio y servidoresDirecto al extracto de hardware: Al momento de escribir este artículo, hay un error en MicroPython 1.19 que hace que el ciclo de trabajo se configure incorrectamente si la frecuencia se configura usando freq(). Una solución es utilizar siempre el constructor para establecer una frecuencia inicial.