
做储能和备用电源系统两节电池串联是最常见不过的拓扑但也是最容易被低估的坑。前阵子在实验室用 MP2642GR-Z 和 STM32F417ZG 做了一套2S磷酸铁锂备用电源样机的均衡控制才把串联电池容量失配的问题彻底压住。出厂时两节电芯压差只有2mV跑了三个月压差飙到接近50mV系统可用容量肉眼可见地缩水浮充末期还出现过一节过压保护、另一节还没充满的尴尬局面。下面这篇复盘我会把选型逻辑、硬件采样链路、均衡状态机、实测数据和踩过的坑一并交代清楚给做小容量储能、UPS后备电池管理的朋友一个可以直接抄作业的参考。1. 两节串联电池的容量失配为什么均衡不是可选项1.1 从一次现场故障说起当时那套备用电源样机结构很简单两节磷酸铁锂电芯串联给直流母线做后备市电正常时由充电模块浮充掉电时切换成放电。问题出在样机连续运行几个月之后我顺手读了一下后台的电压记录发现Cell1和Cell2的电压差从出厂时的2mV一路涨到接近50mV而且还在缓慢扩大。最直接的后果是系统可用容量缩水。串联回路里放电电流是同一个容量小的那节电芯先放空保护板就要强行切断放电剩下那节电芯里面还有电也送不出来。充电的时候反过来容量小的那节先充满达到3.65V之后保护板停止充电容量大的那节永远吃不饱。整个系统的实际容量被最差的那节电芯死死卡住。有意思的是压差一旦拉开还会自己加速。容量低的那节电芯因为长期充不满、放不尽容量衰减更快于是压差进一步扩大形成恶性循环。到了这一步单纯靠BMS保护已经救不回来必须靠均衡去主动干预。1.2 串联电池组的能量木桶效应均衡解决的本质问题可以理解成一个木桶效应串联电池组的总输出能力取决于最矮的那块木板。两节电池在制造时容量不可能完全一致使用过程中温度场、内阻、自放电率也有差异所以SOC剩余电量必然逐渐错开。正常情况下这个错开幅度如果只有2%~3%系统还能忍受。但当它扩大到5%以上容量损失就很明显了。我习惯用一个粗略公式估算损失可用容量 ≈ 额定容量 ×SOC_min SOC_max/ 2的标准差折算。说白了两只电芯的SOC偏差越大系统的理论可用能量就越低而均衡系统就是专门用来把SOC偏差压回去的。有朋友可能会问既然是2S小系统为什么不直接在每节电芯上并联一个大电阻让它自己耗散掉多的电量这就是均衡的雏形但直接并联固定电阻不可控电压高的时候耗散快电压低下来之后耗散慢还会在低温或低SOC场景下把电芯拖入过放。所以需要的是可控的均衡通道而不是一个傻乎乎的放电电阻。1.3 被动均衡与主动均衡的取舍依据均衡方案大体分两类。被动均衡也叫耗散式均衡把高SOC电芯的多余能量通过电阻变成热量放掉优点是电路简单、成本低、可靠性高缺点就是能量浪费以及均衡电阻的散热问题。主动均衡则用电感、电容或者变压器把能量从高SOC电芯搬到低SOC电芯效率高不少但电路复杂度、控制逻辑和成本也上了一个台阶。我没有一上来就上主动均衡原因很现实只有两节电池被动均衡的功率拓扑足够简单而且备用电源场景下系统平时大部分时间处于浮充状态有源源不断的充电能量补充耗散掉的那点能量完全可以接受。换成功率高、控制复杂的主动方案反而引入了更多的故障点。这套取舍逻辑我整理了一个对比表方便大家按自己的项目情况判断对比项被动均衡本方案主动均衡备选均衡效率低多余能量变热高能量转移硬件复杂度低电阻加开关管高需要电感/电容与斩波控制成本低中高可靠性高无电解电容等易衰器件中开关器件应力大控制策略简单开关通断即可复杂需要电流方向与占空比控制适用场景小容量储能、浮充为主大容量、频繁充放电场景2. 选型思路MP2642GR-Z 与 STM32F417ZG 的分工逻辑2.1 MP2642GR-Z 在均衡回路里的角色MP2642GR-Z 在我的方案里承担的是均衡执行端的角色。从功能上看它内部集成了一组逻辑可控的功率开关通道外部只需要在开关通道两端接均衡电阻主控用一个普通GPIO控制它的导通和关断就能实现把某节电芯接到均衡电阻上放电这个核心动作。它对我来说最省事的地方是逻辑电平和3.3V MCU直接兼容。STM32F417ZG 的GPIO推挽输出就能直接驱动它的控制端不需要额外做电平转换。另外它的导通电阻足够低相对于均衡电阻几欧姆量级来说基本可以忽略所以均衡电流的计算可以近似成电池电压除以均衡电阻这让调试期的电流估算变得很直观。我没有去硬抠这颗芯片内部所有检测通道只用了它的功率开关功能电压检测和策略判断全部交给 MCU 做。这样做的好处是系统分层清楚芯片管执行MCU管大脑哪块出问题都好定位。如果你手头的项目对均衡电流的精细控制要求更高可以再研究它内部的开环调节能力但两节电池的被动均衡场景下开关式控制已经足够。2.2 选 STM32F417ZG 的五个理由有人可能会觉得两节电池均衡这种小活儿随便一个 8 位MCU就够用了为什么非要上一颗 Cortex-M4F 级别的 STM32F417ZG我当时的考虑是这么几条每条都踩过教训第一ADC采样精度和通道数。均衡系统的核心是准确感知两节电池的电压差STM32F417ZG 的ADC是 12 位加上硬件过采样和软件滤波足够把压差分辨率做到毫伏级别。同时我还要采集两路NTC温度、母线电压、充放电电流通道数少了就得外扩模拟开关徒增故障点。第二备份寄存器。均衡过程的累计时间、开关次数、上次故障码这类信息需要掉电不丢失。STM32F417ZG 有备份寄存器和RTC不需要额外挂EEPROM系统断电再上电历史记录还在这对备用电源这种平时没动静、关键时刻必须顶住的设备尤其重要。第三CAN接口。储能系统通常要跟柜体控制器或者上位机通信上报每节电池电压和均衡状态。虽然串口也能做但CAN在抗干扰和长距离传输上明显更稳这块是给未来扩展留的余量。第四硬件加密和CRC 加速。备用电源在很多场景里需要做数据审计均衡历史记录不能被随意篡改。STM32F417ZG 自带 AES、HASH 和 CRC 硬件加速做些简单的防篡改校验很方便不用额外花CPU时间。第五性能余量。均衡策略虽然不复杂但我还要在上面跑通信协议栈、电压电流闭环、故障记录和本地显示刷新。用一个性能余量充足的MCU后续加功能不用推翻重来。2.3 系统框架感知、决策、执行整个系统的逻辑链路不复杂可以分成三层看感知层电池电压通过电阻分压加RC滤波进 MCU 的ADC温度通过NTC电阻分压进另一路ADC充放电电流通过采样电阻和运放放大进ADC。这些模拟量是后续所有判断的基础。决策层STM32F417ZG 每 10ms 做一次软件滤波10 秒尺度做一次均衡判据评估。只有连续多个周期满足条件才允许开启均衡避免瞬时波动误动作。执行层MCU 的GPIO输出控制 MP2642GR-Z 的开关通道把选定的高电压电芯接入均衡电阻放电。同时 MCU 根据温度、压差、超时条件来决定是否暂停或终止均衡。一句话总结分工逻辑MCU负责看、想、决定均衡芯片负责动手两边用GPIO握手电气上完全隔离逻辑上也互不干扰。这套框架不是二选一而是各干各的活出问题的时候好查。3. 硬件落地采样精度、均衡功率与保护细节3.1 单体电压采样链路分压、滤波与参考电压电池电压采样首先是分压比设计。以磷酸铁锂为例单体最高充电电压按3.65V算我要留出10%以上的裕量让ADC最高输入不超过3.3V所以我按4.0V对应3.0V来设定分压比也就是分压系数0.75左右。具体用 10kΩ 和 30kΩ 电阻分压4.0V 时 ADC 输入正好3.0V余量充足。这里有个新手容易忽略的坑分压电阻的阻值不能太大也不能太小。阻值大了源阻抗太高ADC内部的采样电容在采样时间内充不满读数会偏低阻值小了分压网络自己一直在耗电对电池是额外的负载。实测下来等效源阻抗控制在 10kΩ 以内比较稳采样时间配置成 480 个ADC时钟周期绝大多数情况下都能保证精度。滤波方面我在分压点到MCU引脚之间加了一级RC低通1kΩ串联电阻加 100nF 对地电容截止频率大概1.6kHz既能抑制开关电源带来的高频纹波又能防止MCU引脚上的数字噪声串回模拟链路。注意这颗电容要用C0G或者X7R介质温度稳定性好别用高容量的Y5V不然低温下容值掉了滤波效果就变了。参考电压这块项目要求压差精度到毫伏级MCU 内部 VREF 的温漂有点大我在 PCB 上加了一颗基准电源芯片给 ADC 做参考稳定性比内部参考高一个数量级。两节电池的压差分辨率最终实测能稳定在 1mV 左右这对 10mV 的均衡关闭阈值来说是足够的。3.2 均衡电阻的功率预算与散热布局被动均衡的本质就是把电芯的电能变成电阻的热能所以均衡电阻的功率选型非常关键这里有过一次冒烟的教训。我按五倍安全余量来选。以电芯电压3.65V、均衡电阻3.3Ω为例最大均衡电流是 3.65 / 3.3 ≈ 1.1A电阻上的最大功耗是 I²R ≈ 1.1×1.1×3.3 ≈ 4.0W。如果选一颗4W电阻长时间满载工作会烫到不能碰我最终用了两颗6.8Ω 5W电阻并联等效3.4Ω总功率余量10W实际最大功耗4W左右温升控制在可接受范围。这里有一个容易被忽视的细节均衡电阻要远离电压采样点。电阻发热后周围空气温度升高会影响附近分压电阻的温度系数导致采样电压缓慢漂移。我的做法是把均衡电阻放在PCB一角采样分压网络放在另一角中间加了一条地线隔离并且让均衡电阻底下大面积铺铜辅助散热同时开好散热孔。控制芯片这边同样要留意散热。MP2642GR-Z 的功率通道在持续大电流状态下会有导通损耗虽然是开关管不是线性稳压但 PCB 上还是给它留了足够的铜皮面积并且放置了一颗NTC贴在均衡电阻旁边软件里把这个温度值作为均衡暂停的判据之一超过了就强制停掉均衡保护PCB和电芯。3.3 保护逻辑与地平面处理硬件保护上我做了一些比较保守的设计。第一每节电芯的采样线都是从电池极柱单独引出的而不是从均衡回路里直接取的。这样做的原因是均衡开启瞬间回路里会有1A级别的电流PCB走线和连接器触点上的压降会通过采样线反馈到 ADC造成虚假的电压跌落。独立采样线也叫开尔文接法能把这个误差完全排除掉。第二均衡通道控制端加了RC吸收防止感性负载断开瞬间产生尖峰干扰。虽然均衡电阻是纯阻性但连接线上的寄生电感在1A电流切换时还是会有感应电动势吸收电路能显著降低电磁干扰。第三电池反接保护。系统可能在生产装配或维护环节出现电池接反我在电池组正极串联了一颗保险丝同时并联了一颗肖特基二极管做反向旁路。任何一根总线对地短路或者电池接反保险丝先断保护后续电路。地平面处理上我把模拟地和功率地分开铺采样分压、基准源、ADC 相关元件放模拟地均衡电阻和功率开关放功率地两片地只在ADC附近单点连接。实践下来这招对抑制均衡开关动作时的电压毛刺非常有效ADC读数的波动从刚开始的 ±20mV 降到了 ±2mV 以内。虽然现在很多高速混合信号PCB建议完整地平层不分割但在这个功率电流不大、频率不高的场景里模拟功率分地带来的信噪比提升更直观。4. 软件策略采样滤波、滞环判据与均衡状态机4.1 ADC多通道采样与软件滤波硬件上采样链路做好了软件滤波同样不能省。我使用ADC的注入组模式把单体电压、电池组总电压、NTC温度、母线电流都放进DMA通道里每1ms自动完成一轮采样不占CPU时间。每个变量连续采 64 次后做一次去最大最小值取平均再叠加一级一阶低通滤波相当于把高频噪声和随机毛刺两层都削掉。滤波参数可以按实际噪声水平调整我给出一组参考值#define SAMPLE_NUM 64 // 一次滤波窗口内采样次数 #define ADC_REF_V 3.3f // 参考电压 #define ADC_RESOLUTION 4095.0f // 12位ADC满量程 float cell_voltage_filtered[2]; // 滤波后的单体电压单位V float low_pass(float new_value, float old_value, float alpha) { return alpha * new_value (1.0f - alpha) * old_value; } void adc_processing_task(void) { uint16_t raw[2]; float v_unfiltered[2]; // 从DMA缓冲区读取最新一轮采样结果 for (int i 0; i 2; i) { raw[i] dma_buf[i]; v_unfiltered[i] (float)raw[i] / ADC_RESOLUTION * ADC_REF_V; // 分压比换算回电芯实际电压 v_unfiltered[i] v_unfiltered[i] / 0.75f; cell_voltage_filtered[i] low_pass( v_unfiltered[i], cell_voltage_filtered[i], 0.2f); } }实测下来这套ADC处理配合前面的RC硬件滤波压差计算的跳变范围能控制在 ±3mV 以内不会因为采样噪声造成均衡反复启停。4.2 均衡判据的设计阈值、滞环与时延均衡判据是整个软件策略的核心也是最容易因为过度设计翻车的地方。我最终采用的是滞环 时延 电压区间三者叠加的判据。滞环开启阈值设在 30mV关闭阈值设在 10mV。如果只用一个15mV阈值压差在阈值附近来回抖动时均衡会在开关之间反复横跳均衡电阻和开关管的热冲击很大。用滞环之后一旦均衡开启必须等压差真正确认收敛到10mV以下才关闭动作次数显著减少。时延任何阈值条件都需要连续满足一段时间才生效我设为 5 秒。这个数值要防止静置状态下瞬时波动造成的误动作又不能太长导致均衡响应迟钝。5秒是综合考虑采样周期和系统动态特性之后的折中值。电压区间均衡只允许在高SOC区间执行。磷酸铁锂的电压平台很平坦电芯在2.9V到3.3V之间的电压变化量很小如果压差出现在这个区间往往不是SOC差异的真实反映。我在代码里明确限制只有目标电芯电压高于 3.35V 时才允许开启均衡低于这个值就一律不做。这套限制在做样机联调时救过大命避免了很多次越均衡越偏的诡异现象。4.3 状态机框架与保护融合整个均衡控制我用一个标准状态机来描述代码结构清晰后期排错也方便typedef enum { BAL_STATE_IDLE, // 空闲不动作 BAL_STATE_CONFIRM, // 压差超限正在持续确认 BAL_STATE_BALANCING, // 均衡通道开启 BAL_STATE_COOLDOWN, // 均衡暂停等待温度回落 BAL_STATE_DONE, // 压差收敛均衡完成 BAL_STATE_FAULT // 故障锁存 } bal_state_t;状态跳转逻辑我提取了最重要的几条IDLE 到 CONFIRM压差大于30mV且目标电池电压大于3.35V。CONFIRM 到 BALANCING压差条件保持5秒以上。BALANCING 到 IDLE压差小于10mV或者均衡持续超过60分钟。BALANCING 到 COOLDOWNNTC温度超过50℃暂停15分钟再重新评估。任何状态下检测到过压、欠压、短路直接进 FAULT 并锁存需要人工复位或者通过上位机清除故障码。考虑到备用电源的特殊性均衡窗口策略也做了区分。只有在充电状态或者浮充状态才执行均衡市电中断进入放电模式时暂停一切均衡动作把有限的电池能量优先供给负载。等市电恢复、电池重新进入充电状态后再继续。这个策略看着简单但对备用电源来说是灵魂性的均衡不能为了追求一致性反而在紧急时刻消耗宝贵的备用能量。5. 实测过程与踩坑记录从压差收敛到噪声处理5.1 实验条件与收敛数据样机装机完成后我模拟了一组失配工况来验证均衡效果。两节 10Ah 磷酸铁锂电芯刻意预先充到不同的SOC静置8小时之后压差约45mV。外界用一个可编程电源模拟浮充电压限流1A让系统处于充电状态均衡策略自动对高电压的那节电芯开启放电通道。实测数据如下时间点Cell1电压Cell2电压压差均衡状态0分钟3.352V3.307V45mV等待确认5分钟3.349V3.306V43mV均衡开启30分钟3.341V3.313V28mV均衡中60分钟3.334V3.317V17mV均衡中120分钟3.326V3.320V6mV均衡中180分钟3.323V3.322V4mV压差达标均衡关闭从数据上看前60分钟压差下降明显因为高电压电芯的均衡放电电流接近0.3A它的充电净速率显著低于另一节。后半段压差进入毫伏级区间后由于电池本身的电压平台特性收敛速度放缓但最终稳定在4~6mV区间整个系统处于一种动态平衡状态。值得注意的是压差在120分钟时已经降到6mV我没有马上关闭均衡而是等它继续跑满几个判断周期确认压差没有再反弹回去才关闭通道。这个确认后再关闭的习惯能避免均衡刚停压差又弹回10mV以上的尴尬。5.2 踩坑一采样噪声导致均衡反复动作刚连上样板测试时我遇到了一个典型的软件看起来没问题硬件却在捣乱的故障。均衡通道开一段时间后压差数据在10mV到30mV之间反复横跳均衡状态机跟着一会儿开启一会儿关闭原本应该是一次性的均衡过程变成了高频振荡。用示波器查看分压节点发现电芯电压信号上叠加了几十毫伏的高频毛刺来源是旁边Buck变换器的开关噪声。虽然硬件上已经加了RC滤波但频率较高的开关噪声还是耦合进了采样链路。我加了两道处理第一把RC滤波的截至频率从1.6kHz降到200Hz代价是响应变慢一点点对10s尺度的均衡判据没有任何影响第二在软件上增加相邻两次压差变化超过 15mV 就丢弃本轮数据的异常剔除逻辑。经过这轮整改ADC读数的峰峰值抖动从 ±20mV 降到了 ±2mV均衡状态机全程不闪跳问题才真正收口。排查过程中我差点怀疑是芯片控制信号的问题后来用示波器同时抓控制引脚和采样引脚才发现噪声是走模拟链路进来的不是逻辑控制的问题。5.3 踩坑二均衡开启瞬间的电压跌落误判第二个坑出现在均衡通道刚开启的那一瞬间。第一次完整跑均衡流程时均衡开启后大概 50ms 内系统报出了单体欠压警告。这个警告让我很困惑电池电压明明在正常区间均衡一开就掉到欠压用示波器抓单体电压的瞬态波形真相是均衡电流直接从电芯极柱流向均衡电阻在电池内阻、连接器触点和PCB走线的合成阻抗上产生了压降。以0.3A电流、100mΩ回路线路阻抗估算瞬间压跌就有30mV这个幅度刚好落在欠压判定的边缘再叠加采样噪声误报就产生了。解决思路分两层。硬件上把电压采样线从均衡回路上移开采用开尔文接法直接从电池极柱根部走独立线路到采样分压网络彻底断开均衡电流在采样回路上的压降影响。软件上均衡通道开启之后进入200ms屏蔽期这期间不对单体电压做欠压判断采样数据照常记录但只用于观察不参与保护逻辑。双重处理之后这个误报一次都没有再出现。这里要提醒一句如果你发现均衡开启后电压突然掉了一截先别急着怀疑是电芯内阻变大大概率是采样点选的位置不对把线挪到电池极柱上问题往往就消失了。5.4 踩坑三均衡电阻发热与降额策略我还吃过一枚均衡电阻的亏。最初样机上用的是一个3.3Ω、4W的铝壳电阻理论上功耗余量不到15%实验室常温环境下跑一两个小时均衡表面温度直接干到95℃以上PCB局部位置被烤得变了色。后来我把均衡电阻改成两颗 6.8Ω 5W 的绕线电阻并联等效阻值3.4Ω额定功率总和从4W提升到10W表面温度降到了60℃上下安全裕量也舒服了很多。同时我在软件里加了温度反馈和降额机制NTC检测到均衡电阻表面温度高于50℃时均衡自动暂停等温度回落再继续。散热设计和软件保护双管齐下才算是把这个坑彻底填平。在做备用电源这类7×24小时运行的设备时均衡电阻的长期可靠性比短期规格更重要。温度余量不够短期测试可能看不出来但设备运行一年两年之后电阻老化率会明显放大最终影响的是整个系统的维护周期。5.5 浮充模式下的长期表现短期的收敛实验通过之后我又做了两周的连续浮充运行。工况模拟真实备用电源白天负载小浮充电压稳定偶尔模拟几次市电中断让电池组深度放电再恢复浮充。两周下来两节电芯的压差始终维持在 4~8mV 区间均衡触发的次数从第一天的十几次逐步减少到后面几天的两三次。这说明均衡系统真正把两只电芯的SOC对齐了后面只是在日常微小的自放电差异里做补偿。中间有一次我人为制造了 60mV 的压差扰动均衡系统照样在 3 小时内把它拉回 10mV 以内整套策略的响应速度和工作可靠性我算是彻底放心了。6. 这套方案的可复用性、局限性与改进方向6.1 可以直接复用的部分这套2S均衡方案里最值得复用的是均衡状态机模型和滞环判据参数。它不依赖特定芯片移植到其他MCU平台只需要改GPIO控制几行代码阈值参数甚至不用动。ADC采样链路的分压、滤波、采样保持时长配置也是通用的换一个MCU型号只要ADC性能不比STM32F417ZG差方案可以直接搬过去。均衡电阻的功率计算方法、开尔文采样接法、NTC温度反馈这三项是低成本高收益的设计强烈建议在下一版直接固化到PCB布局规范里。特别是开尔文采样接法成本几乎为零但对采样精度和抗干扰能力的提升立竿见影。6.2 局限性与改进方向这套方案也有一些天然的局限需要提前说明。被动均衡在放电紧急场景下是不能工作的均衡耗散的是电池自身的能量所以在市电中断期间策略上必须暂停均衡。如果项目对能量的利用率有硬性要求比如追求更高的有效放电容量那被动均衡就力不从心了可以考虑升级成电感式主动均衡把高SOC电芯的能量搬给低SOC电芯用。另一个局限是它只覆盖两节串联。未来扩容到更多节串联时MP2642GR-Z 可以做级联也可以换成多通道均衡芯片但均衡判据会从两节压差变成组内最高与最低压差状态机要做一次升级不能直接照搬。如果你要做的是更大容量比如几十安时以上的储能柜建议把基于电压的均衡进一步升级成基于SOC的均衡。电压判据在磷酸铁锂这种电压平台特别平坦的电池上容易出现盲区配合库仑计实时跟踪电量变化均衡决策会更准确。6.3 一点长期体会做了好几个电池管理项目之后我越来越觉得整套均衡系统里最值钱的部分不是那颗均衡芯片而是采样链路和判据策略。芯片只是个开关真正决定系统可靠性的是能不能准确感知电芯的微小差异以及能不能用一套足够稳的算法去响应这个差异。先把被动均衡做扎实数据治理干净、阈值设计合理、散热余量给足再考虑往主动均衡升级这条路径走下来会比较顺。如果你正准备在储能或备用电源项目里加均衡功能我建议先拿这套方案跑通一轮浮充测试把压差数据记录下来再根据自己的电芯特性和工况去调整阈值参数。每个系统的电芯内阻、温度环境、充放电倍率都不一样别人调试好的参数只能作为起点你得花一两周时间观察数据才能找到最适合自己系统的那组判据。这套功夫省不得但回报相当直接电池组的可用容量提上去寿命也肉眼可见地延长。