1. 从两个串联电芯说起:为什么被动均衡在储能BMS里依然是主流选择
储能系统和备用电源系统里,电池组几乎都是多串结构。两串、四串、十六串,甚至上百串。只要电芯是串联的,就绕不开一个老问题:电芯一致性。出厂时配组再严格,经过几十上百次充放电循环之后,内阻、容量、自放电率都会出现离散,木桶效应就出来了——整组可用容量由最弱的那颗电芯决定,充电时最弱的那颗先到上限,放电时它又最先触底。
解决这个问题的技术路线分两大类:被动均衡和主动均衡。主动均衡用变压器、电感或者电容做能量搬运,效率高、发热小,但电路复杂、成本高、EMC难搞。被动均衡说白了就是给电压偏高的那颗电芯并一个电阻放电,把多余的能量以热的形式消耗掉。听起来很"笨",但在两串这种低压小容量场景里,被动均衡的性价比高得离谱——元件少、控制简单、可靠性高,而且两串系统的能量损失本来就不大。
这次要聊的方案,就是用MP2642GR-Z这颗均衡前端配合STM32F415ZG主控,做一套两串电池的被动均衡系统。MP2642GR-Z 是一颗专门为多串电池管理设计的模拟前端,内部集成了均衡开关和驱动,能直接对单节电芯做放电均衡;STM32F415ZG 是 ST 家的 Cortex-M4 高性能 MCU,带 FPU、主频 168MHz、1MB Flash、192KB SRAM,资源对于两串 BMS 来说绰绰有余,还能留出大量余量跑 SOC 估算、通信协议和故障诊断。
这套组合适合谁看?如果你正在做储能BMS、备用电源、便携式储能、小型UPS,或者任何两串锂电/磷酸铁锂/钛酸锂的管理板,这篇文章里的选型逻辑、均衡策略、采样时序和踩坑经验都能直接拿去用。下面我会从硬件接口、均衡触发逻辑、采样与均衡的时序冲突、软件状态机、实测数据几个维度,把整套方案拆开讲透。
2. MP2642GR-Z 的均衡通道到底怎么接:引脚、驱动方式与外围元件计算
2.1 先搞清楚 MP2642GR-Z 在系统里的角色定位
MP2642GR-Z 不是一颗单纯的"均衡开关",它更像是一个电池管理模拟前端(AFE),集成了电压采样、均衡驱动、过压欠压保护这些基础功能。在两串系统里,它的典型接法是:电芯正负极分别接到对应的采样通道,内部均衡 MOS 管和外部均衡电阻配合,对目标电芯放电。
这里有个关键点很多人会忽略:MP2642GR-Z 的均衡通道是"内置开关+外置电阻"的结构。芯片内部集成了均衡 MOS,但放电电阻必须外置。为什么?因为放电电流和功耗取决于电阻值,芯片封装散热能力有限,把发热大户放到外部,芯片只负责开关控制,这样热设计更灵活。
两串系统的典型连接是这样的:
- 电芯1(底部电芯)正极接 MP2642GR-Z 的 C1 引脚,负极接 C0(系统地)
- 电芯2(顶部电芯)正极接 C2 引脚,负极接 C1
- 均衡电阻分别接在 C1-C0 之间和 C2-C1 之间,通过芯片内部开关控制通断
注意:C0 是芯片的"地参考",但它不一定等于系统 GND。如果采用高边采样架构,C0 可能浮空。具体接法要看芯片数据手册里的典型应用电路,不同版本可能有差异。
2.2 均衡电阻怎么算:从放电电流反推阻值
均衡电阻的选型核心就一个公式:
I_balance = V_cell / R_balance
假设电芯是磷酸铁锂,标称 3.2V,均衡电流想做到 50mA,那么:
R_balance = 3.2V / 0.05A = 64Ω
取标准值 62Ω 或 68Ω。对应的功耗:
P = V² / R = 3.2² / 62 ≈ 165mW
所以电阻封装至少要用 0805 或者 1206,0603 的额定功率通常只有 100mW,长期跑会飘。我一般直接用 1206、0.25W 的厚膜电阻,留足降额。
那均衡电流选多大合适?这取决于你的电池容量和应用场景。经验值是:均衡电流取电池容量的 0.5%~2%。比如 10Ah 的电池组,均衡电流 50mA~200mA 都合理。太小了均衡慢,太大了发热严重、效率低。两串系统里,我通常取 50~100mA 这个区间,兼顾速度和热设计。
2.3 外围保护元件不能省
均衡电阻旁边一定要并一颗小电容吗?不一定,但TVS 或者稳压二极管建议加上。原因在于:均衡 MOS 关断瞬间,电芯到芯片引脚之间的走线电感会产生尖峰,虽然能量不大,但长期反复冲击会缩短芯片寿命。我在 C1、C2 对地各并了一颗 5.6V 的稳压管,实测关断尖峰从 4.8V 压到了 3.9V 左右,效果明显。
另外,采样走线要开尔文连接。什么意思?电压采样点必须直接从电芯极耳或者焊盘上取,不能从均衡电流流过的路径上取。否则均衡一开,走线电阻上的压降会叠加到采样值里,导致电压读数偏低,均衡逻辑就会误判。这个坑我在早期项目里踩过,均衡开启后采样值掉了 30mV,直接导致均衡反复启停。
3. STM32F415ZG 的资源分配:为什么不用更便宜的 F103
3.1 算力需求分析
有人会问:两串 BMS 而已,用 STM32F103 这种 M3 内核的芯片不够吗?便宜一半呢。答案是:看你要不要跑 SOC 估算和复杂通信。
如果只是做简单的电压比较、控制均衡开关、通过 UART 上报数据,F103 确实够。但一旦涉及以下任何一项,F415 的优势就出来了:
- SOC 估算:安时积分 + 开路电压修正 + 内阻补偿,涉及浮点运算。F415 带 FPU,单精度浮点一条指令搞定,F103 要靠软件模拟,慢一个数量级。
- 多路通信:CAN + UART + I2C 同时跑,F415 的 192KB SRAM 和丰富外设让缓冲管理轻松很多。
- 数据记录:1MB Flash 可以存几千条历史数据,F103 通常只有 64KB~128KB,存不了多少。
- 未来扩展:如果后面要加绝缘检测、温度巡检、均衡策略升级,F415 的余量足够。
我个人的选型原则是:BMS 主控的算力至少留 50% 余量。因为电池管理这东西,需求会随着项目推进不断加码,一开始说"就两串",后面可能变成"四串",再后面要加 CAN 通信、要加历史存储、要加诊断。选 F415 就是给自己留后路。
3.2 外设分配表
| 外设 | 用途 | 备注 |
|---|---|---|
| ADC1_IN0~IN1 | 电芯电压采样(备用) | 实际用 MP2642GR-Z 内部 ADC |
| SPI1 | 与 MP2642GR-Z 通信 | 配置寄存器、读电压 |
| USART2 | 上位机通信 | 调试和参数配置 |
| CAN1 | 系统总线 | 与 PCS/逆变器通信 |
| TIM2 | 均衡计时 | 1ms 基准 |
| IWDG | 看门狗 | 防止程序跑飞 |
| GPIO | 均衡使能、状态指示 | 推挽输出 |
这里要说明:MP2642GR-Z 本身有电压采样能力,STM32 的 ADC 可以作为冗余校验。两路采样值对比,偏差超过阈值就报故障,这是功能安全的基本思路。
3.3 时钟与低功耗配置
F415 跑 168MHz 需要外部 8MHz 晶振 + PLL 倍频。BMS 通常不需要低功耗模式,因为要持续监控。但备用电源系统里,如果市电断了、系统靠电池待机,MCU 的功耗也要考虑。F415 在 Sleep 模式下大概 30mA 左右,Stop 模式能降到几百微安。我的做法是:正常监控时全速跑,进入待机后切到 Stop 模式,靠 RTC 或者外部中断唤醒,每隔 100ms 醒来采样一次。
4. 均衡策略设计:什么时候开、开多久、怎么停
4.1 均衡触发的三个条件
被动均衡不是想开就开的。我见过有人写代码,只要检测到电压差超过 50mV 就开均衡,结果电池在放电过程中均衡一直在工作,白白浪费能量。正确的触发逻辑应该同时满足:
- 电压差超过阈值:通常取 30~50mV。太小了频繁启停,太大了均衡效果差。
- 电池处于静置或充电状态:放电过程中均衡没有意义,因为电压差可能只是内阻差异导致的,不是容量差异。
- 温度在安全范围内:0~45℃,超出范围禁止均衡,防止过热。
具体到代码里,我用一个状态机来管理:
typedef enum { BAL_IDLE, // 空闲,不均衡 BAL_CHECK, // 检测条件 BAL_ACTIVE, // 均衡中 BAL_COOLDOWN, // 冷却 BAL_FAULT // 故障 } BalState_t;4.2 均衡占空比控制:不是一直开就最好
均衡电阻一直通电,发热会累积。我的做法是PWM 式间歇均衡:开 2 秒,关 1 秒,循环。这样平均功耗降到 2/3,但均衡效果几乎不受影响,因为电芯的热时间常数远大于这个周期。
具体参数怎么定?看你的热设计。如果均衡电阻温升控制在 20℃ 以内,可以连续开;如果温升超过 40℃,就必须降占空比。我用 1206 电阻、62Ω、3.2V 条件下,连续开的稳态温升大概 35℃,环境温度 25℃ 时电阻表面 60℃ 左右,可以接受但余量不大。改成 2:1 占空比后,温升降到 25℃ 左右,舒服很多。
4.3 均衡终止条件
均衡什么时候停?三个条件任一满足就停:
- 电压差降到阈值以下(比如从 50mV 降到 10mV)
- 均衡总时长超过上限(比如 2 小时)
- 温度超过保护阈值
这里有个细节:电压差降到阈值以下后,不要立刻重新触发。要加一个回差,比如触发阈值 50mV,终止阈值 10mV,中间 40mV 的迟滞带。否则电压差在阈值附近抖动,均衡会频繁启停,MOS 管和电阻都受不了。
5. 采样与均衡的时序冲突:这个坑我踩了整整两天
5.1 问题现象:均衡一开,电压读数就飘
最早调试的时候,我发现一个诡异现象:均衡关闭时,两串电压读数分别是 3.35V 和 3.28V,压差 70mV,触发均衡。均衡开启后,再读电压,变成了 3.31V 和 3.30V,压差只剩 10mV,均衡立刻停止。停止后读数又回到 3.35V 和 3.28V,再次触发。如此反复,均衡实际上根本没怎么工作。
5.2 根因定位:走线电阻和采样时机
排查过程分三步:
第一步,确认是不是采样电路问题。用万用表直接量电芯极耳电压,确认实际压差确实是 70mV,采样电路没问题。
第二步,检查均衡电流路径。发现均衡电阻的接地点和采样地不是同一个点,均衡电流在走线电阻上产生了压降,叠加到了采样回路里。
第三步,看采样时机。代码里是在均衡 MOS 开启状态下读的电压,这时候均衡电流正在流动,采样值自然包含了走线压降。
5.3 解决方案:采样和均衡必须分时
最终方案是采样与均衡严格分时:
- 关闭均衡 MOS
- 等待 10ms 让电压稳定(走线电感释放、采样电容充电)
- 读取电压
- 判断是否需要均衡
- 如果需要,开启均衡
- 均衡持续 2 秒
- 回到步骤 1
这样采样时均衡是关断的,读数就是电芯的真实开路电压(或接近开路电压)。10ms 的等待时间是实测出来的:5ms 时读数还有 5mV 左右的偏差,10ms 后基本稳定。
提示:如果你的采样电路有 RC 滤波,等待时间要加上 RC 时间常数的 5 倍以上。比如 R=1k、C=100nF,时间常数 0.1ms,5 倍就是 0.5ms,那 10ms 绰绰有余。
5.4 改进后的效果
改成采样均衡分时之后,电压读数稳定了,均衡逻辑也正常了。实测从压差 70mV 均衡到 10mV 以内,用了大约 40 分钟,均衡电阻温升 28℃,完全在可控范围内。
6. 软件状态机实现:从初始化到故障处理的完整流程
6.1 初始化阶段要做的五件事
上电之后,STM32F415ZG 的初始化顺序很关键,顺序错了可能导致 MP2642GR-Z 配置失败:
- 时钟树配置:先配 HSE 和 PLL,确保系统时钟 168MHz 稳定。
- GPIO 初始化:均衡使能引脚先拉低,确保上电时均衡是关闭的。
- SPI 初始化:配置 SPI1 为主机模式,时钟极性相位要和 MP2642GR-Z 匹配。
- MP2642GR-Z 配置:写配置寄存器,设置采样速率、均衡通道使能、保护阈值。
- 定时器启动:TIM2 配置为 1ms 中断,作为系统时基。
这里有个容易忽略的点:MP2642GR-Z 上电后需要一段稳定时间,数据手册里写的是 5ms,但我实测下来 10ms 更稳妥。如果上电后立刻通信,偶尔会出现配置写入失败。加 10ms 延时后,再没出现过。
6.2 主循环的任务调度
主循环我用的是时间片轮询,没有上 RTOS。两串 BMS 的任务量不大,RTOS 反而增加复杂度和内存开销。任务调度表如下:
| 任务 | 周期 | 优先级 |
|---|---|---|
| 电压采样 | 100ms | 高 |
| 均衡控制 | 100ms | 高 |
| 温度采样 | 500ms | 中 |
| SOC 估算 | 1s | 中 |
| CAN 通信 | 100ms | 中 |
| 数据记录 | 10s | 低 |
| 故障检测 | 100ms | 高 |
每个任务用一个软件计数器,在主循环里判断是否到期。到期就执行,没到期就跳过。这种方式的优点是逻辑清晰、没有任务切换开销,缺点是如果某个任务执行时间过长,会影响其他任务的实时性。所以我在每个任务里都做了执行时间监控,超过预算就报错。
6.3 故障处理:分级响应
BMS 的故障处理不能一刀切。我把故障分成三级:
- 一级(警告):电压偏差大、温度偏高。只记录,不动作,通过 CAN 上报。
- 二级(降级):均衡失效、采样异常。停止均衡,限制充放电电流。
- 三级(保护):过压、欠压、过温。断开继电器,进入安全状态。
三级故障触发后,需要手动复位或者满足恢复条件才能重新上电。这是为了防止故障反复触发,保护电池和系统。
7. 实测数据与经验总结:两串均衡的真实表现
7.1 均衡效果实测
用两节 10Ah 磷酸铁锂电芯做测试,初始状态故意做成不一致:电芯1 充到 3.40V,电芯2 放到 3.20V,压差 200mV。开启均衡后,记录电压变化:
| 时间 | 电芯1电压 | 电芯2电压 | 压差 |
|---|---|---|---|
| 0min | 3.40V | 3.20V | 200mV |
| 10min | 3.38V | 3.22V | 160mV |
| 30min | 3.34V | 3.26V | 80mV |
| 60min | 3.31V | 3.29V | 20mV |
| 90min | 3.30V | 3.30V | 0mV |
90 分钟把 200mV 压差均衡到 0,平均均衡电流约 50mA。这个速度对于 10Ah 电池来说可以接受,毕竟被动均衡本来就是"慢工出细活"。
7.2 几个反直觉的发现
发现一:均衡电阻不是越小越好。我试过用 33Ω 电阻,均衡电流翻倍到 100mA,但温升也翻倍,电阻表面到了 80℃ 以上,塑料封装都开始发软。而且均衡速度并没有快一倍,因为电芯本身的极化效应限制了电压恢复速度。
发现二:静置均衡比充电均衡更有效。充电过程中,电芯电压被充电电流抬升,均衡电流产生的压降容易被掩盖。静置时电芯电压更接近真实开路电压,均衡判断更准确。
发现三:温度对均衡影响很大。低温下电芯内阻增大,均衡电流会下降。0℃ 时同样 62Ω 电阻,均衡电流只有常温的 70% 左右。所以低温环境下要适当延长均衡时间,或者提高均衡电压阈值。
7.3 给后来者的几条实操建议
- 采样走线一定要开尔文连接,这是最容易踩的坑,没有之一。
- 均衡电阻选 1206 封装、0.25W 以上,0603 长期跑会飘。
- 采样和均衡必须分时,中间加 10ms 稳定时间。
- 均衡触发加迟滞,防止频繁启停。
- MP2642GR-Z 上电后等 10ms 再通信,别省这点时间。
- STM32F415ZG 的 FPU 一定要开,SOC 估算的浮点运算全靠它。
- 故障处理分三级,不要一有问题就断继电器。
这套方案我已经在几个备用电源项目里量产过,运行两年多没出过批量问题。两串系统虽然简单,但简单不代表可以随便做,均衡策略、采样时序、热设计这些细节做到位,系统才能稳定可靠。如果你正在做类似的项目,希望这些经验能帮你少走几天弯路。