当前位置: 首页 > news >正文

ADC电压检测实现电池电量百分比显示

目录

1、使用一阶滞后滤波

2、查表 + 分段判断

3、结构体数组 + 插值法

4、迟滞机制(电量一直在跳是噪声干扰或负载波动导致电压抖动)

5、低功耗采样建议

6、升级

7、电压型迟滞回差(Hysteresis)电量判断(四格电量显示)

核心参数

代码示例


1、使用一阶滞后滤波

#define ALPHA 0.2f static float filtered_voltage = 0.0f; filtered_voltage = ALPHA * raw_voltage + (1.0f - ALPHA) * filtered_voltage;

2、查表 + 分段判断

uint8_t Calculate_Battery_Level(float voltage) { if (voltage >= 4.15f) return 100; if (voltage >= 4.00f) return 90; if (voltage >= 3.90f) return 80; if (voltage >= 3.80f) return 70; if (voltage >= 3.70f) return 60; if (voltage >= 3.60f) return 50; if (voltage >= 3.50f) return 40; if (voltage >= 3.45f) return 30; if (voltage >= 3.40f) return 20; if (voltage >= 3.35f) return 10; if (voltage >= 3.30f) return 5; return 0; }

3、结构体数组 + 插值法

typedef struct { float voltage; uint8_t level; } soc_point_t; const soc_point_t battery_curve[] = { {4.20f, 100}, {3.90f, 80}, {3.70f, 50}, {3.50f, 20}, {3.30f, 0} }; #define CURVE_SIZE (sizeof(battery_curve)/sizeof(battery_curve[0])) uint8_t interpolate_soc(float voltage) { if (voltage >= battery_curve[0].voltage) return 100; if (voltage <= battery_curve[CURVE_SIZE-1].voltage) return 0; for (int i = 0; i < CURVE_SIZE - 1; i++) { if (voltage > battery_curve[i+1].voltage) { float ratio = (voltage - battery_curve[i+1].voltage) / (battery_curve[i].voltage - battery_curve[i+1].voltage); return battery_curve[i+1].level + (uint8_t)(ratio * (battery_curve[i].level - battery_curve[i+1].level)); } } return 0; }

4、迟滞机制(电量一直在跳是噪声干扰或负载波动导致电压抖动

#define BATT_HYSTERESIS 2 // ±2%以内不更新 if (abs(new_level - displayed_level) >= BATT_HYSTERESIS) { Update_Display(new_level); displayed_level = new_level; }

5、低功耗采样建议

  • 用定时器触发ADC,避免CPU轮询
  • 平时关闭ADC时钟,采样时再开启
  • 在Stop Mode下通过RTC唤醒,完成一次采样后继续睡眠、

6、升级

  • 加NTC测温,做温度补偿
  • 接入充电管理芯片的状态中断
  • 实现简易库仑积分(用电流×时间估算耗电)
  • 结合蓝牙上报历史电量曲线,做健康度分析

7、电压型迟滞回差(Hysteresis)电量判断(四格电量显示)

简单一句话:升档用高电压门槛,降档用更低的电压门槛,防止电压在临界点小幅抖动时电量格来回闪

核心参数

#define BATT_HYSTERESIS_MV 30U //回差30mV

代码示例

/** * @brief 根据毫伏值获取电池格数 (0-4格),增加全域迟滞回差 H=20mV * @param voltage_mv 滤波之后毫伏值 (3000-4200mV) */ uint16_t textVbat = 0; #define BATT_HYSTERESIS_MV 20U //回差 uint8_t Get_Battery_Levels(uint16_t voltage_mv) { // static保存上一次输出电量等级,实现迟滞回差 static uint8_t last_level = 0; const float K = (47.0f + 24.0f) / 24.0f; //电阻分压比 uint16_t real_vbat = (uint16_t)(voltage_mv * K + 0.5f); textVbat = real_vbat; //升格阈值 const uint16_t LVL4_UP = 3950; const uint16_t LVL3_UP = 3700U; const uint16_t LVL2_UP = 3450U; const uint16_t LVL1_UP = 3200U; //降格阈值 = 升格阈值 - 回差 const uint16_t LVL4_DOWN = LVL4_UP - BATT_HYSTERESIS_MV; const uint16_t LVL3_DOWN = LVL3_UP - BATT_HYSTERESIS_MV;//3700U-20=3780U const uint16_t LVL2_DOWN = LVL2_UP - BATT_HYSTERESIS_MV; const uint16_t LVL1_DOWN = LVL1_UP - BATT_HYSTERESIS_MV; //先计算候选档位(原始阈值) uint8_t candidate; if(real_vbat >= LVL4_UP) candidate = 4; else if(real_vbat >= LVL3_UP) candidate = 3; else if(real_vbat >= LVL2_UP) candidate = 2; else if(real_vbat >= LVL1_UP) candidate = 1; else candidate = 0; uint8_t new_level = last_level; //迟滞回差状态机 switch(last_level) { case 4: //4格往下掉,必须小于LVL4_DOWN才允许降级 if(real_vbat < LVL4_DOWN) { new_level = candidate; } break; case 3: //可以升4格;或者电压足够低才降级 if(real_vbat >= LVL4_UP) { new_level = 4; } else if(real_vbat < LVL3_DOWN) { new_level = candidate; } break; case 2: if(real_vbat >= LVL3_UP) { new_level = 3; } else if(real_vbat < LVL2_DOWN) { new_level = candidate; } break; case 1: if(real_vbat >= LVL2_UP) { new_level = 2; } else if(real_vbat < LVL1_DOWN) { new_level = candidate; } break; case 0: if(real_vbat >= LVL1_UP) { new_level = 1; } break; default: new_level = candidate; break; } last_level = new_level; return last_level; }
http://www.cnnetsun.cn/news/3908317.html

相关文章:

  • UE5新手避坑指南:Gameplay框架与增强输入系统实战配置
  • 计算机毕业设计之基于spring boot的旅游管理系统
  • 如何快速修复微信网页版:3步安装终极跨浏览器兼容指南 [特殊字符]
  • 千亿参数大模型Kimi-K3实测:从部署到性能的深度评测与工程实践
  • 北京 网站建设 京icp备案全流程解析与企业级解决方案深度指南
  • 大容量电池测试恒温箱
  • 【Games101】C++ 基础软光栅化器:光栅化三角形(Cmake 配置 Eigen OpenCV 库)
  • 从AI直播智能体实践,拆解智能体工作流构建的核心工程逻辑
  • LensWalk:基于主动视觉的视频理解新范式与工程实践
  • 5分钟掌握RPG Maker解密工具:游戏资源提取与修改终极指南
  • Fast-GitHub终极指南:国内开发者必备的GitHub加速神器
  • 探秘全国建设管理信息网站:数字化转型浪潮下的行业变革与未来展望
  • 09 LOD 与大型数字孪生模型管理
  • 5分钟掌握专业EPUB电子书制作:免费开源在线编辑器终极指南
  • Nintendo Switch破解终极指南:大气层系统1.7.1完整安装与优化教程
  • 矩阵系统,ai数字人生成,声音克隆
  • 通达信数据接口终极指南:3步免费获取专业金融数据
  • 如何解决多输入法词库兼容性问题:开源深蓝词库转换工具技术深度解析
  • 铜官山区建设局网站如何助力城市更新与民生幸福 深度解析官方平台的服务功能与便民指南
  • Unity游戏开发:构建模块化通关失败处理系统
  • 微软 Edge 停用 MV2 扩展程序平台,uBlock Origin 等广告拦截器将无法使用
  • windows快捷菜单(简化菜单/新版菜单/IExplorerCommand)开发指南
  • 又一次面试整理
  • IP组播完全入门指南(从零到HCIP)
  • 戴尔网站建设的目标:如何打造符合企业长期发展的专业数字门户
  • SpringBoot图书馆座位管理系统设计与实现
  • 宣城网站建设jidela 揭秘:如何让本地中小企业的官网不再是“摆设”,真正带来业务增长?
  • RAG与LoRA技术融合:构建希腊语多领域专家模型的实战指南
  • 跨境电商多语种本地化实战指南与避坑策略
  • Windows系统kernelbase.dll丢失问题的安全修复方案