ADC
La Conversión Analógica-Digital (Conversión A/D o ADC -Analog-Digital Coversion-) consiste en la transcripción de señales analógicas a digitales, con el propósito de facilitar su procesamiento.
Para ello se realizan medidas de la amplitud de la señal y se redondean sus valores a un conjunto finito de niveles preestablecidos –niveles de cuantificación-, para poder registrarlos.
El microcontrolador ESP32 puede leer la tensión y realizar la conversión ADC en los pines 32, 33, 34, 35, 36, 37, 38 y 39.
machine.ADC()
La clase ADC de la librería machine –machine.ADC()– proporciona la interfaz para la conversión. Dispone de 4 métodos (funciones):
- ADC.read(): lee el voltaje (tensión).
- ADC.read_u16(): lee el voltaje, con una precisión de 16 bits.
- ADC.atten(): permite atenuar el voltaje a leer, para incrementar el intervalo de 0V – 1V para el que está preparado el microcontrolador.
- ADC.width: permite regular la precisión de lectura de ADC.read().
El constructor es class machine.ADC(pin), siendo el argumento el PIN de lectura de tensión.
Por ejemplo, para construir un objeto con el nombre adc34 en el PIN34 utilizaríamos el siguiente script:
import machine #Se importa la librería machine pin34 = machine.Pin(34) #Se inicializa el PIN34 adc34 = machine.ADC(pin34) #Se inicializa la lectura ADC en el PIN34
Método ADC.atten()
El método ADC.atten(atenuación) permite atenuar del voltaje a leer, conforme a unos valores establecidos, para incrementar el voltaje máximo de lectura. Se debe tener en cuenta que conforme se incrementa la atenuación se reduce precisión de lectura.
Los posibles valores de atenuación son:
- ADC.ATTN_0DB: 0 dB de atenuación. Permite un rango de lectura entre 0.0 V y 1.0 V -es la configuración por defecto-.
- ADC.ATTN_2_5DB: 2.5 dB de atenuación. Permite un rango de lectura entre 0.0 V y 1.34 V.
- ADC.ATTN_6DB: 6 dB de atenuación. Permite un rango de lectura entre 0.0 V y 2.0 V.
- ADC.ATTN_11DB: 11 dB de atenuación. Permite un rango de lectura entre 0.0 V y 3.6 V.
Por ejemplo, para modificar la atenuación a 6 dB escribiremos:
adc34.atten(machine.ADC.ATTN_6DB) #6 dB de atenuación. Lectura entre 0.0V y 2.0V
Método ADC.width()
El método ADC.width(ancho) permite establecer el número de bits que se utilizarán y devolverán durante las lecturas de ADC.
Las posibles valores de ancho son:
- ADC.WIDTH_9BIT: 9 bits. 29=512 ⇒ valores entre 0 y 511.
- ADC.WIDTH_10BIT: 10 bits. 210=1.024 ⇒ valores entre 0 y 1023.
- ADC.WIDTH_11BIT: 11 bits. 211=2.048 ⇒ valores entre 0 y 2047.
- ADC.WIDTH_12BIT: 12 bits. 212=4.096 ⇒ valores entre 0 y 4095 -es la configuración por defecto-.
Por ejemplo, para modificar la precisión de lectura a 9 bits escribiremos:
adc34.width(machine.ADC.WIDTH_9BIT) # Lectura con precisión de 9 bits
EJEMPLO PRÁCTICO
Como ejemplo de uso se puede leer la tensión en una batería de 1.5V. Para ello es necesario conectar el polo negativo con el Pin GND del circuito y el positivo con el Pin de lectura (PIN34).
Es preciso programar una atenuación de la lectura ADC de 6 dB para poder leer valores entre 0.0 V y 2.0 V.
Se realizarán dos lecturas, una con una precisión de 16 bits y otra con una precisión de 9 bits y se compararán los resultados.
import machine from time import sleep pin34 = machine.Pin(34) # Se inicializa el PIN34 adc34 = machine.ADC(pin34) # Se inicializa la lectura ADC en el PIN34 adc34.atten(machine.ADC.ATTN_6DB) # 6 dB de atenuación. Rango de lectura entre 0.0V y 2.0V adc34.width(machine.ADC.WIDTH_9BIT) # Lectura con precisión de 9 bits while True: V_16bits = adc34.read_u16() # Voltaje 0-65.535 (2^16) V_9bits = adc34.read() # Voltaje 0-511 (2^9) print("Valor obtenido con 16 bits:", V_16bits/65535/2, "V -- Valor obtenido con 9 bits:", V_9bits/511/2, "V") sleep(5)
Así se verá el resultado con Thonny:
DIVISOR DE TENSIÓN
Como se ha visto se puede realizar una lectura directa ADC para tensiones de entre 0.0V y 3.6V, pero si se superan los 3.6V se corre el riesgo de quemar el microcontrolador.
Esto se puede solucionar realizando una lectura indirecta a través de un divisor de tensión (o divisor de voltaje), que es una configuración de circuito eléctrico que permite dividir la tensión eléctrica de una fuente entre dos o más impedancias conectadas en serie.
En un divisor de tensión resistivo se utilizan como impedancias resistencias. Es sencillo construir el circuito y ver como funciona:
A modo de ejemplo, si se quiere medir el voltaje real que suministra una pila de 9V realizando una lectura sin aplicar atenuación se debe reducir la tensión a menos de 1V.
Para calcular el valor de las resistencias conviene elegir primero la corriente que pasará por el divisor (IAB). En general, una corriente de 1mA es suficiente. Conociendo la corriente (1mA) y la tensión de salida (1,0V) se puede aplicar la Ley de Ohm para obtener RAB:Como se disponen de resistencias comerciales de 1 KΩ será la que se utilice.
RBC se calculará resolviendo la siguiente ecuación:
Por lo tanto RBC debiera valer 8KΩ , pero como no existen resistencias comerciales de 8 KΩ se buscará la más próxima a ese valor, por encima. La resistencia debe ser de 8,2KΩ.
Finalmente se debe resolver la ecuación con las resistencias seleccionadas, para conocer el voltaje real de salida que se utilizará para corregir la medición obtenida en la lectura ADC:
El circuito eléctrico quedará así:
Y el sketch será el siguiente:
import machine from time import sleep pin34 = machine.Pin(34) # Se inicializa el PIN34 adc34 = machine.ADC(pin34) # Se inicializa la lectura ADC en el PIN34 while True: Volt = adc34.read() # Voltaje 0-4095 (2^12) Volt_corregido = round(Volt/4095/0.98*9, 2) print("El voltaje es de:", Volt_corregido, "V") sleep(5)
Leave a Reply
Tu correo electrónico está seguro.
You must be logged in to post a comment.