在储能和备用电源系统里两节串联电池看似简单实际坑很多。我刚做完的一个模拟项目就是用 MP2642GR-Z 做均衡执行、PIC24FJ128GA310 做大脑总算把两节电芯的压差从几十毫伏压到了个位数毫伏。这篇内容就复盘这个方案为什么需要均衡、硬件怎么搭、算法怎么写、调试时踩了哪些雷。如果你是做 BMS 的工程师或者手头有两串锂电池想自己搭一个均衡模块这篇文章应该能给你一条比较完整的路线。1. 项目概述两串电池为什么需要“专用均衡芯片 单片机”1.1 储能和备用电源场景的特殊要求两节电芯串联在储能系统里经常被当成一个“小电池包”来用给通信设备做备用电源、给小型太阳能控制器做中间储能、或者做直流 UPS 的核心电池。这类系统有个共同点——长期处于浮充或待机状态真正大电流放电的时刻很少但一旦发生停电就必须在短时间内输出可靠功率。正因为大部分时间都在“闲逛”电芯之间的细微差异反而会积累起来。这个差异从哪来的制造公差只是很小一部分。电芯内阻不一致、自放电率不一样、环境温度不同都会导致两节电芯的容量衰减速度不同。一组两串电池在循环 200 次以后落后电芯的容量可能只剩另外一节的 90%这时候整组可用容量就被那节“短板”锁住了。备用电源系统最怕的正是这种隐性失效——你平时巡检用万用表量整组电压12V 或者 7.2V 都正常但真到停电放电落后电芯先到截止电压保护板立刻切断输出整组设备直接掉电。所以均衡在这类系统里不是可选功能而是延长电池寿命、提高系统可用性的基本手段。我们做这个项目时定的目标是在静置状态下两节电芯的压差能收敛到 10mV 以内而且不牺牲系统效率。被动均衡显然做不到高效于是方案锁定了主动均衡加 MCU 控制。1.2 系统里两颗芯片的分工MP2642GR-Z 是一颗面向两串电池的均衡前端芯片在项目里它负责执行能量搬运PIC24FJ128GA310 是主控单片机负责采样、判断和工作状态管理。这么分工的动机很直接均衡芯片把功率路径和开关逻辑处理掉硬件上不需要我自己搭一个隔离 DCDC而单片机把算法部分接管过来让我可以随时调整策略而不是改硬件。简单说系统分成四个部分。第一部分是两节电池本体引出 B、B1、B- 三个节点第二部分是以 MP2642GR-Z 为中心的均衡功率级外加一颗储能电感和滤波电容第三部分是 PIC24FJ128GA310 及其外围主要做电压采集、温度采集、通信和保护输出第四部分是上位机调试接口我用的是 UART 转 USB把电芯电压和均衡状态实时打出来。均衡芯片和主控之间用 I2C 通信。我最初考虑过用普通 GPIO 直接控制使能但后来发现这样拿不到均衡芯片内部的状态——比如当前均衡电流有没有到设定值、芯片温度是不是偏高。这些信息对策略闭环很重要所以还是选带了状态回读的通信方式。选 PIC24FJ128GA310 则是因为它片上资源刚好够用ADC 通道多Flash 也大不需要外扩存储芯片。2. 硬件设计均衡芯片和主控怎么搭才能稳定工作2.1 均衡拓扑的取舍为什么上主动均衡而不是被动均衡电池均衡两大类。被动均衡最简单给高电压电芯并联一个放电电阻把多余电量以热的形式放掉。优点是成本低、控制逻辑简单甚至用一个比较器就能做。缺点是电能被浪费而且电流不能太大否则发热很难处理。对两串小容量电池来说被动均衡也不是不能用但在我这个项目里最终放弃了。原因有两点。一是备用电源系统往往长时间浮充均衡电流太小的话根本补不上电芯自放电差异造成的电压差距二是被动均衡只能放高电芯放掉的能量最后变成壳体温度在小密封壳里是隐患。MP2642GR-Z 在项目里是和一颗电感配合把高电芯的一部分电荷搬到低电芯能量往返效率明显高于被动电阻法。我选它还有一个理由它能直接串联在两节电芯之间不需要额外的均衡母线或隔离电源适用对象正好是 2S 电池组。PIC24FJ128GA310 在主控侧只管算策略和下指令均衡电流路径被隔离在电池端系统调试起来会安全很多。这里插一句后级储能系统如果以后想扩展到 4S、6SMP2642GR-Z 这类两串均衡芯片就不够了需要换多节级的均衡方案或者改用串联电感组。但如果项目限定在 2S这种“专用均衡前端 MCU”的组合比用 PWM 自己控制 MOS 管做反激式主动均衡要省心得多至少环路稳定性不用自己死磕。2.2 主控选型与采样电路设计PIC24FJ128GA310 是我在这类小系统里用得比较顺的一颗 16 位 MCU。它片上带 128KB Flash 和 8KB RAM跑均衡程序绰绰有余。关键是它有很多通道的 10/12 位 ADC可以分时采集两节电芯电压、MOSFET 温度、环境温度。如果直接用单片机的 ADC 去采电池电压必须注意最高电压可能超过 ADC 参考电压。我的做法是用两个独立的电阻分压网络分别把每节电芯的端电压缩放到 3.3V 以内再经过运放电压跟随器送到 ADC 引脚。实际项目里我没有用单片机内部的参考电压而是外接了一颗基准源。为什么因为均衡的目标是“两节电芯的电压差尽量小”如果 ADC 参考源随温度和供电电压漂移采集到的绝对电压虽然看起来准但两节电池之间的相对误差会直接影响均衡判断。外接基准源以后采样线性度稳定很多压差计算也更可信。对两串系统B、B1、B- 三个点分别是电芯1正、电芯1负/电芯2正、电芯2负。测量电芯1就是 B1 对 B-测量电芯2就是 B 对 B1。注意别把两个分压电阻的地弄错否则轻则采样乱掉重则短路。我这边用了四个采样点电芯1电压、电芯2电压、均衡芯片温度、板温。前两个是均衡依据后两个是保护依据。PCB 上把这四路采样都走成了差分对而且尽量从电池端子附近直接引出避免经过功率回路。实测下来采样噪声主要来自均衡芯片的电感开关节点所以我特意在 ADC 引脚前加了二级 RC 滤波截止频率设在 10kHz 左右既不拖慢采样速度又能把开关毛刺滤掉。2.3 均衡芯片和主控之间的接口与供电均衡芯片和主控之间的接口我这边用了 I2C 总线。它本身有地址引脚两节电池的最简系统只有一片均衡芯片地址固定就行。如果以后并联多片靠地址位区分。主控每 100ms 读一次状态寄存器状态字里能看到当前均衡方向、芯片温度、故障标志要启动均衡时往控制寄存器写入目标通道和均衡电流档位。这个交互比用 GPIO 硬拉电平可靠得多因为读回来的状态能反馈给策略做闭环。主控和均衡芯片都需要供电。两串磷酸铁锂的电压区间大概 5V 到 7.3VPIC24FJ128GA310 可以直接用电池组供电但必须经过稳压器。我用了 LDO 降到 3.3V并且在靠近 MCU 电源脚放 100nF 和 10uF 电容。均衡芯片的电源则从 B 取它内部有自己的稳压但我仍加了一个 LC 滤波器避免均衡开关动作时产生的开关噪声干扰电压采样。这一点非常关键我在调试时一开始没加导致 ADC 读数像呼吸一样跳动。供电顺序也要注意。上电时先让均衡芯片完成初始化再让 MCU 去读它的寄存器下电时反过来。否则均衡芯片还没准备好MCU 一上来就去写控制字写入可能失败而且状态位会不对。我在软件里做了 200ms 的上电延迟实测以后再没出现过首轮写失败。2.4 均衡电感、电容和 PCB 布局要点均衡芯片外围最核心的元件就是那颗储能电感。我根据目标均衡电流 1A 和开关频率选了 10uH 的功率电感饱和电流留到 2A 以上。电感选大了均衡电流上升慢效率会下降选小了电流纹波太大发热更多。这个值是在 MP2642GR-Z 手册推荐范围里取的然后我用示波器看了电感电流波形确认没有进入饱和再把电阻值微调到了最终状态。如果你也想参考建议先按手册典型值来做不要上来就抄别人的“优化值”。布局上均衡回路要尽量短。MP2642GR-Z 去连接两节电芯的功率路径上任何过长走线都会带来寄生电感主动均衡的开关频率不高但瞬时电流变化依然会产生振铃。我在 PCB 上把电芯端子放在板子一侧均衡芯片放在离电芯端子 5mm 以内的地方功率地单独走一小段后和信号地单点连接。采样分压电阻和运放则放在另一侧远离电感/开关节点。这个方法不算多高级但对稳定性帮助很大。保护电路不要省。两串电池的安全底线是过压、欠压和过温。MP2642GR-Z 内部有一些硬件保护但均衡策略不能完全依赖它。PIC24FJ128GA310 这边我用两路 GPIO 直接驱动后级保护逻辑一路是充电允许一路是放电允许一旦检测到电芯电压超过保护阈值立刻拉低对应 GPIO切断充放电 MOS。这样做的好处是即使 MCU 死机均衡芯片也不会拼命工作因为均衡芯片的使能引脚同样是 MCU 控制在异常时一起关断。3. 核心均衡策略从电压差到闭环控制3.1 为什么不能直接比较瞬时电压很多人一开始的做法是检测到电芯1电压比电芯2高 20mV就开启均衡让芯片把电芯1的能量搬到电芯2直到两者电压相等。听起来没问题实际会犯两个错误。第一个错误是电池开路电压和端电压不是一回事。均衡发生在系统静置或者浮充阶段端电压除了受 SOC 影响还受电流和内阻影响。如果系统一边均衡一边带负载端电压差会被负载电流放大或缩小拿这个差值做均衡判断会得出错误结论。第二个错误是均衡是一个慢过程电压差会随均衡过程出现反弹。比如你刚把电芯1电量搬了一部分断开均衡电芯1电压立刻回升电芯2电压稍微回落两者很可能又拉开十几毫伏。如果我做严格滞回控制用一个固定阈值比如 10mV那么均衡会频繁开启和关断每次开关都会带来电流冲击。所以我最后确定了一个工作条件只有在整组电池静置且无充放电电流时才允许均衡动作此时端电压近似等于开路电压用电压差来判断 SOC 差异才比较可信。具体策略可以分为三档。当压差大于 30mV启动快速均衡把均衡电流设到芯片支持的最大档当压差在 10mV 到 30mV启动慢速均衡减小均衡电流避免过冲当压差小于 10mV停止均衡。10mV 这个阈值不是随便定的它综合了 ADC 采样噪声、运放失调电压和电芯自身恢复特性。我实际测量过静止状态下两节相同电芯的电压波动大约在 2~3mV所以 10mV 已经留有裕量。3.2 状态机设计与保护联动均衡控制我写成了一个简单的状态机四个状态IDLE、PRE_CHARGE、BALANCING、FAULT。IDLE 是默认状态。在这个状态里MCU 周期性采样电压、温度但不操作均衡芯片所有均衡通道都关闭。进入 BALANCING 的条件上面已经说了压差超阈值、静置、温度在 0℃ 到 45℃、系统没有报故障。PRE_CHARGE 是我额外加的一个状态不是每个方案都有均衡动作前先把均衡芯片的输出电容预充到接近目标电压然后再启动开关管。这样能避免启动瞬间的大电流冲击也能减少 MOS 管应力。BALANCING 之后每一轮均衡循环都读一次状态寄存器。均衡芯片会报告当前工作方向、电流是否达到设定值、是否发生过流或过热。如果连续三次读到的电流都低于设定值的 80%说明路径上可能有断路或者电感饱和我直接跳到 FAULT并间隔一分钟后重试连续重试三次失败就永久关闭均衡并输出告警。这个逻辑是调试里发现的因为有一次电感虚焊均衡电流只有预期的三分之一系统却认为一直在正常工作。FAULT 状态要做两件事关闭均衡并使能信号记录故障代码到非易失存储。PIC24FJ128GA310 内部有 Flash 模拟 EEPROM我分配了一页专门存故障代码和最近一次均衡的时间戳。调试的时候不用接仿真器就能从上位机读到故障历史省了很多力气。3.3 主循环代码框架与滤波细节下面给出一段可参照的伪 C 代码主要展示每 100ms 的主循环怎么组织。实际工程里我会拆成中断驱动但逻辑框架一样。#define TH_SLOW 10 // mV #define TH_FAST 30 // mV void battery_balance_task(void) { uint16_t v1 adc_read_filtered(CELL1_CH); uint16_t v2 adc_read_filtered(CELL2_CH); int16_t diff (int16_t)(v1 - v2); int8_t temp read_temperature(); switch (bal_state) { case BAL_IDLE: if (abs(diff) TH_SLOW temp 0 temp 45) { if (is_system_idle()) { mp2642_set_bal_target(diff 0 ? CELL1_TO_CELL2 : CELL2_TO_CELL1); bal_state BAL_PRE; } } break; case BAL_PRE: mp2642_start_precharge(); if (mp2642_precharge_done()) { mp2642_enable_balancing(diff 0 ? CELL1_TO_CELL2 : CELL2_TO_CELL1); bal_state BAL_RUN; } break; case BAL_RUN: if (abs(diff) TH_SLOW) { mp2642_disable_balancing(); bal_state BAL_IDLE; last_balance_ok 1; } else if (temp 45 || temp -10) { bal_state BAL_FAULT; } break; case BAL_FAULT: mp2642_disable_balancing(); bal_state BAL_IDLE; if (fault_count 3) disable_balance_forever(); break; } }ADC 滤波我推荐滑动平均再加中值滤波。电动车和储能场景里开关噪声是周期性的单纯滑动平均容易把尖峰平均进去。我的做法是连续采 7 次去掉最大最小值剩下 5 个求平均得到结果再喂给策略。这样的一组采样在 2ms 内完成不影响 100ms 控制周期。还有一个细节均衡芯片运行时会在电芯路径上产生纹波我让 ADC 采样时机避开均衡芯片的开关动作具体做法是均衡芯片状态寄存器里有一位是“开关同步信号”我等到信号为低时才启动采集。这个细节让压差数据的抖动从 8mV 降到了 2mV。3.4 均衡效率与损耗的实测数据我以两节 3.2V/50Ah 磷酸铁锂电芯做测试初始压差大约是 55mV对应 SOC 差异大约 3% 左右。均衡电流设定为 1AMP2642GR-Z 的电感方案实际转换效率在 80% 到 85% 之间。我测了整个过程前 15 分钟压差快速下降之后趋于平缓总共约 42 分钟压差收敛到 8mV。开始我以为越到后面越快后来看数据才知道随着压差缩小均衡芯片内部的电压检测误差和 MOS 管导通压降占比会上升有效均衡电流会变小所以曲线尾巴拉得很长。这让我调整了策略最后 10mV 以内直接停止均衡不追求绝对相等。热损耗方面1A 均衡电流下均衡芯片表面温度最高的位置大概到 60 摄氏度加了一点导热垫后降到了 46 摄氏度。这个数据说明在小体积设备里主动均衡不是没有发热只是比被动均衡好得多。如果设计的是完全密闭金属壳这个温度完全可接受如果是塑料壳又贴在锂电池表面建议把均衡电流降到 0.5A或者在策略上限制单次均衡时间不超过 20 分钟。4. 调试阶段最容易被坑的地方4.1 单节电压采样完全不准怎么定位第一次上板我碰到的最严重问题就是两节电池的 ADC 读数相差 100mV而万用表量出来只差 8mV。查了一圈发现是两个分压电阻的精度不够。我在快速原型阶段用了 1% 精度的电阻理论上来讲分压比误差大概也在 1% 以内但两节电池一个通过 100k/20k 分压另一个通过 100k/18k 分压分压比不一致误差会被叠加。换成 0.1% 精度电阻后采样偏差立刻小了一个数量级。另一个原因是 MCU ADC 输入端的采样电容。如果分压电阻太大比如 1M 级别等效源阻抗太高ADC 采样瞬间电容还没充满就开始转换读到的值会偏低。我最后把分压总阻值控制在 100k 以内并且在 ADC 引脚对地并联了一个 100nF 电容这样输入阻抗大大降低。这个方法看似简单却能省掉专门加一级运放的费用。当然如果你有预算还是建议加运放跟随。4.2 均衡芯片一使能就复位调试里有两次几乎一样的现象程序一启动均衡没过几秒 MCU 系统就复位。看门狗没有动作最后发现是电源问题。均衡开启瞬间电池电流突然增加B 端电压瞬跌给 MCU 供电的 LDO 输入电压掉到低于最低工作电压于是 MCU 复位。解决方案分三步在 LDO 输入侧加大电容储能在均衡芯片使能前先把 MCU 切换到稳压后的供电模式最后是在软件上做软启动也就是先设置小电流均衡过来 200ms 稳定后再升到目标电流。三步做完复位问题彻底消失。这个现象也提示我备用电源系统的电源路径非常容易受到均衡瞬态影响。如果均衡芯片和 MCU 各自用一路独立的 DC-DC那均衡电流引起的电压跌落会被 DC-DC 的负载响应吸收情况会好很多。成本允许的话推荐在主控前加一级输入范围很宽的降压稳压器而不是直接用 LDO。4.3 上位机看不到数据但功能正常调试时经常出现一种情况均衡功能自己跑得很好蜂鸣器也正常但连上上位机后数据死活不出来。开始怀疑通信接口配置错误翻代码发现没问题问题出在接线干扰。均衡芯片工作时在电池线上产生了很高的 di/dt通过地线耦合到通信口导致数据包 CRC 错误。后来把通信线改成双绞线并且在 MCU 和均衡芯片之间加了一个地线隔离层另外在通信引脚加了 ESD 保护数据就稳定了。如果你也用 I2C 和上位机脚本交互我建议所有读取操作都带重试机制。我在测试脚本里每个寄存器读三次取多数值虽然增加了开销但避免了很多假故障。这在量产阶段也可以作为一种防错手段代价很小。4.4 浮充阶段均衡误动作的规避备用电源系统有一个特殊阶段——浮充。整组电池被充电器维持在较高电压每节电芯的端电压都很接近过压阈值但可能一节的 SOC 偏低、另一节偏高。如果此时启动均衡虽然能强制把两节电压拉近但均衡结束以后充电器又会慢慢把电压推回去最后两节电芯依然处于同一 SOC 差的状态甚至因为均衡引发的充放电逻辑混乱导致过压。我在策略里专门加了一个“浮充锁定”位只要监测到有外部充电电流均衡不要动作只有充电电流消失并且系统进入静置状态达到 30 秒才允许均衡。这个 30 秒的静置时间不是拍脑袋想的。刚切断充电器时电芯内部离子浓度还在扩散端电压会缓慢变化这段时间内测到的压差不代表真实 SOC 差异。30 秒后电压变化趋于平稳此时再做均衡出来的结果才稳定。为了在代码里判断外部充电电流我在电池回路串了一颗低阻采样电阻直接用 PIC24FJ128GA310 的差分通道采集。虽然会增加一点硬件成本但给策略带来的收益非常大。5. 扩展方向与我的个人体会5.1 从两串扩展到更多串电池MP2642GR-Z 本身面向两串系统想扩展成 4 串目前比较顺的路是“两个两串模块级联”。每两节电芯一个均衡模块模块之间通过主控的 I2C 总线连接然后用软件做两级均衡先让每组两节内部均衡再让两组的平均电压趋近。这种方案的缺点是能量不能直接跨组转移均衡速度慢一点但对于中小储能系统慢均衡比没有均衡好得多。真正要做好多串我建议研究专为 4S 到 6S 设计的均衡前端芯片再把 PIC24FJ128GA310 升级成带 CAN 或更多 UART 的型号方便把每节电芯电压和均衡状态上传到系统控制器。这个扩展方向在我做完两串项目以后已经明确因为备用电源机柜通常要并联多组电池如果每组都能上报均衡状态维护成本会下降很多。5.2 策略上的可移植点这几天复盘我认为最适合拿到下一代项目复用的是两点一个是“静置时才均衡”的判定另一个是“快慢两档均衡电流加滞回”的思路。前者保证了采样可靠性后者避免了均衡通道反复通断。只要把芯片抽象成一套 API换其他均衡芯片时上层策略几乎不用改。我在代码里单独建了一个 hw_balancer.c里面只放初始化、设置目标、使能、读取状态四个函数底层寄存器逻辑都隔离在里面。这个习惯在中小型嵌入式项目里非常实用因为芯片缺货时你可能会换一个外围兼容的型号上层策略不受影响。再补充一点PIC24FJ128GA310 的休眠模式很适合备用电源系统。系统大部分时间处于浮充主控没必要满速跑。我让 MCU 在静置且压差小于阈值时进入空闲模式只保留一个定时器唤醒。均衡需要启动时才让 ADC 连续工作。这个小改动把整板待机电流降低了不少在电池供电的备用场景里很有意义。5.3 最后的提醒做这种电池相关的硬件项目无论方案听起来多简单我强烈建议先做原型再看效果。MP2642GR-Z 加上 PIC24FJ128GA310 的物料成本不高但电池不是玩具接反一根线、漏焊一个电容代价可能不是烧一个芯片那么简单。我自己的习惯是先用几节废旧电芯做破坏性测试确认保护逻辑没漏洞以后再上真电芯。整个过程里对我帮助最大的工具不是分析仪而是给每节电芯贴上标签、记录初始电压和容量这个笨办法让均衡前后的数据对比一目了然。如果你也在做类似的东西希望这篇复盘能帮你少走几圈弯路。均衡这件事硬件只是基础真正决定系统寿命的往往是软件里那些看似不起眼的延时和阈值。