
两节串联的磷酸铁锂电池在很多人眼里就是个“小电池包”但真把它装进备用电源系统之后我才发现最让人头疼的往往不是充放电逻辑而是两节电芯之间那几十毫伏的电压差。早些年我做储能BMS项目时习惯性先堆状态机后来经过反复调试在 MP2642GR-Z 这颗均衡控制器和 STM32F407VGT6 单片机上才真正把“两个串联电池单元的主动均衡”跑通。这篇笔记算是一次完整复盘芯片为什么这样选、采样电路怎么搭、均衡状态机怎么写以及实测里那些数据手册不会告诉你的细节。适合正在做储能BMS、备用电源或电池包均衡的工程师参考。1. 为什么是两串电池均衡反而成了第一道坎1.1 失配不是“坏了”而是电芯的出厂统计规律先说说问题的来源。很多人觉得两串电芯一致性应该很好同一批次、同一老化工艺出厂电压也差不多。但真正把电池组放进储能或备电场景跑一段时间情况就不一样了。电解液浸润程度、隔膜厚度、极片涂布量、内阻分布这些在生产线上都有公差更麻烦的是自放电率并不相同同一批电芯搁置一个月电压能差出30~50mV。这个差异平时看不出来一旦进入充放电循环会被系统放大。充电时容量小的电芯先到达截止电压BMS为了保护它只能停充另一节电芯实际还没充满。放电时反过来容量小的那节先到低压保护整个系统提前断电。备用电源最怕的就是“关键时候掉链子”——市电断开的那几秒正好是电池组出力最猛的时刻如果两串里有一节处于低电量整组可用的后备时间直接缩水一大截。1.2 不均衡带来的三个后果我把实际影响归纳成三类方便你对照自己的项目排查过充风险。充电末端高压电芯电压上升速度极快稍微多充几分钟就可能超过电芯厂家给的绝对上限。锂电池过充的危害不用多说轻则鼓包重则热失控。过放风险。放电时低压电芯先被抽干继续放电会导致铜箔溶解、负极析锂这类损伤不可逆电芯容量会永久衰减。可用容量下降。两节电芯一个高一个低串联组的“木桶效应”非常明显实际可用容量由最低的那节决定系统标称容量再大也发挥不出来。在储能系统中均衡不是锦上添花而是安全运行的前提。在备用电源中它决定的是应急备电时间是否真的可靠。1.3 为什么拿两串做最小验证系统两串电池在储能和备电领域是特别常见的起点。很多便携储能、小型UPS、工业控制备电、安防备电用的就是两串磷酸铁锂或两串三元锂。对开发者来说2S系统成本低、控制链路完整、出现问题也好定位。把两个串联电池单元的均衡跑通之后4串、8串甚至16串系统本质上都是复制粘贴采样通道和均衡通道变多而已能量搬移逻辑、保护策略、状态机迁移都完全一致。而且两串系统有一个天然优势——你可以把注意力完全集中在“均衡”这件事上不用被复杂的电芯分组、主动均衡网络拓扑分散精力。后面第六节我会讲怎么从两串扩展到多串你会发现核心还是这套状态机只是多了时序协调。2. MP2642GR-Z 的能量搬移逻辑核心是电感而不是电阻2.1 先从被动均衡为什么被淘汰说起很多初入门的设计师包括我最早做第一版BMS时都习惯用被动均衡。原理很简单哪节电芯电压高就给它并一个电阻把多余的电量变成热量放掉。电路非常简洁成本极低一个MOS加一个功率电阻而已。但它有一个绕不开的痛点——能量被白白浪费。如果均衡电流取100mA一个压差50mV的场景确实够用但真要处理150mAh以上的电荷差需要连续放电十几个小时。如果为了加快速度把电流提到500mA功率电阻上的发热就会很可观在密封的电池舱里这热还得想办法散出去。备用电源往往要长期在线外面再套一层外壳散热条件本来就不如实验室被动均衡在这种场景下很吃亏。更麻烦的是被动均衡的方向是单向的只能把高电压电芯的能量放掉。但在储能场景中你有时候希望把高压电芯的多余能量“喂”给低压电芯而不是白白烧掉。比如在浮充状态下市电断电后的第一个放电周期里被动均衡根本来不及把能量搬过去系统就已经进入低压保护了。2.2 MP2642GR-Z 如何实现相邻电芯之间的“搬运”我手头这个备电项目最终选了 MP2642GR-Z最初是被它的电路结构吸引的。这颗芯片本质上是一个高度集成的电池均衡控制器它内部已经集成了同步开关管和驱动逻辑外部只需要配一颗功率电感和一颗采样电阻就能在这两颗串联电芯之间做双向能量搬移。它的工作逻辑可以这样理解把两颗电芯看成两个水池一高一低。芯片通过电感的开关动作先让高压电芯给电感充磁再把电感里的能量释放到低压电芯相当于一个“电池之间的水泵”。方向由外部的方向控制引脚决定MCU只需要给出两个高低电平就能决定能量是从电芯1搬到电芯2还是反着搬。芯片本身具备闭环的电流检测和限流功能均衡电流可以通过外部设定电阻或PWM占空比来配置。它还自带热保护、输入输出过压保护和故障输出脚。对STM32F407VGT6来说控制它非常轻松——两个GPIO管方向一个GPIO管使能一个GPIO读故障状态不需要额外的功率驱动电路。这里我建议你在画原理图前先花时间读懂芯片手册里的“电流环路布局”章节。电感、采样电阻、输入电容这一圈的走线一定要短而粗反馈采样要用开尔文接法直接把采样电阻两端的电压以差分方式送回芯片的检测脚。我第一次画时偷懒把反馈线拉长了结果检测到的是走线电阻上的压降均衡电流比设定值小了差不多15%。2.3 选它而不选其他方案的三点理由选型时我其实对比过好几类方案最后选 MP2642GR-Z 主要是出于三点考虑待机功耗足够低。备用电源系统长期挂在线均衡控制器在非均衡状态下不能成为耗电大户。这颗芯片的睡眠电流在微安级别这对于电池供电的系统很关键。外部BOM简单。开关管、驱动电路全都集成在芯片内部外围只有电感、电容、电阻极大降低了PCB面积和物料管理成本。相比之下如果用分立MOS加PWM驱动自己搭同步升降压光是死区时间处理和过流保护就要做好几版。方向可动态切换。因为由F407的GPIO控制方向我可以在不同的SOC区间执行不同的均衡策略。充电末端优先把高压电芯的能量搬走放电阶段则考虑保护低压电芯这种灵活性是被动均衡给不了的。提示均衡控制器的数据手册里一般都会给一条“持续均衡时间建议”不要长时间只朝一个方向搬。随着被搬入方电压上升、被搬出方电压下降系统会逐渐逼近“拉平点”此时继续均衡的边际收益很低还可能因为控制环路的死区导致过冲。所以合理的设计一定是“搬一段时间停下来重新采样再决定是否继续”。3. STM32F407VGT6 外围硬件设计采样、驱动与保护一次到位3.1 电压采样链路分压、滤波、校准F407的ADC是12位、参考电压3.3V而两串磷酸铁锂的最高总电压大约7.2V如果是三元锂则是8.4V不能直接进ADC。我采用的是两个分压点分别采样。简单说BAT-作为系统的模拟地CELL1-1脚第一串电芯正极到BAT-这个区间就是电芯1的电压CELL1-2到BAT-这个区间是两串总电压。通过两组精密电阻分压把电压映射到ADC量程内。分压电阻一定选0.1%精度、低温漂的薄膜电阻因为均衡判断的阈值就在十几毫伏量级电阻误差带来的偏移会直接换算成误判。分压之后需要加一级RC低通滤波把开关电源带来的纹波滤掉。F407的ADC采样保持时间很短RC的截止频率不用设太低我这里是10k电阻加100nF电容大约160Hz够用了。滤波电容建议用C0G材质温度特性好不会随着电芯发热漂移。采样端的ESD防护不能省。我见过不少方案在采样线路上直接裸奔结果电芯搬运或者插拔连接器时一个静电脉冲就把ADC通道打坏了。每个采样点都加了TVS管还串了1k的限流电阻故障时宁可电压读不准也不要让高压直接进MCU。3.2 温度检测与均衡电流回读温度保护是均衡系统的底线。我在每颗电芯表面都贴了NTC热敏电阻用10k对地分压进ADC。均衡过程中芯片表面的温升是一回事电芯本身因为大电流充放产生的温升又是另一回事。程序里我设了两个阈值电芯温度超过60℃时强制停止均衡超过50℃时把均衡电流降一档。均衡电流的回读我用的是板级简单差分方案。在均衡功率回路里串入一颗10mΩ的合金采样电阻用低失调的仪表放大器把压差放大送到F407的另一个ADC通道。这个数值不参与精确计量主要用来做健康检查——比如芯片报告正在均衡但电流读数为零那多半是电感虚焊或者芯片没真正使能可以提前发现硬件异常。3.3 驱动IO与供电、上电时序F407和MP2642GR-Z的接口只有四个信号使能EN、方向DIR1/DIR2、故障输出FAULT。其中DIR1和DIR2互斥MCU侧最好做一次软件互锁防止两个方向同时有效。故障输出是开漏结构需要上拉到3.3VF407配置成上升沿中断一旦均衡芯片报过压、过温MCU能立刻响应。系统电源从电池总电压取经过一级低压差LDO降到3.3V供电。这里有一个很容易踩的坑上电瞬间MCU还没完成自检GPIO默认状态可能是高电平如果这个高电平刚好对应“使能均衡”芯片就会在MCU启动前开始搬能量。所以我在软件初始化里第一件事就是把所有均衡相关GPIO配置为输入下拉再按顺序切换到输出模式硬件上EN脚也加了下拉电阻双重保险。有的方案还会在均衡功率路径上加一颗PTC自恢复保险丝用来应对极端情况下的过流。我建议保留这个位置哪怕初期不贴件也给量产留个余地。3.4 原理图阶段的几个细节坑再分享三个原理图阶段容易忽略的点都是我实际吃过亏的地方功率环路走线电感、采样电阻、芯片的SW与输入电容之间回路面积要尽量小。大电流路径越长寄生电感越大开关尖峰会越高EMI测试也越难过。采样与功率分离ADC分压电阻的参考地要单独拉回BAT-不能和均衡大电流的地混在一起否则大电流的压降会污染电压采样。均衡芯片散热MP2642GR-Z底部如果有散热焊盘记得打过孔到背面铜箔。我实测0.5A均衡电流下散热焊盘接地铜箔面积从2cm²加到4cm²芯片表面温度能降将近10℃。4. 均衡状态机的软件实现从采样滤波到滞回停止4.1 采样策略不要用单次读数做判断软件部分我建议先设定一个原则任何均衡决策都不能基于单次ADC读数。为什么因为均衡本身会产生电流纹波电芯的极化电压又会随负载变化单次采样看到的电压是叠加了噪声的瞬时值直接拿来做判断很容易出现振荡。F407的ADC资源很丰富我用定时器触发ADC1在规则组里轮流采样电芯1电压、电芯2电压、芯片温度和电芯温度DMA把结果搬到内存。采样周期10ms每次取最近100个样本做移动平均。移动平均之后再做一次中值滤波去掉明显的毛刺。实测下来这套组合能把电压噪声压到±2mV以内足以支持8mV的关断阈值。每次上电后还要做一次通道校准。方法是用外接的高精度电压源给两个分压点灌入已知电压程序算出实际ADC读数与理论值的偏差把校准系数写到Flash里。硬件分压电阻的精度再高也会有0.1%~0.5%的偏差不校准的话采样值可能整体偏移几十毫伏均衡阈值形同虚设。4.2 滞回区间不是所有压差都需要均衡很多新手写均衡逻辑时设一个阈值压差超过就启动低于就停止。这样会带来问题均衡停止后电芯会有回弹也就是极化电压慢慢消退电压瞬间又超过阈值于是一会儿开一会儿关均衡电路反复启动芯片和电芯都在做无用功。我用的是一对阈值也就是滞回控制。启动阈值设为25mV停止阈值设为8mV。只有当压差超过25mV才开启均衡开启后要等压差掉到8mV以下才停止。中间这17mV的区间就是“缓冲区”既避免了频繁启停也保证了均衡效果在一个可接受的范围内。方向判断同样有讲究。启动时取当前电压较高的电芯作为“源”较低的作为“目标”然后通过DIR引脚让芯片朝正确的方向搬运。在浮充场景中电压较高的通常是自放电率较小、容量剩余较多的那节方向判断比较稳定但要注意在充电末端电芯电压会因为极化而虚高如果此时开启均衡可能把本来正常的那节当成“高压源”结果搬错方向。所以我在状态机里加了一个条件如果高压电芯电压超过3.55V磷酸铁锂平台末端则暂时禁止均衡方向切换等充电电流降下来再说。4.3 状态机迁移代码骨架均衡主状态机我用了一个简单的枚举状态。核心循环结构如下typedef enum { BAL_IDLE, // 空闲 BAL_SAMPLE, // 采样滤波 BAL_DECIDE, // 判断方向与阈值 BAL_ACTIVE, // 均衡进行中 BAL_REVIEW, // 复查回弹 BAL_FAULT // 故障 } bal_state_t; void BMS_balance_task(void) { switch (bal_state) { case BAL_IDLE: if (sample_complete) { bal_state BAL_SAMPLE; } break; case BAL_SAMPLE: voltage_filtered[0] moving_average(adc_cell1, 100); voltage_filtered[1] moving_average(adc_cell2, 100); temp_cell moving_average(adc_ntc, 50); bal_state BAL_DECIDE; break; case BAL_DECIDE: if (fault_flag || temp_cell 60) { bal_state BAL_FAULT; break; } delta_v voltage_filtered[0] voltage_filtered[1] ? voltage_filtered[0] - voltage_filtered[1] : voltage_filtered[1] - voltage_filtered[0]; if (balance_active) { if (delta_v BAL_STOP_THRESHOLD_MV) { set_balance_enable(0); balance_active 0; bal_state BAL_REVIEW; } } else { if (delta_v BAL_START_THRESHOLD_MV) { src voltage_filtered[0] voltage_filtered[1] ? 0 : 1; set_balance_direction(src); set_balance_enable(1); balance_active 1; } } bal_state BAL_SAMPLE; break; case BAL_REVIEW: // 停止后等待10s观察回弹量 if (review_counter 1000) { review_counter 0; bal_state BAL_SAMPLE; } break; case BAL_FAULT: set_balance_enable(0); // 上报故障码至CAN/UART等待人工干预 break; } }这段代码是精简版工程上还要加看门狗喂狗、超时计时和故障恢复逻辑。重点是你在看的时候要理解状态的迁移条件而不是直接抄代码。特别是BAL_REVIEW这个状态很多人觉得没必要实际上非常关键。均衡停止后电芯的极化电压会逐渐消退电压会有一个回弹过程。如果不等待回弹就直接进入下一次采样判断可能刚停止就又要启动整个系统会一直在启停边缘徘徊。4.4 均衡时长管理给它一个时间上限我还给每次均衡设置了最大连续时间默认20分钟。达到上限后强制停止进入复查状态。原因是我发现当两节电芯的SOC差已经不大时继续均衡的边际收益很低但芯片和电芯的热积累却在持续。与其为了最后5mV的压差硬耗时间不如停下来让系统自然恢复等下一次压差判断再决定。这个“时间上限”在不同场景下要不同对待。浮充场景可以宽松一些因为我这边实测磷酸铁锂电池在浮充状态的压差会自然缩小一些但如果是在放电末端压差变化很快均衡时间太长反而会拖累放电能力我会把上限压缩到5分钟。5. 实测数据与边界条件均衡速度、效率和温升5.1 实测场景一上电就是80mV压差为了验证这套方案我搭了一个相对严苛的测试场景。两颗标称容量1500mAh的磷酸铁锂电芯一节放到3.55V另一节放到3.47V初始压差80mV均衡电流设定为0.5A。环境温度25℃散热条件就是普通FR4四层板加4cm²的接地铜箔。测试过程中每10分钟记录一组数据整理成下面的表时间(min)电芯1电压(V)电芯2电压(V)压差(mV)芯片表面温度(℃)03.5503.4708025103.5413.4786341303.5233.4883557603.5093.4911861903.5003.4928581203.4963.489752到90分钟时压差达到8mV触发停止条件系统转入复查状态。复查10秒后回弹到约9mV仍然低于停止阈值因此没有再启动均衡。整个过程中芯片温度最高到61℃在可接受范围内。5.2 效率和热量估算电感均衡没有亏太多很多人关心主动均衡的效率。我按能量守恒的方式粗算了一下假设两节电芯的内阻和容量曲线基本一致要把80mV压差缩小到8mV相当于需要在两节电芯之间转移约90mAh的电荷。按0.5A平均电流计算理论时间约180分钟实测只用了90分钟。为什么快了这么多因为磷酸铁锂放电平台很平电压差的变化更多来自SOC差异和极化电压实际需要搬运的电荷比线性估算要小。这也是为什么原型机测试时一定要实测数据不能光算理论值。能量的角度上电感均衡的效率主要取决于电感的DC电阻、开关管的导通损耗和开关损耗。我测到的芯片供电端输入能量和电芯电压提升对应的能量变化两者相除大约在85%左右。这个效率放在备用电源场景里完全可以接受相比被动均衡的100%损耗等于把一个重大短板补上了。5.3 边界条件与失效防护真正做产品边界条件比主流程更重要。我总结了几条必须处理的情况压差低于5mV时直接忽略。这个量级已经接近采样噪声和分压误差的叠加范围均衡动作没有意义甚至可能把原本平衡的系统“弄歪”。高压电芯接近充满时禁止均衡。磷酸铁锂在3.60V以上电压上升极快均衡时的高频电流切换会引起额外极化让电压读数更不可信。此时我把均衡控制改为“等待回落”而不是强行拉平。低压电芯低于2.8V时禁止启动均衡并上报“单体异常”。如果低压电芯本身存在微短路均衡会导致失效电芯持续吸收电流掩盖真实故障。先诊断再均衡。长期浮充场景。备电系统在市电正常时基本处于浮充状态我设置了每周自动触发一次均衡巡检确保两节电芯的静态压差始终控制在10mV以内。这个动作在凌晨负载低时执行避免影响正常备电功能。6. 从两串到多串扩展时的时序与通信规划6.1 相邻均衡通道的互扰问题两串验证板确认没问题后下一步几乎肯定要往更多串扩展。这时候遇到的第一堵墙是“相邻通道互扰”。举个典型例子一个4串电池组里芯片A正在把电芯1的能量搬到电芯2芯片B同时把电芯2的能量搬到电芯3中间的电芯2同时被充电又被放电整体效率下降严重时还会因为两个控制环路互相耦合产生低频振荡。解决办法其实很简单——同一时刻只允许一个均衡通道工作。软件里做一个仲裁器每个采样周期扫描所有相邻电芯对的压差找出压差最大的那对只给它使能均衡其他对全部保持待命。这种“分时均衡”牺牲了一些并行度但换来了可控性和稳定性。4串系统压差修复时间会增加一些但储能系统对均衡速度的敏感度并不高稳定压倒一切。6.2 用F407的资源换扩展性对于扩展到8串、12串的情况F407的资源是完全够用的。一组相邻均衡通道只需要4个GPIO使能、方向1、方向2、故障外加一路PWM用于电流设定。8串系统需要7组相邻对如果按最大压差仲裁同一时间只启用一组那么GPIO总量也不多。F407的GPIO引脚充裕多个定时器也可以分别生成不同PWM频率给未来预留了裕量。软件架构上我在两串阶段就把均衡策略抽象成了“均衡通道”结构体每个通道有自己的状态机变量、GPIO句柄、电流设定值和故障标志。扩展时只需要注册新的通道仲裁器遍历所有通道做压差排序选优改动的代码量非常小。6.3 通信上报与数据积累备用电源系统通常会有上位机或集中监控所以我预留了UART转Modbus RTU和CAN 2.0两路通信接口。上报的内容包括每节电芯的电压、温度、当前均衡通道、均衡方向、均衡电流、累计均衡时间、故障码。累计均衡时间这个数据非常有价值。如果某节电芯长期频繁被当作“低压目标”充电说明它的自放电率异常可能正在微短路。通过历史趋势可以提前预警在真正出问题之前安排维护这对现场运维特别重要。6.4 断电切换与掉电保存备用电源还有一个绕不开的场景市电突然断开。此时系统立刻从充电/浮充状态切换到电池放电状态均衡控制必须快速降级。我的处理逻辑是检测到总电压快速跌落或外部掉电信号后第一时间关闭均衡使能确保所有能量都用于负载支撑同时把当前均衡状态、故障码和最后一段采样数据写入Flash。等市电恢复后系统重新上电通过比较掉电前后的电压数据来评估均衡效果也避免掉电过程中均衡状态错乱导致重新启动时的方向误判。6.5 给后来者的三点调试建议最后说几点我在整个开发过程中觉得特别有用的经验都是踩过坑换来的第一先用电芯模拟器验证状态机再上真电池。用两台可编程电源分别模拟高压电芯和低压电芯可以精确控制初始压差、内阻和回弹特性测试结果可重复定位问题也快。我最初调试时一直用真实电池温度变化和极化回弹让状态机看起来不可控换用模拟器之后十分钟就找到了问题所在。第二示波器要盯着电感电流波形看。均衡启动瞬间和方向切换瞬间是电流尖峰最容易出现的时刻。如果电感电流出现振铃多半是采样电阻的布线引入了额外电感优先改PCB布局而不是去调芯片的环路补偿参数。第三把ADC多通道的串扰问题提前考虑进去。F407的多通道连续采样如果配置不当前一通道的残余电荷会影响下一通道的读数。我使用定时器触发规则组每组采样完成后再切通道并加入丢弃两次采样的机制实测数据稳定后刻度才做阈值验证。这条建议能帮你省下好几天调试时间。