当前位置: 首页 > news >正文

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

http://www.jsqmd.com/news/1095910/

相关文章:

  • 本地电脑装 Ollama 连上 AMD 显卡,离线跑大模型真简单
  • 【漏洞复现实战】CVE-2021-42342 GoAhead LD_PRELOAD注入攻击链深度剖析
  • 【C++】【OpenCV】霍夫直线检测实战:从cv::HoughLinesP参数调优到复杂场景应用
  • 4-20mA电流环原理与STM32工业变送器设计
  • 从夯到拉:大模型岗位锐评(收藏版:小白程序员进阶指南)
  • Redis集群查询原理与实践:解决SCAN命令查询不到数据的困惑
  • 5分钟学会歌词滚动姬:免费在线制作专业滚动歌词的终极指南
  • 性能测试全流程实战:从核心指标到瓶颈定位的工程闭环
  • 实战指南:华为光猫配置解密工具深度应用
  • 从一维到二维:TimesNet如何重塑时间序列分析的通用骨干
  • AI增强写作:从文字搬运工到语义架构师的能力升维
  • Adobe-GenP 3.0:终极Adobe全家桶激活解决方案完整指南
  • 终极指南:如何快速免费解包微信小程序源码
  • 3步快速搞定魔兽争霸3性能优化:从卡顿到300FPS的完整指南
  • 从npm ERR! missing script: build入手,详解package.json脚本配置与项目构建流程
  • UART串口环回测试:FIFO缓冲区的设计与实战
  • 5分钟搞定显示器色彩校准:用novideo_srgb让NVIDIA显卡实现专业级色彩还原
  • 5分钟搞定魔兽争霸3卡顿闪屏:WarcraftHelper终极优化指南
  • 3分钟快速上手:Android Studio中文语言包终极安装配置指南
  • 工业4-20mA电流环接收器设计与实现
  • 终极魔兽争霸3性能优化完整指南:突破60FPS限制实现300+帧率
  • 如何3步搞定魔兽争霸3卡顿问题:WarcraftHelper的终极兼容性解决方案
  • 电商系统Web渗透测试实战指南:从业务逻辑漏洞到防御体系构建
  • 告别文献堆砌内耗!paperxie 四段式文献综述生成,精准对标本硕博学术撰写标准
  • 百考通AI智能降重保留专业术语和核心观点
  • Codex直发测试csdn896200
  • 实战部署OBS RTSP服务器插件:专业级视频流媒体解决方案深度指南
  • 终极指南:如何让旧款Mac电脑运行最新macOS系统
  • HDMI协议:从物理引脚到数据流的全景解析
  • 如何用WarcraftHelper让魔兽争霸3在现代电脑上流畅运行:新手完整指南