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

BMS系统专栏:BMS_InfoTaskEntry信息管理任务
渡水无言个人主页渡水无言❄专栏传送门《linux专栏》《嵌入式linux驱动开发》《linux系统移植专栏》❄专栏传送门《freertos专栏》 《STM32 HAL库专栏》《linux裸机开发专栏》❄专栏传送门《产品测评专栏》 《Ai智能体专栏 《ROS开发专栏》❄专栏传送门《BMS专栏》⭐️流水不争先争的是滔滔不绝博主简介第二十届中国研究生电子设计竞赛全国二等奖 |国家奖学金 | 省级三好学生| 省级优秀毕业生获得者 | csdn新星杯TOP1 | 半导纵横专栏博主 | 211在读研究生在这里主要分享自己学习的linux嵌入式领域知识有分享错误或者不足的地方欢迎大佬指导也欢迎各位大佬互相三连​目录前言一、任务整体定位与调用链路二、任务主循环 BMS_InfoTaskEntry2.1、子函数 1BMS_BattLow 四段式 SOC 电量 LED 指示灯2.2、子函数 2BMS_InfoPrintf 全参数串口打印总入口总结前言前几期博客已经完整解析了整套BMS的四大核心业务任务采集 Monitor、保护 Protect、算法 Analysis、能量管理 Energy四大任务完成数据采集、安全保护、SOC 容量计算、充放电均衡硬件控制但是缺少调试日志、人机可视化交互模块。本期博客主要讲解配套辅助任务 InfoTask信息管理任务基于FreeRTOS开发承担两大核心功能周期性串口输出全套电池运行参数开发调试、现场故障排查根据实时 SOC 驱动四路 LED 分段指示剩余电量无屏幕设备快速直观查看电量。一、任务整体定位与调用链路串口日志输出容量、SOC、单体电压、压差、总压、电流、温度、均衡状态全量打印四路 GPIO 电量 LED 分级控制四段式电量提示纯数据读取 外设输出不修改任何电池控制参数不参与充放电、保护逻辑。全部数据来自前置四大业务任务全局缓存结构体BMS_MonitorData原始采集总压、回路电流、多路 NTC 温度BMS_AnalysisDataSOC、温度修正真实容量、剩余容量、最大压差、平均电压、实时功率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、子函数 1BMS_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、子函数 2BMS_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 指示灯开发调试与人机交互。