Si estás interesado en aprender sobre el mundo de la electrónica y la programación, el ESP32 es una herramienta que no puede faltar en tu arsenal. En este artículo, profundizaremos en uno de los conceptos más fundamentales: el convertidor analógico a digital (ADC) del ESP32. ¡Prepárate para sumergirte en el fascinante mundo de la conversión de señales!
Este artículo de nuestra serie de conceptos básicos de ESP32 muestra cómo leer valores analógicos con ESP32 usando el IDE de Arduino.
Esto es útil para leer una variedad de sensores y componentes variables, incluidos, entre otros, potenciómetros de ajuste, joysticks, controles deslizantes y resistencias sensibles a la fuerza.
Pines ESP32 ADC
El ESP32 incluye dos ADC SAR de 12 bits (ADC1 y ADC2) y admite mediciones en 18 canales (pines con capacidad analógica). ADC1 está disponible en ocho GPIO (32 a 39), mientras que ADC2 está disponible en diez GPIO (0, 2, 4, 12 a 15 y 25 a 27).
Sin embargo, la placa DEVKIT V1 DOIT (la versión con 30 GPIO) solo tiene 15 canales ADC, como se muestra en la siguiente figura.
El ADC de su ESP32 tiene una resolución de 12 bits, lo que significa que puede detectar 4096 (2^12) niveles analógicos discretos. En otras palabras, convierte voltajes de entrada en el rango de 0 a 3,3 V (voltaje de funcionamiento) en valores enteros en el rango de 0 a 4095. Esto da como resultado una resolución de 3,3 voltios/4096 unidades o 0,0008 voltios (0,8 mV) por unidad.
Además, la resolución del ADC y el rango de canales se pueden ajustar mediante programación.
Limitaciones del ADC ESP32
Para ser honesto, ADC no es el punto fuerte del ESP32. Hay varias limitaciones que debes tener en cuenta.
No se puede utilizar cuando WiFi está habilitado
Los pines ADC2 no se pueden usar cuando WiFi está habilitado. Dado que existe una buena posibilidad de que un microcontrolador diseñado para esto use WiFi, solo se puede usar el ADC1.
Rango de entrada del ADC
El ADC del ESP32 solo puede medir voltajes en el rango de 0 a 3,3 V. No se pueden medir directamente voltajes analógicos entre 0 y 5 V.
Precisión del CAD
Idealmente, uno esperaría un comportamiento lineal al usar el ADC, pero este no es el caso. Los convertidores ADC del ESP32 son de naturaleza no lineal. Para obtener más información sobre esto, consulte una discusión en GitHub.
En el siguiente gráfico, las no linealidades en los extremos bajo y alto del voltaje de entrada son claramente visibles.
Básicamente, esto significa que el ESP32 no puede distinguir 3,2 V de 3,3 V; El valor medido será el mismo (4095). Asimismo, no puede distinguir entre señales de 0V y 0,13V; El valor medido será el mismo (0).
Ruido electrico
El ruido eléctrico del ADC implica una ligera fluctuación en las medidas.
Sin embargo, esto se puede corregir añadiendo un condensador en la salida y sobremuestreo.
La función analogRead()
Leer los valores analógicos de un pin GPIO es sencillo. En el IDE de Arduino se utiliza el analogRead()
Función que toma como argumento el número de pin GPIO que desea leer.
analogRead(GPIO);
Leyendo un potenciómetro
Para demostrar cómo usar el ADC en el ESP32, usaremos un ejemplo simple que lee un valor analógico de un potenciómetro.
Conexión de hardware
Configuremos un circuito de potenciómetro simple para este ejemplo.
Comience insertando el potenciómetro en su placa. Conecte el pin del medio para fijar GPIO 34 en su ESP32. Finalmente, conecta uno de los pines exteriores del potenciómetro -no importa cuál- al pin 3V3 del ESP32 y el otro a tierra.
Código de ejemplo
Cargue el siguiente boceto en su ESP32. Este boceto simplemente lee el potenciómetro e imprime los resultados en el monitor serie.
// Potentiometer is connected to GPIO 34 (Analog ADC1_CH6)
const int potPin = 34;
// variable for storing the potentiometer value
int potValue = 0;
void setup() {
Serial.begin(115200);
delay(1000);
}
void loop() {
// Reading potentiometer value
potValue = analogRead(potPin);
Serial.print("Analog value: ");
Serial.println(potValue);
delay(500);
}
Después de cargar el boceto, abra el monitor serie con velocidad de baudios 115200 y presione el botón EN en ESP32.
Dependiendo de la rotación actual de la perilla, se debe mostrar un valor entre 0 y 4095, que se imprimirá en el monitor serie. Prueba a girar la perilla del potenciómetro para ver cómo cambian los valores.
Explicación del código:
El boceto comienza definiendo el pin GPIO al que se conecta el potenciómetro, en este caso GPIO 34.
const int potPin = 34;
También se define una variable para almacenar los valores del potenciómetro.
int potValue = 0;
En setup() inicializamos la comunicación serie con el PC.
Serial.begin(115200);
En el bucle el analogRead()
La función se utiliza para leer el voltaje en potPin
. El valor devuelto se almacena en la variable. potValue
.
potValue = analogRead(potPin);
Finalmente, los valores leídos en el potenciómetro se imprimen en el monitor de serie.
Serial.print("Analog value: ");
Serial.println(potValue);
potPin
no es necesario configurarlo como entrada. Esto sucede automáticamente para usted cada vez que llama analogRead()
.
Otras funciones del ADC
Hay otras funciones de ADC que pueden resultar útiles en otros proyectos:
analogReadMilliVolts(pin)
: Obtenga el valor ADC para un pin/canal ADC específico en milivoltios.analogReadResolution(bits)
: establece los bits de muestra y la resolución de lectura. La resolución predeterminada es de 12 bits. Rango: 9 (0 – 511) a 12 bits (0 – 4095).analogSetWidth(bits)
: establece los bits de muestra de hardware y la resolución de lectura. La resolución predeterminada es de 12 bits. Rango: 9 a 12 bits. 9 bits = 0-511, 10 bits = 0-1023, 11 bits = 0-2047 y 12 bits = 0-4095.analogSetCycles(cycles)
: establece el número de ciclos por muestra. El valor predeterminado es 8. Rango: 1 a 255.analogSetSamples(samples)
: establece el número de muestras en el rango. El valor predeterminado es 1 muestra. Tiene un efecto de aumento de la sensibilidad.analogSetClockDiv(clockDiv)
: Establece el divisor para el reloj ADC. El valor predeterminado es 1. Rango: 1 a 255.analogSetAttenuation(attenuation)
: establece la atenuación de entrada para todos los pines del ADC. El estándar esADC_11db
. Valores aceptados:
ADC_0db
: no establece ninguna atenuación (rango de voltaje de entrada medible = 100 mV ~ 950 mV).ADC_2_5db
: Establece una atenuación de 1,34 (rango de voltaje de entrada medible = 100 mV ~ 1250 mV)ADC_6db
: Establece una atenuación de 1,5 (rango de voltaje de entrada medible = 150 mV ~ 1750 mV)ADC_11db
: Establece una atenuación de 3,6 (rango de voltaje de entrada medible = 150 mV ~ 2450 mV)
analogSetPinAttenuation(pin, attenuation)
: Esta función es la misma que la anterior excepto que establece la atenuación de entrada para el pin especificado.adcAttachPin(pin)
: Conecta un pin al ADC (también borra cualquier otro modo analógico que pueda estar habilitado) y devuelve verdadero si la configuración se realizó correctamente; de lo contrario, devuelve falso.adcStart(pin)
: Inicia una conversión ADC en el bus del pin conectado.adcBusy(pin)
: Comprueba si la conversión se está ejecutando actualmente en el bus ADC del pin (devuelve VERDADERO o FALSO).resultadcEnd(pin)
: Obtiene el resultado de la conversión (espera si ADC aún no se ha completado), devuelve un entero de 16 bits.
Para más información, ver leer los documentos.
Introducción al convertidor analógico a digital (ADC) en ESP32
Este artículo es parte de nuestra serie de básicos de ESP32 y demuestra cómo leer valores analógicos con ESP32 utilizando Arduino IDE. Esta habilidad es útil para leer una amplia variedad de sensores y componentes variables, que incluyen, pero no se limitan a, trimpots, joysticks, sliders, y resistencias sensibles a la fuerza.
Pines ADC de ESP32
El ESP32 incluye dos ADC SAR de 12 bits: ADC1 y ADC2, y es compatible con medidas en 18 canales (pines habilitados para analógico). ADC1 está disponible en ocho GPIOs (32 a 39), mientras que ADC2 está disponible en diez GPIOs (0, 2, 4, 12 a 15 y 25 a 27). Sin embargo, la placa DEVKIT V1 DOIT (la versión con 30 GPIOs) tiene solo 15 canales ADC.
La resolución del ADC en el ESP32 es de 12 bits, lo que significa que puede detectar 4096 (2^12) niveles analógicos discretos. En otras palabras, convertirá voltajes de entrada que van de 0 a 3.3V (tensión de operación) en valores enteros que van de 0 a 4095, con una resolución de 0.0008 voltios (0.8 mV) por unidad.
Limitaciones del ADC de ESP32
Verdaderamente, el ADC no es el punto fuerte del ESP32. Hay varias limitaciones que debes tener en cuenta, incluyendo el hecho de que los pines ADC2 no se pueden usar cuando el WiFi está habilitado. Además, la precisión y el rango de entrada del ADC son temas a tener en cuenta.
Función analogRead()
La lectura de los valores analógicos desde un GPIO es sencilla en el Arduino IDE. Utilizas la función analogRead() que acepta como argumento el número de pin GPIO que deseas leer. Por ejemplo: analogRead(GPIO);
Ejemplo de lectura de un potenciómetro
Para demostrar cómo utilizar el ADC en ESP32, utilizaremos un ejemplo simple que lee un valor analógico de un potenciómetro. En este caso, el potenciómetro está conectado al pin GPIO 34. También se proporciona un código de ejemplo y una explicación detallada del mismo.
Para información más detallada y ejemplos de código adicionales, visita la página de referencia de ESP32.