6浏览
查看: 6|回复: 0

[ESP8266/ESP32] 基于FireBeetle ESP32 C5 的电量检测

[复制链接]
一. 概述
1.1 测试目的
本报告旨在评估ESP32-C5开发板电量检测功能,此次新出的扩展板自带锂电池接口,验证其在实际应用中的性能和可靠性。(由于本人没有适配扩展板接口的锂电池,只能适用锂电池加上充放电模块测试)

二.测试环境
​主控板: ESP32-C5开发板
​电池: 3.7V 300mA锂电池
​开发环境: Arduino IDE 2.0


三. 硬件配置分析
扩展板锂电池接口特性
根据扩展板设计文档,锂电池接口具备以下特性:

支持3.7V锂电池直接接入
集成充放电保护电路
电压检测分压比:2:1(实测确认)
检测引脚:GPIO33(ADC1_CH9)

硬件连接图:


四.代码编写


  1. #include <Wire.h> // 包含Wire库用于I2C通信
  2. // 配置参数
  3. const int BATTERY_PIN = 33;       // 检测引脚
  4. const float MAX_VOLTAGE = 4.2;    // 锂电池满电电压
  5. const float MIN_VOLTAGE = 3.0;    // 锂电池最低电压
  6. const float VOLTAGE_DIVIDER_RATIO = 2.0; // 分压电阻比例 (R1+R2)/R2
  7. const int ADC_SAMPLES = 16;       // ADC采样次数
  8. void setup() {
  9.   Serial.begin(115200);
  10.   Wire.begin(); // 初始化I2C总线
  11.   
  12.   // 配置ADC
  13.   analogReadResolution(12); // 设置12位ADC分辨率
  14.   analogSetAttenuation(ADC_11db); // 设置11dB衰减 (0-3.9V范围)
  15. }
  16. float read_battery_voltage() {
  17.   int raw = 0;
  18.   for (int i = 0; i < ADC_SAMPLES; i++) {
  19.     raw += analogRead(BATTERY_PIN);
  20.     delay(1);
  21.   }
  22.   raw /= ADC_SAMPLES; // 计算平均值
  23.   
  24.   // 将ADC值转换为电压 (12位ADC,参考电压3.3V)
  25.   float voltage = (raw * 3.3) / 4095.0; // 单位V
  26.   return voltage * VOLTAGE_DIVIDER_RATIO; // 计算实际电池电压
  27. }
  28. int calculate_percentage(float voltage) {
  29.   // 电压超出范围处理
  30.   if (voltage >= MAX_VOLTAGE) return 100;
  31.   if (voltage <= MIN_VOLTAGE) return 0;
  32.   
  33.   // 使用非线性曲线计算电量百分比(更准确)
  34.   // 锂电池放电曲线不是线性的
  35.   float percentage = 0;
  36.   if (voltage > 3.9) {
  37.     percentage = 100 - (4.2 - voltage) * 60;
  38.   } else if (voltage > 3.7) {
  39.     percentage = 60 - (3.9 - voltage) * 100;
  40.   } else if (voltage > 3.5) {
  41.     percentage = 40 - (3.7 - voltage) * 100;
  42.   } else {
  43.     percentage = 10 - (3.5 - voltage) * 20;
  44.   }
  45.   
  46.   // 确保百分比在0-100范围内
  47.   return constrain(percentage, 0, 100);
  48. }
  49. void loop() {
  50.   float voltage = read_battery_voltage();
  51.   int percentage = calculate_percentage(voltage);
  52.   
  53.   // 使用Wire库发送数据(可选)
  54.   Wire.beginTransmission(0x08); // 假设I2C地址为0x08
  55.   Wire.write((byte*)&percentage, sizeof(percentage));
  56.   Wire.endTransmission();
  57.   
  58.   // 串口输出
  59.   Serial.print("电池电压: ");
  60.   Serial.print(voltage, 2);
  61.   Serial.print("V, 电量: ");
  62.   Serial.print(percentage);
  63.   Serial.println("%");
  64.   
  65.   delay(2000); // 每2秒检测一次
  66. }
复制代码
串口数据输出:


五. 问题与改进建议
发现的问题:
扩展板分压电阻精度为5%,影响检测精度
ADC参考电压随温度有轻微漂移
电量估算算法在3.7V平台区不够精确

改进建议:
使用1%精度的分压电阻
增加温度补偿算法
实现基于库仑计法的精确电量计算
添加电池老化补偿
六. 结论
ESP32-C5扩展板的锂电池电量检测功能整体表现良好,能够满足大多数物联网设备的电池监控需求。硬件设计合理,软件接口简单易用。通过本次测试验证,该方案具有以下优势:

​高可靠性: 测试期间无故障发生
​良好的精度: 满足日常应用需求
​低功耗: 适合电池供电设备
​易用性: 接口简单,便于二次开发

SunOctober-202510192068..png
SunOctober-202510191160..jpg
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4 备案 沪公网安备31011502402448

© 2013-2025 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail