尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

BMS系统专栏:BMS_InfoTaskEntry信息管理任务

BMS系统专栏:BMS_InfoTaskEntry信息管理任务
📅 发布时间:2026/6/30 12:31:17

🎬渡水无言:个人主页渡水无言

❄专栏传送门:《linux专栏》《嵌入式linux驱动开发》《linux系统移植专栏》

❄专栏传送门:《freertos专栏》 《STM32 HAL库专栏》《linux裸机开发专栏》

❄专栏传送门:《产品测评专栏》 《Ai智能体专栏) 《ROS开发专栏》

❄专栏传送门:《BMS专栏》
⭐️流水不争先,争的是滔滔不绝

📚博主简介:第二十届中国研究生电子设计竞赛全国二等奖 |国家奖学金 | 省级三好学生

| 省级优秀毕业生获得者 | csdn新星杯TOP1 | 半导纵横专栏博主 | 211在读研究生

在这里主要分享自己学习的linux嵌入式领域知识;有分享错误或者不足的地方欢迎大佬指导,也欢迎各位大佬互相三连

​

目录

前言

一、任务整体定位与调用链路

二、任务主循环 BMS_InfoTaskEntry

2.1、子函数 1:BMS_BattLow 四段式 SOC 电量 LED 指示灯

2.2、子函数 2:BMS_InfoPrintf 全参数串口打印总入口

总结


前言

前几期博客已经完整解析了整套BMS的四大核心业务任务(采集 Monitor、保护 Protect、算法 Analysis、能量管理 Energy),四大任务完成数据采集、安全保护、SOC 容量计算、充放电均衡硬件控制,但是缺少调试日志、人机可视化交互模块。
本期博客主要讲解配套辅助任务 InfoTask(信息管理任务),基于FreeRTOS开发,承担两大核心功能:
周期性串口输出全套电池运行参数,开发调试、现场故障排查;
根据实时 SOC 驱动四路 LED 分段指示剩余电量,无屏幕设备快速直观查看电量。


一、任务整体定位与调用链路

串口日志输出:容量、SOC、单体电压、压差、总压、电流、温度、均衡状态全量打印;
四路 GPIO 电量 LED 分级控制,四段式电量提示;
纯数据读取 + 外设输出,不修改任何电池控制参数,不参与充放电、保护逻辑。

全部数据来自前置四大业务任务全局缓存结构体:

BMS_MonitorData:原始采集总压、回路电流、多路 NTC 温度;
BMS_AnalysisData:SOC、温度修正真实容量、剩余容量、最大压差、平均电压、实时功率;
BMS_EnergyData:均衡掩码,打印时标记正在均衡的电芯。

完整函数调用栈

BMS_InfoInit // 信息任务初始化,创建FreeRTOS线程 └── xTaskCreate └── BMS_InfoTaskEntry // 任务2000ms周期主循环 └── BMS_InfoPrintf() // 信息打印总函数 ├── BMS_BattLow() // SOC电量LED驱动 ├── sprintf格式化串口日志 ├── 循环打印多路温度、单体电压(标注均衡电芯)

二、任务主循环 BMS_InfoTaskEntry

标准 FreeRTOS 无限周期任务,2000ms 阻塞延时,让出 CPU 给高优先级任务:

static void BMS_InfoTaskEntry(void *pvParameters) { (void)pvParameters; for(;;) { BMS_InfoPrintf(); // FreeRTOS毫秒级延时阻塞 vTaskDelay(pdMS_TO_TICKS(INFO_TASK_PERIOD)); } }

2.1、子函数 1:BMS_BattLow 四段式 SOC 电量 LED 指示灯

读取全局 SOC 值,划分 5 个电量区间,控制 4 路 GPIO 指示灯分级点亮,无显示屏设备快速判断剩余电量。

SOC 区间LED1/LED2/LED3/LED4 状态电量说明
SOC == 0.0四灯全亮空电告警,禁止放电
0 < SOC ≤ 0.25LED1/2/3 亮,LED4 灭低电量,建议及时充电
0.25 < SOC ≤ 0.5LED1/2 亮,LED3/4 灭剩余电量一半以内
0.5 < SOC ≤ 0.75LED1 亮,其余熄灭中等电量
0.75 < SOC ≤ 1.0全部熄灭电量充足 / 满电

2.2、子函数 2:BMS_InfoPrintf 全参数串口打印总入口

本函数是信息任务核心,一次性输出 6 大类电池参数,同时刷新电量 LED,所有数据均读取全局缓存,不直接访问 BQ76920 寄存器,不占用 I2C 总线带宽。

static void BMS_InfoPrintf(void) { uint8_t index; char str[64]; BMS_INFO("/*************************************************************/"); // 1、容量相关打印 sprintf(str, "Battery Real Capacity = %0.1fA/H", BMS_AnalysisData.CapacityReal); BMS_INFO("%s", str); sprintf(str, "Battery Remain Capacity = %0.3fA/H", BMS_AnalysisData.CapacityRemain); BMS_INFO("%s", str); print_usart1("\r\n"); // 刷新电量指示灯 BMS_BattLow(); // SOC百分比 sprintf(str, "Battery SOC = %0.1f%%", BMS_AnalysisData.SOC * 100.0f); BMS_INFO("%s", str); // 预留SOH、SOE、SOP扩展打印 /* sprintf(str, "Battery SOH = %0.1f%%", BMS_AnalysisData.SOH * 100); BMS_INFO("%s", str); sprintf(str, "Battery SOE = %0.1f%%", BMS_AnalysisData.SOE * 100); BMS_INFO("%s", str); sprintf(str, "Battery SOP = %0.1f%%", BMS_AnalysisData.SOP * 100); BMS_INFO("%s", str); */ print_usart1("\r\n"); // 2、电芯电压、压差参数 sprintf(str, "Cell Max Voltage = %0.3fV", BMS_AnalysisData.CellVoltMax); BMS_INFO("%s", str); sprintf(str, "Cell Min Voltage = %0.3fV", BMS_AnalysisData.CellVoltMin); BMS_INFO("%s", str); sprintf(str, "Cell Max Voltage Difference = %0.3fV", BMS_AnalysisData.MaxVoltageDifference); BMS_INFO("%s", str); sprintf(str, "Cell Average Voltage = %0.3fV", BMS_AnalysisData.AverageVoltage); BMS_INFO("%s", str); // 实时功率 sprintf(str, "Battery Real Power = %0.3fW", BMS_AnalysisData.PowerReal); BMS_INFO("%s", str); print_usart1("\r\n"); // 3、总压、回路电流 sprintf(str, "Battery Voltage = %0.3fV", BMS_MonitorData.BatteryVoltage); BMS_INFO("%s", str); sprintf(str, "Battery Current = %0.3fA", BMS_MonitorData.BatteryCurrent); BMS_INFO("%s", str); // 4、多路NTC温度循环打印 for (index = 0; index < BMS_MonitorData.CellTempEffectiveNumber; index++) { sprintf(str, "Tempature %d = %0.1f℃", index + 1, BMS_MonitorData.CellTemp[index]); BMS_INFO("%s", str); } print_usart1("\r\n"); // 5、单体电压+均衡状态标记 for (index = 0; index < BMS_GlobalParam.Cell_Real_Number; index++) { sprintf(str, "Cell%-2d Voltage = %-5.3fV %s", index + 1, BMS_MonitorData.CellVoltage[index], (BMS_EnergyData.BalanceRecord & (1U << index)) > 0 ? "--->" : ""); BMS_INFO("%s", str); } BMS_INFO("/*************************************************************/\r\n\r\n"); }

容量数据:温度修正真实容量、剩余可用安时容量;
SOC剩余电量百分比;
电芯均衡核心参数:最高单体电压、最低单体电压、整组压差、平均单体电压;
电气功率:实时充放电功率、电池总电压、回路电流;
多路NTC温度采集值;
每一节单体电压,通过均衡掩码标记正在均衡的电芯(--->标识);
预留 SOH/SOE/SOP 健康度扩展打印接口。


总结

本期博客主要讲解配套辅助任务 InfoTask(信息管理任务),期串口日志打印 + 四路电量 LED 指示灯,开发调试与人机交互。

相关新闻

  • 2026实测必看|5款主流AI编程工具上手教程,前端vibe coding从零落地
  • TikTokCommentScraper:3分钟掌握抖音评论数据采集的终极指南
  • 终极指南:如何快速免费解包微信小程序源码

最新新闻

  • KMS智能激活脚本:一键永久激活Windows和Office的完整解决方案
  • 汽车级MCU评估板硬件设计解析:从电源管理到调试接口
  • Synopsys MetaWare on Linux:从环境配置到AI模型部署实战
  • 云手机哪个好?从底层技术拆解选购核心标准,剖析云手机永久免费套路
  • 群论中的“相似性”:从同构到同态的技术内涵与应用辨析
  • 从理论到实践:利用Python小程序快速求解无线充电LCC补偿网络关键参数

日新闻

  • 【计算机毕业设计案例】基于 Spring Boot+Vue 的电影售票系统设计与实现 前后端分离架构下影院在线购票管理平台(程序+文档+讲解+定制)
  • 到底 TMD 用哪个: npm, pnpm, Yarn, Bun, Deno? 傻瓜, 当然用 npm 啦
  • Google限制Meta使用Gemini模型 凸显AI授权竞争白热化

周新闻

  • Windows字体自定义终极方案:No!! MeiryoUI完全指南
  • Deepin Boot Maker:告别命令行,3分钟制作Linux启动盘的智能解决方案
  • Plain Craft Launcher 2:重新定义你的Minecraft游戏体验

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号