做储能柜备电系统那阵子,我被两串串联电池单元的压差问题折腾得不轻。两节电芯串联使用看起来简单,但实际循环几十次之后,压差会从十几毫伏慢慢滚到上百毫伏,备电系统的可用容量迅速缩水。最后我用 MP2642GR-Z 搭配 STM32F101ZG 做了一个双串电池均衡控制板,把这个问题按了下去。这篇文章把整套方案拆开来讲:硬件架构、均衡策略、采样标定、状态机设计,以及我实际调试中踩过的几个坑,给正在做储能、备用电源或者BMS相关项目的朋友一个可以直接参考的样本。
1. 两串电池不均衡的根源:为什么必须专门做均衡
1.1 串联结构下的一致性“放大器”
两节电芯串联,回路电流天然相等,充电电流和放电电流流经每一节电池时都是一样的。问题恰恰出在这个“一样”上。电池与电池之间永远存在制造偏差:容量可能差2%到3%,内阻可能差零点几毫欧,自放电速率更是千差万别。这些偏差在串联结构里会被充放电循环反复放大,最终表现为荷电状态(SOC)和端电压的可观测差异。
我常用一个行军队伍的例子来理解这件事。两个人被强制要求以完全相同速度走完同一条路,体能好的人还能保持节奏,体能差的人越走越吃力,落后越来越多。电池也是类似道理:每次循环里“落后”的个体并不会自动追赶回来,偏差以同方向累积。尤其当系统长期处于浮充状态时,自放电率高的那节电池需要更多充电电量才能补满,而串联充电没办法单独给某一节补电,于是“强者恒强、弱者恒弱”。
实际表现就是:一节电池电压偏高、另一节偏低,压差随循环次数单调增长。如果系统不做任何均衡干预,一百个循环以后,原本只有20mV的压差可能变成150mV以上,这是我在多个模拟项目中验证过的数据规律。
1.2 偏差被循环放大的三个具体路径
偏差的放大有清晰的作用链路。第一条发生在充电阶段:容量偏小的那节电池会先到达满充电压,BMS为了防止过充只能切断整串充电回路,此时容量偏大的那节只充到95%左右,永远充不满。第二条发生在放电阶段:容量偏小的电池先到达放电截止电压,整串被迫停止放电,容量偏大的那节还剩下不少能量,但这些能量在串联回路里“取不出来”,直接变成了备电系统的容量损失。第三条是劣化正反馈:容量偏小的那节每次在充放电末端都会承受更高的电压应力或更深的放电深度,导致其容量衰减更快,容量差进一步拉大。
我实际测过一对100Ah电芯的极端情况。两节电池容量差5Ah,放电电流20A时,容量小的一节要提前约15分钟到达放电终点。这意味着原本标称可以支撑1小时的备电系统,实际只能支撑45分钟左右。更麻烦的是这种损耗每次故障都会出现,用户只会觉得“电池越来越不耐用”,但根本原因其实是均衡没有做好。
1.3 储能和备电场景为什么尤其敏感
消费电子里的单节锂电池也有均衡需求,但远没有储能和备电系统这么敏感。前者更换成本低、使用周期短;后者使用周期动辄五到十年,而且大部分时间处于浮充或静置状态。浮充状态下,自放电差异造成的压差会被持续放大;而真正的考验——市电中断后的满负荷放电——一年可能只出现几十次,一旦关键时刻压差过大,系统直接失去后备能力。
再加上储能系统通常串并联规模大,一个模组的故障可能影响整个电池簇的输出,所以两串之间的均衡不应该被当成“可选优化项”,而应该作为基础功能内建到控制板里。这也是我选择 MP2642GR-Z 这样带双通道均衡控制能力的芯片,而不是用普通保护板凑合的原因。
2. MP2642GR-Z 的双通道均衡原理:芯片侧到底做了什么
2.1 芯片与MCU的职责切分
开始设计之前我先把系统分成两个层次。MP2642GR-Z 放在靠近电池侧,负责两节串联电池单元的电压检测、均衡通道的MOS开关控制、电流检测以及一些必要的硬件保护;STM32F101ZG 作为策略层,通过通信接口读取芯片的状态寄存器,解析两节电池的电压和温度数据,再决定“现在要不要均衡、均衡哪一节、均衡多久”。
这样切分的好处很明显。电压采样的精度和可靠性由芯片保证,硬件层已经做了滤波和比较处理,MCU拿到的是相对干净的数值,不需要用自己较差精度的ADC直接面对电池电压纹波和共模干扰。均衡MOS的驱动电流由芯片提供,MCU只需要控制使能信号,隔离了功率回路和逻辑回路。我把更高层的策略从模拟前端里拆出来,意味着以后换更大的电池、更复杂的拓扑,MCU侧的状态机可以复用。
2.2 均衡电流是怎么定下来的
这套系统采用被动均衡方案,原理就是把电压偏高电池的多余能量通过外部均衡电阻放掉。均衡电流的取值直接影响均衡速度和发热量,必须在硬件设计阶段就定好。
均衡电流的估算公式很简单:均衡电阻阻值 ≈ (单体电压 - 芯片内部MOS导通压降) / 目标均衡电流。以我这次的设计为例,目标均衡电流取200mA,单体电压平均按4.0V计算,芯片内部均衡MOS导通电阻和管理电阻加一起大约1Ω,那么均衡电阻就需要约19Ω。我取了标准阻值20Ω,实际均衡电流约(4.0 - 0.2×1) / 20 ≈ 190mA。这个量级对两串备电系统来说是合理的:太快会加剧发热,太慢则达不到均衡效果。
均衡电阻上的功耗也要随手算一下。190mA 流过20Ω电阻,功耗约0.72W。这看起来不大,但在密闭的电池包内部持续半小时到一小时就会形成明显的热点。因此我选了额定功率1W的2512封装贴片电阻,并预留了足够的PCB铜箔散热面积。
2.3 被动均衡和主动均衡的取舍
“为什么不用主动均衡”是我在这个项目里被问得最多的问题。两种方案的差异本质上是“烧掉多余能量”和“搬走多余能量”的区别。
| 对比维度 | 被动均衡(本次方案) | 主动均衡 |
|---|---|---|
| 均衡效率 | 能量以热形式耗散,效率低 | 能量转移,效率可达80%-90% |
| 硬件复杂度 | 只加电阻和MOS,简单可靠 | 需要电感/电容和开关管阵列 |
| 成本 | 很低 | 明显偏高 |
| 控制难度 | 开关控制,状态机简单 | 需要PWM或同步整流控制 |
| 适用场景 | 小规模、低功耗、成本敏感 | 大容量、高价值电池组 |
对于两串电池单元这种规模,被动均衡的发热量完全可控,成本优势却非常明显。主动均衡的设计周期长、故障点多,在两串场景里属于“过度设计”。我建议大家在16串以上的大模组里再去考虑主动均衡方案,两串用被动均衡是性价比很高的选择。
3. STM32F101ZG 控制链路搭建:采样、标定与均衡状态机
3.1 电压采样通路与误差消除
STM32F101ZG 在这套系统里负责读取 MP2642GR-Z 提供的电压数据。芯片输出的采样值会经过内部ADC转换,但原始值不能直接用来做均衡判断,必须先做两步处理:滤波和标定。
滤波我用的是“中值+均值”的两级方案。先取连续9次采样做中值滤波,去掉偶发的毛刺;再对中值滤波后的结果取4次平均,得到稳定读数。这个组合比单纯用FIR滤波更能抵抗接触不良带来的随机跳变,而且MCU在36MHz主频下跑这个算法几乎没有负担。
标定是更关键的环节。理论上STM32F101ZG的12位ADC在3.3V参考下分辨率约0.8mV,但ADC的偏移误差和增益误差通常都在几个到十几个mV量级,直接拿来判断30mV的均衡阈值会误判。我在生产中留了一个标定流程:先断开电池,用高精度电压源分别给芯片注入2.000V和4.200V标准电压,记录ADC原始码,线性拟合出增益和偏移系数,然后把系数存到片内Flash。实际使用中直接查表读取,误差能控制在±5mV以内。
3.2 均衡状态机的设计
均衡控制的核心是一个五状态状态机:空闲、均衡A节、均衡B节、暂停、完成。因为均衡只会对电压偏高的一侧动作,不可能同时均衡两节。
| 状态 | 进入条件 | 退出条件 |
|---|---|---|
| 空闲 | 系统上电初始化完成 | 压差 > 30mV |
| 均衡高压侧 | 某节电压明显偏高 | 压差 < 10mV 或触发暂停 |
| 暂停 | 温度 > 45℃ 或采样异常 | 温度回落且采样恢复 |
| 完成 | 压差 < 10mV 且持续1分钟 | 压差再次 > 30mV 重新启动 |
关键是设置10mV的滞回区间。我刚开始没加滞回,结果压差在阈值附近抖动时,均衡继电器高频反复通断,MOS管和电阻的温度蹭蹭往上走。后来把启动阈值设30mV、停止阈值设10mV,这个问题立刻消失。状态机的核心判断逻辑我放在一个10ms定时中断里执行,代码如下示意:
#define BAL_START_MV 30 #define BAL_STOP_MV 10 #define BAL_TEMP_LIMIT 45 static uint8_t balance_fsm(int16_t vcell_a_mv, int16_t vcell_b_mv, int16_t temp_c) { int16_t diff_mv = vcell_a_mv - vcell_b_mv; uint8_t bal_ch = 0; if (temp_c > BAL_TEMP_LIMIT) return 0x00; if (diff_mv > BAL_START_MV) bal_ch = 0x01; /* 均衡A节 */ else if (diff_mv < -BAL_START_MV) bal_ch = 0x02; /* 均衡B节 */ else if (diff_mv > -BAL_STOP_MV && diff_mv < BAL_STOP_MV) bal_ch = 0x00; /* 停止均衡 */ if (bal_ch != 0) bal_ch |= 0x80; /* 标志位:均衡使能 */ return bal_ch; }这段代码在实际产品里还包了一层上下文:必须连续3次判断结果一致才执行状态切换,进一步降低干扰的影响。
3.3 均衡不该孤立运行:与充电阶段的联动
均衡动作的时机非常关键。我踩过一个教训:在放电过程中开启均衡,等于把电池里宝贵的能量白白变成热量。所以均衡策略必须和充放电状态联动。
我的设计是:充电末段和浮充阶段执行均衡,静置阶段如果压差偏大也会补平衡,放电阶段强制关闭均衡。具体到代码实现,通过检测充电电流方向和幅值判断状态。充电期间电流为正且电压已进入恒压段时,均衡可以开;电流接近零时,说明处于浮充或静置,均衡照常执行;一旦检测到持续放电电流,立刻关闭均衡通道。这个联动逻辑让均衡能耗降到最低,也避免在备电系统最需要电量的时候浪费能量。
4. 样板调试与踩坑记录:均衡控制远比“代码写完”复杂
4.1 高频反复启停问题的完整排查链路
首版样板做完后,我碰到的第一个问题是均衡通道启动后又立刻关断,反复无常。用调试串口把判断结果打印出来,发现压差的原始采样值在阈值附近快速抖动:一会儿29mV、一会儿31mV、一会儿28mV。MCU按我的初始逻辑每次比较就做决定,自然会出现高频翻转。
排查第一步是确认ADC数据抖动来源。我用示波器挂在电池采样线上,看到纹波大约有6mV,主要来自均衡电阻并联后对采样地的干扰。第二步是确定是硬件噪声还是软件滤波不足,我把中值滤波窗口从5次加长到9次,抖动幅度从6mV降到2mV,但没有根除。最后确认是滞回缺失导致的状态机问题,加入10mV滞回窗口后彻底稳定。这个案例说明:只有滤波和迟滞同时具备,均衡控制才能稳定工作,任何一环缺失都会带来现场问题。
4.2 均衡电阻发热引发的采样漂移
第二个坑来自PCB布局。刚开始我把20Ω均衡电阻靠近芯片的采样输入引脚放置,结果均衡一启动,采样值就悄悄往偏高的方向漂。原理不复杂:电阻发热后,热量通过PCB铜箔传导到采样引脚附近的焊盘,造成热电动势和芯片内部基准漂移。
解决方法是把均衡电阻移到采样电路的对侧,并在两者之间加一条隔热槽,同时增大接地铜箔的过孔密度来引导热量。改完布局之后,用热成像仪实测,均衡期间芯片采样区温度上升从8℃降到了2℃以内,压差读数变得稳定可靠。这块经验让我印象很深:原理图正确不代表系统正确,物理布局对模拟采样链路的影响往往比想象中大得多。
4.3 均衡实测数据与效果评估
最终测试是在一块模拟备电电池组上做的。两节100Ah磷酸铁锂电芯,初始开路电压差85mV,环境温度25℃,均衡电流约190mA。从开始均衡到压差降到12mV,一共用了32分钟。期间记录的温度变化如下:
| 时间(分钟) | A节电压(V) | B节电压(V) | 压差(mV) | 表面温度(℃) |
|---|---|---|---|---|
| 0 | 3.412 | 3.327 | 85 | 25.0 |
| 8 | 3.401 | 3.336 | 65 | 28.6 |
| 16 | 3.390 | 3.345 | 45 | 31.2 |
| 24 | 3.381 | 3.353 | 28 | 29.8 |
| 32 | 3.373 | 3.361 | 12 | 27.5 |
如果把均衡电流提高到500mA,可以在12分钟左右完成同样的均衡任务,但温度实测会超过40℃,长期运行可靠性下降。这个测试让我确定了200mA左右在密闭电池仓内的合理性,也验证了温度保护阈值45℃的设定不会轻易误触发。
5. 从两串到多串:这套设计如何扩展
5.1 多级级联的架构取舍
两串做好之后,自然会想把它扩展到更多电芯。最简单粗暴的做法是把控制板复制多份,每个双串模组配一套 MCU 加芯片,通过通讯线把状态汇总到上级主机。这种方式每套可以独立工作,故障隔离性好。
更省成本的做法是用更高通道数量的管理芯片,单个MCU直接控制4串或8串,但状态机和保护逻辑会复杂不少,而且一旦芯片失效,整个模组都会失控。我个人的建议是:在储能系统里优先采用两串子板加总线汇聚的架构,每一级均衡控制保持简单可靠,比“省一块MCU”重要得多。
5.2 从被动到半主动的升级路径
这套硬件框架并不锁死在被动均衡上。如果之后遇到大容量电芯,需要提升均衡效率,可以在原有采样和控制逻辑之上,把均衡电阻换成电感或开关电容网络,由MCU输出PWM控制能量搬移。芯片负责的电压检测和保护判断依然可以沿用,需要改动的只是功率级电路和状态机里的均衡策略。这也是我当初坚持用独立MCU做策略层的理由——功率级怎么改,策略代码的框架不需要推倒重来。
5.3 快速验证均衡效果的方法
最后分享一个快速验证均衡效果的办法。不要等电池自然不平衡再去测,那太慢了。我用一台可编程电源和一个电子负载搭了一个模拟电池模型:把两个通道分别设定为3.40V和3.30V,串联回路里加一个小电阻模拟电池内阻,然后跑充放电循环。这样可以在半小时内模拟出电池自然老化十几天的压差状态,用来验证状态机和保护逻辑非常高效。实测发现,这套方法发现的阈值抖动态问题占了全部问题的60%以上,强烈建议同行在做均衡板时把这种方式纳入常规测试流程。