#include <stdio.h>
#include <freertos/FreeRTOS.h>
#include <freertos/task.h>
#include "driver/adc.h"
#include "esp_adc_cal.h"
#define DEFAULT_VREF 3300
void get_adc_task(void *parametro){
// creamos un objeto para la calibracion
esp_adc_cal_characteristics_t adc1_chars; // variable que almacera las caracteristicas de calibracion
// funcion de calibracion
esp_adc_cal_characterize(ADC_UNIT_1, ADC_ATTEN_DB_11, ADC_WIDTH_BIT_12, DEFAULT_VREF, &adc1_chars);
/**
* adc_unit_t adc_num: especifica la unidad ADC, la esp32 tiene 2 ADC ADC 1 y ADC 2
* adc_atten_t atten: la atenuación permite menejar un rango más amplio del voltaje de entrada (Vin)
* ADC_ATTEN_DB_0 0: Sin atenuación, se puede medir hasta 800mV
* Corresponde a un rango de entrada de 0 a 1.1, pero 800 es el maximo seguro (practico), luego de 800mv a 1.1V tiene margen de error)
* ADC_ATTEN_DB_2_5 1: x1.33 Corresponde a un rango de 0 a 1.5V
* ADC_ATTEN_DB_6 2: x2 Corresponde a aun rango de 0 a 2.2v
* ADC_ATTEN_DB_11 3: x3.55 Corrresponde a un rango de 0 a 3.9v
*
* adc_bits_width_t bit_width: define la resolucion
* ADC_WIDTH_BIT_9 : 9 bits (0 a 511 bits)
* ADC_WIDTH_BIT_10: 10 bits (0 a 1023 bits)
* ADC_WIDTH_BIT_11: 11 bits (0 a 2047 bits)
* ADC_WIDTH_BIT_12: 12 bits (0 a 2095 bits)
*
* uint32_t default_vref: voltahe de referencia ADC predeterminado en mV
* esp_adc_cal_characteristics_t *chars: puntero a una estructura vacia del tipo esp_adc_cal_characteristics_t. En nuestro caso es adc1_chars
*/
// resolucion de 12 bits
adc1_config_width(ADC_WIDTH_BIT_12);
// seleccion del canal y atenuacion
adc1_config_channel_atten(ADC1_CHANNEL_0, ADC_ATTEN_DB_11);
adc1_config_channel_atten(ADC1_CHANNEL_1, ADC_ATTEN_DB_11);
while(1) {
int val0 = adc1_get_raw(ADC1_CHANNEL_0);
int val1 = adc1_get_raw(ADC1_CHANNEL_1);
printf("%d,%d,\n", val0, val1);
vTaskDelay(2000/portTICK_PERIOD_MS);
}
}
void app_main(void)
{
xTaskCreate(get_adc_task, "get_adc_task", 2048, NULL, 5, NULL);
}