串联电池组主动均衡实战:MP2642GR-Z+STM32F410RB实现压差10mV
前一阵做备用电源的小板两节三元锂电池串联标称7.4V。装完第一版样机觉得电池都是同一批次直接给电池组充电结果充放不到20个循环两节电池的电压差就开始拉大最严重的时候到300mV。低压那节一直吃不饱高压那节保护板又频繁报警。查了一圈问题不是电芯品质而是串联电池组本身就需要均衡。后来我用 MP2642GR-Z 做了主动均衡功率级再用 STM32F410RB 做控制器在储能和备用电源系统里对两个串联电池单元进行均衡最终把压差稳定在10mV以内。这篇就把硬件、软件和调试过程完整拆一遍给正在做2S均衡的同行一个参考。1. 为什么两节串联电池也绕不开均衡这个坎1.1 先看“同一电流”背后的误区很多人觉得串联回路电流处处相等既然两节电池流过同样的电量容量消耗也应该一样。这个观点错在哪里电流“一样”只是外部表现电池内部的化学反应并不完全同步。每节电芯出厂时的实际容量普遍有百分之几的偏差内阻、自放电率、温度系数也各不相同。偏差虽小但在反复充放过程中会不断累积反映到端电压上就是荷电状态偏移。可以类比成两根粗细不同的水管同时灌水出水口再接到同一个杯子虽然流速一样但上游两个水箱的水位趋势不可能一直相同。电池行业的实际测试也证明即使是严格分容配对的两节电芯几十个循环后也会出现可见的压差。备用电源的应用往往是“长期浮充、偶尔放电”这种工况会放大偏差不做均衡基本撑不住。1.2 失衡在储能和备用电源里的特殊危害备用电源的电池大多数时间挂在线路上市电正常时一直保持满电或浮充状态。一旦出现失衡高压那节会在过充区徘徊低压那节则一直欠充。过充对三元和磷酸铁锂都不是好事电解液分解、内压升高、负极析锂严重时热失控欠充那节长期得不到满充可用容量越缩越小系统整体续航也就跟着缩水。更麻烦的是当市电中断、负载突然切入低压那节会最先触底保护板可能误判整个电池组没电明明另一节还有能量也不能继续供电。这对备用电源来说是非常严重的可靠性问题。在储能系统里虽然单节电池容量更大但模组数量多温度差异和老化差异更容易产生所以均衡是所有安全和管理策略绕不开的基础。两串结构虽然简单危害机制是完整的不能因为电芯少就忽略。1.3 耗散均衡做不成的两个真实原因早版方案里我也考虑过最廉价的耗散均衡把高压那节电池的能量通过一个电阻放掉降到和低压那节一样为止。这确实够了简单但在这个项目里有两个致命问题。一是能量被白白烧成热两串电池容量本身就不大均衡时高压侧还要额外承受发热温度升高会进一步扩大自放电差异形成正反馈。二是热量集中在局部板子和电池结构紧凑时局部高温很难处理。而主动均衡是电荷转移能量没有消失只是从高电池搬到了低电池。MP2642GR-Z 这类的做法是用水泵搬水不是挖一个坑把水放掉。所以虽然硬件复杂度高一些从系统收益角度更划算。1.4 均衡的目标不是治疗电池顺手说一个容易被忽略的定位问题均衡并不能恢复电池容量它只是重新分配电荷让每一节都工作在安全区间。如果低压那节已经老化得很厉害容量衰减超过20%均衡可以把压差拉平但放电时短板还是那块短板使用时间不会明显提升。所以这套板子的目标应该是“防止不一致扩大”而不是“治好已经产生的不一致”。带着这个预期做设计就不会对均衡能力做过高的要求。2. MP2642GR-Z 与 STM32F410RB分工逻辑2.1 MP2642GR-Z 怎么搬运电荷把结论放在前面MP2642GR-Z 在这套方案里更像功率级核心而不是带自动策略的完整均衡SoC。它内部集成高侧和低侧开关管外部配一颗电感组成一个可双向工作的同步开关网络。物理动作可以简化成“先把高电池的能量灌进电感再让电感把能量放进低电池”。电感相当于一个临时能量仓库开关管负责控制仓库的进出方向整个过程没有把能量消耗在电阻上所以叫主动均衡。实际使用时MP2642GR-Z 需要 MCU 给它提供控制信号或者调整反馈基准才能决定均衡方向与电流大小。芯片手册里会给出典型外围电路我按典型电路搭了一遍没有去动内部的环路补偿。真正需要自己算的只有电感感值、峰值电流和开关频率的匹配这些会在硬件部分细讲。2.2 为什么非要加一颗 STM32F410RB有人会问芯片自己就能做均衡为什么还要单独加 MCU在我这个场景里原因很具体备用电源的工作状态是变化的充电、浮充、放电、待机每种状态下均衡策略完全不同。自动均衡器通常用固定判据比如“电压差超过某个值就开启”不会管系统此时是在放电还是浮充。如果放电过程中盲目开启均衡不仅毫无意义还可能把低压电池直接拉崩。STM32F410RB 在这里负责四件事电压采样、策略判断、均衡使能、与充电器或上位机通信。选它而不是一颗 8 位单片机是因为它带 12 位 ADC 和 12 位 DAC采样和输出精度都能满足压差控制Cortex-M4 核用来跑滤波算法也很轻松。实际调试时ADC 的分辨率直接决定了均衡判据能做到多细换成 10 位 ADC 就会感到误差吃掉了整个阈值空间。2.3 两条闭环能量流和数据流整个系统可以拆成两条闭环来看。能量流是电池组对外输出、充电器往里充电、MP2642GR-Z 在电池1和电池2之间搬运电荷。数据流是两条电压采样线从电池端引出经分压滤波进 STM32F410RB 的 ADCMCU 算完之后输出控制信号给均衡功率级形成一个电压闭环。这个闭环的周期大约 100ms比均衡的电学过程慢但比电池的热时间常数快很多足够稳定。这里要提醒一个关键点电池组的地电位和 MCU 的地电位不是同一个参考。两节电池串联时中间点电位会随充放电电流变化如果把 MCU 的地直接接中间点ADC 读到的电压会跟着负载抖动。因此硬件上必须单独拉采样参考线下面我来展开。3. 硬件搭建从原理图到 PCB 的过程记录3.1 均衡功率级核心元器件怎么选MP2642GR-Z 外围不算复杂选型却有几个点不能拍脑袋。电感我选了 10uH额定电流 3A饱和电流 5A。感值太小会让纹波电流偏大开关管和电感发热都上来感值太大又会让电流爬升太慢同样占空比下搬电速度下降。按 1A 均衡峰值电流设计10uH 配合合理的 PWM 频率能让电感电流处在连续模式这是后续调试稳定性的基础。输入输出电容也不要盲目加大。输入端用 22uF 陶瓷电容吸收开关纹波输出端用 4.7uF 就够太大会拖慢电压反馈让 MCU 看到虚假的“已经平衡”。电流采样电阻要选高精度低温漂合金电阻普通厚膜电阻温度漂移很严重均衡电流一大读数就会飘。3.2 电压采样线开尔文连接是底线我第一版板子把采样线和功率线走在一起结果负载电流一变化采样值整体漂移。原因是功率走线上的铜箔电阻虽然只有几毫欧但均衡电流和负载电流叠加后压降足以影响 mV 级采样。正确做法是从电池组的极耳处单独引出两条细线一条取中间点电位一条取总正极电位采样线上不流过任何功率电流这就是开尔文连接。采样线进入板子后先经过电阻分压和 RC 滤波再进 ADC 引脚。RC 滤波的时间常数不能太大否则充电时电压变化会被拖慢均衡判据跟不上真实状态。我选了 100R 串联电阻加 100nF 电容截止频率约 16kHz既能抑制开关噪声又不明显影响电压趋势。3.3 PCB 布局的三个教训第一功率回路要短且闭环。均衡电流在电池、高侧开关、电感、低侧开关之间形成回路回路面积越小辐射和振铃越少。MP2642GR-Z 的开关节点如果走线太长测波形时会看到非常明显的振铃。第二采样线和电感必须有物理距离不能平行走线。第二版才把采样线绕到板边远离电感ADC 读数立刻干净了很多。第三地平面要分区后单点相连。均衡功率级的地适合单独铺铜再用 0R 电阻与 MCU 地单点连接避免地环路。芯片如果有散热焊盘记得用铺铜和过孔连到背面地平面长期工作才不会局部闷热。4. STM32F410RB 侧的均衡控制策略4.1 ADC 采样从原始值到可信电压直接读 ADC 原始值做判决一定会出现误动作。实际固件里我用定时器触发 1kHz 采样连续采 8 次做排序取中值再做滑动平均既滤掉尖峰又保留缓慢变化趋势。上电初期还要做校准用精密电压源给两路采样通道分别送几个标准电压计算偏移和增益系数存到 Flash。校准之后两路读数误差可以做到 ±2mV 以内这样判压差才有实际意义。这里有个细节不同 ADC 通道之间的偏移和增益并不完全一致如果只校准一个通道另一个通道读数就会偏。我一开始偷懒省了这个步骤结果压差一直存在 5mV 左右的系统误差反复调了很多参数都消不掉后来才意识到是两通道不一致。4.2 均衡阈值必须有迟滞和超时最早我设的是“压差超过 10mV 开启低于 10mV 关闭”结果系统一直在开关之间振荡。原因很简单电池电压本来就有小范围波动阈值附近来回穿越太正常。后来加了迟滞开启阈值 20mV关闭阈值 5mV。这样从开启到关闭需要压差减少 15mV开关动作被限制在一个稳定区间内。迟滞之外还要有超时保护。如果均衡连续运行超过 2 小时压差仍然没有缩小说明电池内阻异常或者电感参数不合适程序必须拉停并报错。很多均衡板只做“开启/停止”不做异常运行保护这在储能场景里是不负责任的。认真对待每个异常分支是电源类系统的重要习惯。4.3 均衡时机看系统工作状态再动作备用电源最常见的状态是待机浮充和断电放电。浮充状态下电池组由充电器维持电压如果一边充电一边均衡均衡器搬走的那部分能量很可能又被充电器补回来等于空转。所以我选择先停充再均衡或者在充电末期用小电流均衡避免和充电环路打架。放电状态下原则上不开启均衡因为电压本身在快速下落压差判断没有意义而且均衡额外消耗能量等于加速电池耗尽。实际固件里保留了一个“维护均衡”模式维护人员可以通过调试口手动触发用于定期把电池组重新拉齐。这样既不干扰正常工况又保留了运维能力。4.4 失效安全均衡使能不能是普通 GPIO这是整个设计里最不能省的一环。STM32F410RB 跑飞或者死机时GPIO 会回到复位默认状态如果默认恰好是“使能均衡”功率级就会一直导通。备用电源长期无人值守这种故障可能直接导致电池损坏。我的做法是给均衡使能信号加一个硬件与门与门的另一个输入来自 MCU 的定时器通道。这个通道平时输出高电平但 MCU 每个控制周期都会刷新一个喂狗事件一旦 MCU 停止工作通道输出回落到低电平与门输出变低均衡功率级强制关闭。等于给均衡器加了一个“心跳线”程序活着才能运行程序死了就断电。这个设计在联调阶段就救我一次后面调试实录里会说。5. 调试实录三个问题的完整排查过程5.1 均衡电流只有设计值的四分之一第一版焊完目标均衡电流 1A实测只有 250mA。当时第一反应是电感问题换大电感以后电流更小又怀疑占空比不对用示波器看开关节点波形发现高电平时间明显偏窄。逐项查到最后才定位到基准电压我给 DAC 设置的基准电压选错了参考源DAC 输出在均衡启动后掉了 0.1V误差放大器一直处于限流状态。检查原理图确认VREF 不能直接接电源要接独立高精度基准。换成独立基准后均衡电流回升到 900mA 以上。这个案例的教训是遇到电流与设置不符不要一上来就怀疑软件先测基准和反馈网络的外部条件是否稳定。很多看似软件的问题最终都是基准地漂移造成的。5.2 MCU 复位瞬间均衡器误导通调试中有一次按下复位键示波器捕捉到均衡使能引脚出现 2ms 高脉冲均衡功率级也导通了这么一下。时间很短但足以让电池电压出现毛刺。原因很简单STM32 复位后引脚默认状态是浮空输入均衡使能线如果悬空噪声一推就变成高电平。修复分三步一是在使能引脚外部加 100k 下拉电阻让默认电平为低二是在初始化代码最开始立刻把该引脚配成低电平输出三是加一个上电延迟用 RC 电路把高阻状态延长到 10ms确保 MCU 启动完成前不会误动作。对这个 2S 项目来说 2ms 误动作后果不大但养成了习惯以后做更大系统时才会更稳。5.3 均衡启动后电压采样“假下跌”还有一个挺迷惑的现象均衡一开启被测电池电压瞬间跌了 30mV但用万用表量电池端并没有跌这么多。问题出在采样时刻开关管切换时会在采样线上耦合尖峰ADC 恰好采到尖峰的低压部分再经过滤波就表现为整体下跌。解决思路是给 ADC 采样做同步不是自由运行去采而是用定时器触发采样让采样点落在 PWM 周期中相对平稳的区间。我还加了一个“透明窗口”逻辑在采样前 2ms 暂时关断均衡采样结束再恢复。这个操作牺牲了一点均衡工作时间却换来了可靠的采样值最终实测开启均衡前后电压读数基本一致。5.4 地环路会让所有修复都显得失效如果前面几个都检查完仍然读数飘基本就是地环路。调试阶段我曾经把 MCU 板子用杜邦线连到功率板结果 ADC 读数随负载电流明显漂移。原因就是两块板的地在多个地方形成环路采样地参考不稳定。解决办法是只保留一个短而粗的地连接点所有信号地都汇总到这个点。调试器和上位机串口的地也不能和功率地混在一起否则问题会反复出现。这些经验用过一次以后就再也不想踩第二次了。6. 实测数据与扩展思路6.1 一组均衡前后的对照数据在 25℃ 环境下两节标称 2000mAh 的 18650 电池初始压差 64mV。先用 500mA 均衡电流跑4 小时后记录数据如下项目均衡前均衡后 4 小时电池1电压4.112V4.056V电池2电压4.048V4.052V压差64mV4mV均衡状态未开启进入迟滞区自动停止这组数据显示电荷从高压电池平稳转移到低压电池压差收敛到迟滞关闭阈值以内均衡过程自动结束。放在循环里看后续充电时低压电池能够正常充满整体可用容量比不均衡时好很多。需要再强调一遍均衡没有修复电池只是让两节都尽量处在安全区那节容量已经衰减的电芯如果被拉到平台区整组时间依旧受它限制。6.2 从 2S 往多串扩展的取舍这套方案非常适合两串结构。如果要做成 4 串最简单的做法是拆成两组 2S各用一片 MP2642GR-Z由 MCU 统一调度。这里会遇到新的麻烦两组 2S 的地参考电位不同采样和控制信号都得处理隔离。如果目标是 4S 以上我更倾向于直接选用支持多串的均衡前端而不是无限堆这个双串方案。毕竟均衡本身是安全系统的一部分扩展时稳定性和可维修性比省料更重要。6.3 复盘这套设计里最值钱的是什么把整个项目捋一遍我觉得最值钱的不是某颗芯片而是“控制策略与硬件安全机制的配合方式”。没有 MCU 的均衡器只能做固定动作不符合备用电源的多状态需求有了 MCU 又容易在可靠性上出疏漏。这次用硬件与门和心跳信号把“程序死了也要安全”落实了这是我个人最满意的地方。下次再做类似板子我大概率会把采样通道改成隔离差分放大器进一步提高抗干扰水平同时把均衡电流档位做成可配置跳线方便适配不同容量电池。最后给最初做这个项目时的自己补一句经验先想清楚“不均衡会坏”和“均衡太过也会坏”再去调代码均衡才不会帮倒忙。