ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

两串电池也要做均衡:备用电源BMS均衡板设计实战

两串电池也要做均衡:备用电源BMS均衡板设计实战

两串电池也要做均衡?我第一次听到这个需求时觉得小题大做:两节同一批次的电芯,出厂压差不超过几毫伏,有什么好折腾的。但真正跑了大半年的备用电源项目后,我彻底改了这个想法。柜子里那对磷酸铁锂电芯,从装机时的几乎零压差,到充电末端稳定压差180mV,再到一次容量测试里整组提前40分钟掉到欠压保护——我才意识到,在储能和备用电源系统里,哪怕只有两个串联电池单元,均衡也不是可有可无的装饰。

后来我把方案推倒重来,用MP2642GR-Z做双串均衡前端,用PIC24HJ256GP610做主控,专门做了一套针对两节串联电芯的均衡板,问题才算真正解决。这篇文章会把这套板子的设计思路、均衡控制逻辑、实测数据以及调试时踩过的三个坑完整捋一遍,给正在做储能备电BMS或者考虑给备用电源加均衡的同行做一个参考。方案不复杂,但里面有几处取舍和细节,是光看芯片手册根本不会告诉你的。

1. 两串电池为什么也要均衡:差异远比你想象的大

1.1 同一批电芯也会有离散:自放电、内阻老化与温度

很多人觉得“同一批、同一化成柜”的电芯一致性一定好,这个假设在出厂那一刻勉强成立,但放到实际系统里能维持多久就说不准了。备用电源和储能系统跟消费电子不一样,电池不是天天深度充放,而是常年挂在线上小电流浮充,偶尔带载。这种工况下,三件事会慢慢把电芯拉开差距。

第一是自放电率差异。电芯内部副反应、轻微微短路、隔膜工艺波动,都会让每个电芯“自己偷跑”的速度不一样。别小看这百分之零点几的差别,一个月下来就可能差出1%到2%的SOC。第二是内阻增长曲线不同。循环次数相同,但温度、充电倍率、过充历史不一样,SEI膜增厚速度也不同。内阻差在空载时看不出来,一旦有电流流过,端电压会被明显拉开。第三是温度分布不均。电池柜里总有一节更靠近发热元件或者通风更好,长期高个1到2℃,老化速度就不一样。

这三个因素叠加,结果就是两节同一批次的电芯,半年后静置压差能到几十甚至上百毫伏。我见过最夸张的一组,存放一年后两节电芯开路电压差了接近500mV,那已经不是均衡能解决的问题了,直接判废。所以均衡一定要在差异还小的时候就开始做,不要等压差大了才补救。

1.2 储能和备用电源场景下,不均衡的后果更隐蔽

两节串联的备电系统,容量定义是“整组充到截止电压再放到欠压”这段区间。可一旦两节电芯不均衡,整个过程就会变成木桶效应:充电时,高压那节先撞上充电截止电压,BMS为了保护必须切充电,低压那节其实还没满;放电时,低压那节先到欠压保护,高压那节里还有能量但已经放不出来了。

我在100Ah的2S磷酸铁锂组上实测过,静置压差180mV对应有效可用容量损失大概8%。听起来不算特别吓人,但备电系统的关键指标恰恰是“断电后能撑多久”,损失掉的那部分容量很可能就是最不该丢的那三十分钟。更讨厌的是,不均衡会自我强化:高压那节长期被顶到上限,老化更快,内阻更大,于是压差进一步拉大,最后整个模组提早退役。

所以在储能和备用电源系统里,哪怕只有两个串联电池单元,均衡板也不是奢侈品。事前做均衡,成本可能就是几个电阻、一个模拟前端、一段固件逻辑;事后再处理电芯一致性,那就是整个模组换新的代价。

2. 均衡前端MP2642GR-Z与主控PIC24HJ256GP610的硬件分工

2.1 为什么选MP2642GR-Z做前端,而不是让MCU直接采样

最早做实验的时候,我试着让PIC24HJ256GP610自带的ADC直接去采两节电芯电压。理论上12位ADC分辨率不算差,稍微规划一下也能跑,但实际做下来问题一堆:分压电阻网络本身的漏电流会拉偏高压电芯;均衡MOS开关动作时地平面被瞬间扰动,采样值乱跳;要想在充放电回路里安全地处理共模电压,还得加隔离和运放,成本比预想高得多。

后来我把模拟前端交给MP2642GR-Z这颗双串均衡前端芯片,系统的负担一下子就减轻了。它在电路里的角色很清晰:负责两节电芯的差分电压采样、均衡放电控制、过压欠压监测,并通过SPI接口把这些数据送给MCU。PIC24HJ256GP610不需要自己去摸电芯正极,它只跟低压侧的寄存器打交道,逻辑上干净,物理上安全。

被动均衡的原理可以这样理解:两个串联电池就是一高一低两个水杯,均衡就是把高水位的那只杯子的水稍微泼掉一点,代价是能量变成热量散掉。主动均衡效率高,可以把多余能量灌到低压侧,但电路复杂、成本高;对两串小容量备电系统来说,被动均衡的发热完全可控,稳定性反而最好。所以在这套方案里我选择“MP2642GR-Z采样与驱动 + 外部均衡电阻耗散”的被动均衡拓扑。

2.2 参考电路:两个电芯、均衡电阻与MOS的接法

以2S磷酸铁锂为例,每节电芯工作范围在2.5V到3.65V之间,串联后最高约8.4V。主回路连接顺序是BAT+接到CELL2+,CELL2-与CELL1+相连,CELL1-接BAT-。均衡支路则是在每节电芯两端并联一组“均衡电阻+低边MOS管”,由MP2642GR-Z的均衡控制引脚去驱动MOS。

我在第一版板子上的参数如下表所示。这些值不是随手拍的,每一项都跟系统容量和热预算相关。

器件参数用途备注
均衡电阻 Rbal3.3Ω / 5W限制放电电流见下方电流计算
放电MOS管低压低导通电阻SOT-23受控开关栅极下拉10k确保关闭
采样滤波电容100nF / X7R抑制采样尖峰靠近AFE采样引脚
SPI串阻22Ω抑制反射靠近MCU发送端放置
电源TVS反向截止约9V保护AFE供电防止母线尖峰损坏前端

均衡电流按照电芯最高工作电压3.65V算,3.65V除以3.3Ω约等于1.1A。对20Ah电芯来说,这个数值接近0.05C,既不会让电芯端电压塌陷太多,又能在一个浮充周期内把几十毫伏的压差拉回来。电阻功率按I²R算,1.1A的平方乘3.3Ω约4W,所以我选了5W线绕电阻,并且把电阻安装在板边,尽量远离电芯温度采样点。

2.3 PIC24HJ256GP610的资源分配与逻辑电平匹配

PIC24HJ256GP610在这块板子上的任务主要是三个:读MP2642GR-Z的寄存器、维护均衡状态机、上报状态。资源分配我这样安排:SPI1作为主接口连接AFE,两个普通GPIO分别做片选和复位控制;RB4和RB5控制两路均衡指示灯;UART1接调试口和上位机;OC1模块产出PWM,用来对均衡MOS做软启动。

这里有个容易被忽略的点:MP2642GR-Z的逻辑电源和PIC24HJ256GP610的I/O电源都是3.3V,所以电平直连没有问题,不需要再加电平转换。真正需要花心思的是地。电芯采样输入的地、AFE的模拟地、PIC24HJ的数字地,要在PCB上单点汇合。我第一次画板时数字地和模拟地靠一根细走线连接,结果均衡电流一波动,SPI读回来的数据偶发乱码,后来改成星型接地才稳定。

另外MP2642GR-Z的电芯采样引脚是高压域,走线到主回路必须保证足够的爬电距离。两串电芯最高不到10V,危险程度比几十串的储能系统低很多,但我也把电芯采样区域的爬电距离留到了4mm以上,防止浮充久了PCB受潮导致漏电。

3. 均衡控制逻辑:不是电压差小就停,而是看SOC差

3.1 为什么不能只按“电压相等”判断结束

这是很多第一次做均衡的人最容易犯的错:看到两节电芯电压一样,就觉得均衡完了。但端电压相等,并不代表荷电状态一致。真实电芯的端电压表达式大概是 V = OCV + I × R_internal + 极化电压。

举个例子,充电时回路电流是1A,两节电芯内阻差20mΩ,那么伏特表上就会出现20mV的虚假压差,实际上两节电芯的SOC可能是一样的。如果以“在线电压一致”作为均衡结束条件,系统就会一直给不需要放电的那节电芯放电,浪费能量不说,还可能把本来均衡的电芯越搞越偏。

所以我的做法是分两种情况:如果系统允许,尽量用静置电压做判据,也就是在电流为零一段时间后,再读MP2642GR-Z的电压值,这时候极化已经恢复得差不多了,电压更接近OCV;如果必须在线判断,就要加上电流补偿,或者干脆在软件里对电压差做滞后和滤波。两串系统规模小,不需要做复杂的SOC估算,但“用静置回弹值做最终判断”这条原则一定要写进逻辑,省很多麻烦。

3.2 控制流程与代码骨架:采样、迟滞、保护联锁

均衡状态机不复杂,我把它抽象成三步:定时采样、条件判断、执行动作。PIC24HJ256GP610每500ms通过SPI读一次MP2642GR-Z返回的两节电芯电压和温度,经过滤波后得到压差,再判断是否开启某一侧的均衡MOS。

启动阈值我设为20mV,关闭阈值设为10mV,中间留了10mV迟滞。为什么不用同一个阈值?因为均衡一旦打开,高压电芯会通过电阻放电,端电压会明显下降;如果开关阈值相同,程序会在均衡和关闭之间来回切换,像个振荡器一样停不下来。加一段迟滞之后,整个系统就稳定多了。

下面是一个极简骨架,实际项目里还需要加故障标志、看门狗和EEPPROM存储,但核心逻辑就是这几行。

#define BAL_ON_LIMIT 20 #define BAL_OFF_LIMIT 10 void balancer_service(void) { uint16_t vcell1 = read_cell_voltage(0); uint16_t vcell2 = read_cell_voltage(1); int16_t diff = (int16_t)vcell2 - (int16_t)vcell1; if (diff > BAL_ON_LIMIT) /* CELL2明显偏高 */ bal_enable(2); else if (diff < -BAL_ON_LIMIT) /* CELL1明显偏高 */ bal_enable(1); else bal_disable(); }

只要保证MP2642GR-Z返回的电压值是经过正确滤波的,这套逻辑就能稳定跑。但要注意,绝对不能省略保护联锁。我实际使用的版本里,至少包含四个硬件条件:电芯电压必须处于2.5V到3.65V窗口内、温度低于45℃、充电电流没有超过设定值、AFE没有上报过压欠压故障。任一条件不满足,均衡立刻关闭,故障状态置位。

3.3 均衡窗口:充电末段和静置阶段分开策略

备用电源系统绝大多数时间处于浮充状态,这也决定了均衡不能“猛干”,而是要细水长流。我把均衡窗口分成两段。

充电末段是黄金窗口。浮充电流很小,高压那节电芯很容易被顶到上限,此时开启对应支路的放电MOS,相当于给高压电芯“泄压”,让低压电芯还能继续接收充电电流。我在这个阶段把均衡电流控制在0.5A左右,避免放电电阻发热影响到旁边的低压电芯。

静置阶段做静态均衡。系统没有充放电电流时,电压恢复接近OCV,判断最准。这时候目标可以设得更严格,比如压差10mV以内关闭。这个阶段不需要太大电流,细水长流慢慢拉平就行。我的经验是:每次静置均衡最多跑30分钟,然后强制休息一段时间,防止均衡电阻的热量积累到电芯温度采样点附近。

放电期间我一般不开均衡。一方面放电时端电压受内阻影响大,判断不可靠;另一方面,在储能备电场景里,放电往往意味着正在带负载,没必要把宝贵的电量当成热量耗散掉。

4. 实测复盘:数据、三个坑和不能省的硬件保护

4.1 一个完整均衡周期的数据表现

这块板子调试稳定后,我拿一对存放了两个月的20Ah磷酸铁锂电芯做了均衡测试。上电静置24小时后,CELL1电压3.612V,CELL2电压3.587V,压差25mV,超过启动阈值,程序开启CELL1侧的均衡支路。下面是那一次测试记录下来的数据节选。

时间点CELL1电压CELL2电压压差均衡状态
0h3.612V3.587V25mVCELL1放电
2h3.601V3.590V11mVCELL1放电
4h3.597V3.593V4mV关闭
6h3.595V3.594V1mV保持

从数据能看出一个特点:均衡期间高压电芯的电压一直在缓慢下降,低压电芯几乎不动,所以压差在收窄。4小时后压差掉到4mV,低于关闭阈值,程序关闭均衡。此时整组并没有充满,均衡只是让两节电芯的电量“切线”拉平了,后续再靠充电回路把整组带上去。这一点很多刚接触均衡的人会误解,以为均衡结束后两节电芯都应该在同一个高电压,其实被动均衡只降不升。

另一个值得注意的点是,4到6小时间压差没有反弹,说明最初的25mV压差主要来自静置自放电差异,不是内阻伪差。如果关闭均衡后压差快速弹回,那就要检查是不是采样点接到均衡电阻后面、在线电压判断被误导了。

4.2 坑一:均衡期间采到的电压偏低,导致均衡反复启停

第一次联调时发现一个奇怪现象:开启均衡后,下一次采样显示CELL1电压猛降,压差瞬间从25mV变成18mV再变成8mV,于是程序关闭均衡;关掉后CELL1电压又慢慢回升,压差又超过20mV,均衡再次打开。整个波形像锯齿一样,永远消不掉。

当时我先怀疑软件滤波没写好,加了滑窗滤波还是不行。后来用示波器直接量MP2642GR-Z的采样输入引脚,才明白问题出在硬件时序上:均衡MOS导通的瞬间,大电流流过均衡电阻和采样路径上的公共阻抗,采样点被拉低;等读取电压的时候,电压已经不是真实OCV了。

解决办法很简单:采样和均衡分时。每次读电压前先关断均衡30ms到50ms,让电芯电压恢复一下,然后再采样,采样完再重新打开均衡。这套“先断开、后采样、再恢复”的时序写进状态机后,锯齿波形就消失了。如果你的AFE内部集成了同步采样,也可能不需要这么麻烦,但无论如何,都不应该在均衡导通的同时读取作为均衡判据的电压值。

4.3 坑二:低温下均衡MOS关不断,电压缓慢下掉

低温试验时又踩了一个坑。把板子和电芯放进-20℃环境箱,跑均衡停止之后,电流钳显示均衡电流还有大约50mA的漏流,CELL1电压在“均衡结束”后仍在缓慢下降。第一感觉是MOS坏了,换了几颗还是这样,说明不是单个器件问题。

用示波器看栅极波形,发现PIC24HJ输出关断电平只有0.2V左右,但这时MOS的栅源极电压还悬在阈值边缘,并没有被真正夹断。我选的MOS是普通逻辑电平高边P-MOS,开启阈值大概在2.5V,低温下阈值漂移后,栅极必须被拉到更低的电位才能保证彻底关断。

解决办法是两处:一是把MOS换成低阈值、带明确关断规格的型号,确保1.8V以下可靠夹断;二是在栅源之间加一个10k下拉电阻,同时软件里每周期固定把均衡使能引脚输出锁存为低电平,而不是只靠往AFE寄存器里写一次配置。从那以后,不止低温,在电源上电瞬间MOS误开的问题也一并解决了。

4.4 坑三:备用电源切换瞬间SPI通信读到0xFF

备用电源最核心的动作是市电断电后自动切到电池输出,可偏偏就在切换瞬间,PIC24HJ的SPI读到了一大串0xFF,均衡策略直接误动作,保护中断也被触发。这个坑最隐蔽,因为平时测试通信完全正常,只有大电流切换时才复现。

排查过程我分三步走。第一步怀疑SPI线路太长,但缩短距离后问题依旧;第二步拿示波器看切换瞬间,发现MP2642GR-Z的供电引脚出现了明显跌落,SPI的SCK和MOSI波形边缘带着振铃;第三步确认了根因:AFE的电源和主功率回路共用了较长的PCB走线,切换时直流母线大电容充电,地平面被顶起来,AFE瞬间复位。

修复方案是硬件和软件一起上。硬件上,AFE电源入口加RC滤波和一颗TVS,SPI三根线串联22Ω电阻靠近接收端,数字地和功率地做单点汇合。软件上,SPI每次读取连续读三遍,两次结果一致才采用,否则丢弃这一帧。加了这层冗余之后,我再用电子负载反复模拟切换,通信错误率降到了零。

4.5 两个不能省的安全设计

均衡板再小,也不能省安全设计。我在这块板子上保留了至少两处“独立于MCU”的保护。

第一是AFE的过压欠压保护必须直连主回路功率开关,不经过MCU。PIC24HJ虽然有硬件看门狗,但固件跑飞后恢复需要时间,而磷酸铁锂过充到危险电压可能就在十几秒内发生。MP2642GR-Z这类前端芯片内部有比较器,可以直接把故障信号送到功率链路,这才是最后一道防线。

第二是均衡电阻的温度监测。1A左右均衡电流通过3.3Ω电阻时,功耗接近4W,电阻外壳温度可以轻松超过80℃。如果板子密封在电池柜里,热量还可能传导到NTC温度采样点,让系统误判电池过热。我在均衡电阻旁边加了一颗热敏电阻,温度超过90℃就自动降占空比,降到30%还压不住就直接关闭均衡并上报。这个小设计后来确实救了一次长时间满载均衡的现场。

最后说一个我吃了亏才记住的习惯:均衡结束后,不要立刻让PIC24HJ256GP610进入休眠。程序里保留20分钟静置窗口,回读两节电芯电压并写入EEPROM。很多均衡板看起来“已经完成”,其实只是电压瞬间一致,回弹后差值又回来了。把这20分钟的数据存下来,作为下一次均衡周期起始判断的参考,比盲目定时执行可靠得多。这套MP2642GR-Z加PIC24HJ256GP610的两串方案,后来也做了几次改版;如果你做的是更大容量的备电柜,只要把每片前端芯片的片选、中断和地线梳理清楚,两串均衡的思路一样能往更多串联级扩展。希望这篇记录能帮你少走一点弯路。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进