做储能和备用电源这类项目大家最容易忽视的往往是两串电池的均衡。我见过不少做 BMS 的同事一听说只有两节电芯第一反应都是“两节而已压差几十毫伏不至于出问题”随便采个电压、开个电阻放放电就算完事。等装机跑上几个月浮充状态下的自放电差异会把压差越拉越大循环工况下容量偏低的那节电芯又提前碰到截止电压整组可用容量被单颗电芯绑架。我最近用 MP2642GR-Z 配合 STM32F302R8 做了一个 2S 电池均衡模块从硬件设计、均衡策略到调试踩坑完整过了一遍这篇就把落地过程记录下来给同样在做低压储能、UPS 备用电源、便携式储能设备的朋友一个参考。这个方案里MP2642GR-Z 负责电池侧的前端管理STM32F302R8 负责均衡决策和系统监控两者配合完成两节串联电芯的电压采集、充放电通路控制、均衡开关以及保护逻辑。文章会涵盖为什么要单独做两串均衡、两颗芯片怎么分工、硬件上哪些细节容易翻车、均衡算法怎么写、实测数据长什么样以及调试中踩过的三个典型坑。1. 从一次“压差越均衡越大”说起两串电池均衡的核心矛盾1.1 电芯不一致的来源与累积效应串联电池组的均衡需求根源并不是简单的“厂家容量差”。同一批次的电芯出厂时容量、内阻、自放电率都有离散度容量差个 1%3% 很正常自放电率在存放几个月后也能拉开明显差距。更麻烦的是这种差异会在使用过程中不断被放大。举个例子两颗 1000mAh 的电芯若容量差 2%那就是相差 20mAh。假设被动均衡电流 100mA理论上要连续工作 12 分钟才能把 20mAh 的“差距”补回来。这还只是容量差这一项温度差异、内阻差异、极化差异都会叠加到端电压上最终体现为同一时刻两节电芯电压不一致、SOC 不一致。所以均衡这事儿不是“有没有必要”的问题而是“什么时候开始管、管到什么程度”的问题。1.2 储能和备用电源的诉求差异储能系统和备用电源系统对均衡的需求方向完全不一样。储能系统更看重循环寿命和可用能量。一次充放电过程中容量偏低的那颗电芯会先充满、先放空BMS 为了保护它只能提前终止充放电整组电池的可用能量被单颗电芯锁死。这时候均衡的目标是“救容量”尽量让两节电芯在充放电过程中同步达到上下限。备用电源则相反系统大部分时间挂在浮充电压上电芯长期处于涓流状态。浮充工况下自放电率高的那颗电芯电压会越来越低如果不干预它会持续被拖到更低电位严重时甚至被反充到极性反转这是备用电源电池组最常见的早衰原因。这时候均衡的目标是“救电压”通过微小的放电补偿持续保持两节电芯的电位一致。这两个诉求直接决定了均衡阈值、均衡窗口和运行时长的设计方向后面第 4 章会详细展开。1.3 被动均衡的能力边界用电阻放电的被动均衡本质上是把高电压电芯的多余能量变成热量消耗掉。它能修正的是“小剂量”的不一致适合 10mV50mV 级别的压差纠正优点是电路简单、成本低、控制策略容易写。缺点也很直接能量被浪费了而且修正速度受电阻功率和温升限制。如果电芯容量差超过 5%指望被动均衡把整组拉回来是不现实的那种情况更需要主动均衡或者上机前先做电芯分选配对。两串系统因为电芯数量少被动均衡反而更有发挥空间——没有中间节点的复杂通路均衡电流从高电压电芯流向电阻路径最清晰。我做这个项目时把主要精力放在“如何把均衡窗口和阈值设对”上而不是盲目追求更大电流。2. 硬件架构拆解MP2642GR-Z 与 STM32F302R8 怎么分工干活2.1 先定电平两串电池的电压窗口设计之前先把系统电压区间定下来。如果按磷酸铁锂电芯标称 3.2V工作范围大约 2.5V3.65V两串就是 5.0V7.3V如果按三元锂电芯标称 3.7V两串是 6.0V8.4V。备用电源的浮充电压、储能系统的充电恒压点都会影响后面的均衡窗口判断。我做这个方案时默认按磷酸铁锂来调参但代码里把电压阈值全部做成可配置参数换电芯体系时不用改硬件。2.2 MP2642GR-Z 的角色电池侧前端与硬件保护MP2642GR-Z 在系统里扮演电池侧前端管理的角色。它把电池端的多路电压监测、充放电通路控制以及均衡执行逻辑整合在一起具体内部结构、寄存器定义请以官方手册为准我这里重点讲它在系统层面的功能划分。这颗芯片负责三件事。第一采集两节电芯的电压或者配合外部采样网络把单体电压数据通过 I2C 上报给 MCU第二提供过压、欠压、过流等硬件比较通道一旦触发可以独立于 MCU 直接关断充放电通路第三通过控制信号或内部驱动逻辑执行均衡动作配合外部均衡电阻完成被动放电。这组分工非常关键。MCU 跑飞了、看门狗没来得及复位前端芯片还能在硬件层面把过充过放通路掐断。对于储能和备用电源这类需要长期无人值守的场景这个安全冗余比省几颗器件更重要。2.3 STM32F302R8 的角色均衡决策与系统监控STM32F302R8 是 Cortex-M4F 内核72MHz 主频对于两串电池的管理绰绰有余。它在这个系统里做四件事。第一均衡策略执行。根据电压差、绝对电压、温度和工况状态决定要不要开均衡、开多久。第二系统监控与交叉校验。F302R8 自带 12 位 ADC、两个比较器和三个运放我让 MCU ADC 独立采集两节电芯电压作为前端 IC 数据的备份和交叉验证而不是盲目相信单一来源。第三通信与上位机交互。通过 UART/CAN 将电池状态、均衡状态、告警信息上送给总 BMS 或显示面板。第四软件保护和参数管理。看门狗、降压保护、标定参数存储都在这颗 MCU 上完成。2.4 信号连接与整机通信我用一张表格说明两串均衡模块中的主要信号连接关系注意这是本方案中的接法具体引脚名以对应芯片手册为准信号方向作用I2C_SCL / I2C_SDAMCU ↔ 前端 IC读取电压、温度、状态下发均衡配置充放电通路使能MCU → 前端 IC控制充放电 MOSFET 通路均衡开关控制MCU → 均衡驱动控制均衡电阻支路的通断ISENSE / ISENSE-MCU ADC电流采样经内部运放放大VCELL_H / M / LMCU ADC两节电芯的三个采样点用于备份校验FAULT 输出前端 IC → MCU硬件保护触发中断看门狗脉冲MCU → 前端口安全刷新防止均衡长时间异常开启这套接法的核心思路是高压大电流路径交给前端芯片和外部 MOS信号采集和策略运算交给 MCU两边各管一摊互不争抢。3. 硬件设计的几个容易翻车的地方3.1 采样点选不好均衡开了也白开两串电池均衡最容易翻车的地方不是算法而是采样点位置。我刚开始做第一版 PCB 时电压采样线就近接到了均衡 MOS 的源极侧而不是直接接到电芯极耳。结果均衡一开启采样线上流过均衡电流产生的铜箔压降导致 ADC 读到的电压比实际电芯电压低了几十毫伏控制逻辑误判压差方向出现“越均衡压差越大”的诡异现象。正确做法是采用开尔文接法电压采样线直接连到电芯端子单独走线均衡电阻和 MOS 支路放在采样点之后。也就是说采样点要看到的是“电芯本身”的电压而不是“均衡电流流过的路径上某一点”的电压。对于两串电池来说中间点最容易出错因为采样地线如果借用了均衡回路的地均衡电流一流动采样就失真。3.2 均衡电阻选型与热布局被动均衡把能量变成热量均衡电阻的选型直接决定均衡电流大小和 PCB 温升。按我常用的设计目标均衡电流控制在 100mV150mV 之间以磷酸铁锂单体电压上限 3.65V 来算27Ω 电阻能给出大约 135mA 的均衡电流电阻功耗约 0.5W我选 1W 额定功率的 2512 封装电阻留一倍裕量。不同电阻值在不同电压下的参数对比如下电阻值3.65V 时均衡电流3.50V 时均衡电流最大功耗封装建议22Ω166mA159mA0.61W2512 / 2×121027Ω135mA130mA0.49W2512 / 1210×233Ω111mA106mA0.40W1210 / 2010温度方面0.5W 持续耗散在只有 0603 封装的电阻上表面温度轻松过 100℃必须用大封装电阻并加大铜箔面积帮助散热。实际布局时我把均衡电阻放在 PCB 板边远离电解电容、MCU 晶振和前端芯片避免局部热点影响采样稳定性和器件寿命。3.3 电源、地弹与通信抗干扰均衡 MOS 开关瞬间电流突变会在主板地线上产生地弹严重时会让 I2C 通信数据错乱。我的做法是I2C 走线尽量远离均衡 MOS 栅极驱动线并且串 33Ω79Ω 的电阻抑制振铃I2C 上拉电阻按总线电容计算通常选 2.2kΩ4.7kΩ。均衡电阻支路的地单独汇流到电池负极采样点附近不要让均衡大电流从 MCU 的地平面下面穿过。另一个需要注意的点是上电时序。MCU 供电如果从系统侧取得前端芯片和 MCU 同时上电时I2C 总线可能因为电平未稳定而卡在中间状态。我在设计里加了一个简单的时序控制前端芯片先完成初始化MCU 再开始访问 I2C 总线避免通信握手失败。3.4 校准与精度预算单体电压精度要求通常在 ±10mV 以内。前端 IC 自带高精度采样读数可以直接用作均衡判断的主参考MCU ADC 这边做备份校验我用 0.1% 精度的电阻分压将 3.65V 量程映射到 ADC 输入范围并在生产时做两点软件标定2.0V 和 4.0V 两个校准点把增益误差和偏置误差都修正掉。温度漂移方面我测过 MCU 内部基准在 25℃60℃ 环境下会有几个毫伏的漂移所以 MCU ADC 的采集结果只用于交叉验证和保护判断不直接参与均衡阈值判定。4. 均衡策略一个状态机管好充电、浮充与静态三种工况4.1 均衡判定逻辑与迟滞均衡要不要开不能只看瞬时压差需要结合电压窗口和温度条件。我用的判定条件如下开启条件压差 d D_START其中 D_START 默认 20mV同时最高电芯电压 V_MAX 高于均衡电压下限 V_BAL_MIN磷酸铁锂取 3.30V防止在低压段把电芯越放越低温度在 0℃45℃ 之间。停止条件压差 d D_STOP其中 D_STOP 默认 8mV或者温度超过 60℃或者 V_MAX 低于安全电压下限 V_SAFE_LOW。迟滞机制开启阈值与停止阈值之间留 12mV 的迟滞带防止均衡在阈值边缘反复启停。这里尤其要注意如果没有迟滞均衡开启后压差降到阈值以下立刻关闭关闭后极化恢复、压差回升又会再次开启MOS 开关频繁动作会产生明显温升和噪声。我实测过这个现象的板子均衡 MOS 表面温度能比正常工作时高出十几度。4.2 三种工况的差异化策略储能和备用电源的运行工况差异很大我把均衡策略拆成三套参数工况启动压差阈值均衡窗口最大连续均衡时间说明充电均衡15mVV_MAX 高于 3.40V30 分钟充电末端压差变化快需要及时干预浮充均衡10mVV_MAX 接近浮充电压不限制靠温度保护备用电源长时间浮充微电流持续补偿静态均衡25mVV_MAX 高于 3.50V受温度限制待机或存放时收敛压差充电均衡出现在恒流末尾和恒压阶段。这个阶段最高电芯电压接近上限如果压差大充电会在满电电芯的保护下提前停止所以均衡介入要早、电流要足。浮充均衡是备用电源的重点压差阈值放低到 10mV让均衡以低占空比长期运行持续抵消自放电差异。静态均衡则主要用在设备闲置、需要把电池组压差修正常态的场合。4.3 软件状态机与调度实现均衡控制采用状态机实现主循环每 10ms 跑一次任务调度电压采集每 500ms 执行一次均衡调度每 100ms 执行一次。状态机包含四个状态IDLE、BALANCING、COOL_DOWN、FAULT。伪代码逻辑如下if (state IDLE) { if (d D_START V_MAX V_BAL_MIN T 45) { state BALANCING; } } else if (state BALANCING) { if (d D_STOP || T 60 || V_MAX V_SAFE_LOW) { // 关闭均衡 state IDLE; } else if (balanceTime 30min) { // 强制进入冷却 state COOL_DOWN; } } else if (state COOL_DOWN) { // 冷却 3 分钟 state IDLE; } else if (state FAULT) { // 需要人工清除或故障恢复 }C 语言实现时我一般把电压采集做 8 次采样、去掉最大最小值后取平均再做一阶低通滤波抑制均衡放电造成的瞬时电压波动。均衡开启前连续 3 个调度周期都满足启动条件才开始动作避免单次毛刺误触发。4.4 为什么浮充均衡不能“一刀切”有同行问过我浮充时加一个固定均衡电阻一直放不就行了问题在于浮充电压下均衡电阻两端电压差很小均衡电流被压得非常低如果电芯压差本身有 30mV电阻 27Ω均衡电流只有 1.3mA 左右基本等于没有作用。所以浮充均衡不是简单把开关焊死而是要在压差超过阈值时配合时间片策略让均衡电流集中作用于高电压电芯。正确理解是均衡开关是断续工作的它的占空比决定修正量而不是靠恒定小电流硬扛。5. 实测数据看起来像“均衡失败”其实是参数没设对5.1 静态均衡曲线与极化假象我在两节磷酸铁锂电芯上做了一组静态均衡测试。初始压差 48mV均衡电阻 27Ω均衡电流约 130mA。前 5 分钟压差迅速降到 40mV15 分钟到 25mV30 分钟降到 12mV 左右。但再往后压差一直徘徊在 812mV好像怎么都压不下去。这里有个容易误判的点均衡放电时电芯的极化也在变化读到的端电压并不是真实的开路电压。均衡关断后电芯电压会有一个缓慢回升的过程回升的那部分就是极化的影响。所以判断均衡是否生效不能只看实时压差曲线要周期性关断均衡 12 分钟读取“松弛后的开路电压”来做最终判定。我把这个功能做进了上位机每 5 分钟自动记录一次开路压差曲线反映的真实收敛速度比端电压看起来要理想得多。5.2 充电末端的均衡效果充电均衡测试用 0.5C 恒流充入进入恒压阶段后开启均衡。开始时压差 25mV均衡开启后大约 15 分钟压差降到 8mV。在恒压阶段后期均衡能够明显延长恒流转恒压的过渡时间减少因单颗电芯先达到电压上限而提前停止的容量损失。测试中我发现均衡启动条件里“V_MAX 高于 3.40V”这个条件很重要——如果电芯在 3.30V 以下就开启均衡不仅没有意义还会拉低总放电容量的表现。5.3 容量差异对均衡时间的影响容量差异决定了被动均衡需要工作多久。以 1000mAh 电芯为例容量差理论亏空130mA 均衡理论时间实际收敛时间含极化1%10mAh4.6 分钟约 15 分钟2%20mAh9.2 分钟约 30 分钟5%50mAh23 分钟超过 1 小时从这个表能看出被动均衡适合在容量差 2% 以内做精细调整。超过 5% 的差异单靠均衡很难在合理时间内拉平必须靠电芯分选保证初始一致性。这个结论直接影响了我在项目中对电池来料验收的规格制定。5.4 浮充 30 天对比测试备用电源场景我做了两组对比一组开启浮充均衡一组关闭均衡。初始压差都是 8mV 左右挂同样的浮充电压连续运行 30 天。关闭均衡的那组压差逐步漂移到了 55mV开启均衡的那组压差始终稳定在 5mV 以内。浮充均衡看起来每次只修正一点点但长期积累的效果非常明显。备用电源最怕的不是压差一时大而是压差随着时间不断增大把整组电池拖入过放风险。6. 调试全记录三个最典型的坑和排查链路6.1 均衡一开压差反而变大这是我在第一章提到的现象。现象描述均衡未开启时压差 10mV一打开均衡MCU 读到的压差瞬间跳到 35mV而且方向是反的。排查链路如下先怀疑均衡电阻选错均衡电流太大导致电压被“放过头”。用万用表直接量电芯端电压发现电芯实际电压确实在缓慢下降说明放电路径没有错。再对比 MCU 读回值和万用表读值发现 MCU 读到的电压明显偏低而且低的部分恰好等于均衡回路电阻上的压降。最终定位采样线接在了均衡 MOS 的源极侧也就是均衡电流流经的路径上。均衡电流 130mA 流过一小段铜箔产生了约 20mV 的压降采样点“提前”把这段压降算进了电芯电压。解决重新布线把电压采样线直接焊到电芯极耳位置均衡电阻支路从采样点之后接出软件上保留 MCU ADC 作为交叉校验但均衡判定必须用前端芯片的电压数据。这个坑非常典型尤其在做两串模块时更容易踩因为中间节点只有一颗采样点接线太近就会共用均衡回路。6.2 压差在阈值边缘反复启停MOS 发烫现象均衡开启后压差降下来降到启动阈值以下它就关闭关闭后极化恢复压差又升回去于是均衡反复启停MOS 温度明显升高。排查链路一开始以为是均衡电流太大把电流从 130mA 降到 80mA问题依旧只是启停频率变慢。查看代码后发现开启阈值和停止阈值都设成了 20mV没有任何迟滞。均衡开启的瞬间压差从 20.5mV 降到 20.1mV仍然满足开启条件降到 19.8mV 时关闭极化恢复后又回到 20.2mV再次开启。整个闭环在 0.5mV 的窄带里震荡。解决把停止阈值改成 8mV开启前增加连续 3 次采样确认。迟滞带一拉开启停振荡立刻消失。后续又把“最近 1 分钟内均衡开关次数”作为软件统计项如果开关次数超过 10 次强制进入 COOL_DOWN 状态双保险。6.3 休眠后通信丢失均衡被异常打开展开现象板子进入低功耗模式后I2C 总线状态卡死前端芯片保持最后一次收到的均衡使能信号均衡 MOS 一直开着直到把电芯放过压保护才停下。排查链路一开始以为是均衡 MOS 击穿换了管子依旧复现。用示波器抓均衡控制引脚波形发现均衡使能引脚持续为高电平且 MCU 没有输出任何关断信号——MCU 还在睡眠。再看 I2C 总线发现 SDA 线被拉低总线处于半通信状态。原因是 MCU 进入睡眠前没有释放 I2C唤醒后初始化到一半时被看门狗复位I2C 外设状态机卡死。解决分三层软件上睡眠前显式关闭均衡使能释放 I2C 总线并复位外设硬件上给均衡驱动增加独立使能口MCU 睡眠时自动拉低策略上MCU 每 100ms 必须向前端芯片刷新一次“均衡保活”命令超过 1 秒没有刷新前端自动断开均衡通路。这个坑提醒我均衡通路的安全不能只依赖 MCU 代码必须有一个独立于主控的“超时断开”机制。对于无人值守的储能设备这种兜底很关键。最后说一个实用判断方法如果你也在做两串电池均衡调试时拿不准均衡有没有生效最简单的判断方法不是看实时压差而是记录“均衡关断 1 分钟后的开路压差”。只有把极化的干扰去掉才能真正看到均衡的收敛趋势。我的经验是把阈值、迟滞、均衡电流、温度限值这些参数全部做成可配置项换电芯体系时不用重新编译固件调参效率会高很多。这套方案跑下来两串电池的被动均衡做到位之后大部分日常场景其实用不上主动均衡先别急着上复杂拓扑把基础采样和安全逻辑打磨好收益往往更直接。