做储能和备用电源系统有几年了,我最早对“两节串联电池均衡”这件事是有点看轻的——总共就两个电芯,压差能大到哪去?直到第一批样板在老化房里连续跑了几个星期,看到其中一组电池的剩余容量明显被“短板”拖住,才开始认真对待这个环节。后来把 MP2642GR-Z 和 PIC32MX675F256L 这套组合用进去,做了完整的双节串联电池均衡方案,才算真正把问题解决干净。
这篇文章就围绕这套方案展开,适合正在做储能、备用电源、BMS 前级均衡的工程师参考。我会从“为什么必须均衡”“拓扑怎么选”“硬件采样怎么做”“PIC32 固件怎么跑状态机”“实测数据长什么样”一路写到量产前的坑,尽量把能直接抄作业的细节都放出来。
1. 双串联电池的失配问题:备用电源场景下最容易被忽略的坑
1.1 容量、内阻、自放电:三座大山从哪来
串联电池组的均衡问题,根源不在电路,而在电芯本身。两节电芯即便是同一批次出厂,容量也会有 1%~3% 的离散度;内阻差异可能更大,尤其是其中一节已经老化、另一节还比较新的时候。这些差异在日常使用中不会立刻暴露,但会通过三种方式持续累积:
- 容量差异:放电时容量小的那节先到放电截止,整组被迫停机,另外一节还有大量剩余电量没用完。
- 内阻差异:同样电流经过内阻大的电芯,极电压在放电时掉得更快,充电时升得更高。
- 自放电率差异:备用电源经常处于长时间静置状态,两节电芯自放电率不同,静置几个月后压差可能从几乎为零慢慢拉到几十毫伏甚至上百毫伏。
两节串联的组比 4 串、6 串更容易被忽略,因为电芯数量少,很多工程师觉得“少了自然就简单”。实际上电芯越少,单节的电压波动对整组可用容量的影响越明显。四节里面坏一节,你还能靠其他三节撑一段;两节里面坏一节,整组直接瘫痪一半。
1.2 不均衡的后果:容易被“保护住了”掩盖的真实伤害
很多人会觉得有保护板就行,过压、欠压都被拦住了,不均衡只是容量少用一点而已。但实际上不是“一点”的问题。
我见过一组两串磷酸铁锂备用电池,静置三个月后两节压差到了 110mV。按典型平台电压 3.2V 来算,这意味着充电时电压高那节先顶到 3.65V 被保护板叫停,电压低那节还在 3.54V,大约充进去的电量差了 7%~10%。反过来放电时,电压低那节先到 2.8V 被拉停,高的那节还剩 3.1V 的电压。
表面上看保护板每次都正常动作,电池组也没坏,但实际上整组可用容量一直在向“最差的那节”看齐。长期这样跑,低的那节容量衰减更快,形成恶性循环。在储能和备用电源场景里,这意味着当真正要切换电池供电的关键时刻,系统实际能撑的时间,远远低于标称可用容量,这是非常要命的事情。
保护板只负责“不越界”,均衡电路要负责“消除差异”。这两个任务必须分开,这也是我在方案里坚持引入专用均衡链路的原因。
2. 方案骨架:MP2642GR-Z 负责转移能量,PIC32MX675F256L 负责做决策
2.1 为什么不用被动均衡
被动均衡是很多入门设计的第一选择:检测到哪节电压高,就用电阻把那节多余的能量放掉,以热的形式消耗。这种方案结构简单,控制逻辑也简单,但有两个很难绕开的问题:
第一,效率直接归零。备用电源本身就讲究能量利用率,把宝贵电量用电阻烧掉,在储能这种场景里很浪费。第二,均衡电流受散热限制。电阻大了发热失控,电阻小了均衡时间长,根本慢不下来。被动均衡在长时间静置场景下几乎是失效的,静置时你不可能一直开着大功率电阻放电。
因为项目做的是储能和备用电源系统,我更倾向主动均衡:把电压高那节电池的能量搬运到电压低那节里去,能量不白费,均衡电流也可以做得比被动电阻方案更大、更可控。
2.2 主动均衡拓扑落地:开关电容方案
主动均衡有电感式、变压器式和开关电容式几种。在一个两节串联的小系统里,开关电容方案结构和成本最均衡。
原理不复杂:用一个电容做临时“能量中转站”。先把电容并联到电压高的那节电池上,充上电;再把电容切换到电压低的那节电池上放电。往返循环,高的一节降一点,低的一节升一点,压差逐渐收敛。
这有点像两个人分水,容量多的拿杯子舀一勺倒给少的那个,来来回回就把水位拉平了。整个过程几乎没有热量产生,除了开关管和线路的导通损耗之外。这也是 MP2642GR-Z 在这套系统里的核心角色,它内部集成了开关管和切换控制逻辑,外部只需要接均衡电容和少量阻容元件,就能完成能量在两个电芯之间的搬运。PIC32 不需要自己搭桥式开关电路,也不需要自己控制 MOS 管的开关时序,这个脏活累活交给专用芯片处理,可靠得多。
实际接线大致是两节电池的正极、中间点、负极分别连到 MP2642 两端入口,均衡电容接在它的外部端口上;PIC32 通过 I2C 和它的控制/状态引脚打交道,发一个“开始均衡”的指令,它内部就去执行电容切换序列。
2.3 主控芯片选型:PIC32MX675F256L 凭什么站在决策位
均衡器本身能做能量搬运,但“什么时候均衡、均衡到多少停止、中间是不是出了故障”这些问题它不一定擅长判断。所以体系里需要一个主控大脑,PIC32MX675F256L 在这个位置非常合适。
这颗 MCU 的思路是:什么都给你留足余量,但不逼你上高端大芯片。我在早期评估过 8 位单片机,做简单逻辑和几个阈值判断也够用,但后面要把充电电压曲线、温度补偿、上位机通信、故障日志一起塞进去的时候,8 位机的资源就有点吃紧了。
PIC32MX675F256L 有 256KB Flash、64KB 量级的 RAM,主频跑在处理两节电池电压采样、滤波、均衡状态机和通信协议这个量级的任务上绰绰有余。外设方面,12 位 ADC、I2C、UART、多个定时器都齐了,基本不需要再挂外部扩展芯片。这类芯片在工业现场的生命力也被市场反复验证过,长期稳定性对我们这类备用电源设备来说比某些时髦的新内核更重要。
选它还有一个现实原因:工具链熟。Harmony 和裸机开发我都试过,团队上手快,采购渠道也稳定,BOM 可控。
3. 硬件搭建:从采样链路到均衡通道的细节设计
3.1 电压采样链路:均衡算法再聪明,采样不准都是白搭
两节串联的电压测量,最简单的方式是用电阻分压直接进 MCU 的 ADC。方案简单,但有几个地方必须在设计阶段处理好,否则后面调试全是在给采样误差擦屁股。
分压电阻必须用低温漂、高精度的型号。两个通道的分压比例要尽量一致,最好选同一批次、同阻值的电阻。如果上下两路分压比例差了 0.5%,在 3.6V 的电池电压上就是 18mV 的固定误差,直接超过我们设定的启动阈值。
ADC 基准电压决定测量精度,配置为内部基准时,必须在校验阶段把基准误差校掉。我在这套系统中给每个采样通道加了二阶低通滤波(RC),截止频率大概在几百赫兹,把 PCB 上耦合进来的高频噪声滤掉。滤波电容要靠近 MCU 的 ADC 引脚,而不是靠近分压电阻。
最关键的是开尔文接法。电池组大电流回路和采样回路在物理上必须分开走线,不能让采样分压电阻串进充放电电流回路里。否则负载一变动,毫欧级走线电阻上的压降会直接变成采样误差,均衡检测到“假压差”,乱启动、乱停止,整个逻辑全部错乱。
3.2 均衡通道和保护元件布局
MP2642GR-Z 外围器件不算多,但对布局有要求。均衡电容是能量搬运的载体,要紧贴芯片相关引脚,引线长了会增加寄生电感,高频切换时尖峰更难看。
我在电池端加了一颗 TVS 和一颗 PPTC 自恢复保险丝。TTL 正常工作时没感觉,一旦有人反接、静电或者意外短路,这两个元件能避免事态扩大。均衡电容的耐压值选型也不能省,至少按单节充电截止电压的 1.5 倍来选,宁可留余量,不要贴着极限。
均衡电流的大小靠均衡电容容量和开关频率共同决定。电流选大了收敛快,但瞬间切换电流会变大,对 PCB 走线和芯片开关管都带来压力;选小了压差半天磨不平。我在这版方案里把均衡电流限制在几百毫安量级,既保证几个小时内能完成收敛,又控制在器件安全范围内。
3.3 PCB 走线的隐蔽注意事项
第一点,采样线要走细线,并且远离均衡功率走线。功率线上变化的电流会产生磁场耦合,把纹波串进采样回路。第二点,电池中间点连接要用从电池节点单独拉出来的采样线,绝对不能从 MP2642 内部路径上取中间点,因为你不知道内部开关状态给这个节点带来多大扰动。第三点,地线尽量单点汇聚,避免数字地与功率地串扰。
这块板我前前后后改了三版,第一版为了省面积把采样线贴着均衡走线走了,结果采样噪声确实比较大,均衡状态机偶尔会抖动。第二版把采样线重新布到独立区域,加宽了功率地,问题基本消失。这也是我建议第一次做均衡板的人最好直接上四层板、留独立采样地层的原因,两层板也不是不能做,但你的调试时间会告诉你四层板有多值。
4. 固件侧实现:均衡状态机、阈值判断与通信配置
4.1 均衡策略:不是电压一样就停,而是用滞回避免抖动
均衡策略决定这套系统好不好用。很多初版设计最容易犯的错误是:压差高于阈值就启动,压差低于阈值就立即停止。看起来没毛病,但实际运行时均衡过程里电压会来回波动,状态机会在“启停”之间反复切换,次数多了可能导致控制芯片内部参数越切越乱,也在无意义地消耗寿命。
我在工程里用的是双阈值滞回:压差大于 25mV 则启动均衡,压差小于 10mV 才停止。中间这个 15mV 的区间是滞回带,用来吸收电压波动。
另外要避开充放电电流剧烈波动的阶段。均衡开始前先确认系统处于空闲或轻载状态,因为大电流会在内阻上产生额外压降,这部分的压差不是容量失配造成的,均衡了也没意义。备用电源场景下,系统大多数时间都处于静置浮充,天然适合均衡操作。
整个均衡过程还要加超时保护。比如连续均衡超过 4 小时压差一直没有收敛,我倾向认为电容、开关或者控制链路出现了问题,此时强制进入故障态,而不是让硬件无限循环下去。温度约束也要做,我们只在 0~45 摄氏度范围内允许均衡,超出就退出。
4.2 PIC32 外设初始化与 I2C 配置要点
PIC32MX675F256L 的外设初始化,重点在时钟树、ADC、I2C 和定时器。I2C 是 PIC32 和 MP2642GR-Z 通信的纽带,需要注意速率匹配。均衡器这类芯片通常工作在几百 kHz 以下,我初期直接按标准模式去配,结果丢包率偏高,后来降到 100kHz 量级,再开启重试机制,问题就消失了。配置 I2C 时还要留意:每次通信后检查 ACK,出现 NACK 时不要立刻重试,先做短延时再从总线上重新发起 START,给从设备留出恢复时间。
ADC 这边我轮流采集两节电池电压和 NTC 温度,每个通道的 RC 稳定时间要算进采集顺序里,不能用开启采样后立刻就读。初始化之后先空跑几十个采样,把通道稳定阶段丢弃掉,再进入正式逻辑。
4.3 均衡主状态机示例
下面这段是这版固件里状态机的核心骨架,删掉了大部分厂商库细节,保留了策略逻辑,方便理解。
typedef enum { BAL_IDLE, BAL_MEASURE, BAL_BALANCING, BAL_DONE, BAL_FAULT } bal_state_t; #define BAL_START_MV 25 #define BAL_STOP_MV 10 #define BAL_TIMEOUT_SEC 14400 static bal_state_t bal_state = BAL_IDLE; static uint16_t bal_timeout_cnt; void bal_task(void) { uint16_t diff_mv = get_cell_voltage_diff_mv(); switch (bal_state) { case BAL_IDLE: // 静置/空闲且压差超限,启动测量 if (diff_mv > BAL_START_MV && system_is_idle()) { bal_state = BAL_MEASURE; } break; case BAL_MEASURE: // 连续 N 次有效采样后确认压差,防止毛刺误触发 if (diff_mv > BAL_START_MV && measure_confirm()) { bal_state = BAL_BALANCING; bal_timeout_cnt = 0; mp2642_balancing_enable(); } else { bal_state = BAL_IDLE; } break; case BAL_BALANCING: bal_timeout_cnt++; if (diff_mv < BAL_STOP_MV) { mp2642_balancing_disable(); bal_state = BAL_DONE; } else if (bal_timeout_cnt >= BAL_TIMEOUT_SEC) { mp2642_balancing_disable(); bal_state = BAL_FAULT; } break; case BAL_DONE: // 短暂稳定后如果压差回升,重新均衡 if (diff_mv > BAL_START_MV) { bal_state = BAL_MEASURE; } break; case BAL_FAULT: // 拉码上报,直到人为清除 break; } }这里的关键点是确保get_cell_voltage_diff_mv()返回的不是瞬时值,而是经过滤波和确认的值。否则状态机再健壮,也会被噪声喂出误判。
4.4 采样滤波与故障保护
滤波我用的是滑动平均加一阶低通。滑动平均的窗口不要太大,通常 8~16 次采样就够,窗口大了响应太慢。每次均衡启动和停止后的 200ms 内禁止采样判定,这段时间芯片内部开关切换、外部电容充放电剧烈,采样结果不可信。
故障保护方面,我把故障码分成几档:采样超范围、I2C 通信异常、均衡超时、均衡电容短路嫌疑。所有故障都要通过状态位锁存,现场维护人员也好用 UART 读取诊断信息。这个系统还接了看门狗,PIC32 必须在窗口期刷新,一旦主控跑飞,看门狗复位后进入安全态,同时均衡使能引脚被硬件逻辑强制拉低,确保能量转移通道不会在失控状态下继续工作。
5. 实测复盘:压差 80mV 收敛到 15mV 的完整数据
5.1 测试平台与电芯准备
为了验证这套 MP2642GR-Z + PIC32MX675F256L 方案的实际效果,我们搭了一套简单的测试台:两节同规格锂电芯,其中一节经过加速老化,容量和内阻都明显变差,另一节保持较新状态。测试前先将两节电芯充满电,再静置 72 小时,让自放电差异自然拉开。
实测开始时,两节电池的静态电压差在 80mV 以上。这正是备用电源长期存放后最常见的启动状态。开启均衡前先记录一次完整电压值,随后每 5 秒记录一次,挑出几个代表性的时间点整理成表格。
5.2 均衡过程中的电压变化数据
下面的表格是一次典型收敛过程,均衡电流控制在约 300mA 量级:
| 时间点 | 电压较高节(V) | 电压较低节(V) | 压差(mV) |
|---|---|---|---|
| 启动前 | 3.612 | 3.530 | 82 |
| 10 分钟 | 3.602 | 3.544 | 58 |
| 30 分钟 | 3.589 | 3.559 | 30 |
| 55 分钟 | 3.576 | 3.563 | 13 |
| 90 分钟 | 3.571 | 3.560 | 11 |
| 120 分钟 | 3.570 | 3.559 | 11 |
从数据看,前面 30 分钟收敛最快,把 82mV 的压差压到了 30mV;后面速度变慢,因为压差越小,搬运过去的能量被来回转移过程中的损耗抵消得越明显。最终稳定在 11mV 左右,没有再继续收敛,属于开关电容主动均衡的正常平台表现。
整套系统在收敛后处于低功耗监控状态,PIC32 每 5 秒做一次采样,压差没有超过重启阈值,所以均衡器保持关闭。这个行为符合我们“只在必要的时候均衡”的预期。
5.3 调试中遇到的三个问题和对应调整
实测过程不只是看数据变好。我们同时踩了几个坑,写出来供参考。
第一个问题是均衡启动瞬间,ADC 采样值会跳变十几 mV。原因是 MPCU 在切换电容瞬间,电池端电压被瞬间拉低,纹波直接体现在采样回路上。解决方法是前面说的启动后锁存 200ms,等电压稳定再进入下一个判断周期。
第二个问题是 I2C 偶发通信失败。排查下来发现是时序紧张造成的,把 I2C 频率从 400kHz 降到 100kHz,再增加重试机制后,连续跑了一整天通信丢包率近乎为零。
第三个问题是某些早期 PCB 上均衡电流比预期小,收敛时间明显拉长。检查后发现均衡电容去耦走线过长,寄生电感削弱了有效开关功率。重排布局后电流恢复到预期水平。这也是为什么我一直强调第一版就要把均衡电容放好,后期飞线整改既难看又难保证一致性。
6. 量产前还要做的功课:校准、低功耗与异常兜底
6.1 ADC 校准系数存储与温度影响
MCU 的 ADC 基准源会有片间离散,分压电阻也有误差,因此每块板子的电压读数都需要产线校准。方法是外接精密电压源,分别输出两个典型电压值(比如 3.300V 和 3.800V),读取 ADC 原始码,用两点拟合或者多点最小二乘算出增益和偏置,把校准系数写入 MCU 内置 Flash 的专用区域。
校准系数在系统启动时加载,用户最终看到的是校准后的电压值。温度对分压电阻和 ADC 的影响也值得关注,NTC 采集的温度用于修正实际电压,而不是只做保护用。在 25 摄氏度下校准过的板子,放到高低温箱里跑一圈,温漂通常在可接受范围,但如果要求更苛刻,可以把校准点拉开成高低温多点,存一个系数表,运行时查表插值。
6.2 待机功耗与唤醒方式
备用电源系统大部分时间并不需要均衡工作,低功耗设计直接影响系统自耗电。MP2642GR-Z 在未使能均衡时应进入关断状态,PIC32 主控降低主频、关闭外设时钟,进入睡眠模式,只保留低功耗定时器和唤醒引脚。
唤醒来源一般有两个方向:一是充电回路检测到外电接入,需要处理充电均衡;二是低功耗定时器定期唤醒,做一次短电压巡检,看看静置期间是否出现明显压差。这个巡检周期我设置成 30 分钟,平衡了“尽早发现失配”和“待机电流尽量小”两个需求。实测整套电路在不做任何工作时的整机电流能做到一个比较低的量级,对备用电源这种常年挂网的设备来说很重要。
6.3 异常兜底:主控失效时均衡器必须自动退出
最后说一个安全性设计。均衡系统再聪明,也可能遇到 MCU 跑飞、电源跌落、软件异常的状态。这时候最重要的不是“继续均衡”,而是“停止均衡、进入安全态”。
除了前面提到的软件看门狗和硬件使能引脚之外,我还加了一层独立于 MCU 的硬件比较器。两节电池压差一旦超过一个极限设定值,比如 200mV,比较器直接向 MP2642 发送强制停止信号;如果信号已经中断或损坏,上位机也能在下一轮巡检中发现异常。做嵌入式系统的人都清楚,防呆永远比事后补救成本低,均衡电路尤其如此,因为能量搬运一旦失控,就是电池被反充或者持续过充的严重问题。
这套双节点串联均衡方案从原型验证走到小批量生产,最深的体会是:均衡算法的核心不在于“花哨”,而在于采样准、阈值稳、故障兜得住。MP2642GR-Z 解决能量搬运,PIC32MX675F256L 解决决策逻辑,两者配合,比用一堆分立元件搭桥式电路省心太多了。如果你正准备做类似的储能备用电源均衡,第一次打板就把采样电阻和 PCB 布局的内容认真处理好,后面会少走非常多弯路。