两轮BMS 防打火策略详解

两轮BMS 防打火策略详解
BMS 防打火策略详解本文基于量产 60V BMSSTM32F0 SH367306 AFE拆解防打火的原理与软件实现。一、为什么会打火电动两轮车的电机控制器输入端有大容量电解电容通常几千 µF。BMS 输出端与控制器之间通过接插件连接。BMS 电池 ────[接插件]──── 电机控制器 │ ┌──┴──┐ │ 电容 │ ← 几千 µF初始电压 0V └─────┘当接插件插入瞬间电池电压60V直接加到 0V 的电容上。电容充电电流 I C × dV/dt在 µs 级时间内电流可达几百安——接插件触点处产生电弧打火长期会烧蚀触点、熔毁接插件、甚至击穿 MOS。二、怎么防——预充电路在放电主回路之外加一条预充支路一个小功率 MOS 串一个 22Ω 限流电阻。电池 ──┬── 放电 MOS ──────────┬── 负载 │ │ └── 预充 MOS ── 22Ω ──┘流程1. 预充 MOS 导通放电 MOS 断开 → 电流经 22Ω 电阻给负载电容充电 最大电流 60V / 22Ω ≈ 2.7A安全 2. 等待电容电压充到接近电池电压数百 ms 3. 放电 MOS 导通预充 MOS 断开 → 正常放电无打火三、软件实现Idle 状态机PMM 模块在空闲模式下有一个四级状态机PMM.c:35-39kIdleInit ──→ kIdleFirePrevent ──→ kIdlePowerOn ──→ 放电模式3.1 kIdleInit —— 初始化防打火防打火使能闭合充电 MOS 预充 MOS断开放电 MOS检测到放电电流 30mA用户拧电门→ 进入kIdleFirePrevent防打火未使能直接闭合放电 MOS跳过预充3.2 kIdleFirePrevent —— 执行预充时序PMM.c:156-175// 阶段1预充 MOS 断开 200mss_TimeDelay200ms → PreMos_Ctrl0// 阶段2预充 MOS 闭合 500ms电流经 22Ω 给电容充电200ms ≤ s_TimeDelay900ms → PreMos_Ctrl1// 阶段3预充完成标记防打火结束跳转s_TimeDelay ≥900ms → FirePreventEnd_flg1→ 进入 kIdlePowerOn整个预充时序持续约900ms200ms 断开等待 500ms 导通充电容 200ms 余量。3.3 kIdlePowerOn —— 闭合主回路预充完成后放电 MOS 闭合预充 MOS 断开进入正常放电模式。3.4 防打火重新开启放电结束后电流归零超过2 秒s_FirePreventEnd_flg自动清零下次再有电流时重新走防打火流程。3.5 什么时候触发防打火防打火只在“负载电容可能已经放空了”的时候触发不是每次有电流都走。触发三种情况场景触发原因BMS 上电启动默认IdleStMachine kIdleInit直接走防打火空闲时无电流 2s电容可能通过漏电流放空FirePreventEnd_flg自动清零充电 3 分钟后回空闲IdleStMachine重置为kIdleInit不触发从放电模式退出回空闲时跳过防打火直接跳到kIdlePowerOn// 从放电退出到idle模式,先到poweron模式// (退到init中立刻拧电门有掉电的风险)IdleStMachine_enumkIdlePowerOn;因为刚放完电负载电容还满着——不需要预充。而且用户可能是等红灯松油门马上又要拧——如果每次都走 700ms 防打火体验会很差。四、短路保护联动短路发生后即使 AFE 已经在 50µs 关断了放电 MOSMCU 端的 PreChgIf 也会主动闭合预充 MOSPreChgIf.c:122-125// 发生短路强制进行预充if(g_Afe1SampleRawData.ShortCircuitPreChg_Cnt!0){g_PreChg_cmd1U;// 强制闭合预充 MOS}短路可能是负载电容充电的瞬时大电流导致的误判——强制预充相当于给电容一次温柔充电的机会如果充满后不再触发短路说明是容性负载而非真短路。五、预充电路故障检测预充支路通过 ADC 检测预充电阻上的电流PreChgIf.c:137// 22Ω 采样电阻ADC 读数换算为电流g_PreChgCurrent_mAADC值 ×33×10×1000/(4095×22);如果预充电流 2A 持续 1s判定预充电路故障电阻短路或 MOS 击穿上报PreChgCircuitFlt同时禁用防打火功能。六、关键参数参数值说明预充电阻22Ω限流60V 电池最大预充电流 ~2.7A预充等待200ms断开等待预充导通500ms电容充电时间预充总时长~900ms防打火重开无电流 2s自动重置预充故障判定2A 持续 1s电阻短路/MOS 击穿七、200ms 断开阶段的作用用户拧电门 →kIdleInit检测到电流 → 进入kIdleFirePrevent→ 预充 MOS 先断开 200ms。这 200ms 不是充电容而是状态复位进入kIdleFirePrevent之前预充 MOS 在kIdleInit里已经是闭合的。先断开才有明确的预充起点给电路一个静默窗口等残余电流或接触抖动消退如果 200ms 内电流归零说明用户只是碰了一下油门而非真要骑车不需要后续流程八、为什么用时间预估而不是检测外侧电压更好的方案是外侧加电压采集 → 读到 V_out ≈ V_bat 就切主 MOS。但这需要一路 ADC 两个分压电阻60V → 3.3V板子上没做纯粹是省成本。时间预估为什么够用最差情况预充电阻 22Ω负载电容 5000µF τ 22 × 0.005 110ms 5τ 550ms → 充到 99% 实际给 500ms电容再大也充到 95%压差仅 ~3V残余电流 140mA → 不打火如果有外侧电压采集逻辑可以简化成两个状态还能额外获得自适应电容、预充超时故障检测、MOS 粘连检测、接插件松动检测——但代价就是那两个电阻。本文基于量产 BMS 代码分析。