MicroPython – Gerando PWM em ESP8266 e ESP32

MicroPython: generación de PWM en ESP8266 y ESP32

La modulación de ancho de pulso (PWM) es una de las cinco funcionalidades básicas de cualquier microcontrolador. Los otros cuatro son entrada digital, salida digital, entrada analógica y comunicación de datos en serie. La mayoría de los microcontroladores no tienen un convertidor digital a analógico incorporado para generar señales analógicas. Sin embargo, la mayoría de los microcontroladores tienen una o más interfaces de salida PWM. Las señales PWM son señales rectangulares periódicas con duración de pulso de encendido y apagado programable. Con un ancho de pulso modulado, estas señales pueden aproximarse a la verdadera salida analógica. Las señales PWM no están diseñadas para la comunicación de datos analógicos, el suministro de energía eléctrica ni el funcionamiento con circuitos analógicos. Sin embargo, estas señales son muy útiles para proporcionar potencia de salida a componentes externos como luces LED y parlantes. Estas señales también se pueden utilizar como señales de control para actuadores como servomotores.

Las señales PWM se utilizan para controlar dispositivos en lugar de suministrarles energía. La potencia de salida de un microcontrolador GPIO es demasiado pequeña para accionar prácticamente cualquier actuador o dispositivo. Por ejemplo, la corriente máxima que las placas ESP32 y ESP8266 pueden absorber o suministrar es de sólo 40 mA y el voltaje de funcionamiento es de sólo 3,3V. Se requieren circuitos amplificadores de potencia externos para controlar componentes como parlantes y timbres con señales PWM.

¿Qué es la modulación de ancho de pulso?
La modulación de ancho de pulso cambia la potencia promedio entregada por una señal dividiendo la señal de onda cuadrada en partes discretas. No es una señal continua real. En cambio, la duración de ENCENDIDO y APAGADO de una señal digital periódica se modula para reducir el voltaje/potencia de salida efectiva. Por ejemplo, si el GPIO de un microcontrolador genera 3,3 V en la salida digital mientras genera una señal PWM al 50% del ciclo de trabajo del pin, producirá un voltaje efectivo de aproximadamente 1,65 V, es decir, 3,3/dos.

PWM vs. salida analógica
Las señales PWM no son verdaderas señales analógicas. Las verdaderas señales analógicas son continuas y pueden tener cualquier valor fluctuante. Las señales PWM se generan dividiendo la duración de salida de las señales digitales por valores discretos. Por lo tanto, las señales PWM pueden acercarse a las salidas analógicas esperadas, pero nunca pueden tener valores fluctuantes similares. Qué tan cerca puede acercarse una señal PWM a un valor de punto flotante depende de su resolución. Por ejemplo, ESP8266 tiene una resolución PWM de 10 bits con un voltaje de funcionamiento en su GPIO de 3,3 V. Así, los voltajes que puede aproximar el controlador ESP8266 PWM serán en pasos de 3,3/1023 V o 3,22 mV.

Además, tenga en cuenta que las señales PWM son señales periódicas. No pueden aproximarse a señales continuas no periódicas; Aunque son señales periódicas, las señales PWM no pueden aproximarse con precisión a todas las frecuencias. Qué tan cerca puede coincidir una señal PWM con una frecuencia de salida depende de la frecuencia base del microcontrolador y de la resolución PWM. Por ejemplo, la frecuencia base en ESP32 puede oscilar entre 1 Hz y 40 MHz, y la resolución PWM se puede configurar entre 1 y 16 bits. Déjelo establecido en 10 bits. Supongamos que desea emitir una frecuencia de 300 KHz. Si la frecuencia base se establece en 40 MHz, el divisor necesario para generar la frecuencia de 300 KHz será 40.000.000/300.000, es decir, 133,33. Si utilizamos 133 como divisor, la frecuencia real de la señal que obtenemos es 40.000.000/133, es decir, 300.751 Hz. Esto no son precisamente 300 KHz.

Además, tenga en cuenta que la salida PWM depende en gran medida del comportamiento específico del microcontrolador/puerta específico. Por ejemplo, las placas Arduino utilizan un reloj de hardware dedicado para generar señales PWM. Las placas ESP utilizan temporizadores e interrupciones para la generación de PWM, comenzando con una frecuencia base teórica de 80 MHz. El controlador PWM en el ESP32 consta de dos submódulos: Control LED (LEDC) y Modulador de ancho de pulso de control del motor (MCPWM). En MicroPython, el marco de desarrollo de IoT (IDF) de Expressif se utiliza como kit de desarrollo de software. El kit utiliza la misma API para la implementación de PWM en ESP8266 y ESP32. En ESP32, el firmware MicroPython utiliza un periférico LEDC para la generación de PWM. Las frecuencias mínima y máxima del Arduino dependen únicamente de la frecuencia del reloj base y la resolución PWM. Pero en el caso de las placas ESP, depende no sólo de la implementación del hardware, como las frecuencias base admitidas en Expressif IDF, sino también de la implementación del software en el firmware MicroPython. Discutiremos esto en detalle más adelante en este artículo.

Biblioteca de máquinas MicroPython
El módulo de la máquina gestiona muchas funciones relacionadas con el hardware en MicroPython. Este módulo consta de varias clases escritas para controlar entrada/salida digital, controlar señales de salida de dispositivos externos, modulación de ancho de pulso, conversión analógica a digital, control de ADC, UART, SPI, I2C, I2S, periféricos de temporizador, RTC, temporizador de vigilancia. y administrar la tarjeta SD. El controlador PWM es gestionado por el módulo de máquina de clase PWM.

Clase MicroPython PWM
La clase PWM se escribió para proporcionar modulación de ancho de pulso en placas compatibles con MicroPython. Esta clase se puede importar a un script MicroPython siguiendo las siguientes instrucciones.
Importación de máquina PWM

Después de la importación, se debe crear una instancia de un objeto desde la clase PWM. Para ello, se proporciona el método machine.PWM. Este método tiene la siguiente sintaxis.
clase machine.PWM (objetivo, *, frecuencia, duty_u16, duty_ns)

Esta construcción devuelve un objeto PWM. El parámetro de destino es el pin PWM en el que se debe generar la salida PWM. Esto se puede especificar mediante un identificador específico de puerto que puede ser un número entero, una cadena o una tupla según el puerto específico. La frecuencia , duty_u16 y duty_ns son parámetros opcionales. El parámetro de frecuencia es la frecuencia en Hz para el ciclo PWM. El parámetro duty_u16 especifica el ciclo de trabajo como relación duty_cycle/65535. El parámetro duty_ns especifica la duración del pulso en nanosegundos. Si se especifica la frecuencia, solo se debe proporcionar duty_u16 o solo duty_ns. Algunos de los ejemplos válidos de creación de instancias de objetos PWM son los siguientes.
pwm0 = máquina.PWM(Pin(0))
pwm0 = PWM(Pin(0))
pwm0 = PWM(Pin(0), 5000)
pwm0 = PWM(Pin(0), 5000, 2**16*1//2) //50% del ciclo de trabajo
pwm0 = PWM(Pin(0), 5000, 250_000)

La clase incluye los siguientes métodos para configurar la salida PWM.

PWM.freq : este método se utiliza para obtener o configurar la frecuencia actual de la salida PWM. Si se llama sin argumentos, devuelve la frecuencia en Hz. Se puede pasar un único argumento entero a la llamada al método para establecer la frecuencia en Hz. El rango de frecuencia aceptable depende del microcontrolador/puerta específico.

PWM.duty : este método obtiene o establece el ciclo de trabajo como relación duty_cycle/1023. Si se llama sin argumentos, devuelve el ciclo de trabajo como un valor entero sin signo entre 0 y 1023. Se debe pasar un argumento entero sin signo con un valor de 0 a 1023 para establecer el ciclo de trabajo. Por ejemplo, pwm0.duty(512) establece el ciclo de trabajo del objeto PWM pwm0 en 50%.

PWM.duty_u16 : este método obtiene o establece el ciclo de trabajo como un valor sin signo de 16 bits en el rango de 0 a 65535. Si se llama sin argumentos, devuelve el ciclo de trabajo como un número sin signo de 16 bits entre 0 y 65535. Se debe pasar un argumento largo con un valor de 0 a 65535 para definir el ciclo de trabajo.

PWM.duty_ns : este método establece u obtiene el ancho de pulso actual de la salida PWM en nanosegundos. Cuando se llama sin argumentos, devuelve el ancho del pulso en nanosegundos. Se debe pasar un valor en el rango de 0 a 1000.000.000 para establecer el ancho del pulso.

PWM.init(*, frecuencia, duty_u16, duty_ns) : modifica los ajustes de configuración del objeto PWM una vez que el objeto ya se ha construido. Acepta los mismos parámetros que el objeto constructor, excepto el pin PWM.

PWM.deinit : este método desactiva el objeto PWM.

Vale la pena señalar que la frecuencia y la resolución del ciclo de trabajo son interdependientes. Cuanto mayor sea la frecuencia, menor será la resolución del ciclo de trabajo disponible.

PWM en ESP8266
ESP8266 tiene cuatro interfaces de salida PWM dedicadas. Estas interfaces PWM se enumeran a continuación.

MicroPython le permite especificar un rango de frecuencia de 1 Hz a 1 KHz y una resolución PWM de 10 bits para ESP8266. En MicroPython, se pueden realizar hasta 8 salidas PWM en el ESP8266. Eche un vistazo a la siguiente captura de pantalla de esppwm.c en el firmware MicroPython. En ESP8266 también es posible implementar PWM por software. Esto implica el uso de interrupciones de temporizador. El software PWM en el ESP8266 puede tener una resolución de hasta 44 nanosegundos. El rango de frecuencia PWM se puede ajustar desde 1 microsegundo hasta 10.000 microsegundos, es decir, 100 Hz a 1 KHz. El software PWM en el ESP8266 permite una resolución de ciclo de trabajo de 14 bits a una frecuencia de 1 KHz. En ESP8266, PWM se puede generar en todos los GPIO excepto GPIO16.

Módulo MicroPython PWM para ESP32

Captura de pantalla del módulo MicroPython PWM para el puerto ESP8266

Para ESP8266, se puede crear una instancia del objeto PWM utilizando el constructor machine.PWM. Tenga en cuenta que los parámetros duty_u16 o duty_ns no son aceptables para el puerto ESP8266. La frecuencia PWM se puede configurar u obtener utilizando el método PWM.freq. El valor aceptable para configurar la frecuencia está entre 1 y 1000. El ciclo de trabajo PWM se puede configurar u obtener utilizando el método PWM.duty. El método acepta un valor de 10 bits como parámetro y define la frecuencia como relación duty_cycle/1023. Tenga en cuenta que no puede usar duty_u16 o duty_ns para configurar u obtener el ciclo de trabajo del ESP8266 ya que la placa solo permite una resolución PWM de 10 bits. Un objeto PWM se puede desactivar llamando al método PWM.deinit.

PWM en ESP32
El controlador PWM en ESP32 consta de dos submódulos diferentes: control LED (LEDC) y modulador de ancho de pulso de control del motor (MCPWM). El firmware MicroPython solo utiliza el módulo LEDC para la generación de PWM. Esto es evidente en la siguiente captura de pantalla de ports/esp32/machine_pwm.c en el firmware MicroPython.

Módulo MicroPython PWM para ESP8266

Captura de pantalla del módulo MicroPython PWM para el puerto ESP8266

Hay 16 canales PWM independientes en ESP32. Estos canales se dividen en dos grupos: un grupo de ocho canales de alta velocidad y otro grupo de 8 canales de baja velocidad. Los canales PWM se pueden multiplexar a cualquier GPIO excepto a los pines de solo entrada, es decir, GPIO34~39. Para cada grupo, hay cuatro temporizadores por ocho canales. Esto significa que cada temporizador está acoplado a dos canales PWM. Por lo tanto, sólo se pueden generar ocho frecuencias PWM diferentes a la vez a partir de 16 canales PWM. Sin embargo, es posible tener diferentes ciclos de trabajo en los 16 canales PWM. MicroPython le permite utilizar software PW para generar una frecuencia PWM diferente a partir de 8 canales PWM.

El módulo LEDC del controlador ESP32 PWM puede usar uno de los tres relojes de origen diferentes que se enumeran a continuación.

El firmware MicroPython utiliza sólo dos fuentes de reloj APB_CLK y REF_TICK. Si la frecuencia de un objeto PWM se establece por debajo de 10 Hz, el firmware utiliza REF_CLK; de lo contrario, se utilizará APB_CLK como fuente de reloj. Eche un vistazo a la siguiente captura de pantalla de ports/esp32/machine_pwm.c en el firmware MicroPython.

La frecuencia PWM también está limitada por la resolución del ciclo de trabajo además de la fuente del reloj. Tanto la frecuencia PWM como la resolución del ciclo de trabajo son inversamente proporcionales. Cuanto mayor sea la frecuencia, menor será la resolución del ciclo de trabajo disponible.

Finalmente, la resolución PWM y la resolución del ciclo de trabajo también están limitadas por la implementación PWM de MicroPython. Mientras que el reloj base APB_CLK utilizado por IDF de Expressif utiliza una frecuencia teórica de 80 MHz, la frecuencia PWM máxima establecida para ESP32 es 40 MHz con una resolución de ciclo de trabajo de 1 bit. Esto significa que se puede generar una señal PWM de 40 MHz con un ciclo de trabajo del 50% o 100%. La frecuencia PWM máxima que se puede generar con una resolución de 8 bits es 312,5 KHz. La frecuencia PWM máxima que se puede generar con una resolución de 10 bits es 78,125 KHz.

Para ESP32, MicroPython permite especificar la frecuencia PWM de 1 KHz a 40 MHz. La resolución del ciclo de trabajo puede ser de 1 bit a 16 bits. Para evitar errores en la generación de PWM, primero determine la resolución del ciclo de trabajo deseada. Cuanto mayor sea la resolución del ciclo de trabajo, más precisamente se podrán controlar los niveles de tensión de salida. Después de configurar la resolución del ciclo de trabajo, puede calcular la frecuencia PWM más alta posible utilizando la siguiente ecuación.
Max_PWM_freq = 80.000.000/2 ^ Bit de resolución del ciclo de trabajo

Por ejemplo, si requerimos una resolución de ciclo de trabajo de 13 bits, la frecuencia máxima de PWM será la siguiente.
Frec_PWM_max = 80.000.000/2^13
= 9,765 kHz

Para ESP32, se puede crear una instancia del objeto PWM utilizando el constructor machine.PWM . El ciclo de trabajo se puede configurar mediante los métodos PWM.duty , PWM.duty_u16 o PWM.duty_ns . La frecuencia PWM se puede configurar utilizando el método PWM.freq . La configuración de PWM se puede cambiar llamando al método PWM.init . Los cambios en la configuración de PWM se realizan sin interrupciones de la CPU. El objeto PWM se puede desactivar llamando al método PWM.deinit .

Tenga en cuenta que algunas placas ESP32 tienen menos canales PWM. La siguiente tabla enumera los canales PWM y sus especificaciones para diferentes placas ESP32.

Aplicaciones PWM
Las señales PWM se utilizan para diversas aplicaciones, como atenuar LED, atenuar luces, controlar la dirección de un servomotor, activar zumbadores, controlar la velocidad de motores de CC, generar señales de audio desde parlantes, codificar mensajes para dispositivos de comunicación analógicos y producir señales analógicas. voltajes. La siguiente tabla enumera algunas de las frecuencias PWM y la resolución del ciclo de trabajo recomendadas para muchas aplicaciones comunes.

LED descolorido en ESP8266 usando firmware MicroPython
El desvanecimiento de las luces LED es una de las aplicaciones típicas de las señales PWM. El desvanecimiento del LED se utiliza a menudo para monitorear la salida PWM de un microcontrolador. En este artículo, usaremos MicroPython para atenuar el LED en ESP8266.

Componentes necesarios

  1. ESP8266x1
  2. 1 LED de 5 mm.
  3. Resistencia de 330Ω x1
  4. placa de pruebas x1
  5. Cables de conexión/cables de puente

Conexiones de circuito
Conecte el ánodo del LED al GPIO14 del ESP8266 y su cátodo a tierra a través de una resistencia en serie de 330 ohmios. De esta manera, el LED se conecta al ESP32/ESP8266 de tal manera que se ilumina cuando la fuente GPIO suministra corriente al LED y permanece apagado hasta que el GPIO esté en lógica BAJA.

Tenga en cuenta que el firmware MicroPython ya debe estar cargado en el ESP8266. Obtenga más información sobre cómo cargar firmware MicroPython en ESP8266 y ESP32.

Circuito de atenuación LED MicroPython PWM para ESP8266

Diagrama de circuito para atenuación de LED con ESP8266 usando el módulo MicroPython PWM

Secuencia de comandos MicroPython
Importación de máquina de pines, PWM
del tiempo importa dormir
frecuencia = 1000
led = PWM (Pin (14), frecuencia)
mientras que Verdadero:
para duty_cycle en el rango (0, 1024):
led.duty(ciclo_deber)
dormir (0.005)

Como funciona
El LED está conectado al ESP8266 para que se ilumine cuando la placa le suministra corriente. El ESP8266 proporciona una salida PWM para el LED. La frecuencia PWM está configurada en 1 KHz, que es la frecuencia más alta disponible para ESP8266. El ciclo de trabajo se puede ajustar con una resolución de 10 bits. Por lo tanto, el ciclo de trabajo aumenta de 0 a 1023 en intervalos de cinco milisegundos. Esto proporciona un efecto de aparición y desaparición gradual durante cinco segundos.

Código
El código comienza importando las clases Pin y PWM de la máquina y las clases de suspensión de los módulos de sincronización. La frecuencia se almacena en una variable de 1000. Se crea una instancia de un objeto PWM llamando al método PWM. En un bucle while infinito, el ciclo de trabajo se cambia de 0 a 1023 y se aplica llamando al método PWM.duty durante intervalos de 5 milisegundos.

Resultados

Conteúdo Relacionado

ESP32-CAM es un módulo de cámara compacto que combina...
En cada vehículo hay una red de sensores integrada...
El controlador del motor es uno de los componentes...
La evolución de los estándares USB ha sido fundamental...
SCHURTER anuncia una mejora de su popular serie SWZ...
Visual Communications Company (VCC) ha anunciado sus nuevos tubos...
A Sealevel Systems anuncia o lançamento da Interface Serial...
A STMicroelectronics introduziu Diodos retificadores Schottky de trincheira de...
Determinar uma localização precisa é necessário em várias indústrias...
O novo VIPerGaN50 da STMicroelectronics simplifica a construção de...
A Samsung Electronics, fornecedora de tecnologia de memória avançada,...
O mercado embarcado tem uma necessidade de soluções de...
Probablemente se haya encontrado con el término " resistencia...
Probablemente tenga un aislante de soporte si ha notado...
Probablemente haya visto un aislante colocado en postes de...
Probablemente hayas visto aisladores de grillete entronizados en postes...
Probablemente hayas experimentado situaciones en las que controlar un...
Regresar al blog

Deja un comentario

Ten en cuenta que los comentarios deben aprobarse antes de que se publiquen.