ESP32-Entradas ADC

Generalidades

El ESP32 integra dos ADC SAR (registro de aproximación sucesiva) de 12 bits que admiten un total de 18 canales de medición (pines analógicos habilitados). En el modulo “wroom 32”, son 16 pines analógicos

La API del controlador ADC admite ADC1 (6 canales, conectados a GPIO 32-36,39) y ADC2 (10 canales, conectados a GPIO 0, 2, 4, 12-15 y 25-27). Sin embargo, el uso de ADC2 tiene algunas restricciones para la aplicación:

ADC2 es utilizado por el controlador de Wi-Fi. Por lo tanto, la aplicación solo puede usar ADC2 cuando el controlador de Wi-Fi no se ha iniciado.

Algunos de los pines ADC2 se utilizan como pines de sujeción (“strapping pins”) (GPIO 0, 2, 15), por lo que no se pueden utilizar libremente. Tal es el caso de los siguientes kits de desarrollo oficiales:

ESP32 DevKitC: GPIO 0 no se puede utilizar debido a circuitos de programación automática externos.

ESP-WROVER-KIT: GPIO 0, 2, 4 y 15 no se pueden utilizar debido a conexiones externas para diferentes propósitos.

Funciones

  • analogReadResolution (resolución): establece los bits de muestra y la resolución. Puede ser un valor entre 9 (0 – 511) y 12 bits (0 – 4095). La resolución predeterminada es de 12 bits.
  • analogSetWidth (ancho): establece los bits de muestra y la resolución. Puede ser un valor entre 9 (0 – 511) y 12 bits (0 – 4095). La resolución predeterminada es de 12 bits.
  • analogSetCycles (ciclos): establezca el número de ciclos por muestra. El valor predeterminado es 8. Rango: 1 a 255.
  • analogSetSamples (muestras): establece el número de muestras en el rango. El valor predeterminado es 1 muestra. Tiene el efecto de aumentar la sensibilidad.
    analogSetClockDiv (atenuación): establece el divisor para el reloj ADC. El valor predeterminado es 1. Rango: 1 a 255.
  • analogSetAttenuation (atenuación): establece la atenuación de entrada para todos los pines ADC. El valor predeterminado es ADC_0db. Valores aceptados:
    ADC_0db: Cuando la tensión de entrada se aproxime a 1 V ,si la resolucion es de 12 bits el valor de lectura llegara al maximo, 4095.
    ADC_2_5db: El voltaje de entrada del ADC se atenuará, extendiendo el rango de medición hasta aprox. 1400 mV. (Entrada 1.4V = lectura ADC de rango maximo de 4095).
    ADC_6db: El voltaje de entrada del ADC se atenuará, extendiendo el rango de medición hasta aprox. 1920 mV. (Entrada 1.9V = lectura ADC de 4095).
    ADC_11db: El voltaje de entrada del ADC se atenuará, extendiendo el rango de medición hasta aprox. 3200 mV. (Entrada aprox 3,2v = lectura ADC de 4095).
  • analogSetPinAttenuation (pin, atenuación): establece la atenuación de entrada para el pin especificado. El valor predeterminado es ADC_0db. Los valores de atenuación son los mismos de la función anterior.
  • adcAttachPin (pin): adjunta un pin al ADC (también borra cualquier otro modo analógico que pueda estar activado). Devuelve un resultado VERDADERO o FALSO.
  • adcStart (pin), adcBusy (pin) y resultadcEnd (pin): inicia una conversión ADC en el bus del pin adjunto. Compruebe si la conversión en el bus ADC del pin se está ejecutando actualmente (devuelve VERDADERO o FALSO). Obtener el resultado de la conversión: devuelve un entero de 16 bits.

-Ejemplo1: Simple lectura con un potenciometro conectado al pin 34

// 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.println(potValue);
  delay(500);
}

EJEMPLO 2: Aqui vamos a practicar estas nuevas funciones descritas anteriormente, al mismo tiempo que utilizaremos una pantalla TFT para ver los valores de lectura y tensión en el pin 36, utilizando tambien un potenciometro de 2K


#include "SPI.h"
#include "TFT_eSPI.h"
#define TFT_GREY 0x7BEF
TFT_eSPI tft = TFT_eSPI();
int pot36 = 0;


void setup() {
  tft.begin();        // inicializa pantalla
  tft.setRotation(3);     // establece posicion horizontal con pines derecha
  tft.fillScreen(TFT_BLACK);
  //analogReadResolution (10);// comprobar la función
  analogSetWidth (12) ;
  analogSetAttenuation (ADC_6db);
  
}
void loop() {
  
  pot36 = analogRead(36);
  float v=(3.3/4095)*pot36;//lectura en tensión V
  tft.fillScreen(TFT_BLACK);//refreco de pantalla
  tft.setTextColor(ILI9341_GREEN);  // color de texto en VERDE
  tft.setTextSize(2);     // escala de texto en 2
  tft.setCursor(90, 10);
  tft.print(pot36);
  tft.setCursor(90, 50);
  tft.print(v);
  delay(500);



}

Deja una respuesta

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

Translate »