Cómo resolver el problema de resolución de doce bits de esp32adc
Esta función experimental demuestra el uso de ESP32 ADC. El código para este experimento se encuentra en el directorio del proyecto "3_11_adc".
3.11.1. Contenido del experimento
(1) Aprenda a usar la función ESP32 ADC
(2) Aprenda a usar el fotorresistor
(3) Aprenda el uso de pantallas de visualización
3.11.2. Principios y diseño de hardware
Abra el archivo esquemático que le proporcionamos:\ Schematic\.ESP32. diagrama V1.3 .pdf,
La característica del fotorresistor es que la resistencia se vuelve menor cuando hay luz. En la figura anterior, R15 es el fotorresistor. Cuando no brilla ninguna luz sobre el fotorresistor, la resistencia de R15 es infinita. El voltaje máximo recogido por el ADC es el voltaje dividido de R9 y R10, que es 1,06 V. brillando en el fotorresistor. Cuando la luz es más fuerte, el voltaje recogido por el ADC es menor.
Como se puede ver en el diagrama esquemático anterior, el ADC del fotorresistor se recopila a través de un interruptor DIP, que está conectado a IO34. Para usar el ADC fotosensible, debe encender el interruptor DIP 7 en la base. placa, como sigue Imagen:
ESP32 tiene dos ADC de 12 bits, ***18 canales, ADC2 es más especial: se utilizan ADC2 y wifi***, wifi es más especial: ADC2 y wifi* ** se utilizan, wifi Aún más especial: el wifi es aún más especial. Lo especial de ADC2 es que cuando ADC2 se usa con wifi ***, wifi tiene mayor prioridad, por lo que ADC2 solo se puede usar cuando el módulo WIFI no está en uso.
El ADC de 18 canales de ESP32 es el siguiente:
Abra otro documento que proporcionamos: .\ManualandDocumentation/ESP32-S_Product_Specification.pdf, sobre la parte de definición de pin,
A través de la figura anterior, sabemos que IO34 conectado al fotorresistor está conectado al sexto canal de ADC1. Al escribir el código, programamos el sexto canal de ADC1 para obtener la intensidad de la luz.
3.11.3.ESP32 Introducción a la función ADC Configuración de ADC
Para ADC1, puede configurar la precisión y atenuación requeridas llamando a las funciones adc1_config_width() y adc1_config_channel_attenuation().
Definición de función:
esp_err_t adc1_config_width(adc_bits_width_t width_bit); Descripción del parámetro:
adc_bits_width_t width_bit: establece la resolución de ADC, que es una enumeración. Esta es una enumeración, la definición específica se explicará más adelante: ESP_OK (éxito).
1024
ADC_WIDTH_BIT_11 = 2, //La resolución del ADC es de 11 bits, es decir, el valor máximo es 2 elevado a la 11ª potencia, es decir, 2048
ADC_WIDTH_BIT_12 = 3 , //La resolución del ADC La velocidad es de 12 bits, es decir, el valor máximo es 2 elevado a la 12ª potencia, es decir, 4096 ADC_WIDTH_MAX,
} adc_bits_width_t;1234567
Definición de función:
esp_err_t adc1_config_channel_atten (canal adc1_channel_t, adc_atten_t atten); Descripción del parámetro:
canal adc1_channel_t: configura el canal del ADC, esta es una enumeración, la definición específica se describirá más adelante adc_atten_t atten: configura el voltaje de referencia del ADC, esta es una enumeración, la definición específica se describirá más adelante
Valor de retorno: ESP_OK (éxito).
typedef enumeración {
ADC1_CHANNEL_0 = 0, /*! ADC1_CHANNEL_1, ADC1_CHANNEL_2,ADC1_CHANNEL_3,ADC1_CHANNEL_4,ADC1_CHANNEL_5,ADC1_CHANNEL_6,ADC1_CHANNEL_7,ADC1_CHANNEL_MAX, } adc1_channel_t; ADC_ATTEN_DB_2_5 = 1, ADC_ATTEN_DB_6 = 2, ADC_ATTEN_DB_11 = 12345678 Para ADC2, la atenuación se realiza a través de adc2_config_channel_attenuation () para configurar. El ancho de lectura de ADC2 se configura para cada lectura. Definición de función: esp_err_t adc2_config_channel_atten(adc2_channel_t canal, adc_atten_t atten); Descripción del parámetro: adc2_channel_t canal: configurar ADC_channel_t canal: configurar el canal ADC, esto Es una enumeración, la definición específica se describirá más adelante adc_atten_t atten: configura el voltaje de referencia del ADC, esta es una enumeración, descrita en la función de configuración del ADC1 Valor de retorno: ESP_OK (éxito). typedef enum { ADC2_CHANNEL_0 = 0, /*! < el canal 0 de ADC2 es GPIO4 */ ADC2_CHANNEL_1, /*! *! < ¡El canal 2 de ADC2 es GPIO2 */ ADC2_CHANNEL_3, /*! < ¡El canal 3 de ADC2 es GPIO15 */ ADC2_CHANNEL_4, /*! < ADC2 canal 4 es GPIO13 */ ADC2_CHANNEL_5, /*! < ADC2 canal 5 es GPIO12 */ ADC2_CHANNEL_6, /*! < ADC2 canal 6 es GPIO14 */ ADC2_CHANNEL_7, /*! ¡Es GPIO27 */ ADC2_CHANNEL_8, /*! < ADC2 canal 8 es GPIO25 */ ADC2_CHANNEL_9, /*! < ADC2 canal 9 es GPIO26 */ ADC2_CHANNEL_MAX, } adc2_channel_t;12345 Leer ADC Para ADC1, hay dos Lectura funciones, sus parámetros y valores de retorno son exactamente los mismos. : int adc1_get_voltage(adc1_channel_t canal); int adc1_get_raw(adc1_channel_t canal); Descripción del parámetro: adc1_channel_t canal: configura el canal ADC, esta es una enumeración, en la función de configuración ADC1 El valor de retorno se describe en: Valor ADC muestreado en el canal. Para ADC2, utilice la siguiente función para leer el valor de ADC, definido de la siguiente manera: esp_err_t adc2_get_raw(adc2_channel_t channel, adc_bits_width_t width_bit, int* raw_out); p> canal adc2_channel_t: configura el canal ADC. p> adc2_channel_t canal: configura el número de canal de ADC2, esta es una enumeración, en la función de configuración de ADC2 adc_bits_width_t width_bit: establece la resolución de ADC int* raw_out: esto es un valor de retorno, que indica el valor ADC leído. Valor de retorno: ESP_OK (éxito), ESP_ERR_TIMEOUT (usando wifi). 3.11.4. Descripción del código Utilice vs code para expandir el directorio del proyecto de este experimento, como se muestra a continuación: En nuestro experimento, ADC recopiló The El código está escrito en el archivo fuente app_main.c, y debajo de la carpeta del componente está el código del controlador LCD, que se explica en detalle en el Capítulo 3.4. Abrimos app_main.c y vemos la inicialización de ADC: void adc_Init() { /resolución de 12 bits adc1_config_width (ADC_WIDTH_12Bit);1234 99 /Establecer canal 6 y resolución de 12 bits. Voltaje de referencia de 1 V adc1_config_channel_atten(ADC1_TEST_CHANNEL,ADC_ATTEN_0db); }< / p> La definición de ADC1_TEST_CHANNEL es como se muestra en la siguiente figura: //El canal conectado al ADC //El canal conectado al ADC. #define ADC1_TEST_CHANNEL ADC1_CHANNEL_6 Luego mire la función principal app_main(), que inicializa el LCD y el ADC, y luego lee el valor del ADC a través del bucle while(1). El código es el siguiente: //Entrada de función de usuario. void app_main() { int read_raw; char adc_buff[50]={0}; //Mostrar inicialización Lcd_Init(); adc_Init(); // Mostrar información del mensaje // Mostrar información del mensaje // Mostrar mensaje Información //Mostrar información de aviso