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.25 | LED1/2/3 亮,LED4 灭 | 低电量,建议及时充电 |
| 0.25 < SOC ≤ 0.5 | LED1/2 亮,LED3/4 灭 | 剩余电量一半以内 |
| 0.5 < SOC ≤ 0.75 | LED1 亮,其余熄灭 | 中等电量 |
| 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 指示灯,开发调试与人机交互。
