ADC y PWM con MicroPython
En este tutorial aprenderás a utilizar el módulo ADC y PWM con MicroPython de manera combinada en la Placa ESP32, se leerá un valor analógico de un Pin ADC de dicha placa conectado a un potenciómetro, el cual mediante PWM controlará la atenuación del brillo de un LED.
Hay varios pines en el ESP32 que pueden actuar como pines analógicos, estos se llaman pines ADC. Todos los siguientes GPIO pueden actuar como pines ADC son: 0, 2, 4, 12, 13, 14, 15, 25, 26, 27, 32, 33, 34, 35, 36, 39.
Los pines ADC de la Placa ESP32 tienen una resolución de 12 bits de forma predeterminada. Estos pines leen un voltaje entre 0 y 3,3Vcc, devolviendo un valor entre 0 y 4095, la resolución se puede cambiar en el código, donde se lo cambiará a una resolución de 10 bits para obtener un valor entre 0 y 1023.
Para crear una señal PWM, se debe pasar como parámetros el pin al que está conectado, la frecuencia de la señal y el ciclo de trabajo.
Frecuencia: La frecuencia puede ser cualquier valor entre 0 y 78125. Se puede usar una frecuencia de 5000 Hz para controlar el brillo del LED.
Ciclo de trabajo: El ciclo de trabajo puede ser un valor entre 0 y 1023, donde 1023 corresponde al 100 % del ciclo de trabajo (brillo máximo) y 0 corresponde al 0 % del ciclo de trabajo (LED apagado). Si no se establece el ciclo de trabajo, de forma predeterminada será 0.
Materiales
- 1x Placa Esp32 con micropython.
- 1x Diodo emisor de luz.
- 1x Resistor de 330 Ohm.
- 1x Potenciómetro de 10k Ohm.
- 2x Protoboard.
- Cables de conexión.
Circuito
Los componentes se deben conectar de la siguiente manera:
- El ánodo del Led (Pin Largo) va conectado a un extremo del resistor de 330 Ohm, el otro extremo del resistor va conectado al Pin G5 de la placa.
- El cátodo del Led (Pin Corto) va conectado al Pin GND de la Placa.
- El Pin Izquierdo del Potenciómetro va conectado al Pin GND de la placa.
- El Pin Central del Potenciómetro va conectado al Pin G34 de la placa.
- El Pin Derecho del Potenciómetro va conectado al Pin 3v3 de la placa.
Sketch en MicroPython
from machine import Pin, ADC, PWM from time import sleep # Pin ADC pin_adc = ADC(Pin(34)) # Atenuacion de entrada a 11dB y 3.3v pin_adc.atten(ADC.ATTN_11DB) # Resolucion ADC a 10 bits pin_adc.width(ADC.WIDTH_10BIT) # Pin Led pin_led = PWM(Pin(5), 5000) while True: # Se lee los valores del ADC adc_valor = pin_adc.read() # Vizualizar los datos print(adc_valor) # Valor del ADC se carga en el PWM pin_led.duty(adc_valor) # Espera de 100ms sleep(0.1)
Para modificar el rango de voltaje admitido por el ADC, se debe editar la línea número 7, de acuerdo a lo siguiente:
# Atenuacion de entrada a 0dB y 1.2v pin_adc.atten(ADC.ATTN_0DB)
# Atenuacion de entrada a 2.5dB y 1.5v pin_adc.atten(ADC.ATTN_2_5DB)
# Atenuacion de entrada a 6dB y 2.0v pin_adc.atten(ADC.ATTN_6DB)
# Atenuacion de entrada a 11dB y 3.3v pin_adc.atten(ADC.ATTN_11DB)
Para modificar la resolución del ADC, se debe editar la línea número 9, de acuerdo a lo siguiente:
# Resolucion ADC a 9 bits pin_adc.width(ADC.WIDTH_9BIT)
# Resolucion ADC a 10 bits pin_adc.width(ADC.WIDTH_10BIT)
# Resolucion ADC a 11 bits pin_adc.width(ADC.WIDTH_11BIT)
# Resolucion ADC a 12 bits pin_adc.width(ADC.WIDTH_12BIT)