渡水无言个人主页渡水无言❄专栏传送门《linux专栏》《嵌入式linux驱动开发》《linux系统移植专栏》❄专栏传送门《freertos专栏》 《STM32 HAL库专栏》《linux裸机开发专栏》❄专栏传送门《产品测评专栏》 《Ai智能体专栏 《ROS开发专栏》❄专栏传送门《BMS专栏》⭐️流水不争先争的是滔滔不绝博主简介第二十届中国研究生电子设计竞赛全国二等奖 |国家奖学金 | 省级三好学生| 省级优秀毕业生获得者 | csdn新星杯TOP1 | 半导纵横专栏博主 | 211在读研究生在这里主要分享自己学习的linux嵌入式领域知识有分享错误或者不足的地方欢迎大佬指导也欢迎各位大佬互相三连目录前言一、任务整体定位与调用关系二、任务主入口 BMS_AnalysisTaskEntry三、基础电气参数计算 BMS_AnalysisEasy四、电池容量与温度校准五、SOC 计算总结前言在前文中我们依次讲解了 BMS_MonitorTask 电池监控任务、BMS_ProtectTask 电池保护任务这两大模块完成了电池原始数据采集与安全防护。本文继续拆解整套 BMS 的第三大核心任务BMS_AnalysisTask 电池状态分析任务。该任务基于监控任务上报的电压、电流、温度原始数据完成基础电气参数计算、温度容量校准、SOC 剩余电量估算、剩余容量统计等核心算法。一、任务整体定位与调用关系BMS_AnalysisTask电池分析任务是 BMS 的算法计算核心运行在监控、保护任务之后主要职责计算电芯最大 / 最小电压、单体压差、电池平均电压、实时功率等基础参数根据环境温度对电池额定容量做动态校准采用 开路电压法 安时积分法 双算法计算 SOC 剩余电量与剩余容量上电完成容量、SOC 初始值校准输出分析后的数据供给上位机显示、整机逻辑决策使用。上下游依赖数据源依赖 BMS_MonitorTask 采集的电压、电流、温度数据联动模块数据供给保护任务、均衡任务、串口 / 485/CAN 上报任务使用运行系统基于 RT-Thread 实时操作系统周期轮询执行。完整函数调用栈BMS_AnalysisInit // 分析任务初始化 创建线程 └── BMS_AnalysisTaskEntry // 任务主入口死循环 ├── BMS_AnalysisCapAndSocInit // 上电容量、SOC初始化校准 ├── BMS_AnalysisEasy // 基础参数计算压差、平均电压、实时功率 ├── BMS_AnalysisCalCap // 电池容量计算 温度校准 │ └── BMS_AnalysisTempCal // 温度补偿算法 └── BMS_AnalysisSocCheck // SOC综合计算 ├── BMS_AnalysisOcvSocCalculate // 开路电压法(OCV) └── BMS_AnalysisAHSocCalculate // 安时积分法(AH)二、任务主入口BMS_AnalysisTaskEntry代码如下所示static void BMS_AnalysisTaskEntry(void *paramter) { // 上电执行一次容量、SOC初始校准 BMS_AnalysisCapAndSocInit(); while(1) { BMS_AnalysisEasy(); // 基础参数计算 BMS_AnalysisCalCap(); // 容量温度校准 BMS_AnalysisSocCheck(); // SOC综合计算 osDelay(ANALYSISI_TASK_PERIOD); // 1s周期延时 } }上电仅运行一次BMS_AnalysisCapAndSocInit完成初始容量、SOC标定进入1秒周期死循环依次执行基础计算 → 容量温度校准 → SOC 计算整体时序稳定符合电池参数变化慢的特性。三、基础电气参数计算 BMS_AnalysisEasy该函数负责简单四则运算类参数读取监控任务的原始电压、电流计算压差、平均电压、实时功率逻辑简单、执行效率高。static void BMS_AnalysisEasy(void) { uint8_t index; // 1. 电芯最大电压差均衡判断核心依据 BMS_AnalysisData.MaxVoltage BMS_MonitorData.CellData[BMS_GlobalParam.Cell_Real_Num - 1].CellVoltage - BMS_MonitorData.CellData[0].CellVoltage; // 2. 整组电芯平均电压 BMS_AnalysisData.AverageVoltage 0; for (index 0; index BMS_GlobalParam.Cell_Real_Num; index) { BMS_AnalysisData.AverageVoltage BMS_MonitorData.CellData[index]; } BMS_AnalysisData.AverageVoltage / BMS_GlobalParam.Cell_Real_Num; // 3. 电池实时功率 P 总电压 × 电流 BMS_AnalysisData.PowerReal BMS_MonitorData.BatteryVoltage * BMS_MonitorData.BatteryCurrent; // 4. 单体最高/最低电压 BMS_AnalysisData.CellVoltMax BMS_MonitorData.CellData[BMS_GlobalParam.Cell_Real_Num - 1].CellVoltage; BMS_AnalysisData.CellVoltMin BMS_MonitorData.CellData[0].CellVoltage; }四、电池容量与温度校准锂电池容量受温度影响极大低温容量衰减、高温加速老化。本模块实现温度动态补偿容量。入口函数static void BMS_AnalysisCalCap(void) { BMS_AnalysisTempCal(); }温度校准核心BMS_AnalysisTempCal额定容量 → 温度修正后实际容量 → 计算剩余容量static void BMS_AnalysisTempCal(void) { static int16_t LastTemp 0; uint8_t Ratio; uint16_t RateTemp; int16_t MinTemp BMS_MonitorData.CellTemp[0] * 10; // 温度数据无效直接退出 if (BMS_MonitorData.CellTempEffectiveNumber 0) { return; } // 温度变化小于1℃不重新校准防抖 if( abs(MinTemp - LastTemp) 10 ) { return; } LastTemp MinTemp; // 分段设置温度补偿系数 if (MinTemp 250) Ratio 1; else if (MinTemp 100) Ratio 2; else if (MinTemp 0) Ratio 3; else if (MinTemp -200) Ratio 4; else if (MinTemp -300) Ratio 5; else Ratio 6; // 计算容量折算率 RateTemp 1000 Ratio * (MinTemp - 250); // 限制折算率上下限 if(RateTemp TEMP_CAP_RATE_LIMITH_HIGH ) RateTemp TEMP_CAP_RATE_LIMITH_HIGH; if(RateTemp TEMP_CAP_RATE_LIMITL_LOW ) RateTemp TEMP_CAP_RATE_LIMITL_LOW; // 动态实际容量 额定容量 × 温度折算率 BMS_AnalysisData.CapacityReal BMS_AnalysisData.CapacityRated * RateTemp / 1000; // 剩余容量 实际容量 × SOC BMS_AnalysisData.CapacityRemain BMS_AnalysisData.CapacityReal * BMS_AnalysisData.SOC; }如果新检测到的温度和上一次相差一度以上则更新如果没有则不校准。校准也是按照分段的某一段对应的斜率不一样进而更符合实际情况。五、SOC 计算结合完整任务执行流程梳理 SOC 相关代码的层级关系BMS_AnalysisTaskEntry 分析任务主循环1s周期运行 ├─ BMS_AnalysisEasy // 基础电压、功率计算 ├─ BMS_AnalysisCalCap // 温度容量校准 └─ BMS_AnalysisSocCheck 【SOC计算总入口】 ├─ BMS_AnalysisOcvSocCalculate // 开路电压(OCV)算法 └─ BMS_AnalysisAHSocCalculate // 安时积分(AH)算法 注意上电会进行初始化 BMS_AnalysisTaskEntry 任务启动仅执行一次 └─ BMS_AnalysisCapAndSocInit // 上电SOC初始化单独逻辑不经过SocCheckBMS_AnalysisSocCheck该函数是运行阶段SOC 计算的唯一入口任务每 1 秒轮询一次依次调用开路电压法和安时积分法两套算法根据电池当前工作模式自动选择生效逻辑。上电瞬间SOC 由 BMS_AnalysisCapAndSocInit 函数完成初始化直接查表不经过本入口设备正常运行待机 / 充电 / 放电 / 睡眠所有 SOC 刷新、修正、计算全部由 BMS_AnalysisSocCheck 驱动。// soc检查SOC计算总入口 static void BMS_AnalysisSocCheck(void) { BMS_AnalysisOcvSocCalculate(); // 开路电压法计算/校准SOC BMS_AnalysisAHSocCalculate(); // 安时积分法计算SOC }代码结构极简采用串行执行双算法的设计两套算法各司其职、互相补充是嵌入式 BMS 经典的OCV 安时积分组合方案。1. BMS_AnalysisOcvSocCalculate开路电压法触发条件仅当系统处于睡眠模式BMS_MODE_SLEEP 时执行。核心作用电池长期静置、电流近似为 0电芯电压回归真实开路电压用于修正安时积分的累积误差。执行细节等待电压稳定延时 → 读取单体电压 → 查表换算 SOC → 更新剩余容量。非睡眠模式该函数内部逻辑不执行直接空运行。2. BMS_AnalysisAHSocCalculate安时积分法触发条件待机、充电、放电 全工况都会执行是动态工况下的主力算法。核心作用基于实时电流做积分运算动态更新剩余容量与 SOC。原理剩余容量变化量 ∫电流 × 采样时间实时积分逻辑BMS 每隔固定周期采集回路电流把每一段周期内的电量变化累加 / 扣减实时更新电池剩余容量再用「剩余容量 ÷ 电池可用实际容量」算出 SOC。工程实现任务周期 200ms/1s把毫秒级时间换算成小时计算单次充放电电量充电剩余容量 本次增量放电剩余容量 - 本次消耗限制边界剩余容量最大不超额定容量、最小不为 0。充电模式累加容量SOC上升放电模式扣减容量SOC下降待机模式根据电压极值强制锁定SOC满电 100%、欠电 0%。补充该算法实时性强但长时间运行会产生积分漂移依赖开路电压法定期校准。系统工作模式开路电压法安时积分法最终 SOC 来源睡眠模式执行校准执行以 OCV 查表结果为准修正积分误差充电模式不执行执行主力安时积分累加容量放电模式不执行执行主力安时积分扣减容量待机模式不执行执行边界锁定电压极值强制 SOC 为 0/100%以完整上电→运行流程为例系统上电 → 分析任务启动 → 执行BMS_AnalysisCapAndSocInit查表得到初始 SOC进入任务 1s 主循环 → 每次循环调用BMS_AnalysisSocCheck设备充电仅安时积分运行持续累加容量设备停机静置 → 进入睡眠模式开路电压法启动修正长期积分误差再次开机放电安时积分继续工作SOC 正常下降。总结BMS_AnalysisTask是整套 BMS 的算法核心承接监控任务的原始数据完成参数运算、温度补偿、SOC 与容量计算。结合前文监控任务、保护任务数据采集 → 安全保护 → 算法分析 → 上位上报。
BMS系统专栏:BMS_AnalysisTask 电池状态分析任务
渡水无言个人主页渡水无言❄专栏传送门《linux专栏》《嵌入式linux驱动开发》《linux系统移植专栏》❄专栏传送门《freertos专栏》 《STM32 HAL库专栏》《linux裸机开发专栏》❄专栏传送门《产品测评专栏》 《Ai智能体专栏 《ROS开发专栏》❄专栏传送门《BMS专栏》⭐️流水不争先争的是滔滔不绝博主简介第二十届中国研究生电子设计竞赛全国二等奖 |国家奖学金 | 省级三好学生| 省级优秀毕业生获得者 | csdn新星杯TOP1 | 半导纵横专栏博主 | 211在读研究生在这里主要分享自己学习的linux嵌入式领域知识有分享错误或者不足的地方欢迎大佬指导也欢迎各位大佬互相三连目录前言一、任务整体定位与调用关系二、任务主入口 BMS_AnalysisTaskEntry三、基础电气参数计算 BMS_AnalysisEasy四、电池容量与温度校准五、SOC 计算总结前言在前文中我们依次讲解了 BMS_MonitorTask 电池监控任务、BMS_ProtectTask 电池保护任务这两大模块完成了电池原始数据采集与安全防护。本文继续拆解整套 BMS 的第三大核心任务BMS_AnalysisTask 电池状态分析任务。该任务基于监控任务上报的电压、电流、温度原始数据完成基础电气参数计算、温度容量校准、SOC 剩余电量估算、剩余容量统计等核心算法。一、任务整体定位与调用关系BMS_AnalysisTask电池分析任务是 BMS 的算法计算核心运行在监控、保护任务之后主要职责计算电芯最大 / 最小电压、单体压差、电池平均电压、实时功率等基础参数根据环境温度对电池额定容量做动态校准采用 开路电压法 安时积分法 双算法计算 SOC 剩余电量与剩余容量上电完成容量、SOC 初始值校准输出分析后的数据供给上位机显示、整机逻辑决策使用。上下游依赖数据源依赖 BMS_MonitorTask 采集的电压、电流、温度数据联动模块数据供给保护任务、均衡任务、串口 / 485/CAN 上报任务使用运行系统基于 RT-Thread 实时操作系统周期轮询执行。完整函数调用栈BMS_AnalysisInit // 分析任务初始化 创建线程 └── BMS_AnalysisTaskEntry // 任务主入口死循环 ├── BMS_AnalysisCapAndSocInit // 上电容量、SOC初始化校准 ├── BMS_AnalysisEasy // 基础参数计算压差、平均电压、实时功率 ├── BMS_AnalysisCalCap // 电池容量计算 温度校准 │ └── BMS_AnalysisTempCal // 温度补偿算法 └── BMS_AnalysisSocCheck // SOC综合计算 ├── BMS_AnalysisOcvSocCalculate // 开路电压法(OCV) └── BMS_AnalysisAHSocCalculate // 安时积分法(AH)二、任务主入口BMS_AnalysisTaskEntry代码如下所示static void BMS_AnalysisTaskEntry(void *paramter) { // 上电执行一次容量、SOC初始校准 BMS_AnalysisCapAndSocInit(); while(1) { BMS_AnalysisEasy(); // 基础参数计算 BMS_AnalysisCalCap(); // 容量温度校准 BMS_AnalysisSocCheck(); // SOC综合计算 osDelay(ANALYSISI_TASK_PERIOD); // 1s周期延时 } }上电仅运行一次BMS_AnalysisCapAndSocInit完成初始容量、SOC标定进入1秒周期死循环依次执行基础计算 → 容量温度校准 → SOC 计算整体时序稳定符合电池参数变化慢的特性。三、基础电气参数计算 BMS_AnalysisEasy该函数负责简单四则运算类参数读取监控任务的原始电压、电流计算压差、平均电压、实时功率逻辑简单、执行效率高。static void BMS_AnalysisEasy(void) { uint8_t index; // 1. 电芯最大电压差均衡判断核心依据 BMS_AnalysisData.MaxVoltage BMS_MonitorData.CellData[BMS_GlobalParam.Cell_Real_Num - 1].CellVoltage - BMS_MonitorData.CellData[0].CellVoltage; // 2. 整组电芯平均电压 BMS_AnalysisData.AverageVoltage 0; for (index 0; index BMS_GlobalParam.Cell_Real_Num; index) { BMS_AnalysisData.AverageVoltage BMS_MonitorData.CellData[index]; } BMS_AnalysisData.AverageVoltage / BMS_GlobalParam.Cell_Real_Num; // 3. 电池实时功率 P 总电压 × 电流 BMS_AnalysisData.PowerReal BMS_MonitorData.BatteryVoltage * BMS_MonitorData.BatteryCurrent; // 4. 单体最高/最低电压 BMS_AnalysisData.CellVoltMax BMS_MonitorData.CellData[BMS_GlobalParam.Cell_Real_Num - 1].CellVoltage; BMS_AnalysisData.CellVoltMin BMS_MonitorData.CellData[0].CellVoltage; }四、电池容量与温度校准锂电池容量受温度影响极大低温容量衰减、高温加速老化。本模块实现温度动态补偿容量。入口函数static void BMS_AnalysisCalCap(void) { BMS_AnalysisTempCal(); }温度校准核心BMS_AnalysisTempCal额定容量 → 温度修正后实际容量 → 计算剩余容量static void BMS_AnalysisTempCal(void) { static int16_t LastTemp 0; uint8_t Ratio; uint16_t RateTemp; int16_t MinTemp BMS_MonitorData.CellTemp[0] * 10; // 温度数据无效直接退出 if (BMS_MonitorData.CellTempEffectiveNumber 0) { return; } // 温度变化小于1℃不重新校准防抖 if( abs(MinTemp - LastTemp) 10 ) { return; } LastTemp MinTemp; // 分段设置温度补偿系数 if (MinTemp 250) Ratio 1; else if (MinTemp 100) Ratio 2; else if (MinTemp 0) Ratio 3; else if (MinTemp -200) Ratio 4; else if (MinTemp -300) Ratio 5; else Ratio 6; // 计算容量折算率 RateTemp 1000 Ratio * (MinTemp - 250); // 限制折算率上下限 if(RateTemp TEMP_CAP_RATE_LIMITH_HIGH ) RateTemp TEMP_CAP_RATE_LIMITH_HIGH; if(RateTemp TEMP_CAP_RATE_LIMITL_LOW ) RateTemp TEMP_CAP_RATE_LIMITL_LOW; // 动态实际容量 额定容量 × 温度折算率 BMS_AnalysisData.CapacityReal BMS_AnalysisData.CapacityRated * RateTemp / 1000; // 剩余容量 实际容量 × SOC BMS_AnalysisData.CapacityRemain BMS_AnalysisData.CapacityReal * BMS_AnalysisData.SOC; }如果新检测到的温度和上一次相差一度以上则更新如果没有则不校准。校准也是按照分段的某一段对应的斜率不一样进而更符合实际情况。五、SOC 计算结合完整任务执行流程梳理 SOC 相关代码的层级关系BMS_AnalysisTaskEntry 分析任务主循环1s周期运行 ├─ BMS_AnalysisEasy // 基础电压、功率计算 ├─ BMS_AnalysisCalCap // 温度容量校准 └─ BMS_AnalysisSocCheck 【SOC计算总入口】 ├─ BMS_AnalysisOcvSocCalculate // 开路电压(OCV)算法 └─ BMS_AnalysisAHSocCalculate // 安时积分(AH)算法 注意上电会进行初始化 BMS_AnalysisTaskEntry 任务启动仅执行一次 └─ BMS_AnalysisCapAndSocInit // 上电SOC初始化单独逻辑不经过SocCheckBMS_AnalysisSocCheck该函数是运行阶段SOC 计算的唯一入口任务每 1 秒轮询一次依次调用开路电压法和安时积分法两套算法根据电池当前工作模式自动选择生效逻辑。上电瞬间SOC 由 BMS_AnalysisCapAndSocInit 函数完成初始化直接查表不经过本入口设备正常运行待机 / 充电 / 放电 / 睡眠所有 SOC 刷新、修正、计算全部由 BMS_AnalysisSocCheck 驱动。// soc检查SOC计算总入口 static void BMS_AnalysisSocCheck(void) { BMS_AnalysisOcvSocCalculate(); // 开路电压法计算/校准SOC BMS_AnalysisAHSocCalculate(); // 安时积分法计算SOC }代码结构极简采用串行执行双算法的设计两套算法各司其职、互相补充是嵌入式 BMS 经典的OCV 安时积分组合方案。1. BMS_AnalysisOcvSocCalculate开路电压法触发条件仅当系统处于睡眠模式BMS_MODE_SLEEP 时执行。核心作用电池长期静置、电流近似为 0电芯电压回归真实开路电压用于修正安时积分的累积误差。执行细节等待电压稳定延时 → 读取单体电压 → 查表换算 SOC → 更新剩余容量。非睡眠模式该函数内部逻辑不执行直接空运行。2. BMS_AnalysisAHSocCalculate安时积分法触发条件待机、充电、放电 全工况都会执行是动态工况下的主力算法。核心作用基于实时电流做积分运算动态更新剩余容量与 SOC。原理剩余容量变化量 ∫电流 × 采样时间实时积分逻辑BMS 每隔固定周期采集回路电流把每一段周期内的电量变化累加 / 扣减实时更新电池剩余容量再用「剩余容量 ÷ 电池可用实际容量」算出 SOC。工程实现任务周期 200ms/1s把毫秒级时间换算成小时计算单次充放电电量充电剩余容量 本次增量放电剩余容量 - 本次消耗限制边界剩余容量最大不超额定容量、最小不为 0。充电模式累加容量SOC上升放电模式扣减容量SOC下降待机模式根据电压极值强制锁定SOC满电 100%、欠电 0%。补充该算法实时性强但长时间运行会产生积分漂移依赖开路电压法定期校准。系统工作模式开路电压法安时积分法最终 SOC 来源睡眠模式执行校准执行以 OCV 查表结果为准修正积分误差充电模式不执行执行主力安时积分累加容量放电模式不执行执行主力安时积分扣减容量待机模式不执行执行边界锁定电压极值强制 SOC 为 0/100%以完整上电→运行流程为例系统上电 → 分析任务启动 → 执行BMS_AnalysisCapAndSocInit查表得到初始 SOC进入任务 1s 主循环 → 每次循环调用BMS_AnalysisSocCheck设备充电仅安时积分运行持续累加容量设备停机静置 → 进入睡眠模式开路电压法启动修正长期积分误差再次开机放电安时积分继续工作SOC 正常下降。总结BMS_AnalysisTask是整套 BMS 的算法核心承接监控任务的原始数据完成参数运算、温度补偿、SOC 与容量计算。结合前文监控任务、保护任务数据采集 → 安全保护 → 算法分析 → 上位上报。