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

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

专栏传送门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 指示灯,开发调试与人机交互。