1. 从一个真实症状说起:2S电池组为什么越用越不耐用
事情是这样的:我手头一个采用两块磷酸铁锂电芯串联的备用电源模块,用了大概半年,容量肉眼可见地缩水。起初以为是电芯寿命到了,结果拆下来单独测量,发现两节电芯的开路电压差了接近 0.18V,其中一节容量明显高于另一节。把电压高的那节单独放电到与低节一致,再重新装回去,整个模块的可用容量又恢复了不少。这个现象在储能和备用电源系统里太典型了,根源就是串联电芯的不一致,而解决办法就是加均衡。
很多刚接触电池管理的人会把"均衡"想得很复杂,其实本质就一句话:让串联的每一节电芯在充放电过程中保持电压、容量尽量一致。对于 2S(两节串联)这种最简单的组合,不均衡带来的后果同样不可忽视。像我上面那个模块,充放电时高电压那节先到达充电截止电压,系统为了保护电池只能提前停止充电;放电时又是低电压那节先到达放电截止电压,系统同样只能提前停止放电。一来二去,整组电池的实际可用容量被"木桶效应"卡死了,而且每次过充、过放的那节电芯损伤会加速累积,形成恶性循环。
这篇文章要讲的,是围绕 MP2642GR-Z 均衡控制器和 STM32F031C6 单片机搭建的一套 2S 主动均衡方案,适用于储能后备电源、便携储能电源、小型 UPS 这类对可靠性和寿命有要求的场景。我会从原理拆解、硬件设计、控制策略、软件实现、实测调试到踩坑记录完整过一遍,适合正在做 BMS、或想给现有 2S 电池组补上均衡功能的开发者参考。
先说清楚方案的总体分工:MP2642GR-Z 负责功率级的电荷搬移,它本质上是电感式主动均衡控制器,通过外部功率电感和一对 MOSFET 在两个电池单元之间转移能量;STM32F031C6 则负责电压采样、均衡策略判断、故障保护与上位机通信,是整个系统的大脑。一个管功率,一个管逻辑,各干各的活,边界非常清晰。
2. MP2642GR-Z 电感均衡电路的工作原理与外围参数计算
2.1 芯片在电路中负责什么
MP2642GR-Z 属于电感式主动均衡控制器,这类芯片的典型工作方式,是驱动一组半桥开关电路,配合功率电感,在相邻两节串联电池之间搭建一条双向的能量通路。你可以把它想象成一台小型的 Buck-Boost 变换器,只不过输入和输出分别接在两节不同的电池上,能量可以从高电压那节"搬"到低电压那节,也可以反向搬移,取决于控制方向。
和常见的电阻耗散式均衡相比,电感式均衡最大的优势是能量转移而非能量烧掉。电阻均衡是把高电压电芯的多余电能直接以热量形式消耗掉,效率几乎为零,而且均衡电流受限于散热能力,通常在 50mA 到 200mA 左右,遇到压差大的电池组,可能需要好几个小时才能拉平。而 MP2642GR-Z 这种电感式方案,均衡电流可以做到 1A 以上,能量从高电压电芯转移到低电压电芯,整个过程损耗很小,而且也不需要额外加散热片。
从芯片外部看,MP2642GR-Z 需要搭配一对 MOSFET(一般是 N 沟道增强型)、一颗功率电感和若干采样、滤波元件。芯片内部集成了 PWM 控制器、MOSFET 驱动、峰值电流检测比较器和保护逻辑。MCU 只需要告诉芯片"现在要均衡,方向往哪边",芯片就负责把功率级的开关时序跑起来。具体的控制接口不同批次可能有差异,我这里用的是 PWM 使能加方向信号的方式,以实际数据手册为准。
2.2 电感均衡的能量搬移路径
为了搞清楚后面的参数计算,有必要把电感均衡的单周期工作过程讲明白。假设电芯 B1 电压高于 B2,我们要把能量从 B1 搬到 B2,整个过程分两个阶段。
第一阶段,高侧 MOS 导通,B1 直接给电感充电,电感电流逐渐上升,能量以磁场形式储存在电感里。这个阶段类似于 Buck 变换器中开关管导通时的储能阶段。
第二阶段,高侧 MOS 关断,低侧 MOS 的体二极管或同步整流管导通,电感电流续流,把储存的能量释放到 B2。这时电感电流逐渐下降,电荷注入了低电压电芯。两个阶段循环往复,就实现了从 B1 到 B2 的持续能量搬移。
反过来,如果 B2 电压高于 B1,方向互换,能量就从 B2 搬到 B1。整个电路本质上是一个双向同步 Buck-Boost,只是把变换器的输入输出各接了一节电池。理解了这个基本过程,你就能理解为什么电感值和开关频率对均衡电流影响那么大,也能理解为什么电感电流峰值是设计时最重要的限制因素。
2.3 关键外围元器件参数计算
下面给一套可以照着设计的计算流程。以两节磷酸铁锂电芯为例,单节标称电压 3.2V,充电截止 3.65V,放电截止 2.5V,目标均衡平均电流取 1.5A,开关频率选 300kHz。
第一步,选电感值。根据电感的伏秒平衡,在降压方向(从高电压电芯到低电压电芯)工作时,电感电流纹波约等于:
ΔI = (V_source × D × T) / L
其中 D ≈ V_target / V_source,T = 1/f。代入 V_source = 3.5V、V_target = 3.0V、f = 300kHz,得到 D ≈ 0.857,T ≈ 3.33μs。如果我们希望纹波电流在 0.5A 左右(即峰值电流为 1.5A + 0.25A = 1.75A),那么 L = (3.5 × 0.857 × 3.33μs) / 0.5 ≈ 20μH。考虑到电感感值误差和饱和电流降额,我最终选了 22μH、饱和电流 3A 以上的功率电感。
第二步,选 MOSFET。这里有个容易被忽略的细节:因为系统电压不超过 8.4V,MOS 的耐压 20V 就够,但实际强烈建议选 30V 以上的管子,给开关尖峰留余量。重点看两个参数:Rds(on) 要足够低,因为均衡电流大,导通损耗按 I²R 算非常可观;栅极电荷 Qg 要尽量小,否则高频开关时的驱动损耗会拖累整体效率。我用的是一对 30V、Rds(on) 约 12mΩ、Qg 约 10nC 的 N-MOS。
第三步,算效率,或者说确定散热需求。均衡过程中主要的损耗有:MOS 导通损耗、开关损耗、电感铜损和磁芯损耗。在压差 0.4V、均衡电流 1.5A 的条件下,整个环节的功率大约 0.6W,实测总效率在 85% 左右,发热量很小,PCB 自然散热就够。但如果压差大,比如 1V,功率就到了 1.5W 级别,这时候电感选型就得多留意温升,不能只看饱和电流。
提示:电感饱和电流要按峰值电流留至少 1.5 倍余量,不要按平均电流选。电感一旦饱和,电流会瞬间飙升,轻则均衡效率急剧恶化,重则烧 MOS。我实测中见过一次饱和电流余量不足的电感,表面温度直接飙到 90°C 以上。
3. 均衡控制策略:什么时候该均衡,均衡到什么时候停
3.1 电压采样精度与共模问题
均衡策略的基础是准确知道两节电芯各自的电压。这里有一个新手特别容易踩的坑:两节电芯串联时,中间节点的电压不是对地的低电压信号,而是有约 3V 到 4.2V 的共模电压。对于 STM32F031C6 这种供电电压 3.3V、ADC 输入范围 0 到 3.3V 的单片机,直接把中间节点接到 ADC 引脚是不行的。
正确的做法是分压采样。我用的方案是:单节电芯电压通过两个高精度电阻分压,把电压等比缩小到 ADC 可测的范围内。比如 B1 电压最大 4.2V,用 2:1 分压后最大 2.1V,留够裕量;B2 电压同理。分压电阻的精度直接影响采样精度,我用了 0.1% 精度的电阻,并且在 ADC 引脚前加了 RC 低通滤波,截止频率大约 10kHz,用来抑制均衡开关带来的纹波噪声。
但分压采样还有个隐藏问题:分压电阻阻抗太高的话,ADC 内部采样电容充电不足,读到的电压会偏低。STM32F031C6 的 ADC 采样时间是可以配置的,建议把采样周期调到最长,同时分压电阻总阻值控制在 100kΩ 级别,不要为了降低静态功耗一味加大阻值。实测经验是:分压电阻总阻值超过 200kΩ 后,12 位 ADC 的读数会出现明显抖动,低几位码值不稳。
3.2 滞环比较器:启动与停止条件
均衡控制策略的核心,是定义清楚"什么时候打开均衡"和"什么时候关掉均衡"。理论上当然是压差越大越需要均衡,但这里有个工程上的矛盾:如果压差很小也强行均衡,由于效率在低压差时明显下降,可能出现"越均衡越亏"的情况。电荷从 A 搬到 B,中间损耗了一部分,如果压差本来就很小,这些电量本来也不影响使用,折腾半天反而浪费能量。
所以我在策略里加了一个滞环比较逻辑,这是很多正规 BMS 的做法:
- 当两节电芯压差大于 50mV 且持续 30 秒,开启均衡;
- 当压差小于 15mV,关闭均衡;
- 开启后即使压差降到 20mV,也不立即关闭,而是等低于 15mV 才关,避免频繁启停。
这个 30 秒持续确认是用来滤除瞬态波动的。因为电池在充放电过程中,电压本身会不断波动,尤其负载突变时瞬时压差可能很大,但持续时间很短。如果不加延时确认,均衡电路会在启停之间反复切换,每次启动瞬间都会有电流冲击,长期下来对 MOS 和电感的可靠性都不利。去抖延时的具体时长,可以根据系统负载特性灵活调整,我手里这个项目负载以固定功率为主,30 秒够用了。
3.3 不同工况(充电/放电/静置)下的策略差异
均衡并不是任何时候都适合开启。按照电池系统的工作状态,我把它拆成充电、放电、静置三个场景分别处理。
充电过程中,电池端电压整体偏高,此时电芯电压反映的是极化内阻叠加开路电压的结果,误差较大。如果单凭实时电压判断压差,可能把极化电压误判成真实不平衡。所以充电时我倾向于只在接近充满的阶段才开启均衡,这时候充电电流小,极化影响小,均衡效果更真实。
放电过程中,电池端电压整体偏低,且负载电流大时压降明显,同样不适合实时均衡。我的做法是放电时关闭均衡,只做电压监测。如果放电过程中发现某节电芯电压异常低,直接触发欠压保护,而不是开均衡去救——因为放电时开均衡会在本来紧张的功率通路上额外增加电流负担,雪上加霜。
静置状态下是最理想的均衡时机。此时没有充放电电流,电池处于开路状态,端电压接近真实的开路电压,均衡判断最准确,而且均衡电流也不会干扰系统的工作。我实际使用中的经验是:在备用电源系统里,绝大部分时间电池都处于静置待机状态,充分利用这段时间做均衡,既不影响系统可用性,又能让电池组长期维持在良好的一致性状态。
4. STM32F031C6 的软件实现:状态机、滤波与保护联动
4.1 主循环与状态机设计
STM32F031C6 是一颗 Cortex-M0 内核、48MHz 主频、16KB Flash 的小芯片。资源不算富裕,但跑均衡控制这种简单任务绰绰有余。我在软件层面最忌讳的就是把所有逻辑堆在一个大 while 循环里硬扛,因为 ADC 采样、均衡判断、通信、保护这些任务对时效性的要求不一样,混在一起很容易出问题。
我的做法是搭一个简单的超级循环加状态机。主循环里按 10ms 周期运行一次状态机调度,状态机分成几个明确的状态:空闲(IDLE)、检测(DETECT)、均衡运行(BALANCING)、暂停(PAUSE)、故障(FAULT)。
- IDLE 状态:只做基础采样,不启动均衡。
- DETECT 状态:持续采集并滤波,判断压差是否超过启动阈值,连续满足条件后跳转到 BALANCING。
- BALANCING 状态:根据压差方向使能 MP2642GR-Z 对应方向的均衡,并监测均衡电流和电芯电压。
- PAUSE 状态:每隔一段时间暂停均衡,让电池电压稳定片刻,再做一次准确的重新判断。
- FAULT 状态:检测到过压、欠压、过温、通信异常等情况,锁死均衡输出,等待复位。
定时器方面,我用了一个基础定时器产生 1ms 的时基,用于累加 10ms、30 秒这些延时;再用另一路 PWM 输出给均衡芯片作为开关频率基准。M0 内核没有硬件除法器,所以策略逻辑里尽量用移位和查表替代浮点运算,省 CPU 时间。
4.2 ADC 采样与数字滤波
ADC 采样这一块,我最开始踩过坑,这里详细说一下。STM32F031C6 的 ADC 是 12 位,直接读单次转换结果的话,噪声影响很明显,尤其均衡电路一旦开启,开关纹波会耦合到采样回路。我后来加了两层处理:
第一层是硬件滤波:ADC 引脚前方加 RC 低通,截止频率大约 10kHz,同时采样回路和功率回路在 PCB 上严格分开铺地,避免地平面噪声串扰。
第二层是软件滤波:对每次电压采样连续采 32 次,去掉最大值和最小值,剩下 30 次取平均。每次采样间隔约 1ms,一轮滤波大约耗时 30ms。这个"去极值取平均"的滤波方法比单纯滑动平均更能抗脉冲干扰,对均衡开关引起的偶发尖峰有很好的抑制效果。
此外,我还做了一项工作:在系统上电初始化和每次长时间均衡结束后,用内部的参考电压通道对 ADC 做一次自校准。M0 内部有一个固定的参考电压源,通过读取校准值可以修正 ADC 的增益误差和偏移误差。实测下来,自校准后电压采样误差能控制在 ±5mV 以内,这为后面的均衡滞环判断提供了足够可靠的依据。
4.3 均衡使能控制与故障保护
均衡使能控制不是简单的一句"打开 PWM"就完了,而是需要考虑方向和电流限制。MP2642GR-Z 支持双向均衡,我需要根据压差方向决定是让能量从 B1 流向 B2,还是从 B2 流向 B1。这个方向判断在软件里每轮状态机都要做一次,并且在每次切换方向之前,必须确保上一方向的均衡已经完全关闭,否则电感电流断续过程会产生电压尖峰。
均衡电流限制我通过芯片的峰值电流检测引脚配合外部电阻设定,单片机同时周期性地通过采样电阻监测实际均衡电流。如果发现电流超过设定值 1.2 倍,立即关闭 PWM 并进入故障状态,记录故障代码。这个双重保护很有必要,因为单片机侧的电流监测是数字域慢速响应,而芯片侧的峰值电流检测是模拟域逐周期响应,两者配合才能避免电感电流失控。
故障保护方面,我整理了一张状态表,每个故障对应一个掩码位,故障发生时用 GPIO 驱动 LED 闪烁频率区分故障类别,同时通过 UART 向上位机上报。比如:过压故障闪烁 2 次循环,过温故障闪烁 4 次循环。对于备用电源这种无人值守场景,故障可视化和故障记录是保证后期可维护性的关键,不然出了问题都不知道机器在哪个环节卡的。
5. 实测数据与调试心得
5.1 从硬件上电到波形观察
第一次上电调试时,我没有直接上电池,而是先用一个可调直流电源模拟两节电池的电压,分别输出 3.5V 和 3.3V,观察均衡电路能否按照预期把电荷从高压侧搬到低压侧。这里强烈建议所有做电池均衡的人先这样操作,因为电池是可燃危险源,而可调电源不怕短路,方便你观察失控场景。
上电后我用示波器同时观察高侧 MOS 的栅极驱动波形 W1 和电感电流波形 W2。正常工作时,W1 是 300kHz 的方波,占空比约 0.85,W2 是三角波,峰值约 1.75A,谷值约 1.25A,平均值约 1.5A。如果发现 W1 上升沿有明显振铃,说明 PCB 布局引入了寄生电感,需要在 MOS 栅极串联一个 10Ω 左右的电阻来抑制;如果 W2 出现平台状扭曲,说明电感饱和电流不够,需要换更大的电感。
整个调试过程中我用的是"模拟电池+电子负载"组合:先把可调电源电压调到 3.5V 模拟 B1,电子负载调到 3.0V 模拟 B2,观察均衡运行 10 分钟后的电压变化。当 B2 电压上升 50mV 左右时,说明能量转移方向正确。这个阶段只验证功率级,不验证控制逻辑,把问题隔离在最小范围内。
5.2 均衡收敛过程实测记录
功能验证通过后,我用真实的两节磷酸铁锂电芯做了完整测试。电芯初始状态:B1 开路电压 3.42V,B2 开路电压 3.24V,压差 180mV,在静置状态下启动均衡。
启动后最初 5 分钟,均衡电流稳定在 1.5A 左右,压差从 180mV 下降到 150mV,速度很快,因为大压差时传输功率大,电压差变化率最高。随后压差逐渐减小,进入 100mV 以下区间,均衡电流开始自然下降,因为电感两端的电压差变小了,同样的开关节奏下传输的功率变小。整个过程耗时约 40 分钟,最终压差稳定在 10mV 以内,均衡自动停止。
这组数据说明方案的设计目标是达成的。40 分钟的均衡时间对静置的备用电源来说完全可以接受,反正电池闲着也是闲着。而且整个均衡过程中,两节电芯的电压始终在安全范围内,没有出现过压或欠压的极端情况,保护逻辑也没有误触发。
我另外记录了一组对比数据:同样的电池组如果不做均衡,连续充放电 20 次循环后,压差从初始的 20mV 扩大到 80mV,而且还在持续扩大;做了均衡的对照组,每次循环结束静置时自动均衡,压差始终维持在 15mV 以内,容量衰减明显更慢。这组数据直接证明了均衡对延长电池组寿命的价值。
5.3 三个真实踩坑经历
第一个坑:ADC 采样干扰。刚开始我把采样线绑在电感旁边,想着反正电压是分压出来的,抗干扰应该没问题。结果一开均衡,ADC 读数跳得离谱,压差判断完全失效。后来把采样线改到远离功率路径的位置,并用一个过孔换层避开电感磁场,问题立刻消失。PCB 布局上,采样信号和功率信号必须物理隔离,这不是玄学,是电磁兼容的常识。
第二个坑:方向切换炸驱动。有一次我写代码时没有在切换均衡方向前加一个"完全关断等待时间",直接改方向信号导致上下管短时间直通,把 MOS 驱动搞坏了。后来在所有方向切换之前都加了至少 2μs 的死区等待,并且在软件里做了互锁:同一时刻只允许一个方向的 PWM 有效。
第三个坑:低温环境均衡误判。锂电池在低温下内阻剧增,端电压受极化影响非常大。某次低温测试中,两节电芯实际开路电压一致,但因为极化差异,实时采样显示的压差高达 80mV,均衡被误触发。解决办法是在温度低于某个阈值时禁止均衡,并把压差判断切换到温度补偿后的电压。储能和备用电源的应用场景往往包含户外环境,这个坑非常典型。
6. 针对备用电源场景的进阶优化
6.1 静置自均衡与浮充窗口
备用电源和家用储能的典型特点是:大部分时间负载很小,电池维持在满电或浮充状态,只有在电网异常时才启动放电。这意味着均衡其实有大量可用的静置窗口。
我在策略中增加了一个"静置自均衡"功能:系统检测到电池处于静置且电量接近满充时,自动进入低功率均衡模式。此时均衡电流不需要很大,500mA 足够,但因为是持续工作,累计转移的电荷量非常可观。这个策略的收益是:备用电源在正常待机几个月后,电池组的一致性反而比刚出厂时更好,因为每次静置窗口都把微小的不平衡慢慢纠正掉了。
不过要注意,静置自均衡不能和浮充充电打架。如果系统在浮充,充电器会把均衡搬走的那部分电量补回来,导致均衡功率被充电器抵消,白忙一场。我的解决方案是:检测到充电机输出电流大于某个阈值时,暂停静置均衡;浮充电流很小(达到浮充电压后电流自然减小)时,均衡可以正常工作。这个联动的逻辑虽然简单,但能避免很多无效均衡。
6.2 从 2S 扩展到更多串联单元
MP2642GR-Z 这个方案最初是为相邻两节电芯均衡设计的,但实际项目中很少只用两节,大多是 4S、6S、8S 甚至更多。好在电感均衡有个天然的扩展思路:相邻配对均衡。比如 4S 系统由 4 节电芯组成,可以让电芯 1 和 2、3 和 4 分别做均衡,这是第一轮;然后再让中间位置的两组做跨组均衡,这是第二轮。通过多轮交换配对,整个电池组的能量可以逐步"抹平"。
例如 4S 系统,可以分三个阶段:第一阶段 B1↔B2、B3↔B4;第二阶段 B2↔B3;第三阶段根据情况再做一轮 B1↔B2、B3↔B4。每轮之间留出静置时间让电池电压恢复稳定。实际工程中,这种方式虽然不如专用的多节主动均衡芯片那么精细,但对于中等串数的备用电源完全够用,性价比很高。
STM32F031C6 的一个芯片可以通过多路 GPIO 控制多个 MP2642GR-Z,每个芯片负责一对电芯的均衡。需要提醒的是,均衡控制会随着串数增加而指数级复杂,软件策略上一定要做好状态管理和时序安排,避免多个均衡电路同时开启造成电芯电流叠加过度。
6.3 一点个人体会
在这套方案从原理到落地再到实测的整个过程中,我最大的体会是:均衡系统设计的难点不在功率电路,而在"什么时候该均衡"这个看似简单的问题上。功率级是确定的物理学,只要参数算对,电路总能按预期工作;但策略级是"概率学+经验学",你需要根据电芯材料、系统工况、环境温度逐一调整阈值和时序。
我在实际调参中发现,最有用的调试工具不是示波器,而是一张记录每轮均衡前后电压数据的表格。每轮均衡结束,把压差变化、均衡时长、环境温度、启动阈值这些参数记录下来,一周后回看,你就能发现系统性的偏差,据此微调滞环参数和延时时间。这种以数据驱动的调参方式,远比靠感觉调数更可靠。
最后一个实用小技巧:在均衡策略里增加一个"均衡时长上限"保护。无论压差多大,单次均衡连续运行时间超过 2 小时就强制暂停 10 分钟,再重新判断。这个保护能防住那些极端状况(比如电芯内部微短路导致的假性压差持续存在),避免均衡电路长时间空转发热。我在项目里加入这个逻辑后,整机长期运行的稳定性又上了一个台阶。