首页 > 解决方案 > esp32中内部ADC的精度问题

问题描述

我现在测量电池的电路是 esp32、nrf24l01 和 18650。我用 18650 3.6V 标称/4.2 最大电池为 esp32 供电。运行分压器 100k、27k,然后测量点为 0.893V。在 3.6V 测量点,例如 ~0.72。

我使用内部 1.1V ADC,但为什么我只能在显示器上收到 ~3V 我的电路

float battery_read()
{
    //read battery voltage per %
    long sum = 0;                  // sum of samples taken
    float voltage = 0.0;           // calculated voltage
    float output = 0.0;            //output value
    const float battery_max = 4.2; //maximum voltage of battery
    const float battery_min = 3.0; //minimum voltage of battery before shutdown

    float R1 = 100000.0; // resistance of R1 (100K)
    float R2 = 27000.0;  // resistance of R2 (10K)

    for (int i = 0; i < 100; i++)
    {
        sum += adc1_get_voltage(ADC1_CHANNEL_0);
        delayMicroseconds(1000);
    }
    // calculate the voltage*/

    voltage = sum / (float)100;
    Serial.println(voltage);
    voltage = (voltage *1.1) / 2047.0; //for internal 1.1v reference
    // use if added divider circuit
    voltage = voltage / (R2/(R1+R2));

标签: carduinoesp32adc

解决方案


我假设您使用的是 ESP32-WROOM-32 模块。

如果您希望从通道 ADC1_CHANNEL_0 而不是 EN 引脚读取,您的寄存器分频器应连接到 SENSOR_VP (VP) 引脚。

ADC1_CHANNEL_0 映射到 SENSOR_VP (VP) 引脚。

您的 EN 引脚应通过 RC 网络(R-> 10k 和 C-> 0.1uF)连接到 +3.3VDC。我怀疑您的模块是否甚至可以启动,因为它处于高电平有效状态并且需要 150uS 延迟才能在每次复位后变为高电平。

确保在第一次调用之前adc1_config_width()执行。adc1_config_channel_atten()adc1_get_voltage()


推荐阅读