两轮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):
| 类型 | ComWakeup | ChgWakeUp | 说明 |
|---|---|---|---|
| 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=4 | battery_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,避免检测时触发限流 |
| 防盗 AntiLoss | bBatOperate = 1,防盗使能 | bBatOperate = 0,防盗禁用 |
| 存储模式 | 循环 >3 次后可进入 | 不能进入 |
本质:生产线上做下线检测时,防盗、限流这些保护逻辑不能干扰测试流程。出厂前把标志位从 1 改成 0,电池才进入正常运营状态。
本文基于量产 BMS 代码分析。