首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何利用内部模数转换器ESP32测量电池电压

如何利用内部模数转换器ESP32测量电池电压
EN

Stack Overflow用户
提问于 2019-07-01 09:42:57
回答 1查看 13.7K关注 0票数 9

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

我将使用LIFEPO4 3.3v规范(最大3.6V)或18650 3.7V/4.2Vmax

EN

回答 1

Stack Overflow用户

发布于 2019-07-01 17:31:05

根据文档

默认的ADC全尺寸电压为1.1V.要读取较高的电压(通常为3.3V),需要为该ADC通道设置>0dB的信号衰减。

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

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

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

代码语言:javascript
运行
复制
#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 if added divider circuit
    // voltage = voltage / (R2/(R1+R2));
    //round value by two precision
    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);
}

如果添加了分频器电路,则需要根据分频器电路的新输出来更改battery_minbattery_max

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56833346

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档