如何使用内部ADC ESP32测量电池电压

Qua*_* Lê 7 battery arduino esp32

我正在使用(esp32、DHT11、土壤湿度和 nrf24l01)做无线传感器节点,我想添加一个电池来为这些传感器供电,还需要测量电池电压。对于电池,电压总是改变为不能用作 Vcc 参考,所以我发现有一个内部参考电压。任何人都可以完成这个给我一些指导。谢谢

我将使用 LIFEPO4 3.3v 正常(最大 3.6v)或 18650 3.7v/4.2v 最大

M. *_* R. 6

根据文档

默认 ADC 满量程电压为 1.1V。要读取更高的电压(高达引脚最大电压,通常为 3.3V),需要为该 ADC 通道设置 >0dB 信号衰减。

因此将其设置为零为1.1v;接下来,您可以读取电压(在循环中以获得更好的精度),然后将其转换为有效电压并找到电池电量的百分比。

在下面的示例中,该函数将返回电池电量的百分比。请记住根据您的电池电压水平battery_max进行编辑。battery_min我假设您将电池连接到 ADC1 通道 0 (GPIO 36)。

另外,我建议您创建一个电阻分压器电路来降低电压水平。如果您的输入电源电压下降,Arduino 将直接从模拟输入供电,这是不可取的。请记住,您的电压水平不应超过 3.9v。

#include <driver/adc.h>

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 = 3.6; // maximum voltage of battery
    const float battery_min = 3.3; // minimum voltage of battery before shutdown

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

    for (int i = 0; i < 500; i++)
    {
        sum += adc1_get_voltage(ADC1_CHANNEL_0);
        delayMicroseconds(1000);
    }
    // calculate the voltage
    voltage = sum / (float)500;
    voltage = (voltage * 1.1) / 4096.0; // for internal 1.1v reference
    // use it with divider circuit 
    // voltage = voltage / (R2/(R1+R2));
    // round value by two DP
    voltage = roundf(voltage * 100) / 100;
    Serial.print("voltage: ");
    Serial.println(voltage, 2);
    output = ((voltage - battery_min) / (battery_max - battery_min)) * 100;
    if (output < 100)
        return output;
    else
        return 100.0f;
}

void setup()
{
    adc1_config_width(ADC_WIDTH_12Bit);
    adc1_config_channel_atten(ADC1_CHANNEL_0, ADC_ATTEN_0db); //set reference voltage to internal
    Serial.begin(9600);
}

void loop()
{
    Serial.print("Battery Level: ");
    Serial.println(battery_read(), 2);
    delay(1000);
}
Run Code Online (Sandbox Code Playgroud)

如果添加分频电路,则需要根据分频电路的新输出来更改battery_min和。battery_max