esp32中的内部ADC的精度问题

时间:2019-07-04 04:08:11

标签: c arduino esp32 adc

我现在用于测量电池的电路是esp32,nrf24l01和18650。我使用18650 3.6V标称/4.2最大电池为esp32供电。运行一个100k,27k的分压器,然后将其作为测量点0.893V。在3.6V时,测量点约为〜0.72。

我使用内部1.1V ADC,但为什么在监视器上只能接收〜3V My circuit

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));

1 个答案:

答案 0 :(得分:0)

我假设您正在使用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()