这几年做储能和备用电源系统,我碰到最多的问题不是电芯本身差,而是“明明是同一批电芯,串联用一段时间之后,容量和电压就是越差越多”。尤其是在两节串联的电池包里,这种偏差会被放得特别明显:一个电芯还在工作,另一个已经顶到保护电压,系统被迫提前停机。
今天要聊的项目,就是如何用 MP2642GR-Z 这颗模拟前端芯片,配合 STM32F756ZG 这颗高性能主控,在一个典型的 2S 储能/备用电源系统里把两个串联电池单元做均衡。这个方案适合正在搞电池管理系统(BMS)、便携式储能电源、UPS 后备电源或者通讯基站备用电池的工程师,也适合想自己动手做一套 2S 均衡控制的学生和业余爱好者。
我会尽量把从方案选型、硬件设计、固件逻辑到实测数据的完整链路讲清楚,特别是一些平时文档里不会写但实际调试时一定会踩的坑。内容偏工程实践,不绕理论。
1. 为什么 2S 电池组的均衡直接决定系统寿命
1.1 串联电芯不一致从哪里来
很多人以为两节全新电芯装在一起,容量和电压就是一致的。实际上,电芯制造出来就有 1% 到 3% 的容量离散度。就算同一批次、同一产线,正极材料厚度、电解液浸润程度、内阻分布都会有微小差异。这些差异在单节电芯单独使用时几乎察觉不到,一旦串联,就会变成系统性的短板问题。
串联回路里,两节电芯流过的电流完全相同。容量偏低的那一节,在同样的充放电电流下会先充满、先放空。如果系统不做均衡,每次充电都因为某一节先到达保护电压而整体中断,另一节永远充不满;每次放电又因为某一节先到达截止电压而整体下电,另一节的剩余能量全部浪费。
时间久了,这种“偏充偏放”又会进一步加速低容量电芯的老化,形成正反馈。均衡的实质,就是打断这个正反馈链条。
1.2 失衡在实际坏掉之前有什么表现
我见过不少现场问题,从系统行为上可以提前判断电池组正在失衡:
- 充电末期,两节电芯的电压差会在最后 10% SOC 阶段迅速拉大,其中一节率先到达 4.2V 或者厂家指定的保护电压。
- 放电末端,一节电压还在 3.5V 左右,另一节已经跌到 3.0V,BMS 触发欠压保护,但实际系统总容量远没放完。
- 静置一段时间后,两节电芯开路电压相差超过 30mV。
- 电芯温度异常:某一节在同样的工况下比另一节高 5℃ 以上,往往意味着那一节内阻偏高,承载了更多损耗。
这些问题在 2S 系统里非常容易被检测到,因为只有两个通道,ADC 采样速度快,不需要像 16 串、24 串系统那样频繁做通道轮询。两个串联电池单元的均衡判断,可以做得非常“激进”而精准。
1.3 储能与备用电源场景对均衡的特殊要求
储能和备用电源系统跟消费类电子产品不一样。消费类产品一天可能只用一两次,电池充放周期相对规整;储能和备用系统往往长时间处于浮充、待机状态,可能一年只有几次深度充放。这种工况下,电池大部分时间停在满电或者接近满电的电压区间,均衡窗口非常短。
备用电源还有一个麻烦,它平时靠着充电器供电,电池几乎不放电。如果充电器电压设置得不够精确,或者系统长期把电池维持在 4.15V 以上,两节电芯的自放电率差异就会被放大。静置三个月后再去测,电压差可能已经超过 100mV。
所以,2S 备用电源的均衡策略不能只在“充电末端”启动,必须在系统允许的情况下,利用静置时间周期性地做电压一致性维护。这也是我在这套方案里选择让 MP2642GR-Z 负责模拟量采集、STM32F756ZG 负责智能调度的重要原因——一心不能二用,硬件采集和策略调度分开,系统才既稳又灵活。
2. 硬件方案选型与原理图关键设计
2.1 从电池链路到模拟前端:MP2642GR-Z 的职责边界
在两节串联电池的 BMS 系统里,最容易出问题的环节就是电压采样。
如果只用 STM32F756ZG 自带的 ADC 直接采电芯电压,理论上也能工作,但实际会面临几个麻烦:串联电芯的共模电压不同,需要差分采样或分压电阻;电池电压在充放电时会有较大纹波,主控 ADC 的参考电压如果不够稳,采样结果会跳;最麻烦的是,电池侧和主控侧之间没有保护,一旦某个电阻虚焊或开路,主控引脚可能直接被高压打坏。
MP2642GR-Z 在这里扮演的是模拟前端和电池保护中间层的角色。它直接跨接在电池组两端,内部完成两个串联节点的电压检测、温度检测和电流路径相关状态管理。主控只需要通过通信接口和它交换数据,不需要自己去碰电池强电回路。信号调理、阻抗匹配、过压欠压阈值的粗判,全部在前端完成。
需要注意,我并不是说 MP2642GR-Z 可以替代所有保护逻辑。它的价值是把“模拟世界的脏活”先干完,把干净的电压、温度状态送给 STM32F756ZG。这么做之后,主控的 ADC 引脚不直接面对电池高压,系统的可靠性和抗干扰能力都能上一个大台阶。
2.2 主控为何选 STM32F756ZG:算力与外设门槛
如果只是做两节电池均衡,理论上用一颗几块钱的 MCU 就够了。那为什么选 STM32F756ZG?
第一,它的 Cortex-M7 内核主频跑得足够高,能跑浮点运算。均衡控制里要用到电压滤波、Delta 电压计算、放电时间积分、SoC 估算,如果用定点库硬算,开发效率会下降很多。STM32F756ZG 的 FPU 可以让我直接用浮点类型计算,代码写起来和 MATLAB 原型几乎一样,调参也方便。
第二,它支持多路高级定时器。均衡开关控制不光要“开”和“关”,有时还要用 PWM 来限制平均均衡电流,避免大功率电阻过热。某一路高级定时器产生互补 PWM,另一路定时器做看门狗周期管理,资源够用。
第三,它的存储和外设非常宽裕。双 Bank Flash 可以做在线固件升级,掉电时还能利用剩余 Flash 存储电芯历史数据。加上丰富的串口和通信资源,均衡调试时跑日志、接上位机、连显示屏,都不会造成资源争抢。
2.3 均衡路径的取舍:被动均衡与保护电路
两节串联电池的均衡主要有下面几条路:
- 被动均衡:给电压偏高的一节并接电阻,把多余能量以热量形式放掉。
- 主动均衡:用电感或电容把高电芯能量转移到低电芯。
- 回馈式均衡:把能量回馈到充电器或负载侧,这个在两节低压系统里很少见。
对 2S 储能和备用电源来说,最合适的还是被动均衡。原因有三:系统只有两节电芯,能量差异本身不大;被动均衡电路简单,成本低;备用电源顶多几十瓦功率,把几百毫瓦的偏差热量消耗掉完全没问题。
具体实现上,每一节电芯两端并联一个均衡电子开关和一个功率电阻。我把 MP2642GR-Z 的电池差分采样引脚直接连到电芯两端,同时把均衡开关的控制引脚交给 STM32F756ZG 的 GPIO 或定时器通道,采集和控制尽量分开,减少模拟前端芯片内部逻辑的占用。
均衡电阻取值需要算清楚。举个例子,如果电芯最高电压 4.2V,均衡电流目标是 100mA,那么电阻值至少要在 40Ω 左右。取 47Ω 比较合适,此时最大功率 P = U²/R = 4.2²/47 ≈ 0.375W。选电阻时我推荐用 0.5W 以上,最好用 1W 的贴片电阻,让热裕量充足。散热不好的 PCB 板上,0.5W 电阻长时间工作会烫到无法触摸。
提示:有些人为了追求均衡速度,把电阻选得很小,让均衡电流冲到 300mA 以上。两节电芯看似没什么问题,但长期工作在大电流均衡状态,电芯顶部的化学活性会被加强,反而可能引发新的老化不均。我个人建议均衡电流控制在 80mA 到 150mA 区间,稳字当头。
3. 从硬件到固件的均衡控制闭环
3.1 MP2642GR-Z 与 STM32F756ZG 的通信链路
这一节是最容易因为掉以轻心而出问题的地方。
MP2642GR-Z 这类模拟前端芯片通常支持 I2C 或 SPI 方式与主控通信。实际项目里我习惯用 I2C,接线少,两条线就能完成状态交互。如果板子有强烈的功率噪声,比如 MOSFET 开关频繁动作、变压器耦合干扰严重,则更推荐 SPI,抗干扰能力更强,通信速率也更快。
通信链路并不只是在芯片之间拉两条线那么简单。电池组的电压采样参考点和主控的地之间有可能会出现地电平偏差。如果布局不合理,I2C 信号线上串入的地噪声会被误读成数据跳变。我在这套方案里做两件事:一是在通信线上串联 100Ω 到 330Ω 的电阻,限制瞬态电流;二是把通信线做成差分回流路径,让信号线和地线贴在一起走,减少回路面积。
示波器调出来最难看的情况是:SCL 和 SDA 在空闲状态电平正常,但一旦系统开启均衡,MOSFET 的开关瞬间会把通信线上的毛刺拉低几十纳秒,正好踩在 I2C 采样点位上,导致偶发读回错误。解决办法不是拼命加大上拉电阻,而是给 MOS FET 栅极增加一个 10Ω 到 22Ω 的串联电阻,减缓开关边沿,从源头降低干扰频谱。
主控侧的通信任务我用一个固定优先级的 RTOS 任务接管,每 50ms 调用一次 AFE 读取,读回电压、温度、状态标志。读取结果直接写入整型数组,不做动态内存分配,保证时间确定性。
3.2 电芯电压采集与均衡判定逻辑
采集到两节电芯电压之后,不能立刻拿来做均衡判断,必须先滤波。原因有两层:一是电芯本身在充放电状态下存在欧姆内阻压降,瞬时电压并不能代表真实开路电压;二是 AFE 的 ADC 在强电环境下会混入工频噪声,完全不做滤波的话,电压差会像心电图一样乱跳。
我的做法是做一个滑动平均滤波器,窗口长度取 16 次采样。每次采样间隔 10ms,也就是 160ms 一个滤波周期。这个时间尺度对于储能设备的均衡控制来说足够快,同时又能滤掉大部分纹波。
滤波完成之后,判断逻辑就这么几步:
- 计算两节电芯电压差,取绝对值。
- 如果电压差大于 30mV,则认为需要均衡。
- 比较两节电芯电压,把均衡开关投向电压更高的一侧。
- 如果电压差小于 10mV,认为已经均衡完成,关闭所有均衡开关。
- 检查电芯温度和环境状态,如果温度过高必须强制停止均衡。
30mV 这个阈值不是拍脑袋定的。考虑到电芯开路电压在 SOC 中段变化比较缓慢,10mV 对应大约 1% 到 2% 的 SOC 偏差,而 30mV 的失衡已经足以影响下一次充满截止时间,所以拿 30mV 作为启动门限是合理的。为避免频繁开关开关管造成的机械/电气应力,还加上 30 秒的滞回时间,只有持续超过阈值才真正启动。
typedef struct { float cell1_v; float cell2_v; float cell_temp_c; } afe_sample_t; afe_sample_t g_sample; uint8_t g_balance_mask; void balance_control_update(afe_sample_t* sample) { const float kBalanceStart = 0.030f; const float kBalanceStop = 0.010f; float delta = sample->cell1_v - sample->cell2_v; static uint8_t latch_high = 0; if (sample->cell_temp_c > 55.0f) { g_balance_mask = 0; latch_high = 0; return; } if (fabsf(delta) < kBalanceStop) { g_balance_mask = 0; latch_high = 0; return; } if (fabsf(delta) > kBalanceStart) { latch_high = 1; } if (latch_high) { if (delta > 0.0f) { g_balance_mask = 0x01; /* 均衡电芯1 */ } else { g_balance_mask = 0x02; /* 均衡电芯2 */ } } }这段代码是工程简化版,实际项目里还需要把“已经到达均衡超时时间”“均衡开关粘连检测”“保护状态机互锁”这些状态项加进去。
3.3 均衡使能时序与 PWM 控制策略
很多人第一次做均衡,认为只要把 MOSFET 完全打开,让高电压电芯通过电阻持续放电就可以了。而且确实,在两节电芯的电压差达到 100mV 以上时,全开就是最直接有效的方案。但这个方案有一个隐藏问题:均衡过程中,高电压电芯的电压会持续下降,低电压电芯可能还会因为充电电流而微幅上升,两者之间的交叉点判断非常微妙。
如果你在充电过程中开均衡,高电压电芯一边被充电器充电,一边又被电阻放电,最后的结果可能是电压一直压着不动,低电压电芯慢慢追上来。这个“边充边放”模式本身没问题,但要注意别让均衡电阻长时间处于满功率状态。
我在项目里把均衡使能分成三档:
- 第一档:电压差 30mV 到 80mV,只打开对应开关,全功率均衡,电流约 100mA。
- 第二档:电压差 80mV 到 150mV,PWM 占空比限制在 75%,让平均均衡电流维持在 75mA 左右,避免电芯内部锂枝晶在快速抽流时被加剧。
- 第三档:电压差超过 150mV,先进入异常状态判断,检查是否出现采样故障或电芯损坏,而不是一味猛放。
PWM 频率我选 1kHz。太低的频率,比如几十赫兹,均衡电流脉动会让电池电压波形出现低频跳动,影响 ADC 采样;太高了,比如 100kHz,MOSFET 栅极电容充放电损耗变得不能忽略,驱动电路也要重新设计。1kHz 用通用 MCU 定时器就能干净地产生,兼顾采样稳定性和开关损耗。
均衡使能的时序也要注意。上电瞬间,主控先等 AFE 完成第一轮采样,确认两节电芯电压都在安全范围内,至少需要 200ms。这 200ms 里均衡开关必须全部关闭,防止主控启动瞬间的错误信号导致开关管误动作。然后在每个均衡周期里,先读电压,再做判断,再刷新 PWM 输出。顺序不能反。
4. 均衡效果评估与实测数据
4.1 初次上电与空转测试
硬件焊接完之后,我第一件事不是接真实电池,而是用两节 18650 电芯串一个可调电阻负载,模拟电池组的不一致状态。此时不打开均衡功能,先让主控只采集和显示电压。这样能确认 MP2642GR-Z 的采样链路正常,两节电芯的电压读数误差在可接受范围内。
接下来加入均衡功能,用一个 100mV 的初始电压差做测试。真实电芯做不到人为精确设置电压差,所以我用一个低内阻直流稳压源替代其中一节,另一节用真实电芯,让电压差稳定在 90mV 左右。这样测出来的结果可重复性很高。
第一次运行时发现,均衡开启后,电压差下降速度并不是线性的。一开始下降很快,电压差从 90mV 掉到 40mV 大约用了 35 分钟,但从 40mV 掉到 10mV 又用了 50 分钟。原因在于,电芯开路电压和 SOC 之间的关系并不是一条直线,在 SOC 中段,电压对 SOC 的变化率较小,同样的均衡电流能带来更大的 SOC 修正量;而在 SOC 高端和低端,电压变化快,相同的电量转移对应的电压变化就更明显。做产品评估时,必须用 SOC 视角去衡量均衡效率,不能只看电压绝对值。
4.2 工作损耗和发热核算
用 47Ω 均衡电阻,电芯电压 4.0V 时,电流约 85mA,电阻功率约 0.34W。持续 1 小时,总发热量约 1224 焦耳,相当于 0.34 瓦时。这一点热量对几十瓦时的电池包来说并不大,但对 PCB 上的局部区域来说却很可观。
我实际测过 1W 贴片电阻在 0.35W 持续发热下的表面温度,大约 85℃ 到 95℃,取决于铜箔面积。这个温度虽然不至于烧毁器件,但如果旁边紧挨着电解电容或者温度传感器,就会带来可靠性风险。因此布局时均衡电阻要单独划出一块铺铜区域,远离温度采样点,并且在电阻下方开散热过孔阵。
注意:均衡电流最好不要超过 150mA,否则你需要把均衡电阻功率提高到 2W,并使用更大的散热面积。对于两节串联的便携设备来说,这种成本增加并不划算。
4.3 通过电压差改善案例解读
下面这张表是我在某个模拟项目 X 里记录的典型均衡过程数据。电池是两节标称 3.6V、容量 2.5Ah 的锂离子电芯,初始电压差 66mV,室温 25℃,均衡方式为被动均衡,电流约 90mA。
| 时间点 | 电芯1电压 | 电芯2电压 | 电压差 | 均衡状态 |
|---|---|---|---|---|
| 00:00 | 3.74V | 3.80V | 66mV | 均衡电芯2 |
| 00:15 | 3.74V | 3.79V | 50mV | 均衡电芯2 |
| 00:30 | 3.73V | 3.77V | 40mV | 均衡电芯2 |
| 00:45 | 3.73V | 3.76V | 30mV | 均衡电芯2 |
| 01:00 | 3.73V | 3.74V | 10mV | 停止均衡 |
从数据可以看出,整个均衡过程持续约 1 小时,最终把电压差从 66mV 压到 10mV 以内。虽然没有彻底变成 0mV,但 10mV 的残差已经不会影响后续充放电的截止一致性了。
需要注意,上面测的是静置状态下的电压差。如果边充电边均衡,电压差收敛速度会快一些,但充电结束后电芯会产生极化电压,数据读数会更加复杂,所以我在产品里优先选择静置或浮充状态下做均衡。
5. 常见问题与排查技巧实录
5.1 通信失败和电压乱跳
前文说过,大电流开关会产生噪声脉冲。串行通信偶发失败占了整个调试过程的 70% 工作量。排查时我习惯按顺序做:
- 用示波器看 SCL/SDA 波形,排除电平被毛刺拉低的问题。
- 检查 AFE 供电引脚电压是否在正常范围内,尤其是均衡刚开启瞬间,如果供电被拉低超过 5%,就会导致内部逻辑复位。
- 降低通信速率,比如从 400kHz 降到 100kHz。虽然会牺牲一点点采样率,但调试阶段不要贪快。
- 在主控侧加上总线错误恢复逻辑,连续读到 5 次无效状态就强制拉低时钟线 9 个周期,让从机复位。
电压乱跳则和采样电路的前置滤波有关。MP2642GR-Z 的采样引脚前面要加一个小容量陶瓷电容,比如 100nF,靠近芯片引脚放置,滤掉高频纹波。如果芯片本身已经带滤波,可以适当减小这个电容,防止影响电压建立时间。
5.2 平衡开关管粘连和驱动问题
均衡 MOSFET 如果栅极驱动不够强,开关管会长时间工作在线性区,内阻变大、发热严重,导致整个均衡电阻发热量从集中变成扩散,很难排查。
我在设计时给每个均衡开关管都加了一个 10kΩ 的下拉电阻,确保主控 GPIO 在上电瞬间没有明确驱动能力时,开关管保持关闭。另外再加入一个串联 22Ω 的栅极电阻,既限制驱动电流尖峰,又给开关边沿留下必要的缓冲。
开关管粘连可以通过读取 MP2642GR-Z 的电压变化来间接检测:如果均衡开关应该关闭,但对应电芯电压在持续快速下降,那就说明开关管没有真正关闭,应立即切断所有均衡使能并进入故障安全状态。
5.3 ADC 校准与长期漂移处理
MP2642GR-Z 内部 ADC 的零点和增益会受温度影响。如果每次上电都直接使用原始 ADC 值,两节电芯在 0℃ 和 50℃ 下可能会引入 5mV 到 10mV 的读数误差。对于均衡门限 30mV 来说,这个误差尚可接受,但如果想把门限降到 20mV,就必须做温度补偿。
我的做法是,在系统初次组装时让电池完全断开,然后给 AFE 加一个已知的参考源,记录室温下的零点。同时在每个均衡周期结束后,把均衡状态下的电压读数与静置后的电压读数做对比,用多次静置数据拟合出一个温度补偿系数,写进 Flash 里长期保存。
5.4 现场运行长期维护的均衡策略
备用电源现场运行环境和实验室差别很大。经常有设备在偏远地区,半年无人维护。如果均衡策略太激进,电芯在无人值守时长时间放电,会让过放风险增大。
所以我在固件里加了一个最大均衡时长限制,默认 4 小时。如果 4 小时到了电压差还没有收敛,就停止均衡,记录一条异常日志,等待下一次充满电后再试。连续两次触发超时,系统就认为电芯组可能存在内部微短路或容量严重不匹配,上报维护提醒。
这样做的逻辑很简单:单纯靠外部均衡电路,永远无法挽救已经损坏的电芯。均衡应是“系统维护”工具,而不是“起死回生”工具。
5.5 实验室里最容易被忽略的一步:静置后复测
调试均衡时,我犯过的最蠢的错误就是:均衡刚停止,马上就去读两个电芯的电压,看到电压差非常漂亮,就认为大功告成。实际上,均衡结束时高电压电芯的电压回弹比低电压电芯快,真正的“表面一致性”至少要等 5 到 10 分钟才稳定。
正确的做法是,均衡结束后关闭所有开关,让电池组静置至少 10 分钟。期间继续周期性采集电压,直到相邻两次读数差值小于 2mV,才记录最终结果。这一步对评估均衡效果和写测试报告都很重要,如果你跳过,后期会发现很多“均衡不成功”其实是测试方法的问题。
6. 这套方案还能怎么扩展
虽然标题写的是两节串联,但这个架构稍加调整就能推广到更多串数的电池包。MP2642GR-Z 负责单组模拟量采集,STM32F756ZG 作为主控可以同时挂接多个 AFE 芯片,形成一个分布式 BMS 系统。每一组两节电芯独立均衡,主控统一调度所有组之间的充电、放电和 SoC 估算。
另外,STM32F756ZG 的以太网接口和串口资源非常丰富,可以把电芯电压、温度、均衡状态实时上传到网关或者云平台。备用电源系统通常需要远程运维,有了这套数据链路,运维人员不用到现场就能看到哪一组电池正在均衡、哪一组已经出现偏差趋势,极大降低人工巡检成本。
我在这个模拟项目 X 里还预留了一个 CAN 接口,用来和储能变流器联动。当电池组进入均衡状态时,主控通过 CAN 告诉变流器降低充电电流或者暂停充电,给均衡留出干净的窗口。这个联动逻辑对于并网储能系统来说尤其重要,因为大功率充电时引入的电压噪声会让均衡误判变得非常频繁。
如果你打算在这个方案基础上继续做产品化,我建议重点看三件事:第一是均衡电阻的长期可靠性,别在器件选型上省钱;第二是电压差的判断逻辑必须加入滞回和超时机制,避免振荡;第三是主控日志记录能力一定要够强,现场故障往往要靠历史数据才能定位。
从我个人实际调试这套系统的体会来说,均衡控制真正难的地方,不是单片机和 AFE 通信,也不是那个 30mV 的阈值怎么定,而是你要理解整个系统在什么状态下才允许均衡、均衡到什么程度才算合适、以及均衡失效之后系统怎么安全退出。把这三件事想清楚,两节串联的均衡系统才能真正稳定可靠地长期运行。