ARTICLE · INTELLIGENCE

战地情报 · 详情页

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

两串锂电池主动均衡实战:STM32F302+MP2642方案解析

两串锂电池主动均衡实战:STM32F302+MP2642方案解析

大家做储能或者备用电源,最容易忽略的往往不是那些大的功能模块,而是电池本身的细节处理。这篇文章想聊一个看起来很“小”、实际上很要命的问题:两个串联电池单元的均衡。我调试过的某便携储能样机、某通信备电模块,都用过一套组合方案——主控用 STM32F302VC,均衡功率链路用 MP2642GR-Z,专门解决双节串联锂电池组在长期使用中电压发散的问题。

为什么说它要命?因为两串电池系统一旦单体电压跑偏,过充过放、容量衰减、甚至安全风险都会接踵而来。尤其是磷酸铁锂这种放电平台特别平坦的电池,单纯靠电压判断SOC本来就不准,如果连均衡都不做,系统到后期基本是“一个电芯扛全队”。

这套方案适合谁?做中小容量储能BMS的硬件/固件工程师,或者想给自家双节锂电产品补上均衡功能的开发者。看完你至少能知道:均衡电路为什么这么搭、软件策略怎么设计才不出幺蛾子、现场调试会踩哪些坑。

1. 方案概览:两串电池到底为什么越用越不平衡

1.1 不一致性来源不是玄学

很多人有个误区,觉得新电芯出厂配好了,装在一起就没事了。实际上两节电芯的差异从一开始就存在,只是被系统的“容量余量”掩盖了。

首先,电芯出厂容量本身就有离散度。同一批次标称10Ah的电芯,实测容量可能分别是10.05Ah和9.95Ah,差值0.3%以内还算好,但循环几百次之后这个差异会被放大。其次,自放电率不同。长期静置时,自放电流大的那节电芯电压天然偏低,而且这个差异会持续累积。再有就是温度不均匀,比如两节电芯一节靠近散热风道,一节挨着功率电感,温度差个两三度,内阻和老化速度都不一样。

用数据说话:假设两节电芯初始容量差0.3%,充放电电流相同的情况下,每轮循环的SOC差会累积约0.3%。如果不做任何均衡,循环500次后,潜在的SOC偏差能到5%以上。5%对于10Ah电池来说就是0.5Ah的电荷量差异,反映到电压上可能就是几十毫伏甚至上百毫伏。

这些差异在抽屉里放着不会自己消失,它们只会在充电末端和放电末端集中爆发。所以在2S系统里做均衡,不是“锦上添花”,而是“救命稻草”。

1.2 不平衡的后果与安全风险

两串电池组是“木桶效应”的典型场景。充电时,电压高的那节先顶到保护电压,BMS必须停充,另外一节却还没充满,系统永远充不满;放电时反过来,电压低的那节先跌到欠压值,BMS断电保护,另外一节的能量全剩在电池里。整体容量始终由最弱的那节电芯决定。

更麻烦的是安全风险。长期过充会让正极结构发生变化,析锂风险上升;长期过放会让负极集流体溶解,内阻升高,然后进入恶性循环——内阻越高的电芯充放电压降越大,SOC偏差被进一步放大。

我在某个备电项目里就遇到过这样的情况:两节磷酸铁锂串联,由于长时间浮充加上环境温度偏高,其中一节电压被顶到3.65V以上,另一节只有3.35V,整组电池保护后直接无法正常备电。换掉电芯后发现,真正的根因不是电芯坏了,而是系统根本没有均衡机制,电压发散后把电芯“用”坏了。这就是我们常说的“电芯死于不均衡”。

1.3 为什么用“MCU+专用均衡芯片”而不是全分立

早些年确实有人用全分立方案做两串均衡:两个MOS、几个电阻、一颗比较器,硬搭一个耗散型均衡电路。优点是便宜,缺点是精度差、一致性差、调试痛苦。手动电位器校准这种操作在实验室里还能忍,到了生产线上完全不可复制。

所以现在主流做法是“MCU+专用均衡芯片”的组合。MP2642GR-Z这类均衡控制芯片,把功率开关、电流反馈、保护逻辑这些核心电路集成在内部,外围只需要搭功率电感、采样电阻和少量被动元件,就能构成一个可控的能量转移通道。而STM32F302VC这类带丰富模拟外设的MCU,则负责电压采样、策略判断、保护逻辑和人机交互。

选STM32F302VC还有一个很现实的原因:它内部带运算放大器。做双节电池电压采样,如果用普通MCU,你得在外部加仪表放大器或者差分放大器,成本高还占面积。F302内置运放加12位ADC,刚好够用。而且它内核是Cortex-M4,带FPU,后期算滤波、算SOC虽然用不上太多算力,但写代码的手感比M0+好太多。

2. 均衡原理与核心指标

2.1 被动均衡与主动均衡的取舍

均衡分两大类:被动均衡和主动均衡。

被动均衡的原理最简单,高电压单体通过并联电阻放电,把多余能量以热量形式损耗掉。优点是电路简单、成本低、好调试;缺点是效率低,能量白白浪费,而且均衡电流一大,PCB和电池本体都得承受额外温升。在小容量两串系统里,被动均衡勉强能用,但一旦均衡电流超过100mA,散热问题就很头疼。

主动均衡则讲究“能量搬运”。把高电压单体的一部分能量,通过开关变换器转移到低电压单体,而不是烧掉。效率高、发热小,但电路复杂度明显提高,需要开关管、电感、控制逻辑,成本也上去了。

储能和备电场景对效率是敏感的。备电系统通常长期处于浮充状态,被动均衡意味着均衡电阻长期耗电,功耗可观;储能系统则希望每一次充放电循环的能量都能被利用。所以,只要预算允许,两串系统的主动均衡是更合理的选择。MP2642GR-Z的定位就是解决这个需求,它把“搬运”这个动作的功率级做成专用电路,MCU只需要指挥它干活就行。

2.2 MP2642GR-Z 在双串联系统中的工作方式

从应用角度看,MP2642GR-Z在双节串联电池组里的角色,就像是一个受控的双向电荷泵或者升降压变换器核心。它负责把高电压电池的能量先抽出来,储存在功率电感中,再切换到低电压电池侧释放,从而完成一次“抄家式”的能量搬运。

具体怎么搬运并不需要开发者完全关心芯片内部拓扑,重点在于应用层如何组织“检测、判定、搬、停”这套动作。MP2642GR-Z通常提供使能控制和状态反馈,STM32F302VC通过这些引脚量控制均衡的开启和关闭,同时根据ADC采样结果决定当前应该往哪个方向搬、搬多久。

外围设计上,功率电感是核心元件。电感值决定开关纹波和峰值电流,饱和电流则必须留足余量。采样电阻负责提供电流反馈,阻值和温漂直接影响均衡电流的一致性。芯片的电源去耦、滤波电容、保护电阻,也要严格按照规格书来,因为均衡芯片对电源纹波比较敏感,我后面会专门说。

2.3 均衡电流、效率和电压窗口怎么算

做主动均衡,首先要定均衡电流。假设我的系统是两节10Ah磷酸铁锂串联,均衡电流选0.5A。这不是拍脑袋定的,而是综合了发热、搬运时间和PCB面积。

能量搬运不是无损的。MP2642GR-Z这类芯片升降压效率大概在85%到92%之间。按90%算,从高电压侧抽取0.5A,低电压侧实际能得到的电流大约是0.45A,差额大约0.05A折算成热损耗,在0.5A工况下发热量大概0.5到1W。这个热量需要PCB铺铜和散热设计来带走,如果均衡电流改成1A,损耗翻倍,很多小板子就吃不消了。

压差阈值怎么设?被动均衡一般20mV就启动,因为电阻耗散没什么代价,无非多烧点电。主动均衡不一样,每启动一次,开关切换、电感储能、控制逻辑都会有一次瞬态损耗,频繁启停不划算。所以我实际用的策略是:压差超过30mV启动,回差降到10mV停止,中间再加一个延时去抖,防止临界点反复切换。

搬运时间估算也有公式。假设高低单体SOC差1%,对应电荷量就是0.1Ah。净搬运速率是0.45A,那么理论上搬平需要13分钟左右。实际中因为压差越接近均衡后期差异越小,需要的总时间会更长,而且等静置后重新测压差,极化电压消失,电压读数还会变。所以均衡从来不是一个“搬一次就结束”的动作,策略要持续监测、持续修正。

3. 硬件设计的关键细节

3.1 单体电压采样:精度会决定均衡质量

均衡的本质是跟电压较真,所以采样精度是整套系统的地基。如果采样电路在几十毫伏级别发飘,那后面所有均衡逻辑都是空中楼阁。

两串系统里,一节电芯的负端在系统参考地上,另一节电芯的负极则挂在中间电位上,直接把电池端电压接入MCU的ADC会超过输入共模范围。我见过很多入门者直接拿电阻分压后接ADC,结果大电流时采样值疯狂跳变。正确的做法是使用差分或者伪差分结构,把两个单体的电压分别调理到以MCU地为准的0到3.3V范围内。

STM32F302VC内部的运算放大器在这里就能派上用场。用内置OPAMP构成差分放大电路,配合外部精密电阻分压网络,把单体电压映射到ADC量程内。F302的内置运放不是仪表放大器,输入端共模范围有限,所以分压比要算好,让运放输入始终处于安全范围。

还有一个老生常谈但很容易踩的坑:增益和失调的校准。电阻总有误差,运放总有失调电压,12位ADC本身也不是绝对线性。如果不做校准,两个通道的增益差个0.1%,读出来的压差可能就是几毫伏到十几毫伏的假误差。解决办法是出厂前用精密电压源做两点校准,把每个通道的增益系数和失调存到EEPROM或Flash里,每次上电自动修正。这个步骤在实验室里看似麻烦,但量产时没有它,均衡精度根本没法保证。

3.2 采样滤波与噪声抑制

采样电路必须加一阶RC滤波。电池端电压本身是缓慢变化量,但系统里开关电源、均衡开关切换、负载突变都会带来高频干扰。RC截止频率我习惯设在1kHz左右,既能滤掉开关纹波,又不至于让电压响应慢到跟不上策略节奏。电容值选100nF级别,电阻选几kΩ,具体数值按芯片的ADC采样时间要求来。

滤波还有第二层,就是软件滤波。硬件RC只能滤高频,低频噪声和工频干扰要靠软件。常用的是滑动平均加中值滤波,窗口长度取16个点。F302的12位ADC对单体电压的原始分辨率大约1.1mV(以4.5V满量程算),过采样四倍等效分辨率能提高到0.3mV以下,对均衡判断来说足够了。

这里有个实际体会:均衡开启的瞬间,芯片内部开关切换会产生近场噪声,如果采样正好卡在这个时点,ADC读出的电压可能跳变几百毫伏。解决思路是错开时间采样——均衡开关动作后等待至少100微秒再启动ADC转换,同时软件里丢到采样序列前几个异常值。这个时序上的“躲”,比任何增加滤波电容都有效。

3.3 关键元器件与PCB布局

功率电感的选择,第一看饱和电流,第二看直流电阻。饱和电流至少要留到均衡电流的1.5倍以上,比如0.5A均衡电流,电感饱和电流不能低于0.75A,我实际会选1A以上的,留足裕量应对瞬态过流。DCR当然越小越好,DCR越大,同样的均衡电流下热损耗就越大。

采样电阻必须是低温漂合金电阻,最好用4端子连接,避免焊盘铜箔参与感阻。别小看这个细节,一度我在某个项目里发现采样出来的均衡电流比设定值偏小10%,查到最后是采样电阻焊盘太宽,PCB铜箔电阻跟采样电阻并联了,相当于把采样电阻值拉低了几毫欧,导致反馈失真。

布局方面,功率回路要短粗:MP2642GR-Z、功率电感、采样电阻、电池端子的环路面积要尽量小,大面积铺铜走功率路径。模拟采样部分要远离功率电感,避免磁耦合干扰。供电去耦上,芯片的电源引脚建议磁珠加22uF陶瓷电容的组合,这个不是拍脑袋,均衡芯片内部有比较器,对电源轨上的尖刺非常敏感,去耦不到位会出现均衡误触发或者电流失控。

还有一个非常容易被忽略的热设计点。主动均衡虽然效率高,但0.5A持续工作下,芯片加电感加采样电阻的整体耗散功率在0.5到1W。这些热量如果集中在某个区域,会对电池温度采样造成干扰。NTC测温点绝对不能放在均衡功率器件旁边,否则测出来的“电池温度”会虚高,触发误保护。

4. 软件控制逻辑与工程实现

4.1 均衡状态机设计

软件层面,均衡控制的第一步是搭状态机。我的习惯是分成四个状态:空闲、测量、均衡中、等待迟滞。

空闲状态下,系统只做周期性电压巡检,不启动任何均衡动作。测量状态下,软件对两个单体电压做滤波和校准,计算压差。当压差大于启动阈值时,进入均衡状态,芯片使能打开,开始搬运能量。搬运过程中持续监测两侧电压,当压差小于停止阈值时,进入等待迟滞状态,此时均衡已经关闭,但是系统保持一定时间的观察,确认压差确实稳定,再回到空闲状态。

这个“等待迟滞”很关键,没有它,均衡会在阈值边界反复启停,芯片开关管的应力加大,系统也显得很不稳定。我用的参数是:启动阈值30mV,停止阈值10mV,迟滞观察时间30秒。

伪代码大概长这样:

typedef enum { EQ_IDLE, EQ_MEASURE, EQ_BALANCING, EQ_HYSTERESIS } EQ_State; void eq_task(void) { switch (state) { case EQ_IDLE: if (system_ready && voltage_delta > EQ_START_THRESHOLD) { state = EQ_MEASURE; } break; case EQ_MEASURE: cell[0] = get_filtered_voltage(0); cell[1] = get_filtered_voltage(1); delta = (cell[0] > cell[1]) ? (cell[0] - cell[1]) : (cell[1] - cell[0]); if (delta > EQ_START_THRESHOLD) { eq_direction = (cell[0] > cell[1]) ? DIR_0_TO_1 : DIR_1_TO_0; enable_balancer(eq_direction); state = EQ_BALANCING; } else { state = EQ_IDLE; } break; case EQ_BALANCING: if (delta < EQ_STOP_THRESHOLD) { disable_balancer(); delay_start = HAL_GetTick(); state = EQ_HYSTERESIS; } break; case EQ_HYSTERESIS: if (HAL_GetTick() - delay_start > 30000) { state = EQ_IDLE; } break; } }

实际工程里还会加入均衡超时保护:单次连续均衡最多30分钟,超过就强制关闭,让系统散热。这个参数可以做成可配置项,根据电池容量和环境温度动态调整。

4.2 电压滤波与校准实现

滤波这块刚才在硬件章节提到了一部分,软件里我建议做两级处理:第一级滑动平均,窗口长度16点,用于滤除随机噪声;第二级是中值滤波,窗口长度5点,用于剔除偶发的离群值。两级配合使用,算出的单体电压偏差可以稳定在几个毫伏以内。

校准是另一个关键点。每次上电,我对两个采样通道做一次软件校零:先关闭均衡,短接采样输入或者读一次已知的参考电压,算出失调。增益标定则通过开机时读取一个精密分压网络产生的参考电压来完成。这两个系数都存到非易失区,后续每次采样都做一次线性修正。

有一个细节:F302的ADC在低温下的偏置漂移比较明显,如果设备要在户外低温环境运行,建议在温度变化超过10度后重新做一次通道校准。否则低温下采样误差可能会涨到二三十毫伏,均衡策略就会误判。

4.3 保护逻辑与通信设计

均衡系统不是独立工作的,它必须跟充放电管理、温度保护、通信互联集成在一起。我的保护逻辑包括:过压保护、欠压保护、过温保护、均衡超时保护。

过压保护优先级最高。只要任意单体电压超过过压阈值,均衡必须立即停止,因为你再搬运电荷,可能把高压侧继续顶上更高的电位。欠压保护同理,低电压侧如果已经接近欠压,不能再从这个方向抽出能量。

温度保护不能只看平均值。两节电芯各放一个NTC,分别监测各自温度。任何一节温度超过限定值,均衡关闭,回到空闲状态。只有两个温度都回到安全区间并持续一段时间,均衡才允许重新启动。

通信方面,我给F302VC预留了CAN接口。备电系统里上位机需要知道当前电池状态,尤其是“是否正在均衡”“压差多大”“均衡电流多少”。这些信息通过CAN周期上报,一方面方便监控,另一方面方便现场调试时用上位机实时调整阈值。没有CAN的场合,退一步用UART或I2C也行,但备电领域CAN还是最省心的。

5. 实测表现与避坑经验

5.1 实测中的均衡过程

我用两节磷酸铁锂电芯做过一组模拟测试。测试前电芯静置充分,实测压差48mV,高电压侧电芯明显比低电压侧SOC高。开启主动均衡,设定均衡电流0.5A,方向从高电芯向低电芯转移。

前15分钟压差下降比较快,从48mV降到了20mV左右。这是因为SOC差在平台区映射为较小的压差,能量转移初期效果显著。之后下降速度变慢,到了20分钟左右压差降到15mV,进入回差区间,均衡自动关闭,进入迟滞观察。30秒后重新测量,压差稳定在12mV左右,系统回到空闲状态。

这个过程中芯片和电感表面温度大约上升了10度左右,没有触发过温保护,整板摸上去温温的。连续进行三次循环后,两节电芯的压差被控制在10mV以内,系统整体一致性明显改善。

5.2 常见问题与对策速查

我把调试中遇到过的典型问题整理成了一个速查表,方便大家遇到类似现象时直接对号入座。

故障现象常见原因处理办法
均衡开启瞬间电压采样跳变开关噪声耦合进采样回路采样延时避开开关时刻,加强RC滤波
压差越均衡越大两个采样通道增益不一致做两点校准,修正增益系数
均衡反复启停,无法稳定迟滞窗口过小或没有去抖延时加大回差,增加延迟观察时间
芯片温度异常升高功率电感饱和电流不足换更大饱和电流的电感
均衡电流比设定值偏低采样电阻焊盘分流改用4端子连接,缩小焊盘铜箔宽度
低温环境下误触发高温保护NTC离功率器件过近将NTC移到电芯表面,远离均衡热点
静置后压差反弹极化电压消失导致真实电压偏差暴露属正常现象,拉长均衡时间窗口,多轮循环修正

5.3 一条最值得说的坑

最后分享一个我印象最深的调试经历。

某个备电项目,均衡板在低温环境下频繁触发高温保护,但板子摸上去明明不热。一开始怀疑是NTC型号不对,查半天发现NTC布局被放到了功率电感的正下方——均衡工作时电感铜损发热,热量往上跑,NTC测到的温度比电池本体高将近十度。低温环境下电池本来就容易触发低温限流,再加上这个虚假的高温读数,系统就出现“又冷又热”的矛盾保护。

后来把NTC从PCB上移走,用引线贴到电芯表面,问题立即消失。这件事给我的教训是:热敏元件的位置有时候比热敏元件本身更重要。做均衡系统,热量管理和电气管理同样重要,尤其是两串这种小系统,功率器件和电芯挤在一块板上,任何局部的热点都可能误导系统的温度判断。

说点实在的体会

做了几个双串均衡项目之后,我最大的感受是:均衡系统好不好用,跟芯片性能和MCU算力关系没那么大,真正决定成败的是采样精度、阈值策略和热管理这些“慢功夫”。STM32F302VC算力完全够用,MP2642GR-Z的功率链路也足够可靠,但如果不做通道校准、不设回差、不处理NTC布局,再好的硬件也白搭。

如果你正在做类似的2S系统,我建议你先把单体电压采样精度做到5mV以内,再谈均衡策略。另外,主动均衡不是一锤子买卖,它可以做得更智能,比如结合SOC估算或者充电末期的电压斜率来判断搬运量,这些都是在基础均衡跑稳定之后很自然的扩展方向。

RELATED READING

延伸阅读

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