Introducción al convertidor analógico a digital (ADC) ESP32

El ESP32 se ha convertido en uno de los microcontroladores más populares entre los entusiastas de la electrónica y la programación. Su capacidad para manejar tanto señales digitales como analógicas lo convierte en una herramienta versátil para una amplia variedad de proyectos. En este artículo, exploraremos en detalle el convertidor analógico a digital (ADC) del ESP32, cómo funciona, sus limitaciones y cómo se puede utilizar en aplicaciones prácticas.

Índice de contenido
  1. Pines ADC del ESP32
  2. Limitaciones del ADC del ESP32
    1. Inutilizable cuando Wi-Fi está habilitado
    2. Rango de entrada del ADC
    3. Precisión del ADC
    4. Ruido eléctrico
  3. Función analogRead()
  4. Lectura de un potenciómetro
    1. Conexiones de hardware
    2. Código de ejemplo
    3. Explicación del código
  5. Otras funciones del ADC

Pines ADC del ESP32

El ESP32 cuenta con dos convertidores analógicos a digitales (ADC) de 12 bits: ADC1 y ADC2. Estos ADC permiten la medición de valores analógicos en un total de 18 canales o pines habilitados para la entrada analógica. En el caso de ADC1, se puede acceder a través de ocho pines GPIO, que son los pines 32 a 39. Por su parte, ADC2 está disponible en diez pines GPIO, que incluyen los pines 0, 2, 4, y del 12 al 15, así como 25, 26 y 27.

Es importante mencionar que, en algunas placas como el DEVKIT V1 DOIT, aunque el ESP32 tiene 30 pines GPIO, solo 15 de ellos son utilizables para funciones ADC. Esto es crucial para aquellos que planean realizar aplicaciones que requieren múltiples entradas analógicas.

La resolución del ADC es de 12 bits, lo que significa que puede distinguir entre 4096 niveles discretos de voltajes. En términos prácticos, esto se traduce en la capacidad de convertir voltajes de entrada que oscilan entre 0 y 3.3V en valores enteros que van de 0 a 4095. De esta forma, cada incremento de una unidad representa aproximadamente 0.8 mV, lo que permite una medición precisa dentro de este rango.

Además, es posible configurar programáticamente tanto la resolución del ADC como el rango de los canales, lo que otorga mayor flexibilidad a los desarrolladores.

Limitaciones del ADC del ESP32

A pesar de sus muchas capacidades, el ADC del ESP32 presenta algunas limitaciones que es fundamental considerar al trabajar con este microcontrolador.

Inutilizable cuando Wi-Fi está habilitado

Una de las principales desventajas es que los pines ADC2 no pueden usarse cuando la funcionalidad Wi-Fi está activada. Dado que el ESP32 está diseñado principalmente como un dispositivo conectado a Internet, esto limita considerablemente las opciones para la lectura de datos analógicos, dejando ADC1 como la única opción utilizable.

Rango de entrada del ADC

El rango de voltaje que el ADC del ESP32 puede medir está limitado a un máximo de 3.3V. Por lo tanto, no se pueden medir voltajes superiores a este nivel de manera directa (como los de 5V), lo que podría ser un problema en aplicaciones que requieren un rango más amplio.

Precisión del ADC

La precisión del ADC también puede ser motivo de preocupación, ya que no presenta un comportamiento lineal ideal. Esto significa que los valores devueltos pueden no ser siempre precisos y se pueden presentar errores, especialmente en los extremos del rango de voltaje. Por ejemplo, el ESP32 puede no diferenciar entre 3.2V y 3.3V, resultando en un valor medido idéntico (4095). Esto puede ser crítico en aplicaciones donde se requiere una alta precisión.

Ruido eléctrico

El ruido eléctrico también puede afectar la lectura de los valores analógicos, causando fluctuaciones leves en las mediciones. Sin embargo, es posible mitigar este problema utilizando un capacitor en la salida y empleando técnicas de sobresampling.

Función analogRead()

Para leer valores analógicos de un pin GPIO, se utiliza la función analogRead() en el entorno de programación Arduino IDE. Esta función es muy sencilla de usar y acepta como argumento el número del pin GPIO que se desea leer.

Lectura de un potenciómetro

Para ilustrar el uso del ADC en el ESP32, realizaremos un ejemplo práctico que consiste en leer un valor analógico de un potenciómetro.

Conexiones de hardware

Para este ejemplo, empezaremos creando un circuito simple con un potenciómetro. Inserta el potenciómetro en una placa de pruebas (breadboard) y conecta el pin central al pin GPIO 34 de tu ESP32. Luego, conecta uno de los pines exteriores del potenciómetro al pin de 3V3 del ESP32 y el otro pin exterior a tierra (GND).

Código de ejemplo

A continuación, puedes cargar el siguiente código en tu ESP32. Este sketch lee el valor del potenciómetro y lo imprime en el Monitor Serial.

// El potenciómetro está conectado a GPIO 34 (ADC1_CH6)
const int potPin = 34;

// variable para almacenar el valor del potenciómetro
int potValue = 0;

void setup() {
  Serial.begin(115200);
  delay(1000);
}

void loop() {
  // Leer el valor del potenciómetro
  potValue = analogRead(potPin);
  Serial.print("Valor analógico: ");
  Serial.println(potValue);
  delay(500);
}

Una vez que hayas subido el sketch, abre el Monitor Serial a una velocidad de 115200 baudios y presiona el botón EN en el ESP32. Deberías ver un valor entre 0 y 4095, variando según la posición del potenciómetro. Al girar el knob, observarás cómo cambian los valores impresos en tiempo real.

Explicación del código

En el sketch, comenzamos definiendo el pin GPIO al que está conectado el potenciómetro, que en este caso es el 34. Además, declaramos una variable para almacenar los valores leídos.

En la función setup(), inicializamos la comunicación serial con el ordenador. Luego, en el bucle loop(), utilizamos analogRead() para leer el voltaje en el pin especificado. Este valor se almacena en la variable potValue.

potValue = analogRead(potPin);

Finalmente, imprimimos el valor leído en el Monitor Serial utilizando Serial.print() y Serial.println(). Cabe destacar que el pin no necesita ser configurado como entrada, ya que esto se hace automáticamente al llamar a analogRead().

Otras funciones del ADC

Existen varias funciones adicionales del ADC que pueden ser útiles en diferentes proyectos. Estas son algunas de las más relevantes:

  • analogReadMilliVolts(pin): Obtiene el valor ADC de un pin/ canal ADC en milivoltios.
  • analogReadResolution(bits): Establece la cantidad de bits y la resolución de lectura. La resolución por defecto es de 12 bits, con un rango de 9 (0 - 511) a 12 bits (0 - 4095).
  • analogSetWidth(bits): Configura los bits de muestreo y resolución de lectura. También con un rango de 9 a 12 bits.
  • analogSetCycles(cycles): Establece el número de ciclos por muestra, con un rango de 1 a 255.
  • analogSetSamples(samples): Establece el número de muestras en el rango, afectando la sensibilidad de las lecturas.
  • analogSetClockDiv(clockDiv): Configura el divisor para el reloj del ADC, con un rango de 1 a 255.
  • analogSetAttenuation(attenuation): Establece la atenuación de entrada para todos los pines ADC, con un valor por defecto de ADC_11db. Los valores aceptados son:
  • ADC_0db: Sin atenuación (rango de voltaje medible = 100 mV ~ 950 mV).
  • ADC_2_5db: Atenuación de 1.34 (rango de voltaje medible = 100 mV ~ 1250 mV).
  • ADC_6db: Atenuación de 1.5 (rango de voltaje medible = 150 mV ~ 1750 mV).
  • ADC_11db: Atenuación de 3.6 (rango de voltaje medible = 150 mV ~ 2450 mV).
  • analogSetPinAttenuation(pin, attenuation): Similar a la función anterior, pero establece la atenuación de entrada para un pin específico.
  • adcAttachPin(pin): Conecta un pin al ADC, eliminando cualquier otro modo analógico que pudiera estar activo, y devuelve verdadero si la configuración es exitosa.
  • adcStart(pin): Inicia una conversión ADC en el bus del pin conectado.
  • adcBusy(pin): Verifica si la conversión en el bus ADC del pin está en curso (devuelve verdadero o falso).
  • resultadcEnd(pin): Obtiene el resultado de la conversión (espera si el ADC no ha terminado), devuelve un entero de 16 bits.

Para obtener más información sobre estas funciones y su uso, es recomendable consultar la documentación disponible en readthedocs.

Carlos Julián

Carlos Julián es el fundador de Ingtelecto, es Ingeniero Mecatrónico, Profesor y Programador, cuenta con una Maestria en Ciencias de la Educación, creador de contenido activo a través de TikTok @carlosjulian_mx

Estos temas te pueden interesar

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Tu puntuación: Útil

Subir