基于MP2642GR-Z与STM32F373RC的2串电池主动均衡方案 我见过不少做电池系统的同行一上来就问我同一个问题“只有两节串联电池真的需要单独做均衡吗”答案不仅是需要而且非常需要。尤其是储能和备用电源这种长期浮充、偶尔深度放电的工作场景两节电池的不一致会被静置期和涓流期无限放大最后变成一个看着很新、实际用不了几个循环的模组。这篇文章想跟你聊聊我是怎么用 MP2642GR-Z 这颗主动均衡器件配上一颗 STM32F373RC在 2 串电池模组上做出了一套可靠的均衡方案从选型、硬件设计、算法调试到量产测试都会覆盖到。如果你正在做 2 串磷酸铁锂或小型储能 BMS或者只是对“主动均衡到底怎么落地”感兴趣这篇文章应该能帮上忙。这套组合听起来有点“大炮打蚊子”两颗电池而已干嘛用一颗带高精度 ADC 的 MCU 加一颗专门均衡芯片但实际调下来你会发现均衡这件事硬件只是把路修好真正决定电池寿命和系统可靠性的是软件里那套“什么时候该干活、什么时候必须停”的策略。下面我会把整个项目拆开讲包括很多数据手册里不会写的东西。1. 两个串联电池的不一致性从源头看清问题的本质1.1 看似相同的电芯为什么越用越“分裂”很多人觉得串联电池出厂时容量、电压都差不多差别应该很小。这是最大的误区。出厂分选只能保证初始参数接近真正的问题是使用过程中的分化。影响电池一致性的因素很多最常见的是自放电率差异、温度梯度和内阻差异。自放电率差异同一批次电芯自放电率离散度大概是0.5%~3%/月。假设两节电池一个自放电 1%/月另一个 3%/月一个月下来 SOC 就能差 2%静置三个月就是 6%。对容量 50Ah 的电池来说就是 3Ah 的电量差。温度梯度模组里两节电池所处位置不同散热条件不一样。高温那节老化更快内阻增长更快自放电也更高。这是一个正反馈差异只会越滚越大。内阻差异高内阻电池在工作电流下会产生更大的极化压降。放电时它先到截止电压充电时它先充满整包容量被“木桶板”死死压住。这些差异在 1 节电池上不存在在 2 节串联时就已经开始累积。千万别觉得“才 2 节无所谓”等到备用电源在一次停电测试中提前 15 分钟趴窝你就知道问题有多严重了。1.2 不一致带来的损失算给你看我们可以用最简单的方式估算一下不一致带来的容量损失。假设两个单体都标称 50Ah但实际容量分别是 51Ah 和 49Ah串联在一起使用放电时49Ah 那节先放空系统强制停机。此时 51Ah 那节其实还剩约 2Ah 电量整包可用容量被限制在 49Ah相当于损失了约 4% 的容量。更麻烦的是长期这样运行49Ah 那节每次都处于“被放电到过放边缘”的状态循环寿命会大幅缩短下一轮差异更大。充电时49Ah 那节先到达充电截止电压充电电流被切断51Ah 那节永远充不满。日积月累整包“实际可用窗口”越来越窄。如果把这个场景换算成功率一个 200W 负载的备用电源2Ah 的剩余容量意味着约 30 分钟的工作时间损耗。对关键负载来说这半个小时的差距可能就是事故边界。1.3 储能和备用电源场景的特殊压力储能系统跟消费电子不一样它有几个让电池不一致问题放大的特征长期浮充电池大部分时间挂在恒压源上。浮充电压下自放电快的电池电流会增大导致它被“额外充电”更容易析锂/老化进一步拉开差距。浅充浅放循环虽然每次循环深度浅但一天慢充慢放好几次。电量差异在浅循环中不会自动归零只会累计。小电流长时放电备用电源的负载电流往往只有 0.05C~0.2C此时电池极化电压很小电压差基本能反映真实 SOC 差。一旦有 20mV 以上的压差就说明 SOC 差已经不小了。所以在这种场景下2 串模组不是不需要均衡而是需要在“长时间静置和浮充”这种几乎没有大电流干扰的状态下把电从高 SOC 的一节搬到低 SOC 的一节一点点把差值磨平。这也决定了我们对均衡方案的核心需求电流不用特别大但效率要高、要能长时间稳定运行、要能在低噪声的环境下精准判断差距。2. 均衡方案选型为什么最终选了主动均衡路线2.1 被动均衡的问题能削峰不能填谷被动均衡的做法非常简单每节电池并联一个电阻和一个 MOS 开关谁电压高就放谁的电阻。硬件成本很低控制逻辑也很简单但有两个场景下很难接受的问题。一是能量浪费。压差 0.3V、均衡电流 0.5A电阻上就是 0.15W 的持续发热。看起来不大但在封闭的电池模组里长期发热会叠加到电池温升上。而且它消耗的是整包的能量白白变成热量。二是它只能“削高”不能“填低”。假如两节电池中低的那节本身容量已经衰减了被动均衡把高电压那节放掉一部分低电压那节并不会变得更满。整包可用容量的短板还在那里均衡完以后两节电压看起来差不多但实际上低容量那节依然是瓶颈。备用电源一旦遇到深度放电这个问题会立刻暴露。2.2 主动均衡的三种常见拓扑对比主动均衡的核心思想是让能量在电池之间转移而不是消耗掉。常见的有电容式、电感式和变压器式几种。电容式飞渡电容均衡通过一个电容开关矩阵把电荷从高电压电池“舀”到低电压电池。电路简单但每次转移的电荷量有限均衡电流小效率也会受开关损耗影响对长期浮充的大容量模组来说速度偏慢。电感式均衡用功率电感做储能元件把高电压电池的能量先存在电感磁场上再释放到低电压电池。效率高均衡电流可以做得比较大是目前中等容量模组的主流。变压器式均衡用多绕组变压器实现能量回馈隔离性好适合做高压大容量系统。但对 2 串这种低压小模组来说变压器体积太大成本也高。表格对比一下方案均衡方向典型效率电路复杂度成本适用场景被动电阻只能高电压放电0%能量变热低低容量差异小、循环浅的消费电子电容飞渡高向低转移约 70%~80%中中小电流均衡、串数较少的连续均衡电感式主动高向低转移85%~95%中高中高储能、备电、低速车等对效率敏感的场合变压器式任意单体到整组80%~90%高高高压大容量系统MP2642GR-Z 在我理解的定位里属于电感式主动均衡这一路。它的核心价值不是替 MCU 做判断而是把“高电压到低电压的电荷转移”这个功率动作执行得干净高效外部只需要搭配功率电感和少量被动器件就能组成一个完整的双向转移回路。具体外围电路和引脚定义不同后缀和版本会有差异我下面讲的所有内容都是基于我自己手里的样片和某工程样板的实际调试结果你换一个出处先看官方数据手册再动手。2.3 为什么 MP2642GR-Z 适合 2 串场景2 串电池模组对均衡器件有一个特殊要求均衡对象只有两节不需要复杂的拓扑切换只需要一条可靠的“高侧到低侧”转移通道。MP2642GR-Z 这种专用均衡器件非常适合干这件事理由主要有三个第一它把功率开关和驱动逻辑集成在器件里MCU 不需要自己去写复杂的 MOS 开关时序只要通过使能引脚让它“开工”或“停工”软件负担小很多代码也不容易出现时序上的低级错误。第二它的控制精度和稳定性适合长时间微量均衡。储能场景不需要大电流狂拉但需要那种“开机后连续转移几小时、还不跑偏”的能力。专用器件内部本身的环路控制和保护机制比用通用 PWM 自己搭一个半桥要可靠得多。第三它和 MCU 的分工非常清晰。MP2642GR-Z 管“功率路径”STM32F373RC 管“感知与决策”。MCU 利用高分辨率 ADC 准确测出两节电池的电压差然后决定要不要开启均衡、开多大电流、什么时候停。两者各司其职出了问题也容易排查。3. 系统架构与硬件设计把两个器件的分工落到实处3.1 整体框图的思考方式我不太喜欢一上来就贴原理图。做 2 串均衡系统先理清楚信息流和功率流比抄参考设计更重要。系统里主要有三条路径电压采样路径两节电池的正负极电压经过分压和滤波网络进入 STM32F373RC 的高精度 ADC。这条路径必须精准、抗干扰。均衡功率路径MP2642GR-Z 的功率端口跨接在电池 1 和电池 2 之间配合外部电感完成电荷转移。这条路径必须短粗、低阻抗、散热好。控制与通信路径MCU 的 GPIO 控制芯片使能芯片的故障反馈引脚回连到 MCU 中断MCU 再通过 UART/CAN 把状态上报给 BMS 主控。这样划分清楚以后硬件设计的边界就出来了模拟采样和功率转移不要互相干扰控制逻辑单独成一块。很多新手把 ADC 采样线跟均衡功率线走在一起结果均衡一开工电压读数就像心电图一样乱跳。3.2 STM32F373RC 的资源分配STM32F373RC 在这个系统里不是大材小用它的资源基本都能派上用场SDADCSigma-Delta ADC这是选它的核心原因。F373 集成了高精度 Sigma-Delta ADC非常适合电池电压这种“变化慢但要求非常准”的信号。我在项目里用两个差分通道分别测量两节电池的电压等效分辨率能做到 1mV 以下。普通 MCU 的 12 位 ADC在满量程 5V 下做 4mV 的分辨率都勉强长期稳定性更没法看。Cortex-M4 内核 FPU做电压数据的滑动平均滤波、阈值比较、状态机流转非常轻松。我甚至在 MCU 里加了简单的 SOC-OCV 查表依然跑得毫无压力。定时器虽然 MP2642GR-Z 不需要 MCU 直接驱动开关管但我会用一个定时器给自己留一个“心跳”用于均衡超时计时和周期性采样调度。通信接口我预留了两路通信。一路 UART 接调试口一路 CAN 接 BMS 主控。实际量产时调试口可以留着CAN 用于实时上报均衡状态。3.3 采样电路设计精度是均衡有效的前提均衡做得好不好一半的功夫在电压采样上。如果采样误差本身就超过均衡阈值系统要么一直误动作要么永远测不出需要均衡的场景。我的采样链路是这样设计的每节电池输出经过一对精密电阻分压把电压缩到 ADC 可接受的范围。分压输出接 RC 低通滤波截止频率设在几 kHz滤掉周围开关电源和均衡芯片的开关噪声。滤波后的信号进 SDADC 的差分输入。差分采样能很好地抑制共模噪声这对测量高位电池第二节电池的共模电压接近整组电压特别重要。校准方面每一块板子在生产时都会打两个电压点做线性校准补偿电阻精度和基准漂移带来的误差。这个校准矩阵非常小但做完以后两节电池的电压差测量精度可以稳定在 2mV 以内。说句实话在主动均衡系统里测量精度比很多宣传中的“均衡算法”更重要。3.4 PCB 布局里最容易出错的两个点第一是功率回路。均衡电流哪怕只有 0.5A在开关切换的瞬间也有 di/dt 尖峰。功率路径芯片功率脚、电感、电池连接点要尽量缩短铺铜加宽。别为了省面积把功率路径绕来绕去最终会绕出一根天线。第二是采样线的接法。两节电池的采样走线一定要单独从电池端直接引到电阻网络绝对不能跟功率回路共用走线。我在第一版 PCB 里为了省两个过孔把采样节点直接接到了功率铜皮上结果均衡启动时看到采样电压跳了 10mV 以上。后来改成单点引出、独立走线问题立刻消失。这个细节值得你刻在脑子里采样线和功率线必须分开。4. 控制策略与软件实现均衡算法是整套系统的灵魂4.1 均衡的判据怎么定才合理最朴素的均衡策略是只要两节电池电压差大于某个阈值就开始均衡直到差值小于阈值停止。这个逻辑在少数静态场景能用但在储能和备电这种状态变化比较大的场合很容易出问题。我的判据分了几层系统必须处于“可均衡状态”不放电、充电电流低于某个小电流浮充段/涓流段、温度在 0~45°C 范围内。启动阈值静置压差大于 15mV 才启动。阈值太小的坏处是电池电压本身有极化恢复、有测量噪声5mV 级别的波动会让均衡开关反复抖动MOS 管比平时多开关几千次。停止阈值压差小于 5mV 停止。启动和停止之间留出 10mV 的迟滞区间这能有效防止临界状态下的振荡。保护边界任何一节电池电压低于过放门限或高于过充门限时禁止启动均衡均衡过程中如果碰触到边界立即暂停。需要特别说明的是磷酸铁锂的放电平台非常平坦电压差和 SOC 差的对应关系很弱所以阈值反而要更保守一点。三元体系平台陡峭同样的电压差对应的 SOC 差更小但也不能因为这样就把阈值设得很激进。4.2 状态机设计把“干活”和“观察”分开软件里我维护了这样一个均衡状态机typedef enum { BAL_IDLE, // 空闲等待触发条件 BAL_MEASURE, // 连续采样电压做滤波处理 BAL_CHECK, // 比较压差和保护边界 BAL_ACTIVE, // 均衡进行中 BAL_DONE, // 均衡完成 BAL_FAULT, // 异常保护 } bal_state_t;核心思想是进入均衡之前必须有一段时间专门用来“测得准”。我在 BAL_MEASURE 状态下会连续采样 64 次电压去掉最大最小值再做一次滑动平均。这样做最大的好处是采样噪声和短时负载扰动不会误触发均衡。进入 BAL_ACTIVE 之后MCU 不是直接把使能脚拉高就放着不管了。每个控制周期我取 100ms都会重新读取两节电压和温度同时监测 MP2642GR-Z 的故障反馈引脚。只要出现异常立即停住。用一个简化代码片段说明主逻辑void balance_task(void) { float cell1, cell2; uint8_t status; switch (state) { case BAL_IDLE: if (sys_state SYS_IDLE temperature_ok()) { state BAL_MEASURE; } break; case BAL_MEASURE: battery_voltage_average(cell1, cell2); state BAL_CHECK; break; case BAL_CHECK: if (fabsf(cell1 - cell2) BAL_START_DELTA cell1 BAL_UV_LIMIT cell1 BAL_OV_LIMIT cell2 BAL_UV_LIMIT cell2 BAL_OV_LIMIT) { set_balance_enable(1); state BAL_ACTIVE; } else { state BAL_IDLE; } break; case BAL_ACTIVE: status balance_fault_read(); if (status ! 0) { set_balance_enable(0); state BAL_FAULT; } else if (fabsf(cell1 - cell2) BAL_STOP_DELTA) { set_balance_enable(0); state BAL_DONE; } break; default: break; } }当然实际代码里还包了一层充电状态判断和超时保护但核心逻辑就是上面这几条。4.3 用电量差代替电压差均衡的进阶做法只用电压差有一弊端电池在极化状态下电压会偏。静置电压才是最接近真实 SOC 的信号但静置需要时间。为了在备用电源“长期待命”的长尾状态里更准确地判断不均衡程度我在电压差之外还加入了一个简单的 SOC 差估算。实现方式是利用电池的开路电压-SOC 曲线OCV-SOC 查表把两节电池的静置电压映射成 SOC 百分比然后以 SOC 差作为均衡启动的主要依据。这样做的好处是磷酸铁锂场景下平台区电压差很小但 SOC 可能已经差了 5% 以上。只看电压差系统可能永远不启动均衡看 SOC 差就能发现。梯度区域快充满和快放空时电压随 SOC 变化很陡此时电压差大但 SOC 差未必大。如果盲目均衡反而可能把高压那节搬到低压那节造成“帮倒忙”。做这件事的前提是电池组在每次静置之后要能进入一次完整的 OCV 采样流程。备用电源和储能恰恰具备这个前提因为这类系统大部分时间都在静置和浮充很少连续大电流放电。这也是这类系统值得做 SOC 差均衡的原因。4.4 异常处理和自我保护均衡不是越久越好。我见过有人把均衡使能打开后就忘了管一个晚上过去两节电池确实“均衡”了但整组电量也损失了不少——因为均衡电路本身有静态功耗长时间运行会白白消耗电池能量。我的系统里有这么几道保险单次均衡最大时长超过 4 小时强制停止。如果 4 小时还没能把压差磨到停止阈值说明两节电池的容量差异已经不是单纯靠电量转移能解决的需要上报维护建议。均衡效果监控每周期的压差变化率低于某个速度比如 10 分钟内减少了不到 1mV认为均衡效率异常停止并告警。常见原因是接触电阻偏大或芯片故障。温度降额模组温度到 45°C 时均衡电流自动降低我把使能改为间歇式工作开 1 秒停 1 秒等效电流降一半。到 60°C 直接关闭均衡。这个策略能避免电池热失控的边界风险。5. 实测定标中最容易踩的四个坑与完整排查链路5.1 坑一均衡使能了但电流钳显示一直为零这是我最早遇到的现象。当时软件里已经打印出“均衡已开启”芯片使能引脚也确认是高电平但电流钳就是测不到任何电流。排查链路是这样的先用万用表确认使能引脚电平正常。这一步排除了 GPIO 配置问题。用示波器看芯片供电引脚发现上电一瞬间有轻微跌落但整体稳定排除供电问题。回头去看打印的电压值发现两节电池压差只有 8mV而我设定的启动阈值是 15mV。也就是说软件里的“均衡已开启”标志是一位调试同事直接强制置位的算法自己根本不认可这次启动芯片自然没有获得有效的使能条件。把强制位去掉重新静置半小时后再测压差自然恢复到了 40mV 左右均衡电流正常出现。这个问题让我记住了一个原则调试中不要轻易用“强制置位”去绕过保护逻辑。你绕过的每一条安全判断都可能掩盖一个真正的故障。5.2 坑二均衡电流读数忽大忽小无法闭环第二版样机测试时采样到的均衡电流在 0.3A~0.8A 之间来回跳完全控不住。这次我直接怀疑采样链路。用示波器看采样电阻两端波形发现上面叠加了一个频率很高的地噪声毛刺。进一步查布线发现采样电阻的地线端是通过一段较细的铜皮连接到功率地虽然是单点接地但这段铜皮同时流过均衡芯片的开关回电流产生了地电位差。修正方法采样电阻采用开尔文接法单独用一对细线把采样点引到 MCU 的差分输入。功率地回流的路径单独加宽铺铜和采样地隔开。在采样电阻两端并联一个高频滤波电容把毛刺压到 ADC 量程内的合理范围。改完以后均衡电流稳定在设定值附近波动小于 30mA。这个坑在 PCB 上是“省几秒走线功夫”在现场就是“查一天的噪声”。5.3 坑三充电时均衡越均衡越偏有一版策略把均衡条件放宽到了“小电流充电也可均衡”本意是想利用充电时间做均衡。结果测试时发现均衡结束后两节电池的电压差不仅没缩小反而倒挂了原本低压的那节在均衡后变得更低。根因分析充电过程中电池电压包含欧姆内阻压降和极化电压。瞬时电压高不代表 SOC 高。按充电时的电压差去开启均衡相当于用一个带偏差的测量值去做控制自然会把方向搞反。特别是磷酸铁锂充电平台非常平坦极化电压在充电尾段十分明显。电压差看着有 30mV但真实 SOC 差可能是反的。修复方案均衡只在“静置稳定”和“浮充小电流段”执行。我加了一个充电状态识别充电电流低于 0.02C 并且持续 10 分钟才允许进入均衡判断。在 SOC 差估算里加入了去极化等待时间。每次充满或大电流充电后先等 20 分钟再测量 OCV。这个坑告诉我们硬件明白软件更要明白。均衡方向的判断一旦出错再好的芯片也救不回来。5.4 坑四芯片表面温度异常升高还有一次测试中MP2642GR-Z 表面温度到了 80°C虽然没烧但已经明显超过我预期的工作温度。排查过程用热成像看到芯片中心发热电感温度正常说明发热集中在功率级。用示波器抓电感开关节点波形发现振铃比较大开关边沿有明显的高频振荡。对比数据手册推荐的 RC 吸收参数我意识到实际板上的 PCB 寄生电容比评估板大吸收电路参数需要调整。在电感节点并联了一个小阻值的阻尼电阻并在芯片周边加大了铺铜面积再测时温度降到 55°C 以下。另一个有效做法是降额使用。芯片虽然标称能输出更大的均衡电流但我在量产设计里把目标电流限制在 0.5A这样热设计和成本都有余量长期可靠性也更好。5.5 把这些坑整理成一张排查表现象优先检查项根因示例解决办法使能后无均衡电流使能电平、供电、压差阈值、强制位压差低于启动阈值但 debug 强制置位去掉强制位恢复算法自动判定均衡电流跳动严重采样电阻布线、滤波、地噪声采样地与功率地共用铜皮开尔文接法 差分采样 滤波越均衡越偏充电状态识别、极化电压充电时电压差不能代表 SOC 差仅静置/浮充态均衡增加静置观察时间芯片温度过高开关节点振铃、散热铜皮、吸收电路吸收参数与 PCB 寄生参数不匹配调整 RC 吸收加大铺铜均衡电流降额6. 从样机到小批量可靠性与出厂测试建议6.1 标定流程每一块板子的电压通道都要校准不要相信“这颗 MCU 的 ADC 精度高所以不用校准”。SDADC 本身的线性度确实好但前端分压电阻的精度、参考电压的温漂、PCB 上的应力都会产生误差。2 串系统很多时候只测两节电池如果这两节电池的测量偏差方向不一致均衡就会把本来正常的电池判成“失衡”。我的标定流程分三步用高精度基准电压源分别模拟两节电池电压打点 3.0V、3.6V、4.2V 三个点。对每个通道做两点线性拟合得到增益和偏置补偿系数写入 MCU 的 Flash 中。产线上用一台快速测试治具每块板通电后自动校验一次误差超过 3mV 的直接判 NG。很多原厂参考设计会用精密电阻做比例分压来降低对绝对精度的要求但既然主控的 ADC 够好花一点产线时间去标定能得到更高的余量。6.2 均衡功能的出厂测试方案均衡功能不是芯片能启动就行要验证它在“有压差时能搬电无压差时能停住”。我做的测试动作是用一个可调直流源模拟两节电池的压差初始设置在 100mV。给系统上电通过串口观察均衡标志位和电流值确认在 30 秒内均衡电流建立。保持运行 1 分钟检查芯片温度不超过限值。将压差调到 0mV确认系统在一定时间后自动停止均衡不会产生反向电流。模拟一次过温场景用加热片把模组温度推到 50°C确认均衡电流降额或关闭。这套测试方案大概每块板耗时 3 分钟。对于小批量生产来说时间不算长但能拦截掉绝大多数装配和焊接问题值得投入。6.3 保护器件和长期可靠性的建议储能和备用电源现场的电磁环境通常不干净。电池连接器拔插、电机启停、逆变器切换都可能通过电源线耦合浪涌。我的做法是在电池采样线进入 MCU ADC 之前加一级 RC 滤波和双向 TVS 管防止浪涌打坏 ADC 引脚。MP2642GR-Z 的功率端口附近也加了 TVS避免静电放电和反接瞬态损坏功率级。在 MCU 周边加一个电压监控芯片监控主控供电低于门限时强制复位并关闭均衡使能。这能防止 MCU 跑飞时均衡一直开启。另外量产软件里要加入看门狗喂狗逻辑。一旦 MCU 跑飞不仅均衡要停所有输出都要回到安全默认值。这个“安全默认值”就是均衡使能引脚默认下拉通信总线默认高阻PWM 输出默认关闭。6.4 老化与长期策略在小批量阶段我会每批抽一块板子做持续 72 小时的老化测试模拟真实使用中的浮充静置循环用电子负载模拟微小放电让电池电压缓慢变化。每 4 小时停一次充电触发一次 OCV 测量和均衡判断。24 小时记录一次芯片温度、均衡电流、电压阈值命中次数。这个测试能暴露一个有意思的问题很多均衡系统在实验室里表现很好但放到长期浮充环境里会因为极化电压、温度波动、噪声的叠加导致启动和停止阈值反复切换成为毫无意义的“健身机器”。老化测试就是要看这套算法在 72 小时里到底做了几次有效均衡而不是做了多少次无意义开关。我的这套 2 串模组在做了上述调整后长期测试中均衡动作的次数大幅减少但每次动作的有效性显著提高。反而比早期“一看见电压差就均衡”的方案对电池一致性维护得更好。如果你也在做 2 串储能或备用电源的方案我的最后一个建议是别把均衡芯片当作一个“黑盒开关”去用。MP2642GR-Z 和 STM32F373RC 这套组合里芯片负责把能量高效地搬过去而 MCU 要做的是确保每次“搬运”的方向正确、时机恰好、安全到位。想清楚“什么时候不该均衡”和想清楚“怎么把均衡做好”同样重要。这一点我在几次返工之后体会特别深。