最近手头做了一台小功率备用电源样机,电池组用的是两节18650串联,标称7.4V。真正跑起来之后发现一个特别典型的毛病:两节电池刚出厂时电压几乎一致,但循环几十次之后,B节总是比A节低几十毫伏。别小看这几十毫伏,在储能和备用电源这种长期浮充的场景里,它决定了整组电池到底能放出多少容量。我在这台样机上用了 MP2642GR-Z 这颗有源均衡芯片,搭配 STM32F411RE 做主控,专门针对两个串联的电池单元做均衡,实测效果比传统被动均衡好了不止一个档次。这篇文章就把方案选型、硬件参数、软件策略、实际踩过的坑都摊开讲清楚,给正在做锂电池PACK、储能BMS或者备用电源的同仁作个参考。
1. 项目到底在解决什么问题
1.1 两个串联电池为什么必须均衡
先讲原理,这个是整个项目的根。两节电池串联,充放电回路是同一个电流,但电池不是理想器件。出厂时同一批电芯容量可能有差异,内阻不同,自放电率也不同;运行过程中温度分布不均匀、接触电阻不一样,又会让差异继续拉大。结果就是充到满电时,某一节先达到4.2V截止电压,充电器一停,另一节可能只有4.15V甚至更低。放电时反过来,一节先掉到欠压点,整组都被迫停止。
这个问题的本质是“串联组的短板效应”:整组容量由最低的那节决定。对备用电源来说更头疼,它长期挂在浮充电压上,如果两节电压不在同一水平,高的一节一直处于过充边缘,低的一节又吃不饱,时间长了低的那节容量衰减更快,形成一个恶性循环。所以均衡不是锦上添花,在2S系统里也必须认真对待。
很多人觉得2S电池电压才8.4V,用被动均衡足够了,没必要上主动均衡。这话在消费电子里基本成立,但在储能和备用电源场景不成立。备用电源讲究的是长时间稳定性,被动均衡把高电压那节的能量用电阻放掉,能量变成热,均衡电流一大板子就热,一热就得降功率,实际均衡效果很有限。我在这台样机上选被动均衡试过,压差20mV以下很难收进去。
1.2 被动均衡与有源均衡怎么选
被动均衡的原理是把电压高的那一节单独接一个放电电阻,让它“多放掉一点电”,去追平低电压那节。优点就是便宜、电路简单,一颗运放加几颗电阻就能做。缺点非常直接:能量全部变成热量浪费掉,均衡电流一般只能做到50mA到100mA,再大一点PCB和电阻都扛不住。想象一下一个8.4V的系统,一节电池多出30mV电压,用100mA放掉,每放1小时才消耗不到0.3Wh,但电阻上已经发热了。放在密闭的备用电源壳体内,这种热量很难散掉。
有源均衡完全不同,它用开关管和电感或者电容,把能量从电压高的那节“搬”到电压低的那节,而不是放掉。搬移过程能量基本守恒,只有开关管和电感的损耗,综合效率能做到80%以上。所以均衡电流可以做得更大,300mA、500mA都行,发热却比被动均衡小得多。这颗MP2642GR-Z就是典型的有源双向均衡方案,它自己集成开关管和控制逻辑,外部只需要一颗功率电感和少数电容电阻,就能实现相邻两节电池的能量搬移。
均衡电流大意味着什么?意味着在备用电源浮充时,两节电池的压差能在几十分钟内快速拉平,而不是被动均衡那样慢慢磨几个小时。对于需要频繁充放电循环的储能系统,这个差别很关键。
1.3 MP2642GR-Z + STM32F411RE 的搭配逻辑
选型的时候我其实纠结过:要不要直接用纯硬件均衡芯片,完全不需要单片机参与?市面上确实有这种方案,芯片自己检测压差自己均衡,外围电路一堆电阻电容搞定。但实际做下来发现一个痛点:纯硬件方案没法控制均衡时机,没法判断“什么时候该均衡、什么时候该停”,更没法把均衡动作和充电策略、保护逻辑联动起来。备用电源不是玩具,它需要上报状态、执行保护、记录历史数据。
所以最终架构是“电源芯片干活,主控决策”。MP2642GR-Z负责能量搬运这个脏活累活,STM32F411RE负责大脑部分:读电压、算压差、判断是否开启均衡、检测异常、控制充放电回路。这个分工的好处是任何一边出了问题都好定位。均衡芯片挂了,主控能检测到异常告警;主控逻辑写错了,均衡芯片顶多不动作,不会烧板子。
STM32F411RE这颗芯片我在很多BMS项目里都用过,96MHz主频,Cortex-M4内核,带浮点运算单元,跑电池管理算法绰绰有余。12位ADC有多达16个通道,我采样两节电池电压、一路温度、电流都够用。512KB Flash和128KB RAM对一套2S均衡程序来说非常宽裕,后续想加日志、加通信协议都留了余地。
2. 系统方案与硬件设计解析
2.1 核心架构与能量流向
整体架构用一个词概括是“主从分工”。电池组是两节串联,CELL1在上、CELL2在下,正极引出BAT+,串联点叫M点,负极引出BAT-。MP2642GR-Z直接连接在CELL1和CELL2两端,本质上是并联在串联节点之间,能够感知两个电芯各自的电压,也能通过内部开关把电感分别切换到CELL1回路和CELL2回路。
能量流向分两种情况。当CELL1电压高于CELL2时,芯片把高电压那节的能量先存入电感,再把电感的能量释放到低电压那节,完成一次搬移。这个过程反反复复,开关频率在几百千赫兹,电感每次存储和释放的能量非常小,但每秒成百上千次,累积起来就是持续的均衡电流。反过来,CELL2电压高的时候流程完全对称。
STM32F411RE在这里不直接参与能量搬移,它通过ADC采样两个电芯的电压,通过GPIO给均衡芯片发送使能信号,再通过I2C读取芯片的故障状态寄存器。我还在电池回路中串联了一颗采样电阻,电流测量信号也可以进ADC,配合电压判断充电和放电状态。整个控制回路和功率回路是共地的,因为没有隔离需求,共地设计让采样和通信简化不少。
这里有个容易忽略的点:STM32不能直接接电池满电压采样,必须分压。我的做法是每节电池用两颗精密电阻分压,CELL1的采样点选在BAT+和M之间,CELL2选在M和BAT-之间,两个分压网络独立工作,互不影响。分压比选11:1,也就是100kΩ和10kΩ串联,这样当电池电压在4.2V时,送到ADC引脚的电压约0.42V,留足了余量。分压电阻用了0.1%精度,实际测下来两路采样的一致性能做到正负5mV以内,这个精度对均衡判断足够了。
2.2 MP2642GR-Z 周边电路设计与参数计算
均衡芯片的外围设计,最核心的是电感、均衡电流设定电阻、输入输出电容和使能控制。
电感的选择直接影响均衡效率。MP2642GR-Z是开关型DC-DC的拓扑,电感参数要按照开关频率和均衡电流计算。我第一版随手塞了一颗10μH工字电感,结果均衡电流一上去,电感直接饱和,效率从80%掉到50%以下,板子还特别烫。后来换成22μH的功率电感,饱和电流留到1.5A以上,DCR控制在100mΩ以内,问题才解决。理论依据很简单:电感峰值电流由导通时间和电感量决定,要保证在最大均衡电流时电感不进入饱和区,必须给足余量。
均衡电流的设定,我按500mA来设计。这颗芯片通过外接电阻设定电流档位,具体计算按照手册里的公式,典型做法是选一颗10kΩ的设定电阻得到额定均衡电流。选500mA是因为两节18650的容量在2500mAh左右,1/5C倍率对电池完全无害,但又能保证压差收敛速度。如果电芯容量更大,可以适当把电流调到1A,不过要注意电感和PCB走线都要跟着升级。
输入输出电容我用了10μF X7R陶瓷电容加100nF高频陶瓷电容并联,位置尽量靠近芯片电源引脚。这个组合是为了兼顾低频储能和高频滤波。X7R陶瓷电容耐压选了25V,实际上电池电压只有8.4V,但陶瓷电容在直流偏压下容量会衰减,留一倍以上余量比较稳妥。PCB布局上,电感、电容、芯片构成一个紧凑环路,环路面积越小,EMI和开关尖峰越小。
2.3 STM32F411RE 采样与供电设计要点
STM32部分的硬件设计,第一原则是“自己的供电不能干扰采样”。我一开始直接拿BAT+通过一颗LDO给STM32供电,结果发现ADC读数在均衡开启的瞬间会跳变十几毫伏。原因是均衡芯片工作时电流脉冲很大,电池到LDO之间的走线阻抗产生电压波动,STM32的参考点被干扰了。
后来做了两个改动:第一个是在电池输出端先加一颗大的电解电容和一颗TVS,稳住瞬态电压;第二个是LDO输出给STM32之后,再专门分出一路经过RC滤波给ADC基准供电。MCU内部ADC用3.3V当作参考电压,参考电源的纹波直接换算成采样误差,这个必须压住。实际效果是均衡开启前后ADC读数的偏移从十几毫伏降到了2毫伏以内。
采样回路还有个细节,每个分压网络输出到ADC引脚之间加了一级RC滤波,用的是1kΩ串联电阻和100nF并联电容,截止频率大约1.6kHz。假如不滤波,均衡芯片的开关纹波会直接耦合进采样回路,ADC读到的电压值会在真实值附近上下跳动,严重影响压差判断。
3. 软件控制逻辑实现
3.1 电压采集与滤波处理
软件上第一步是电压采集。STM32F411RE内置12位ADC,我把两个电芯的电压采样分别映射到ADC1的通道0和通道1,用定时器触发采样模式,每200ms触发一次转换序列。每次转换连续采16次,去掉最大值和最小值,剩下的求平均,作为这一轮的电压值。这个办法简单粗暴,但对于2S系统的10mV级判断足够。
采集完电压之后还有一个校准环节。硬件上的分压电阻哪怕用了0.1%精度,仍然有系统偏差,尤其是半批量焊接时精度会漂。我在代码里留了一个电压校准表,出厂测试时用精密电压源在3.0V、3.7V、4.2V三个点测量,计算出增益和偏移量存到Flash里。实际运行时,每次采样都套用校准参数做线性修正。这个步骤别偷懒,它决定了整个均衡系统能不能准确判断阈值。
滤波之后还要做异常值剔除。比如均衡开启瞬间电感电流产生的磁场会干扰ADC采样,有时会采到一个特别离谱的电压值。我的处理方式是:任意一帧采样值如果偏离前一次平均值超过200mV,直接丢弃这一帧,不参与滤波。这样能有效防止单次干扰导致误动作。
3.2 均衡策略:电压均衡 vs SOC均衡
均衡策略我做了两层。最基础的一层是电压判断策略:两节电芯的压差绝对值大于30mV,同时两节电压都在3.0V到4.2V的安全范围内,开启均衡;压差缩小到10mV以内,关闭均衡。这中间加了滞回,避免了在阈值附近反复启停。
为什么要设30mV和10mV这两个门槛?如果门槛太低,比如5mV就启动,电池本身在充放电过程中的动态压差就可能有十几毫伏,均衡芯片会一直在启动和停止之间震荡,浪费能量还增加损耗。30mV启动、10mV停止是一组比较合理的滞回窗口,既能有效均衡,又不会频繁动作。在备用电源浮充状态下,30mV的压差其实已经代表了两节电池状态有可见差异,值得介入处理。
第二层是SOC均衡策略。只做电压均衡有个问题:两节电池电压相同不代表容量相同。开路电压和SOC的关系不是线性的,尤其是磷酸铁锂电芯,平台期非常平缓,电压差10mV可能在SOC上差了10%,电压均衡到5mV以内也没法真正把容量拉齐。所以我在项目中引入了电量计,通过库仑积分估算每节电芯的SOC,当SOC差异大于8%时触发均衡,SOC差异小于3%时停止。这个策略更适合那种负载波动大的储能应用,特点是需要额外的电流采样和电量计芯片,软件复杂度也更高。
实际使用中,我通常默认启用电压均衡策略,因为它鲁棒性最好,不依赖电量计精度。SOC均衡作为高级功能,在系统接入上位机配置的时候可以选择开启。
3.3 保护逻辑与状态机设计
整个均衡控制我按状态机实现了三个状态:IDLE、BALANCING、FAULT。IDLE表示空闲,BALANCING表示正在均衡,FAULT表示故障锁定。状态机的意义是让代码逻辑清晰,避免在异常情况下做出危险动作。
IDLE状态下的进入条件非常严格:电压采样值正常、两节电池电压均处于3.0V到4.2V之间、电池温度在0℃到45℃之间、压差超过30mV,所有条件同时满足才能进入BALANCING。只要有一个条件不满足,就停留在IDLE。
BALANCING状态下,每200ms执行一次压差判断。如果压差已经回到10mV以内,且持续5轮采样都满足,退出到IDLE;如果检测到任何一节电压超过4.25V或者低于2.8V,立刻停止均衡,并且进入FAULT状态。FAULT状态会锁存故障码,必须要人工通过上位机发送清除命令才能复位。这个设计的考虑是:均衡期间如果电压快速上升,可能预示着电池内部出现了微短路或者充电失控,这时候不能再继续均衡,必须先锁定现场等人工介入诊断。
除了状态机,软件里还加了均衡超时保护。单次均衡持续时间限制在30分钟,到达时间后不管压差多少都强制停止,冷却5分钟再重新判断。原因是均衡电流虽然只有500mA,但在密闭空间内长时间工作依然会温升,强制间歇可以保护芯片和电池。另外,均衡期间如果检测到电池温度超过50℃,也会立即进入IDLE并标记过温故障。
4. 实测结果与常见问题排查
4.1 实测数据记录与分析
样机装好后我做了一轮完整的充放电循环测试。测试条件是:两节18650电芯分别经过不同次数的充放电循环,人为制造出约80mV的初始压差;然后给系统接上充电器到满电,再转入浮充模式,观察均衡效果。
第一轮测试结果很有代表性。初始压差86mV,均衡启动后大约25分钟,压差收敛到了8mV以内,之后均衡芯片进入间歇工作状态,偶尔启动一下补充,浮充电压下压差基本稳定在5mV左右。电池表面温度从26℃升到29℃,发热控制在可接受范围。对照组没开均衡,浮充12小时后压差依然有70mV出头,可见均衡对长时运行的备用电源是刚需。
第二轮测试我做了50次循环对比。开均衡的那组两节电芯容量衰减差异非常小,A节和B节的实际容量差在2%以内;没开均衡的对照组,两节容量差了接近8%。这个数据说明,均衡不只是解决当前电压一致性的问题,更重要的是能拉长整组电池的服役寿命。如果设备长期带病运行,低容量那节会被反复过度充放,提前报废,整组都得换。
4.2 均衡电流异常,或者根本没有均衡
这个是最常遇到的问题。我第一版样机焊完,上电之后发现压差明明超过50mV,均衡芯片却不工作,电流表纹丝不动。排查方法我整理成了一套顺序:
- 先查使能信号。用万用表量MP2642的使能引脚电压,发现STM32的GPIO配置成推挽输出了没有问题,但串联的限流电阻虚焊,导致电平没传过去。重新焊接后恢复正常。
- 再查电感两端波形。用示波器看电感开关节点,如果完全没有方波翻转,说明芯片没有启动振荡,问题大概率在使能或压差检测。
- 查压差信号。如果芯片要求压差超过阈值才启动,而采样电阻分压太大,导致芯片内部检测到的是衰减后的压差,阈值设置就失真了。我一度把压差检测回路的分压电阻值选错,芯片看到的压差只有实际的一半,导致启动困难。
- 最后检查电感是否焊反。MP2642对电感方向不一定敏感,但有些布局设计电感一端连接节点是固定的,方向错了会大幅降低效率。
4.3 均衡过程中的震荡问题
压差在阈值附近反复横跳是另一个高频问题。均衡芯片启动之后压差一路下降,掉到10mV附近时退出均衡,结果电池内阻回弹让压差又飘到12mV,芯片又启动,如此反复。表现就是示波器上看到均衡电流一突一突的,像打嗝一样。
问题的根源在于退出阈值和滞回不够宽,加上ADC采样噪声。我的解决办法是三重保护:第一,滞回范围从10mV加宽到15mV,启动30mV、停止15mV;第二,退出条件要求连续5轮采样(1秒)都满足,才真正退出;第三,启用均衡最短保持时间,一旦进入BALANCING至少工作10秒,不允许立刻退出。改完之后震荡彻底消失,系统稳定多了。
还有一个细节,ADC采样时刻尽量安排在均衡芯片的关断窗口采样。因为均衡芯片开关管的通断会在电池电压上叠加毛刺,如果采样刚好落在开通瞬间,读到的电压会偏高。利用定时器同步采样和开关周期,或者简单的软件滤波,都能缓解。
4.4 I2C通信不稳定问题
MP2642和STM32之间的I2C通信也出过怪问题。现象是系统运行一段时间后,主控偶尔读到0xFF或者通信超时,复位后又能正常。这个东西排查起来很隐蔽,因为它不是每次都失败,而是间隔几分钟出现一次。
怀疑过三个原因:I2C上拉电阻阻值不合适、走线过长受电感磁场干扰、主从设备速率不匹配。最后发现主要问题在走线,我把SDA和SCL从均衡功率电感底下穿过去了,开关节点的磁场直接耦合到通信线上。把线绕开电感之后,问题缓解了大半。然后又做了两个加固措施:把I2C速率从400kHz降到了100kHz,并且I2C重试机制加上了,连续三次通信失败才上报故障,避免单次干扰误报。
顺便说一句,MP2642处于均衡状态时,I2C通信要尽量避开电感开关瞬间,如果主控软件里能感知均衡状态,最高效的做法是在均衡间隙做通信。我在代码里加了一个小型状态同步逻辑,等均衡关闭的窗口期才去读芯片寄存器,读取成功率基本100%。
最后再聊两句个人心得
整套系统做完之后,我最深的体会是均衡这件事,“策略比硬件更难”。硬件电路只要按手册设计,参数计算不出错,基本都能工作;但均衡策略的细节,比如阈值、滞回、超时时间、采样窗口,全部需要针对实际电池特性和应用场景去调。同一套代码放在三元锂电芯上没问题,换到磷酸铁锂上就可能因为开路电压平台特性而导致均衡效果很差。
另外我强烈建议,调试均衡板的时候一定要先把示波器接好,观察电感开关节点的波形和I2C总线的时序,很多“玄学问题”在示波器上都清晰可见。项目收尾时我在上位机里加了一个压差和均衡状态的实时曲线记录功能,这样现场运行数据能回传回来分析,后续优化策略就有了依据,而不是靠猜。这套“MP2642GR-Z + STM32F411RE”的组合做到现在,已经成为我做2S储能和备用电源模块的标配方案了。