micropython-salidas-analogicas-pwm

Salidas analógicas PWM con MicroPython

  • 5 min

En este tutorial vamos a ver cómo usar señales PWM en MicroPython para generar salidas pseudo-analógicas con las que controlar, por ejemplo, la intensidad de LEDs o la velocidad de motores.

El PWM (modulación por ancho de pulso) es una técnica que hemos visto frecuentemente en el blog, que nos permite generar señales “más o menos analógicas” de forma barata con un microcontrolador.

Básicamente, como es caro tener hardware para hacer una señal analógica real, lo que hacemos es un ciclo donde encendemos y apagamos una señal digital cada cierto tiempo.

  • Ciclo de trabajo (Duty Cycle): Es el porcentaje de tiempo que la señal está en estado alto. Por ejemplo, un ciclo de trabajo del 50% significa que la señal está encendida la mitad del tiempo y apagada la otra mitad.
  • Frecuencia: Es el número de veces que la señal se repite por segundo, medida en Hertz (Hz).

La frecuencia PWM debe ajustarse según el dispositivo que se esté controlando. En general, una frecuencia entre 500 Hz y 1 kHz suele ser adecuada en muchos casos.

Si el dispositivo es “lento” (tiene mucha inercia) en comparación a la frecuencia del PWM, puede que se comporte ante nuestra señal más o menos como si fuera una seña analógica.

Pero no todos los dispositivos van a aceptar tu señal pseudo-analógica. Algunos de ellos pueden comportarse erráticamente e incluso podemos dañarlos si no están preparados para los niveles de tensión.

Configuración de PWM en MicroPython

Para utilizar PWM en MicroPython, primero debemos importar el módulo machine, que proporciona las funciones necesarias para interactuar con el hardware (como ya hacíamos en las salidas digitales)

Luego, configuramos un pin GPIO como salida PWM asi,

pwm = PWM(led_pin)

Ahora podemos usar algunas de los métodos de PWM para configurar nuestra salida pseudo-analógica. Por ejemplo

ComandoDescripción
pwm.freq(freq)Establece o devuelve la frecuencia de la señal PWM en hercios (Hz).
pwm.duty(duty_cycle)Ajusta el ciclo de trabajo, variando el brillo del LED (valor entre 0 y 1023).
pwm.deinit()Desactiva la señal PWM en el pin especificado.
pwm.duty_u16(duty_cycle)Ajusta el ciclo de trabajo con resolución de 16 bits (valor entre 0 y 65535).
pwm.init(freq, duty)Inicializa el PWM con una frecuencia y un ciclo de trabajo específicos.

Ejemplo práctico

Vamos a verlo mejor si ponemos un ejemplo sencillo. Vamos a controlar la intensidad de un LED utilizando un PWM.

from machine import Pin, PWM
import time

# Configuración del pin GPIO donde está conectado el LED
led_pin = Pin(2, Pin.OUT)  # Usamos el pin GPIO 2 (común en ESP32/ESP8266)
pwm = PWM(led_pin)         # Configuramos el pin como salida PWM

# Configuración de la frecuencia PWM (por ejemplo, 1000 Hz)
pwm.freq(1000)

# Función para variar el brillo del LED
def variar_brillo():
    for duty_cycle in range(0, 1024):  # Rango de 0 a 1023 (10 bits)
        pwm.duty(duty_cycle)           # Ajustamos el ciclo de trabajo
        time.sleep_ms(10)              # Pequeña pausa para observar el cambio

# Ejecutar la función
variar_brillo()

En este ejemplo,

  • Importamos Pin y PWM del módulo machine, y time para manejar pausas.
  • Definimos el pin GPIO 2 como salida y lo configuramos para PWM.
  • Establecemos la frecuencia de la señal PWM en 1000 Hz.
  • Usamos un bucle for para variar el ciclo de trabajo de 0 a 1023 (10 bits), lo que permite controlar el brillo del LED.
  • Añadimos una pequeña pausa (time.sleep_ms(10)) para observar el cambio gradual en el brillo.

Ejemplos prácticos