
上周在调试一批备用电源样机时我遇到一个很典型的毛病两节串联的电芯静置一天后压差从几毫伏扩大到两百多毫伏。客户端反馈说“电池总充不满容量越用越少”。这其实就是串联电池组最常见的木桶效应——整包容量被最差的那节电芯卡死。当时我用的方案是 MP2642GR-Z 均衡控制芯片配合 PIC18F86J55 单片机对两个串联电池单元做差异化均衡管理效果很直观。这篇就把整套系统从选型、电路设计、控制逻辑到实测收尾完整讲一遍适合正在做储能BMS、备用电源板或对电池均衡感兴趣的硬件工程师参考。1. 为什么储能系统必须做电池均衡核心需求与方案选型思路1.1 两个串联电池单元的不均衡从哪来很多人一开始会问新电池出厂时电压不是都一致吗为什么还要专门做均衡实际用过就会发现一致性只是出厂那一瞬间的假象。电芯在制造过程中存在容量、内阻、自放电率的离散性哪怕同一批次两节电芯也可能差出 1% 到 2%。这个差异在串联回路里会被不断放大。拿 2S 电池包举例假设 A 电芯实际容量 2000mAhB 电芯只有 1900mAh。充电时B 会先被充满放电时B 又先被放空。整包可用容量就被 B 卡死在 1900mAhA 剩下 100mAh 用不上。更要命的是备用电源系统长期处于浮充状态B 每次都被充到更高电压、经历更极端的工作条件老化速度比 A 快容量差距只会越拉越大。温度分布不均匀也会加剧这个问题。我在样机里用热成像看过靠近功率器件的那节电芯温度比另一节高出 3 到 5 摄氏度。锂电芯的化学反应速率和温度强相关温度高的那节容量衰减明显更快。电芯一旦在老化速度上产生分叉不靠外部手段干预压差和容量差就会进入恶性循环。串联电池的均衡本质上就是要把“强者”多余的能量转移或消耗掉让每一节电芯都在相近的 SOC 区间工作。对 2S 这种小模组来说成本敏感、结构紧凑均衡方案不能太复杂但又必须能稳定收敛压差。我最终选型的原则很简单独立均衡芯片负责功率通路和电流控制单片机负责采样判断和策略调度各干各的活。1.2 均衡策略怎么选旁路放电还是能量搬移均衡方案大致分两类被动均衡和主动均衡。被动均衡又叫耗散式均衡原理是给高电压电芯并联一个放电电阻把多余的能量以热量形式消耗掉直到它的电压与其他电芯对齐。主动均衡则是用电感或电容做能量搬移把高电压电芯的能量转移到低电压电芯能量利用率高但电路体积大、成本高、控制复杂。对比项被动均衡主动均衡能量处理方式电阻耗散电感/电容转移均衡电流一般 0.1A~0.5A0.5A~2A 或更高发热量较大小成本低高控制复杂度简单中等偏复杂典型应用小容量模组、2S~7S大容量储能、动力电池储能和备用电源系统虽然对能量效率敏感但 2S 模组的绝对容量不大均衡时间通常也就几十分钟到一两个小时被动均衡多消耗的能量完全可以接受。真正需要主动均衡的场合是几十安时以上的大包那时耗散发热和能量损失会让散热系统吃不消。我选 MP2642GR-Z 的原因在于它把均衡通道的控制集成了外部只需要配一个功率电阻芯片根据车CELL端采到的电压差来控制内部开关管导通时间从而稳住均衡电流。MCU 不需要直接驱动大功率 MOSFET也不用关心那么多模拟细节只负责发使能、读状态、做策略系统可靠性高了很多。1.3 为什么选 PIC18F86J55 做管理核心既然 MP2642GR-Z 已经承担了均衡通道本身的工作那单片机还需要干什么它要做的事情其实不少采集两节电池的电压、计算压差、执行滞回控制、控制均衡通道开断、检测过温过压、和上位机通信还要在备用电源待机时控制好自身功耗。PIC18F86J55 是 8 位单片机很多人一听 8 位就觉得是上古产物。但均衡控制本质上是一个慢速控制任务开关频率低、算法简单根本不需要跑复杂的操作系统或浮点运算。反而是 MCU 的稳定性、环境适应性、外设数量和长期供货更关键。PIC18F86J55 自带 12 位 ADC、多路 UART/SPI/I2C、多个定时器程序空间也够用80 引脚的封装给采样电路留了充足的独立引脚在储能柜这种温湿度变化大的场景里表现稳定。还有一个实际工程问题BMS 控制系统经常需要存校准系数、故障记录和出厂信息。PIC18F86J55 内部有 EEPROM我可以在生产线上把每块板的 ADC 校准参数直接写进芯片换板不丢参数。这一点在后文实测部分会再展开。2. 硬件电路核心设计把均衡芯片接入两串电池包2.1 MP2642GR-Z 的均衡工作方式与外围搭配先梳理一下 MP2642GR-Z 在电路里的角色。它内部集成了均衡开关管和控制逻辑外部需要接一个限流功率电阻形成耗散式均衡通路。芯片实时检测电芯两端电压或接收 MCU 的使能信号决定内部开关是否导通。当某节电芯电压偏高时开关导通电芯通过外部电阻放电当电压回落到设定范围后开关关断。外围设计里最重要的参数就是那个功率电阻。以三元锂电池为例满充电压按 4.2V 算均衡电流可以根据 R V / I 来选。如果我想要约 0.4A 的均衡电流电阻取值 R (4.2 - V_MOS) / 0.4考虑到内部开关管导通压降约 0.2V算下来 R ≈ 10Ω。电阻功率必须认真算P I² × R 0.4² × 10 1.6W。这看起来不大但电阻是持续发热器件如果均衡时间长达一两个小时热量会非常可观。选电阻时功率降额至少留一倍余量也就是 2W 起步。我曾经在第一版板子上用过 1/4W 的贴片电阻均衡跑了不到五分钟就开始冒烟这个坑后面细说。PCB 布局上均衡电阻应该放在板边远离 MCU、采样电路和电芯温度传感器。均衡动作时电阻表面温度可能到 85 摄氏度以上如果紧挨着热敏电阻温度检测会直接失真系统误判过温保护就麻烦了。电阻附近要铺大面积铜箔辅助散热采样线则要走开尔文接法避免大电流在采样路径上产生压降。2.2 两串电池的均压采样电路均衡控制能不能做好前提是电压测得准。两节串联电池的采样有个典型坑不能把一个 8.4V 的电压直接送到 MCU 的 ADC 引脚必须先分压。而且第二节电芯的正极相对 MCU 地电池负极是浮动的需要分别采样“总电压”和“中间点电压”再做差分计算。我的做法是总电压 BAT 通过一个高阻分压网络送到 ADC 通道 0中间点电压通过另一个分压网络送到 ADC 通道 1两节电芯的电压在 MCU 内部做减法求得。分压电阻必须用 0.1% 精度的低温漂电阻否则一个千分之一的偏差在 4V 满量程上就是 4mV 误差加上 ADC 本身的量化误差均衡阈值设计得再精细也白搭。滤波电容也不能随便选。我用的是 100nF 加 10kΩ 电阻组成的 RC 低通截止频率约 159Hz既能滤掉开关电源的高频噪声又不至于让电压采样响应太慢。ADC 采样时刻要避开充电器 PWM 开关瞬间软件里做多次采样取平均也能进一步抑制噪声。另外分压电阻网络的静态电流也要考虑。备用电源系统长期挂电待机如果分压电阻选得太小比如各用 10kΩ从电池上拉的电流就是微安到毫安级别长时间下来会白白消耗电池。我的做法是用大阻值分压总静态电流控制在 10μA 以下同时给每个 ADC 通道加一个模拟开关只在采样瞬间接通分压网络。2.3 控制器供电与保护逻辑PIC18F86J55 的工作电压一般在 3.3V 左右而电池包电压是 7.4V 到 8.4V中间需要一级稳压。这个稳压器的选择有讲究如果直接用 LDO待机电流好控制但压差大、效率低如果上 DC-DC效率高但会引入开关噪声可能影响 ADC 采样。我最终选了低静态电流的 LDO并在 LDO 输出端加了二级 RC 滤波给 MCU 和 ADC 基准供电。保护逻辑不能只指望均衡芯片自己。我在 MCU 侧做了完整的过压、欠压、过温和短路保护检测两节电芯电压分别超过 4.25V 或低于 2.8V 时MCU 立刻关断均衡通路并置位故障标志板载温度传感器检测到环境温度超过 60 摄氏度时也会禁止均衡。这些保护逻辑写在中断服务程序里优先级最高保证异常情况下能快速响应。和上位机的通信我留了 UART 转 RS485 的接口因为储能和备用电源系统经常要接到总控箱RS485 的抗干扰能力和传输距离比裸 UART 强得多。通信内容主要是电压、压差、均衡状态、故障码和累计均衡时间方便后续做大数据分析和维护诊断。3. 均衡控制逻辑从阈值判定到完整状态机3.1 两种核心均衡时机充电末端与静置时段均衡不是任何时候都适合开。放电过程中强行均衡没有意义因为电池电压本身在剧烈变化你根本分不清压差是“不均衡”还是“动态响应差异”。我把均衡控制分成两个主要窗口充电末端均衡和静置均衡。充电末端均衡发生在充电进入恒压阶段之后。这时候某节电芯电压已经接近满充电压继续大电流充电会导致过充风险。此时打开对应电芯的均衡通道让它通过外部电阻泄放一部分电流充电电流就会更多流向电压偏低的电芯把两节电芯拉回更接近的 SOC。静置均衡则是系统处于待机或轻载时执行。电池既不充电也不放电端电压最能反映真实的 SOC 差异这时候做均衡效果最准确。备用电源系统的特性就是大部分时间处于待机状态静置均衡的窗口非常充裕。状态机的设计大概是这样的系统上电后先做自检确认 ADC 校准参数有效、温度正常然后进入待机状态。待机时持续监测压差和电压一旦满足均衡条件就切入对应状态。如果检测到温度过高或通信故障就锁定故障状态只允许通过断电或人工指令恢复。3.2 阈值参数怎么算滞回、死区与实际效果均衡阈值是控制策略里最需要细心调的参数。阈值设得太小均衡频繁启停开关管和电阻反复承受热冲击阈值设得太大压差收敛标准太松均衡失去意义。我的初始参数设定是这样的压差均衡开启阈值为 30mV关闭阈值为 10mV。也就是说只有当两节电芯电压差超过 30mV 时才启动均衡而压差降到 10mV 以下就停止。开启和关闭阈值之间留了 20mV 的滞回窗口目的是防止 ADC 采样噪声把均衡通道反复触发和关闭。充电末端的均衡阈值则参考满充电压三元电池按 4.15V 触发关闭阈值放到 4.10V磷酸铁锂按 3.60V 触发关闭阈值放到 3.55V。这样做的原因是恒压阶段充电电流在逐渐减小均衡电流不需要太大就能对充电分配产生明显影响。均衡电流大小也要和充电电流匹配。假设充电电流是 1A均衡电流 0.4A那么高压电芯实际充电电流只有 0.6A低压电芯则维持 1A相当于 0.4A 的“差额”都被用来补充低压电芯。如果充电电流只有 0.2A均衡电流开到 0.4A高压电芯不但没充电反而在放电压差虽然能快速收敛但高压电芯会掉电过多整体电量反而下降。所以均衡电流一般取充电电流的 30% 到 50%或者干脆做成 PWM 可调模式。3.3 MCU 软件实现要点与伪代码单片机上跑的均衡逻辑并不复杂但要注意代码的可读性和可维护性毕竟现场调试主要靠状态变量判断问题。我习惯用状态机 定时中断的结构主循环处理非实时任务定时中断里做 ADC 采集和阈值判断。采样处理流程每 100ms 执行一轮ADC 连续采样 16 次取平均滤掉最大值和最小值再把 ADC 原始值通过校准系数换算成实际毫伏电压。校准系数存在 EEPROM 中出厂时逐板标定。压差计算放在平均值滤波之后防止单次采样异常导致误动作。下面是均衡控制核心代码的简化示例方便理解整体结构#define BAL_EN_DIFF_ON 30 // mV #define BAL_EN_DIFF_OFF 10 // mV #define BAL_EN_CELL_ON 4150 // mV #define BAL_EN_CELL_OFF 4100 // mV uint16_t vcell1, vcell2; // 实际电压 单位mV uint8_t bal_state BAL_IDLE; // 状态机变量 void bal_control(void) { uint16_t diff abs(vcell1 - vcell2); switch (bal_state) { case BAL_IDLE: if (diff BAL_EN_DIFF_ON) bal_state BAL_DIFF; else if (vcell1 BAL_EN_CELL_ON || vcell2 BAL_EN_CELL_ON) bal_state BAL_CHG_END; break; case BAL_DIFF: bal_channel_enable(1); // 打开压差均衡 if (diff BAL_EN_DIFF_OFF) { bal_channel_enable(0); bal_state BAL_IDLE; } break; case BAL_CHG_END: bal_channel_enable(2); // 打开充电末端均衡 if (diff BAL_EN_DIFF_OFF vcell1 BAL_EN_CELL_OFF vcell2 BAL_EN_CELL_OFF) { bal_channel_enable(0); bal_state BAL_IDLE; } break; default: bal_channel_enable(0); bal_state BAL_IDLE; break; } }这里有个工程细节要注意均衡通道导通时间不能无限长。即使压差没到关闭阈值MOS 管和均衡电阻的热量也在持续累积。我在定时中断里维护一个“均衡占空比”计数器默认开 60 秒、关 30 秒等效把平均功耗降为原来的三分之二。这样即便长时间均衡板子温度也能稳住。4. 实测调试验证与整机集成4.1 从硬件调试到功能点亮板子打样回来上电前先做静态检查拿万用表量电池正负极之间有没有短路量均衡电阻两端阻值是否和设计一致量 MCU 供电电压是否正确。确认没问题后才接上电池否则一个低级焊接错误就可能毁掉整块板子。我习惯先用两台可调直流电源模拟两节电池而不是直接用真实电芯。把两台电源分别调到 4.2V 和 4.0V模拟出 200mV 的人为压差。这样做的最大好处是电压可以精确控制不会因为电芯自放电让实验条件漂移。MCU 程序烧录后第一件事是验证 ADC 读数和万用表读数是否一致。如果偏差超过 10mV先查分压电阻阻值和基准电压。我用的办法是用 6 位半万用表在电池端实测电压然后和 MCU 上报值对比逐个通道记录偏差最后拟合成增益和偏置两个校准系数写进 EEPROM。功能点亮的标准是模拟压差超过 30mV均衡通道立刻打开把高电压那台电源往下调当压差小于 10mV 时均衡通道自动关闭。逻辑正确后再接真实电芯做循环测试。4.2 均衡效果实测数据解读为了验证均衡效果我特意挑了两节状态差异明显的电芯一节充满到 4.20V另一节只充到 3.95V初始压差 250mV。这个压差在真实备用电源系统里已经很严重了如果不处理低压电芯在整机负载下会很快触发欠压保护。整机接上充电器开始充电开始时压差几乎没有变化因为两节电芯都在恒流充电阶段。当高压电芯电压到达 4.15V 后充电末端均衡启动均衡通道按 60 秒开、30 秒关的节奏工作。高压电芯的充电速度明显被压制低压电芯电压则持续爬升。时间Vcell1mVVcell2mV压差mV均衡状态开始42003950250关闭15分钟42014060141充电末端均衡45分钟4200417228充电末端均衡75分钟4198418810压差均衡120分钟419641915关闭从数据可以看到均衡大约经过 45 分钟把压差从 250mV 收敛到 30mV 以内之后进入静置均衡模式最终稳定在 5mV 左右。整个过程中均衡电阻表面温度最高到过 82 摄氏度MCU 温度保持正常待机电流测到 0.8mA符合备用电源系统对静态功耗的要求。4.3 储能和备用电源整机集成注意事项均衡板单独工作正常不代表塞进整机后依然正常。我遇到过好几次单板调试没问题装进机箱后均衡不启动或者压差变大最后排查都是系统集成层面的问题。第一均衡窗口必须和充电策略配合。如果充电器进入恒压阶段的时间太短均衡可能还没来得及把压差拉回来充电就结束了。我建议在充电器的充电曲线里预留“均衡等待时间”比如恒压阶段至少保持 30 分钟以上让均衡控制有时间见效。第二采样线要远离功率路径。机箱内功率线电流变化会产生磁场采样线如果和功率线长距离并行走线会在 ADC 输入端感应出共模噪声。我要求生产装配时采样线使用双绞线并且和功率线保持至少 5cm 距离交叉处垂直走线。第三通信和故障上报要走到系统层。备用电源系统通常有总控单元均衡板的状态不能只是“自己知道”。我把均衡累计工作时间、当前压差、最近一次均衡时间都通过 RS485 上报这样系统维护时能直接判断电池健康状态而不需要拆机测试。5. 常见问题与排查技巧实录5.1 高频问题速查表整理了几个我实际调试中经常遇到的问题做成表格方便快速对照排查。现象可能原因排查方法均衡通道不开启使能信号没拉高电压未达阈值分压电阻虚焊检查 GPIO 配置万用表量使能脚电压加焊分压电阻电压测量偏差大于 20mV分压电阻精度不够基准电压漂移采样点接触电阻换 0.1% 电阻校准基准检查开尔文接线均衡电阻严重发热功率余量不足均风占空比过高散热铜箔不够降额选电阻调低占空比加大铜箔面积压差越均衡越大采样点接错均衡电流过大地回路共模干扰核对接线降低均衡电流采样线远离功率线待机电流超标MCU 未进入睡眠分压电路常通LDO 静态电流大配置睡眠模式采样时切换分压电源换低功耗 LDO通信数据乱码波特率偏差电平不匹配总线缺终端电阻核对波特率检查收发器电平补 120Ω 终端电阻5.2 我踩过最深的几个坑第一个坑是开尔文采样。第一版板子我把采样线和均衡电流路径接在同一个焊盘上均衡导通时 0.4A 电流在铜箔上产生的压降直接叠加到采样电压里导致系统误判电压偏高、均衡持续导通直到电阻过热才发现。后来把采样线单独拉到电池端子的采样点电流路径和采样路径完全分开问题才消失。第二个坑是均衡电阻功率降额不足。最开始计算用的是瞬时功耗忽略了长时间工作的热积累。后来统一要求均衡电阻按计算功耗的 2 到 3 倍选型板上预留散热铜箔并在软件里加了间歇均衡模式热问题才算根治。第三个坑和 EEPROM 校准数据有关。量产时有一批板子换过 MCU 后均衡阈值表现明显不对查了半天发现是校准参数没有写入新芯片MCU 用的还是默认值。后来在产测流程里增加了强制校准步骤每块板子都用精密可调电源模拟两档电压逐通道校准并写入 EEPROM生产现场没再出过这种问题。第四个坑是通信和均衡争抢 MCU 时间。我在定时中断里放了 ADC 采样和均衡状态机UART 发送放在主循环。当 RS485 在大量上传调试数据时主循环被发送任务占住均衡状态机虽然还在定时中断里跑但状态上报明显延迟影响了上位机的实时监控体验。后来把发送改成了 DMA 方式主循环负担大部分降到通信模块上问题就解决了。至于换电芯后要不要重新校准我的建议是如果只是同型号电芯替换校准参数不需要变如果换了不同材料体系的电芯满充电压、均衡阈值、过压保护点这些参数必须全部重新标定不能沿用旧数据。均衡系统是为特定电芯的电压平台设计的跨材料体系复用参数很容易出安全风险。整套方案做下来我最深的体会是均衡电路看着简单真正决定成败的其实是采样精度和控制节奏。芯片选得再好采样一塌糊涂均衡就成了盲人摸象。量产阶段给每块板子做一次压差自检和校准把补偿值写进 EEPROM这个步骤看起来繁琐却能省掉大量售后排查时间。如果你也在调类似的 2S 均衡板建议先把采样精度搞定再去调均衡策略这条路走下来会顺畅很多。