前阵子我做了块两串磷酸铁锂的从控均衡板,主控选用 STM32F071VB,均衡部分用了 MP2642GR-Z,目标是放进一套储能和备用电源的电池模组里,对两个串联电池单元做主动均衡。当时身边不少同事的第一反应是:才两节电芯,串几个电阻做被动均衡不就行了?但真正在储能这种大容量、长时间运行、经常浮充的场景里跑过数据之后,我确认这个想法是错的——两串恰恰是最容易出问题、也最容易被忽视的短板点。这篇文章不打算介绍那套“均衡=把电压拉平”的刻板思路,而是把我选这两颗料的原因、硬件设计取舍、软件状态机设计,以及调试中踩过的四个值得记下来的坑,完整拆开讲一遍。
1. 两节电芯串联,为什么也绕不开均衡
1.1 短板效应在储能系统里被放大了
两个电池串联,容量受最差的一节限制,这是串联电池的物理规律。假设电芯 A 容量 50Ah,电芯 B 容量只有 48Ah,那么充电时 B 会先到截止电压,系统只能停止充电;放电时 B 也先到欠压点,系统又要停止放电。A 明明还能充一点、还能放一点,但整个模组的工作窗口被 B 掐住了,可用容量硬生生被拉到 48Ah,损失了 4Ah,折算下来是 8% 的可用电量。
在手机电池或小容量工具电池里,损失 8% 可能只表现为“续航短了一点”,但在储能系统或者备用电源里,这是安时数和瓦时数实实在在的减少。尤其是磷酸铁锂体系,电压平台非常平坦,SOC 从 20% 到 80% 可能电压只变化 200mV 左右,电池制造过程中的微小差异就会被放大成明显的压差。另一个容易被忽略的情况是长期浮充:备用电源系统经常处于“充满、浮充、几乎不放电”的状态,两节电芯各自的自放电率、温度场甚至 PCB 布局温差都会导致 SOC 漂移,时间一长,压差就慢慢积累。前阵子我测过一组浮充半年的两串电池,静态压差到了 180mV,这就是很典型的“不均衡老化”信号。
1.2 被动均衡放热 vs 主动均衡转移能量
传统被动均衡的思路很直接:给每节电芯并联一个电阻和放电 MOS,电压高的电芯通过电阻把能量“烧”掉。做到 1A 均衡电流时,一个 3.5V 的单节就是 3.5W 的热量,放在密闭电池包里是个难题。而且储能电芯容量大,需要搬运的能量动辄几十瓦时,被动均衡把能量白白放掉,效率低,热问题突出。
主动均衡的思路是“转移”而不是“消耗”。MP2642GR-Z 这类开关电容式电荷泵均衡芯片,本质上是通过电容把高电压电芯的能量搬运到低电压电芯里。同样 1A 均衡电流,被动均衡要耗散 3.5W 热,主动均衡则把这部分能量变成了低压电芯的补充电荷,整包能量没有损失。所以对储能和备用电源这类系统,主动均衡不是锦上添花,而是容量保持率和管理成本的刚需。
1.3 先把“均衡目标”定义清楚:最后对齐的是 SOC 而不是电压
这里要特别说清楚一个容易误解的点:均衡的目标不是让两节电芯的电压完全相等,而是让它们的荷电状态(SOC)趋向一致。尤其磷酸铁锂这种电压平台极平的电芯,开路电压差几毫伏可能对应的 SOC 差好几倍;反过来 SOC 差 1% 可能电压上根本看不出来。所以盲目追求“压差等于零”没有意义,反而会让均衡陷入频繁启停。
我在设计状态机时,把均衡判据设成了“静态压差大于一定阈值才启动,压差回到更小阈值才停止”,并且要求系统先进入静置状态再触发均衡。为什么必须静置?因为放电或充电时,两节电芯的内阻差异会导致动态压差,这个压差是极化造成的,搬一晚上能量也搬不平,甚至会把高内阻电芯越搬越亏。先静置,再均衡,才是真正往 SOC 一致这个方向上走。
2. MP2642GR-Z 是怎样在两节电芯之间搬运能量的
2.1 开关电容电荷泵:同一个电容反复“倒水”
MP2642GR-Z 的核心是开关电容电荷泵,简单理解就是让一个飞跨电容在两个电池之间反复“倒水”。第一个阶段,芯片内部开关把电容并联在电压较高的电芯两端,电容被充电,电压升到该电芯电压;第二个阶段,开关切换,电容改接到电压较低的电芯两端,电荷释放到低压电芯里。这个切换频率很高,每一轮搬运的电荷量大概是:
Q = CFLY × (V_high - V_low)
假设飞跨电容取 22μF,压差 200mV,切换频率 300kHz,每个周期转移电荷约 4.4μC,每秒搬运约 1.32A 的平均等效电流。也就是说压差越大,单位周期搬运的电荷就越多,均衡速度越快;随着压差减小,搬运量下降,系统自然趋向平衡,不会像被动均衡那样电压越低放得越慢还要硬烧。这个机制对于两串系统非常合适——一颗芯片直接跨接在两个电芯之间,由芯片内部 MOS 开关阵列自动完成换相,外部只需要按手册要求配置好飞跨电容和输入侧电容。
我实际测试时发现,在压差 150mV 的情况下,都能稳定看到接近 1A 的搬运电流,这已经足够应付大多数 50Ah 级的磷酸铁锂两串模组。如果想估算均衡时间,可以简单这样算:假设两节电芯容量 50Ah,SOC 差 5%,相当于需要搬运约 2.5Ah 电荷。用 1A 均衡电流,理论需要 2.5 小时左右。实际因为有效率和散热折减,留出 3 到 4 小时的均衡窗口比较稳妥。
2.2 飞跨电容和外围器件怎么选
外围器件选型是这块板子最容易翻车的地方,尤其是飞跨电容。我试过两类电容,差别非常明显。
第一类,普通电解电容或高 ESR 的电容。用这类电容时均衡电流上不去,实测只有 0.4A 左右,芯片温度却升得很快,原因很简单:电容 ESR 吃掉了太多电压余量,等效内阻把充电电流压了下来。第二类,低 ESR 的 X7R 或 COG 多层陶瓷电容。换上去之后均衡电流立马回到 0.9A 以上,芯片温升也明显下降。选电容时还要注意耐压,两串磷酸铁锂总电压最高约 7.3V,我最终选的是额定耐压 25V 的 X7R 陶瓷电容,裕量充足,ESR 又够低。
除了飞跨电容,输入侧并联一个 10μF 左右的电容做电荷池,输出侧放一个 0.1μF 高频退耦电容,这些用量都按照芯片手册推荐值来。其他注意点:芯片引脚对应两个电池节点,B+、中间抽头、B- 三个点的连线面积要足够,均衡电流毕竟是安培级的;走线太细会引入额外压降和噪声,直接影响搬运效率。
2.3 均衡效率、发热与极限电流:实测参数心里要有数
做硬件设计最忌讳只看理想公式,实际效率不是 100%。开关管的导通电阻、电容 ESR、PCB 铜箔电阻都会造成损耗,这部分的能量最后变成芯片附近的热量。我在整块板子测试时测过一组数据:
| 工况 | 均衡电流 | 输入端功率 | 电芯侧吸收功率 | 估算效率 |
|---|---|---|---|---|
| 压差 200mV | 0.95A | 约 1.5W | 约 1.3W | 85% 左右 |
| 压差 50mV | 0.35A | 约 0.6W | 约 0.5W | 约 80% |
这些数据说明两件事:第一,均衡效率在中等负载下能做到 80% 以上,比被动均衡的零效率强太多;第二,芯片附近始终会有瓦特级的热,PCB 散热焊盘、过孔阵和铺铜都要给足,不能因为均衡芯片看着小就忽视了散热设计。
3. STM32F071VB 管的是“策略”而不是“搬运”
3.1 为什么选 M0 内核 + CAN:算力刚好够,通信跑得稳
MP2642GR-Z 自己负责能量搬运,而 STM32F071VB 的角色是做监控和策略管理:读电压、读温度、判断是否允许均衡、把状态通过 CAN 上报给上级控制单元。为什么选这颗?核心原因有三个:它带 CAN 控制器,可以直接在储能系统里和总控通信,不用再外挂 SPI 转 CAN 模块;它是 Cortex-M0 内核,主频虽然只有 48MHz,但处理两串均衡的采样、滤波和状态机绰绰有余;它内置 128KB Flash 和 16KB RAM,后续如果要扩展记录故障日志、存储校准参数也不会捉襟见肘。
有些人会觉得主动均衡芯片都自己工作了,还要 MCU 干什么?真不是这样。芯片只是机械地搬运电荷,它不知道电芯什么时候过压、什么时候过温、什么时候应该停止。例如磷酸铁锂单节上限 3.65V,如果均衡芯片在电芯已经接近过压时还继续从高压侧抽电,问题不大;但如果它持续给低压侧充电,而低压侧其实已经满了,那就可能把电芯充过头。还有,当系统正在大电流放电时,均衡和放电电流重叠会给采样造成干扰。这些决策必须由更高层级的 MCU 来做,芯片只负责执行。
3.2 电压采集链路:分压、基准与软件滤波
STM32F071VB 的 ADC 是 12 位,但实际的精度瓶颈往往不在 ADC 位数,而在参考电压的稳定度和采样链路的噪声。我的做法是:外部用一颗低温漂基准给 ADC 做参考,不要直接依赖 MCU 内部 VREF 或电源电压,否则温度一变,整条采样曲线都飘。
分压电阻上我选的是 1% 精度的金属膜电阻,把单节最高 3.65V 分压到 ADC 输入范围内。分压比例约 1/4,那么 3.65V 对应 0.9125V,配合基准 3.0V 时 ADC 读数约 1246,还有余量。这个分压网络必须用精密的等比值电阻,两个单节的采样链路要尽量对称,否则两个采样链路本身就带来几十毫伏的误差,比电芯压差还大,后面均衡判断就全乱了。
软件上做了一组过采样和滑动滤波:连续采 16 次,去掉最高最低,取平均。这样能把开关噪声大概率抑制掉。实测采样抖动控制在 ±3mV 左右,满足 20mV 均衡阈值的判断需求。具体参数见表:
| 项目 | 参数 |
|---|---|
| 采样周期 | 100ms |
| 过采样次数 | 16 |
| 分压电阻精度 | 1% |
| 采样输入 RC | 100Ω + 1μF |
| 均衡启动阈值 | 静态压差 > 20mV 且持续 10s |
| 均衡停止阈值 | 静态压差 < 10mV 或单体过压/欠压 |
3.3 均衡状态机与保护逻辑的工程实现
均衡策略的核心是一个简单但严谨的状态机,状态包括空闲、均衡等待、均衡中、均衡暂停和故障保护。空闲状态下,每 100ms 检查一次两节电芯的电压差、单节电压和温度;只有两节电芯都处于正常电压区间、温度在 0℃ 到 45℃ 范围内,并且系统处于静态或微小负载状态时,才允许进入均衡等待。
进入均衡等待后,软件会启动一个 10s 的确认计时器。为什么要有这个确认时间?因为瞬时扰动可能造成虚假启动。比如负载突然切换时电芯极化电压跳了几下,虽然看起来压差超过 20mV,但那不是真实的 SOC 差距,等 10s 再看,大概率自己就收敛了。确认之后,MCU 通过控制均衡子板的使能端来启动 MP2642GR-Z。
均衡进行中,保护优先级最高。只要任一电芯电压超过 3.65V、低于 2.5V,或者温度越限,MCU 立即断开均衡使能,并置一个故障标志上报 CAN。均衡结束条件不是电压差等于 0,而是压差回落到 10mV 以下并持续一段时间。这样设计是为了避免均衡在“启动-停止-再启动”之间反复横跳,既能完成 SOC 对齐,又不会让系统总是在高功耗模式下空转。
4. 从原理图到样机:两串均衡子板的完整实现过程
4.1 采样线与功率线分开:开尔文接法在最前面
这块板子我画第一版时栽了个跟头:采样线直接就近接到了主功率回路上,结果两个电芯的采样电压总是偏低,而且负载越大偏低越多。原因很典型——功率回路走大电流时,MOS 内阻和铜箔压降叠在采样点,采样点离电芯端子越远,误差越大。
正确做法是采用开尔文接法:功率长距离走线归功率走线,采样线单独从电池端子的根部引出,走细线到分压电阻,中间不要和功率电流路径共用铜箔。采样线电流极小,所以线上不会有什么压降,测到的就是实实在在的电芯端电压。我的板子上把采样线出线点直接做到了端子排根部,功率线则是另一条粗铺铜路径,两路在电气上只在一个点汇合。调试时被这个细节救了很多次,建议做 BMS 的人这个习惯一开始就养成。
4.2 均衡子板与主控板的接口设计
我把均衡子板和主控板做成两块分开的 PCB,中间通过排针连接器对接。子板上的核心器件就是 MP2642GR-Z、飞跨电容、输入输出电容和一些保护器件;主控板上放着 MCU、基准、CAN 收发器、LDO、采样电阻网络。这样的好处是均衡大电流路径独立,调试时可以单独给子板供电做均衡实验,主控板单独跑采样和通信逻辑,方便排查问题。
子板和主控板之间关键信号有一个均衡使能信号、一个故障输出信号、一个来自主控的 PWM 或单片机 IO 控制信号,以及电源和地。这个接口的单片机侧最好加一个 10kΩ 下拉电阻,防止主控板没上电时子板被误触发导致均衡常开。故障输出信号则当作备用保护通道,即使主控死机,子板自身检测到单芯过压也能拉断使能,形成一道硬件兜底。
4.3 PCB 布局里最容易翻车的三个位置
总结我这版板子迭代下来的经验,有五个位置值得反复检查。
第一,飞跨电容要尽量靠近 MP2642GR-Z 的电容引脚,容量越大越要近。高频电荷泵的电流回路如果绕远了,回路电感会把开关尖峰放大到很夸张的程度,均衡效率下降不说,EMI 也会麻烦。
第二,芯片底下要放散热过孔阵列,焊盘上打通孔到底层铺铜。前面提到过,瓦特级热量集中在芯片区域,只靠顶层的铜皮是不够的。
第三,采样电阻的位置必须避开均衡大电流路径。我把采样分压电阻放在了板子靠边缘的位置,离电荷泵的开关节点至少 10mm 以上,中间有地线隔离走线。
第四,CAN 收发器和 MCU 之间的走线要尽量短,终端电阻的位置按协议处理。第五,两个电池的中间抽头作为整个系统电位参考点,走线要粗、要稳,因为均衡电荷转移的所有电流都会从这个点流过。
4.4 充电、静置、放电三种场景下的实测表现
板子调通后,我在三种典型工况下分别做了实测,结果挺有参考价值。
| 场景 | 初始压差 | 均衡效果 | 备注 |
|---|---|---|---|
| 静置空载 | 220mV | 约 2.5 小时后压差降到 25mV | 均衡效率最理想的窗口 |
| 0.2C 放电中 | 180mV | 压差先波动后缓慢缩小,但速度慢 | 动态压差干扰判断,不建议长时间均衡 |
| 充电末端 | 170mV | 压差收敛很快,但出现过压风险 | 需要严格保护逻辑,避免过冲 |
实测显示,静置场景是均衡的“黄金窗口”,因为电池极化最小,搬运电荷几乎全部转化为 SOC 对齐。充电末端虽然压差收敛快,但单芯电压逼近 3.65V 上限,此时均衡芯片理论上会从高压侧抽电给低压侧,但如果低压侧也已经接近满电,继续搬运就等于对整组“微过充”,所以我最后选择在电压超过 3.55V 时先暂停均衡,等浮充阶段再做处理。放电过程中则不建议启动均衡,最好等系统切到空载或待机状态再启用,这个结论也是实测跑出来的。
5. 调试中踩过的四个坑,每一个都值得记下来
5.1 采样点放在 MOS 后面,过压误报了一个星期
第一版原理图我把采样点放在了反接保护 MOS 和低边 FET 的后面,想着这样接线方便。结果一上电就发现,静置时单体电压偏低约 80mV,充电时偏低 20mV,放电时偏低 120mV,而且数值还会跟着负载电流抖动。当时我一度怀疑是电芯分容不准,甚至换了一批电芯还是这样。
后来静下心测各路压降,才发现 MOS 通态电阻和铜箔电阻制造的压降全部落在了采样回路里。比如低边 MOS 导通电阻大约 8mΩ,放电电流 10A 就产生了 80mV 压降,全都算到了电芯头上。解决办法就是前面说的:采样线重新改到电芯端子根部,用开尔文接法避开功率路径。改完后校准精度立刻恢复正常。这里提醒一句:不要相信 MOS 规格书上的导通电阻,温度升高后电阻会涨到常温的一点几倍,压降误差也跟着翻倍。
5.2 被动均衡还在开着,主动均衡越工作压差越大
这是我调试中遇到的最诡异的问题:主动均衡开通后,压差先快速缩小,然后反弹,最终甚至比初始压差还大。查到最后发现是板上原有的被动均衡电路还在工作,而且没有关闭。
被动均衡电阻接在单节电池上,会持续把高压芯的能量放掉。主动均衡把能量从高压芯搬到低压芯,被动电路又同时把高压芯“额外烧掉”,两个环节相互拉扯,等于一套系统里有人灌水有人放水。最终低压芯被主动均衡充电,高压芯被被动均衡放电,压差反而被拉大。解决办法很直接:确认主动均衡方案后,把被动均衡电阻和 MOS 全部移除,或者在逻辑上保证主动均衡工作时被动均衡 MOS 强制关闭。这种问题在改装项目里尤其容易遇到,吃一堑长一智。
5.3 均衡一启动,ADC 就跳 ±15mV
均衡功能开启后,MCU 采到的电压开始剧烈跳动,跳动幅度接近 15mV,已经超过均衡阈值,导致状态机疯了一样来回切换。用示波器看采样点,能看到幅度几百毫伏的高频毛刺,频率正好和电荷泵开关频率对上。
这个噪声耦合进 ADC 分压网络,我的解决组合拳是:在 ADC 输入分压后加一级 RC 低通,时间常数约 1ms;软件上把采样的时间点特意安排在均衡开关周期中的“静默窗口”;并且把采样优先级放在均衡启动指令执行之前,先停一下均衡,等 10ms 采样完成再恢复。这套组合下来,采样抖动从 ±15mV 降到了 ±3mV,状态机也稳定了。这类问题和布局有关,如果发现 RC 滤不掉,大概率是采样线把噪声带进来了,记得回归开尔文接法并在采样线两侧包上地。
5.4 CAN 总线在大电流脉冲时丢帧
最后一个坑出现在整机联调:均衡电流比较大的瞬间,CAN 通信偶发错误帧,严重时连续丢几帧。刚开始怀疑是波特率配错,反复核对了寄存器没问题;也怀疑过收发器质量问题,换了两家的收发器仍然存在。
排查到最后,根源是开关噪声通过板内电源地平面灌进了 CAN 收发器,再加上系统里有多个功率模块共地,地弹效应导致总线差分电压畸变。解决思路有四个方向:CAN 差分线两端加 120Ω 终端电阻,保证总线阻抗匹配;收发器的电源脚加磁珠和高频退耦电容,把电流尖峰隔离在外;数字地和大电流功率地在板内单点连接;端子入口处加 TVS 和共模电感。做了这组整改后,错误帧完全消失。这里提个容易被忽略的细节:终端电阻只能加在总线最远两端,如果多个节点都加了,总线负载会被拉跨,反而更容易出通信错误。
如果后续项目要从两串扩展到 8 串、13 串甚至更高,这套做法的思路可以平滑迁移:以每两串为一个标准均衡单元,每单元配一颗 MP2642GR-Z 或者对应型号的电荷泵芯片,所有单元由 STM32F071VB 或同类带 CAN 的 MCU 协调管理。重点是把最小两串单元调稳,采样、均衡、保护、通信这四条链路摸透了,扩展起来基本上就是复制加上地址分配的事。我自己的体会是,做电池管理系统不一定非要从顶层的复杂架构开始,先吃透一个最小的串联单元,比什么都强。