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

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

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

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

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

专栏传送门 :《BMS专栏

⭐️流水不争先,争的是滔滔不绝

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

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

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

目录

前言

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

[二、任务主循环 BMS_InfoTaskEntry](#二、任务主循环 BMS_InfoTaskEntry)

[2.1、子函数 1:BMS_BattLow 四段式 SOC 电量 LED 指示灯](#2.1、子函数 1:BMS_BattLow 四段式 SOC 电量 LED 指示灯)

[2.2、子函数 2:BMS_InfoPrintf 全参数串口打印总入口](#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:均衡掩码,打印时标记正在均衡的电芯。

完整函数调用栈

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

二、任务主循环 BMS_InfoTaskEntry

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

cpp 复制代码
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 总线带宽。

cpp 复制代码
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 指示灯,开发调试与人机交互。