两轮BMS 电源模式管理 (PMM) 详解

📅 2026/7/6 3:23:48 👁️ 阅读次数 📝 编程学习
两轮BMS 电源模式管理 (PMM) 详解

BMS 电源模式管理 (PMM) 详解

基于量产 60V BMS(STM32F0 + SH367306 AFE),拆解 PMM 五大系统模式的定义、切换逻辑与联动关系。


一、五大系统模式

PMM.h:45-52:

┌──────────┐ 上电 ──→│ kIdle │ 空闲模式 └────┬─────┘ │ ┌─────────────┼─────────────┐ │ 充电电流 │ 放电电流 │ 超时/欠压 ▼ ▼ ▼ ┌─────────┐ ┌─────────┐ ┌──────────┐ │ kChg │ │ kDsg │ │ kSleep │ │ 充电模式 │ │ 放电模式 │ │ 休眠模式 │ └─────────┘ └─────────┘ └──────────┘ │ ┌──────────┐ │ kReset │ 复位模式 └──────────┘
模式充电 MOS放电 MOS预充 MOS
kIdle空闲(防打火使能)闭合断开通断时序
kIdle空闲(防打火关闭)闭合闭合断开
kChg充电闭合闭合断开
kDsg放电闭合闭合断开
kSleep休眠断开断开断开
kReset复位断开断开断开

充放电 MOS 是背靠背串联的,正常工作时(充电或放电)两个都闭合。只在保护触发时才单独关断——forbidCharge关充电 MOS,forbidDisCharge关放电 MOS。充电时放电 MOS 闭合可以减少体二极管导通损耗(MOSFET Rds(on) 远小于体二极管 Vf)。


二、模式切换逻辑

核心在kPMMMode_IdleModeM(PMM.c:256-297),只根据电流方向判断

if(SystemCurrent<-500mA)→ kChg// 检测到充电电流if(SystemCurrent ≈0或 防打火中)→ kIdle// 维持空闲if(SystemCurrent>500mA)→ kDsg// 检测到放电电流

各模式内部也有返回空闲或切换到其他模式的逻辑:

kIdle ──→ 充电电流 ──→ kChg kIdle ──→ 放电电流 ──→ kDsg kIdle ──→ 超时+欠压 ─→ kSleep kChg ──→ 电流归零 500ms ─→ kIdle kChg ──→ 放电电流 ──────→ kDsg (拔充电器直接走) kDsg ──→ 电流归零 1s ────→ kIdle kDsg ──→ 充电电流 ──────→ kChg (插充电器直接走)

三、各模式详解

3.1 空闲模式 (kIdle)

系统的"大厅"——不上不下不充不放时都在这里。

内部还有一个四级子状态机管理防打火(PMM.c:33-39):

kIdleInit → kIdleFirePrevent → kIdlePowerOn → 转 kDsg

同时在此模式下判断休眠条件:静置超时、单体欠压、单体超低压。

3.2 充电模式 (kChg)

充电电流触发,充电 MOS 和放电 MOS 均闭合。

进入后做的事:

  • 满充检测:超过 3 分钟重置 Idle 子状态机
  • 禁止充电/放电检查:FDR 故障标志位会强制关断对应 MOS
  • 满充断开:收到BatFullChrgState == kFullChg时断开充电 MOS
  • 退出:电流归零 500ms → kIdle;出现放电电流 → kDsg

3.3 放电模式 (kDsg)

放电电流触发,闭合充放电 MOS。

进入后做的事:

  • 运行限流调节kPMMMode_CurLimitRegulate(占空比增减)
  • 检测充电电流 → 切 kChg
  • 检测电流归零 1s → 切 kIdle
  • 禁止放电标志位强制关断放电 MOS

3.4 休眠模式 (kSleep)

全部 MOS 断开,MCU 低功耗。

四种触发类型(PMM.h:57):

类型触发条件典型场景
1上位机强制命令远程关停
2单体欠压电池快没电,保护性休眠
3单体超低压紧急,电池严重亏电
4静置超时 + SOC<20%用户长时间不用

唤醒方式:休眠前 MCU 将唤醒源配置为 GPIO 边沿中断,然后进入 STOP 模式。唤醒后硬件复位,软件根据中断标志识别唤醒源:

唤醒源硬件说明
通信唤醒(ComWakeup)UART/RS485 RX 引脚边沿中断充电柜或 4G 模组发来数据时触发
充电唤醒(ChgWakeUp)充电器插入检测引脚上升沿充电器插入瞬间电压跳变触发

各休眠类型的唤醒配置(PMM.c:709-743):

类型ComWakeupChgWakeUp说明
1 强制通信或充电都能唤醒
2 欠压通信或充电都能唤醒
3 超低压只能充电唤醒,通信已关闭以省电
4 静置通信或充电都能唤醒

超低压休眠(类型 3)是最极端的情况——电池电压已经低到不足以维持通信模块,所以关闭通信唤醒,只保留充电器插入这一条"救命"路径。

3.5 复位模式 (kReset)

强制全关 + 状态归零。

触发:上位机下发复位命令。所有 MOS 断开,内部计数器清零,回到kIdleInit

3.6 存储模式(kIdle 下的子状态)

存储模式不是独立的 PMM 顶层模式,而是空闲模式下的低活动优化状态。MCU 仍在运行,MOS 同空闲模式,只是降低非必要操作的频率。进入后 4G 模组上报battery_state = 6

进入条件(PMM.c:608-618):空闲模式下满足全部四种条件且持续60 分钟——

if(SystemMode==kIdle&&循环次数>3// 电池已完整充放过至少 3 次&&无系统故障&&有密钥)// 防盗:无密钥不进存储{if(StoreMode_Cnt>=60分钟)BmsStoreMode_flg=1;}

进入后的变化:

模块正常空闲存储模式
DSM 数据存储间隔10 分钟2 小时(减少 Flash 擦写)
4G 上报状态battery_state=4battery_state=6
退出条件有电流 / 出故障 / 密钥被清 → 立即退出

与休眠模式 (kSleep) 的区别:

存储模式休眠模式
MCU正常运行STOP 低功耗
MOS同空闲全部断开
通信保持关闭等唤醒
本质闲着,少干点活彻底关,等唤醒
恢复有电流立退必须唤醒源触发

设计意图:电池长期放在仓库或柜子里不用时,没必要每 10 分钟写 Flash 浪费寿命,把存储间隔拉到 2 小时就够了。用户一取用,立退恢复正常。


四、对外的 SystemStatus

PMM 内部用SystemMode做状态机,对外用SystemStatus上报(PMM.h:19-24):

kPMMIdle=0// 空闲kPMMChging=1// 充电中kPMMDsging=2// 放电中

SystemStatus被 LED 指示灯、4G 模块、Modbus 寄存器使用,告知外部"电池在干什么"。它和内部SystemMode不是一一对应——比如在kIdle里跑防打火子状态机,对外仍报kPMMIdle


五、工厂模式 vs 运营模式

这不是 PMM 的系统模式,而是 EEPROM 中FuncConfig2.FactoryMode的一个配置位,影响多个模块的行为:

标志位= 0= 1
FactoryMode运营模式工厂模式(下线检测)

由上位机在生产线下线时写入,出厂前置 0。三处行为差异:

模块运营模式 (0)工厂模式 (1)
PMM 限流SOP 查表动态限流(35A~1.5C)固定 1.5C,避免检测时触发限流
防盗 AntiLossbBatOperate = 1,防盗使能bBatOperate = 0,防盗禁用
存储模式循环 >3 次后可进入不能进入

本质:生产线上做下线检测时,防盗、限流这些保护逻辑不能干扰测试流程。出厂前把标志位从 1 改成 0,电池才进入正常运营状态。


本文基于量产 BMS 代码分析。