做储能和备用电源这块,手头这版2S备用电源板上最让我头疼的就是均衡问题。两节串联电芯出厂容量几乎一样,跑了几十次循环之后就开始出现压差,而且越拖越大,整块电池的可用容量直接被最低那节电芯拽住。后来我定了方案:用 MP2642GR-Z 当功率级控制核心,配 STM32F446ZE 做监控和策略调度,专门对两个串联电池单元做主动均衡。这篇文章就是这个项目的完整记录——拓扑怎么选、硬件怎么搭、状态机和策略怎么写、实测中踩了哪些坑,适合正在做 2S 或多串 BMS、想搞懂主动均衡怎么落地的人参考。
1. 为什么两节串联电芯也需要专门做主动均衡
1.1 压差是怎么被“养”出来的
很多人觉得电芯数量少就不需要均衡,这是一个误区。两节电芯串联,看似简单,但电池的不一致性并不因为数量少而消失。制造工艺再接近,电芯内部的电解液浸润程度、极片厚度、内阻分布都不可能完全一致。这些差异平时被充电和放电管理掩盖了,等到循环次数上来、自放电率拉开差距,或者电芯处于不同的温度区间时,端电压就会开始分化。
备用电源系统尤其容易放大这个问题。这种设备大部分时间挂在浮充状态,电流很小,电芯表面上很平稳,但自放电率不一致让“静置”成为最大的分选杀手。靠近功率器件的那节电芯温度更高,自放电更快,容量衰减也更快。容量衰减快的那节电芯,在同样电流下压降更大,发热更大,形成正反馈。我实测过一组使用了半年的两串电池,初始压差只有5mV左右,半年后最坏情况下静置压差跑到了80mV以上,这还只是来自温度场和自放电率的差异,没有算上充电管理误差。
1.2 不均衡的最直接代价
两节电芯串联,充电时哪节先到截止电压,系统就按哪节来停。高压那节先到4.2V,低压那节可能还在3.9V,为了保护高压节,充电被迫中止,低压节永远充不满。放电时反过来,低压节先掉到欠压点,高压节还剩三分之一电能,系统就报欠压切断了。
对储能和备用电源来说,这个代价非常直接:可用容量缩水,备电时长达不到设计值。更重要的是,长期被“压力”的那节电芯始终处于过充或欠压的边缘,老化速度明显加快,随后又反过来加剧失衡,最后变成“最弱的那节电芯决定整包寿命”的局面。在两串系统里,这个现象不是概率问题,是时间问题,跑得久了一定会遇到。
1.3 被动均衡在这个工况下的短板
最传统的被动均衡做法,是检测到某节电芯电压偏高后,通过并联的电阻放电,把多余能量直接以热量形式消耗掉。两串系统用被动均衡也不是不行,但在备用电源场景下有明显短板。首先被动均衡只能削高、不能补低,低压那节电芯永远只能等待被补上,如果两节都有偏差,均衡周期会拖得很长。其次,浮充状态下本来充电电流就小,靠电阻放电反而给充电器增加负担,发热集中在线路板局部,长时间工作隐患不小。最后也是最重要的,被动均衡的能量是白白烧掉的——在一台希望长待机、低功耗的备用电源设备里,这种浪费不可接受。
所以这版设计从一开始就锁定了主动均衡路线:把能量从高压电芯直接搬到低压电芯,而不是烧掉。
2. 拓扑选型:单电感半桥为什么能搬能量,Boost+母线方案为什么不行
2.1 2S电池组的“地”问题决定了拓扑边界
最开始我脑子里冒出来的方案是两级的“Boost+母线”结构:用 MP2642GR-Z 把高压电芯升压到一个固定母线,再从母线给低压电芯灌能量。听起来很顺,但画原理图时很快发现了一个绕不开的坑:2S电池组里两节电芯的地电位不共地。
两节电芯串联,Cell_A 的负极是整个系统的地,Cell_A 的正极同时是 Cell_B 的负极,这个节点我们叫 N1。如果 Boost 的输入接 Cell_A,输出接 Cell_B,那 Boost 的输入地和输出地分别是 P- 和 N1,二者之间隔着整整一节 Cell_A 的电压。非隔离的 Buck-Boost 拓扑根本没办法在两个不同地参考之间直接搬能,硬接的话相当于把 Cell_A 短接了一部分回路。这就是为什么市面上两串均衡器几乎都是单电感加开关网络的结构,而不是简单“先升压到母线再降压”。
如果把它扩展到更多串,地电位问题会更加复杂。所以在 2S 这个场景,正确的边界条件是:必须有一个悬浮在任意节点之间的储能元件,再加上可控的开关网络,让能量从哪个单元取、往哪个单元送,由开关决定,而不依赖一个固定地参考。
2.2 单电感双向搬运的具体工作过程
我最终采用的拓扑是经典的半桥加电感结构。储能电感一端接在电池组中点 N1,另一端接半桥中点 X,半桥的上管接到总正极 P+,下管接到总负极 P-。两个开关管互补工作,但中间必须留死区,绝不允许同时导通。
当 Cell_B 电压高于 Cell_A,需要把 Cell_B 的能量搬给 Cell_A 时,上管先导通。Cell_B 的正极是 P+,电流从 P+ 经上管、电感到 N1,再回到 Cell_B 负极,电感被充电,储存磁场能量。上管关断后,电感电流不能突变,X 点电压被拉低,下管的体二极管或并联二极管续流,电流从 N1 经 Cell_A 回到 P-,再经过下管回到电感,把能量释放到 Cell_A。这个过程本质上就是一个 Buck-Boost 的能量搬运,一个周期搬一次,PWM 频率和占空比决定平均均衡电流。
反过来,当 Cell_A 电压高,需要把能量搬给 Cell_B 时,下管先导通,Cell_A 给电感充磁,然后通过上管体二极管给 Cell_B 续流。两管各自的角色互换,但硬件结构完全对称。这套拓扑不需要任何隔离变压器,一个电感加两个 MOS 就是全部功率级,非常好调试。
2.3 MP2642GR-Z 在功率级里干的活
那 MP2642GR-Z 在这个拓扑里扮演什么角色?它不是一颗专门的均衡芯片,而是一颗 PWM 升压控制器,我把它用在功率级的控制环路上。
均衡过程需要的是受控的脉冲开关动作,也就是 PWM。MP2642GR-Z 内部有振荡器、误差放大器和限流比较器,能以相对固定的开关频率产生 PWM 信号,同时还支持软启动和过流限制。我让 MP2642 负责产生固定频率的 PWM,并通过外部电流采样电阻做峰值电流限制;STM32F446ZE 不直接去高频控制 MOS 开关,而是负责低频的决策——判断方向、使能、监控电压和温度。方向切换的时候,STM32 通过逻辑电路把 PWM 信号映射到当前这个方向对应的主开关管上,续流管则工作在非同步状态,靠体二极管完成续流。
这样做的好处很明显:MCU 的定时器资源不用被高频 PWM 完全占住,控制环路也稳定得多。MP2642 的限流功能可以在一两个开关周期内封顶电流,避免电感饱和和过流,而 STM32 的软件判断再快也赶不上硬件比较器,这种分工是合理的。
3. 硬件实现细节:半桥、电感、采样与保护
3.1 半桥MOS管、驱动器和防直通逻辑
半桥的上管和下管都选用了低导通电阻的 N-MOS,导通电阻基本在 10 毫欧级别。上管是高边开关,源极接半桥中点 X,漏极接 P+,栅极电位必须高于 P+ 才能完全导通,所以需要高压侧驱动。下管是低边开关,源极接 P-,栅极电位只要高于地就能导通,驱动相对简单。
我用了一颗半桥驱动器来同时驱动上管和下管,由 MP2642 生成的 PWM 信号送进驱动器的高边和低边输入。这里最关键的参数是死区时间,上管关断到下管导通之间的间隔,必须大于 MOS 管的关断延迟时间。我实测过,死区太短或者驱动器本身不带死区控制,半桥就会在切换瞬间出现短暂直通,P+ 到 P- 直接短路,轻则冒烟,重则烧管。所以我的做法是选择自带死区控制的驱动器,同时在软件层面保证方向和使能切换时先全部关闭、等待至少 10ms、再使能另一边,从两个层级杜绝直通。
3.2 电感参数与均衡电流的计算
电感的选型决定了均衡电流能到多大,也决定了纹波和损耗。电感的励磁阶段电流上升斜率由输入电压和电感量决定。以单节 3.8V 左右、开关频率 400kHz、目标平均均衡电流 1A 为例,若允许电感纹波约 0.5A,那么电感量大概需要:
L = Vin × D / (f × ΔI)
其中占空比 D 在均衡时接近 0.5,Vin 取 3.8V,f 取 400kHz,ΔI 取 0.5A,算出来约 9.5 微亨。我选了 10 微亨的功率电感,饱和电流按峰值电流加余量取 3A。峰值电流不想取太大,因为限流点设定在 2A 左右时,铜损和开关损耗都还能压住,二极管续流阶段的导通损耗也比较均衡。
电感选型有两个容易忽略的点。第一是饱和电流,电感在峰值电流附近一旦饱和,感值会急剧下降,励磁电流瞬间失控,MP2642 的限流都挡不住。第二是 DCR,低 DCR 能减少铜损,但往往意味着更大的磁芯体积。对于 1A 均衡电流,DCR 控制在 30 毫欧以内就够,没必要为追求极致压榨效率而牺牲体积。
3.3 电芯电压采样:差分、滤波和OCV窗口
电压采样是整个系统的眼睛,采样不准,后面所有策略都是白搭。两节电芯的电压必须精确测量,但在这个拓扑里有个天然难点:Cell_B 的正极相对于系统地最高可到 8.4V,如果直接分压进 ADC,Cell_B 的测量必须扣除 Cell_A 电压,误差会叠加。
我用了两个独立的差分采样通道,分别测 Cell_A 两端和 Cell_B 两端。采样电阻网络按 1/3 分压,4.2V 对应 1.4V,8.4V 对应 2.8V,都在 STM32F446ZE 的 3.3V ADC 量程内。差分结构的好处是共模电压不会影响差模测量,Cell_B 的电压直接就是目标值,不用在软件里做减法。
滤波方面,ADC 前级加了 RC 低通滤波,截止频率设在 1kHz 左右,同时软件里连续采 16 次取平均。这里有个经验:均衡进行中电感和 MOS 开关产生的噪声会往采样线上耦合,如果滤波不充分,看到的电压会随占空比抖动,甚至出现几十毫伏的假压差。所以我在策略上做了个妥协——均衡过程中的 ADC 结果只做保护判断用,不做均衡完成判断;要判断是否真正收敛,必须停止均衡几十毫秒,等电芯端电压恢复稳定后再测,这就引出后面要说的 OCV 窗口。
3.4 保护链路设计
保护链路分为硬件和软件两层。硬件层,MP2642 的峰值电流限制是第一道防线,励磁电流一旦超过设定值,PWM 会立刻被比较器拉低,不会等到软件反应过来。第二道防线是半桥驱动器的直通保护,以及驱动输入端的逻辑门,防止非法状态同时开通两管。软件层,STM32 每 100ms 检查一次电芯电压、母线电压、MOS 温度和电感温度,任何一路异常都会让状态机进入故障态,先关 PWM、再清方向开关、最后置故障标志。温度保护我放在了比较关键的位置:均衡电流 1A 时,续流二极管的压降和电感损耗会让局部温度明显上升,如果没贴好 NTC,热量聚到 MOS 附近,长期运行就会出问题。
4. STM32F446ZE的资源分配与均衡状态机
4.1 F446ZE在项目中的资源占用
STM32F446ZE 是一颗 Cortex-M4F 内核、主频 180MHz 的 MCU,做均衡控制绰绰有余。均衡功能本身不占多少资源,我在同一颗芯片上还跑了充电控制、放电保护、UART 调试输出和状态指示灯,资源都还宽松。均衡模块用到的外设很常规:两个 ADC 通道采电芯电压,一个 ADC 通道采温度,两个 GPIO 控制方向开关,一个输入引脚接收 MP2642 的限流中断标志,再加上一个用于 PWM 映射的定时器输出。
实际分配时要注意一点:ADC 采样和 PWM 开关最好避开同一个时刻。我在代码里没有让 ADC 完全独立连续采样,而是用定时器触发的模式,把采样时刻安排在 PWM 关断的间隙,这样采到的电压包含的开关噪声最小。这个细节让我在调试时少走了很多弯路。
4.2 采样任务与解耦设计
均衡系统的采样任务不能太频繁,也没有必要太频繁。电芯电压的变化是慢变量,100ms 一次已经足够。我的调度很简单:一个 10ms 的时基中断负责累积时间片和状态机推进,100ms 到点时启动一次 ADC 转换序列,转换完进入均值滤波。所有策略判断都基于滤波后的结果,不对单次采样值做响应,避免噪声引起误动作。
还有一点值得单独说,就是“解耦”。均衡开启时,电感和 MOS 的工作电流会在电池组内阻上产生压降,你测到的是端电压而不是开路电压。端电压包含极化电压和内阻压降两部分,而均衡判断关心的是电芯的荷电状态差异,也就是开路电压差异。所以我在每次启动均衡前,会先让系统静置至少 30 秒,采样得到一个相对稳定的 OCV,再拿这个 OCV 做方向判断和触发判断。均衡过程中采到的值只用于过压、欠压和过温保护,除非压差到了极危险的程度,否则不干预搬送过程。
4.3 状态机:从待机到搬送到退出
状态机是整个均衡功能的主干,我用一个枚举变量表示当前状态,在时基中断里周期推进。整个流程分五个状态:IDLE、CHECK、BAL_PREP、BAL_ACTIVE、BAL_DONE,另外还有一个故障态 FAULT。
IDLE 状态什么都不做,只周期性采样电压和温度,计算压差。CHECK 状态里如果压差持续 10 次采样都超过 20mV,就进入 BAL_PREP。BAL_PREP 是关键状态:先清空所有方向开关,延时 10ms,确认半桥完全关断;然后根据压差方向设置方向寄存器;再延时 10ms,最后使能 MP2642 的 PWM 输出。这个状态的目的就是防直通、防误切换。
进入 BAL_ACTIVE 后,MP2642 正常工作,均衡电流由硬件限流圈定,软件只做监控。等停止条件下的压差降到 5mV 以下并持续 30 秒,进入 BAL_DONE。BAL_DONE 要做的动作和 BAL_PREP 是对称的:先关闭 PWM,等待电流降到零,再清方向开关,最后回到 IDLE。我特别强调“先关 PWM 再清开关”这个顺序,如果反过来,电感电流无处释放,会产生很高的尖峰电压。
故障态的处理相对粗暴:任何异常情况下,第一步永远是关 PWM,第二步清方向开关,第三步置故障码。宁可均衡功能停下,也不能让功率级失控烧管。
4.4 PWM映射与电流控制的配合
MP2642 产生的 PWM 需要根据方向输出到不同的 MOS。我在硬件上加了一个方向选择逻辑,用两个 GPIO 信号控制 PWM 走哪条路径。当方向为 A 给 B 供电,PWM 走低边 MOS;方向为 B 给 A 供电,PWM 走高边 MOS。这个映射完全在硬件逻辑门里完成,STM32 只负责设置方向值,不参与高频翻转,避免中断响应延迟带来的时序风险。
电流控制同样分成两层。内层是 MP2642 的峰值电流限制,设定好限流点以后,硬件自动完成逐周期限制。外层是 STM32 的慢速调节,我每隔 100ms 读一次电流采样值,通过一个 PI 调节器微调 MP2642 的反馈参考值,从而实现“大压差大电流、小压差小电流”的效果。这个慢环不需要很快,因为均衡本来就是分钟级的慢过程,调节太快反而会和电池极化现象互相纠缠。
5. 均衡策略:什么时候搬、以多大电流搬、什么时候停
5.1 触发阈值与迟滞
触发阈值我用的是 20mV,停止阈值用的是 5mV,中间留了明显的迟滞区间。设置迟滞的原因很简单:电芯电压在静置状态下也会有很微小的波动,如果触发和停止用同一个阈值,系统会在临界点反复进入和退出均衡,每次切换都要经历关断、延时、使能的过程,对 MOS 和电感都是不必要的折磨。
20mV 触发、5mV 停止,这个区间对绝大多数锂电都是合理的。如果把触发阈值设得太低,比如 5mV 就触发,那均衡系统会频繁工作,效率反而低;设得太高,比如 100mV 才触发,那电芯已经被允许跑偏太久了。我自己的经验是 15 到 30mV 的触发阈值比较合适,具体可以根据电芯类型和系统允许的失衡量来调。
5.2 分段电流设定
均衡电流不是恒定不变的。这个项目里我分了三个档位:压差大于 100mV 时,均衡电流 1A;压差在 30mV 到 100mV 之间时,均衡电流 0.5A;压差小于 30mV 时,均衡电流降到 0.3A。
分段降流的逻辑是这样:压差大时,能量搬运的必要性强,用大电流尽快把失衡修正回来,减少高压电芯长时间处于高电压状态的老化风险。压差接近收敛时,继续用大电流很容易出现过充——因为低压电芯在充电过程中端电压会升高,如果反映到端电压上已经趋近,再以大电流灌进去,反而可能把低压电芯灌到偏高,形成反向压差。所以末端降流是保护措施,也是让收敛过程更平滑的手段。
实测下来,压差从 80mV 收敛到 10mV 的过程中,大电流阶段确实明显更快,末端 0.3A 的小电流则让最终收敛更精准,不会因为过冲来回震荡。
5.3 电压判据的局限与改进方向
纯电压判据有一个理论上的局限:端电压相同不代表荷电状态相同,因为电芯的内阻和极化特性可能不同。同样的开路电压,不同老化的电芯对应的 SOC 可能差几个百分点。对大多数应用场景来说,静置后的 OCV 判断已经足够;但如果做更严格的产品,建议引入 SOC 辅助判断。
具体做法有两种。第一种是安时积分配合:在正常充放电过程中记录每个电芯的累计吞吐量,当两节电芯的累计容量差异超过阈值时触发均衡。第二种是开路电压查表:通过标定不同 SOC 点对应的 OCV,把实际测得的 OCV 换算成 SOC 差值,以 SOC 差值为主要判断依据。第二种更准确,但需要针对具体电芯型号做标定,工作量会大一些。
我在这版项目里没有做 SOC 换算,因为备用电源场景经常处于静置状态,OCV 条件好,电压判据已经能覆盖绝大部分情况,后续如果要做多串产品,我会把 SOC 判据加进去。
6. 实测结果与踩坑记录
6.1 一次完整均衡的数据
实测对象是两节标称 3.2V 的磷酸铁锂电芯,初始静置压差 85mV(Cell_A 3.82V,Cell_B 3.91V),按预设策略触发均衡。前 27 分钟以 1A 电流运行,压差从 85mV 降到 12mV;之后进入 0.3A 小电流阶段,第 46 分钟压差降到 6mV;停止均衡,静置 30 分钟后压差回弹到 9mV,没有触发再次均衡。整个过程中最高温度出现在电感附近,大约比环境温度高 10°C,MOS 表面温度略低一些。
回弹现象很有意思。均衡到 6mV 时你以为已经结束了,但停止后电芯内部的极化慢慢释放,端电压会往回弹一点。这就是为什么我在策略里要求完成判定必须在停止均衡的状态下测量,并且留了 30 秒持续观察窗口。如果当初是带着均衡电流判断完成,系统就会在“觉得完成了”和“实际上还没完成”之间来回折腾。
6.2 坑一:MOS驱动死区不足导致半桥直通
第一版硬件画完后,上电测试不到半分钟,下管 MOS 开始发烫,随后保险丝炸了。排查过程:先测 PWM 波形,发现上管关断沿和下管导通沿之间几乎没有间隔。换了两颗不同批次驱动芯片,问题依旧,最终确认是驱动器本身不带死区控制,而我在设计时默认它是带死区的。
修复方案分两步。硬件上换成了带死区控制的半桥驱动器,死区时间设定为 100ns 左右;软件上增加了一个方向切换保护逻辑,任何状态迁移都必须先全关 10ms。从那以后,即使在方向切换瞬间用示波器抓半桥中点电压,也没有再看到直通尖峰。
这个坑让我牢记一个原则:半桥电路的直通保护不能只靠软件延时,软件延时再短也有不确定性,必须在硬件层面做死区保证。
6.3 坑二:电感噪声灌进ADC
均衡功能调通以后,我发现一个诡异现象:均衡开启时,ADC 读到的 Cell_B 电压会跳变到比实际值高 80mV 左右,均衡一停就恢复正常。排查链路是这样的——先怀疑参考电压不稳,加了钽电容滤波没用;再怀疑 ADC 采样时序,调整采样窗口也没用;最后用示波器探到采样电阻分压点,发现上面叠加了一大串开关振铃,频率和均衡 PWM 完全一致。
根源是采样地和功率地共了一段走线,电感开关时地平面电流突变,在共地段上产生了电压差,而这个电压差被差分采样电路当成信号采了进来。修复方法是把采样地单独拉一根线回到电池负极,功率地则走大电流路径,两者在电池端单点连接。同时把软件均值滤波窗口加长,从 8 次改到 16 次。这两步做完,均衡开启前后的电压读数跳变从 80mV 降到了 2mV 以内。
6.4 坑三:方向切换瞬间的振铃
方向切换时,比如刚从“A 搬 B”切换成“B 搬 A”,半桥中点电压会出现一段高频衰减振铃,幅度最高到几十伏,虽然不至于击穿 MOS,但已经超过了典型耐压余量,长期看是隐患。
定位过程:先用示波器抓驱动波形,振铃发生在 PWM 映射切换的瞬间。原因是切换方向的瞬间,MP2642 的 PWM 输出同时被拉低,但半桥驱动器由于自身有传播延迟,上管和下管都不是立刻关断,导致电感电流在切换瞬间发生了强烈的换流。修复方法是增加一个“换向等待”时间,也就是 BAL_PREP 状态里的两次延时,第一个 10ms 等所有开关完全关断,第二个 10ms 等电感电流确实衰减到零,然后再使能新方向的 PWM。这之后振铃幅度明显下降,剩下的部分加了一个 RC 吸收网络也压住了。
6.5 后续可以扩展的方向
这套单电感半桥拓扑天然支持扩展到多串系统。如果做 3S 或 4S,就需要在每个相邻电池单元之间部署一个类似的均衡单元,或者用开关矩阵加一个共享电感轮流搬运。MP2642GR-Z 和 STM32F446ZE 的组合目前看来完全够用,如果均衡电流要提到 2A 以上,需要重新整定电感参数和散热方案,主控侧的处理逻辑基本不用大改。
最后分享一个个人体会:均衡这件事,硬件占一半,策略占另一半。MP2642GR-Z 把高频 PWM 和限流这些脏活累活消化掉了,STM32F446ZE 只管慢速的决策调度,两个芯片配合起来边界非常清晰。真正花时间的反而是那套“什么时候搬、搬多少、怎么停”的逻辑。如果你也在做 2S 或扩展多串的主动均衡,第一版先把采样地和功率地分开、把状态机里的防直通延时和 OCV 判断窗口留好,后续会省掉大量调试时间。