☰
2S电池组主动均衡方案:基于MP2642与STM32的硬件设计及状态机实现
2026/10/15 1:50:25 网站建设 项目流程

这两年做储能和备用电源的项目,感触最深的一个环节就是电池均衡。2S电池组看着简单,真正把均衡逻辑做得可靠,比想象中要麻烦不少。我这套方案用的是MP2642GR-Z这颗专用均衡芯片配合STM32L021K4这颗超低功耗MCU,对两个串联电池单元做主动均衡,折腾完一个完整的工程样机,把硬件设计、软件状态机、调试过程都记录下来,给正在做类似方案的同行做个参考。

1. 2S电池组的均衡为什么是个真问题

1.1 一致性漂移的根源

两块电芯出厂时同批次、同容量,装进一个电池包用上几个月,电压就开始分道扬镳。原因不外乎三个:电芯制造过程中的涂布厚度和电解液浸润量存在微小差异;电池包内部两节电芯位置不同,靠近发热器件的温度高,自放电率不一样;循环使用后内阻增长速度不同,导致同样的电流下压降不同。

在储能系统和备用电源里,这个不一致性会被放大。串联充电时电流相同,容量小的那节先充满;串联放电时也是电流相同,容量小的那节先欠压。结果是整组电池的可用容量被最弱的一节绑架,充电不敢充满,放电不敢放尽,长期下来容量损失越来越大。

1.2 被动均衡在储能场景下不够用

被动均衡是最简单的方式:高电压那节并联一个电阻,把多余能量以热量形式放掉。成本低、控制简单,但问题也很明显。均衡电流做不大,通常几十毫安,对容量几十瓦时级别的电池组来说,一个浮充周期根本搬不动多少电荷。电流做大一点,电阻发热又压不住,给电池包内部散热带来很大压力。

储能和备用电源的需求不太一样。备用电源平时浮充,电池容量一般有5到10Ah,被动均衡那点电流在浮充电压下几乎不起作用。主动均衡用高频功率变换把电荷从高电压电芯搬到低电压电芯,不靠发热泄放,均衡电流可以做到200毫安以上,一个小时能搬0.2到0.3Ah,几个周期下来能把压差拉回正常范围。

1.3 为什么是专用芯片加通用MCU的组合

主动均衡的功率拓扑有很多种,常见的是电容飞渡和电感式。电容飞渡简单,但电荷转移效率低、均衡电流小。电感式Buck-Boost方案效率高、电流可控,就是电路复杂,开关管驱动、电流检测、死区控制这些都是硬骨头。

MP2642GR-Z的价值在于把功率级和驱动控制收进一颗芯片里,外部只需要一颗功率电感、采样电阻和滤波电容。MCU不需要直接管MOSFET开关时序,只需要给它方向和电流设定值。STM32L021K4在这里的作用是做决策端:采样两节电池电压、判断均衡方向、监控故障状态、控制均衡启停。这颗MCU的功耗非常低,闲置时进入Stop模式电流可以做到微安级别,对备用电源这种绝大多数时间待机的应用很关键。

2. 硬件架构与关键细节

2.1 整体信号流设计

整个系统信号流不复杂。STM32L021K4的ADC先采集两节电池电压和采样电阻上的电流信号,经过软件滤波判断出哪节电压高、压差多大。需要均衡时,MCU通过GPIO控制均衡芯片的使能脚、方向脚和电流设定引脚。均衡芯片自己跑功率变换,再把状态信号返回给MCU。

方向控制是硬件设计里最容易搞反的地方。我习惯把方向脚的高电平定义为Cell1向Cell2转移能量,低电平为Cell2向Cell1转移。切换方向前必须先拉低使能脚,等功率级完全关断后再改方向,最后重新使能。不要在均衡运行中直接切换方向,电感里的续流电流很容易把开关管打穿。

2.2 均衡芯片外围参数选择

MP2642GR-Z外围最重要的元件就是那颗功率电感。电感量直接影响纹波电流和效率。均衡电流目标300mA的话,电感感值取22微亨到33微亨比较合适。感值太小,纹波大、峰值电流高,电感更容易饱和;感值太大,体积和直流电阻都上去了。

计算电感感值的关键公式是:

L = V × D × T / ΔI

其中V是单体电压,D是占空比,T是开关周期,ΔI是允许的纹波电流。比如开关频率400kHz、单体电压3.7V、占空比0.5、纹波控制100mA,算出来L约等于46微亨。实际选型时留一点余量,还要重点看电感的饱和电流,至少是峰值电流的1.5倍以上才稳妥。

输入输出电容选择低ESR的陶瓷电容,X7R材质,容量10到22微法。放置位置要紧贴芯片的功率引脚,不要走太长过孔绕路,否则开关尖峰噪声会直接串进采样电路。

2.3 电池电压采样链路

电压采样直接影响均衡判断的准确性,这里值得多说几句。两节电池电压要分压后进ADC,分压电阻阻值不能取太大。虽然MCU功耗低,但分压网络如果直接跨接在电池两端,长时间待机时会产生持续漏电。我在实际项目中给分压网络串联了一个受控MOSFET开关,只有采样时才把分压网络接通,采样完毕立刻断开,待机功耗能降下来一个量级。

分压比按照满充电压来设计。例如磷酸铁锂单体满充3.65V,两节串联满充7.3V,分压后的最高电压不要超过ADC参考电压。分压电阻总阻抗控制在几百千欧以内,ADC采样时间选最大档,确保采样电容能充分充电。不然源阻抗太大,采样值会偏差几十毫伏,这个误差足以让均衡状态机误判。

2.4 布局布线的优先级

功率地和采样地一定要分开走。均衡芯片的地引脚、电感底部焊盘、输入输出电容组成功率回路,这条回路面积要尽可能小。采样电路的地单点接到系统参考地,不要串进功率回路里,否则采样电阻上的瞬态压降会污染电池电压读数。

还有一点容易忽略:电感选屏蔽式还是非屏蔽式。均衡电感属于高频功率器件,非屏蔽式电感的漏磁会耦合到旁边的采样走线和ADC引脚,导致采到的电压带纹波。我建议优先用屏蔽式功率电感,或者至少让采样线远离电感本体,间距保持5毫米以上。

3. 软件状态机的设计与实现

3.1 采样滤波的基本功

STM32L021K4的ADC是12位,直接读出来的值做均衡判断肯定不行,至少要经过两层处理。第一层是多次采样取中值,我每个采样点连读3次取中间值,能滤掉偶发的尖峰干扰。第二层是移动平均,取最近5次的中值做算术平均,把低频纹波压下去。

电池电压采集中还有一个容易踩的坑:极化电压。电池刚充完电或刚放完电,表面电压和真实开路电压差距很大。均衡判断如果基于极化状态下的电压,很容易误判方向,把电荷从真正需要充电的电芯搬走。我这边处理方式是在进入均衡前先静置一段时间,至少等电池电压稳定下来再判断。备用电源系统平时本身处于静置状态,这个条件天然满足。

3.2 迟滞窗口与方向判断

均衡的启动和停止条件要设置不一样的阈值,形成迟滞窗口。假设启动阈值30毫伏、停止阈值10毫伏,当压差超过30毫伏时启动均衡,压差降到10毫伏以下且持续稳定一段时间才停止。如果启动和停止用同一个阈值,压差在临界点附近波动时,均衡会在启停之间来回震荡,对电芯极其不利。

方向判断就是拿两节电压做差。差值大于启动阈值,方向为高电压那节向低电压那节转移。这里要注意绝对值比较,不要因为接线习惯搞反了正负方向。我把方向逻辑独立成一个函数,枚举两个方向状态,避免直接操作方向引脚电平,降低编码出错概率。

3.3 状态机结构

均衡控制我用了一个五状态状态机:空闲、预充、运行、暂停、完成。

空闲状态下不做任何均衡操作,周期比较压差,判断是否满足启动条件。预充状态是给均衡芯片上电后的短暂过渡期,先设定一个小电流,等200毫秒左右确认芯片状态脚正常、电流反馈没有异常,再把电流升到目标值进入运行状态。运行状态下每100毫秒检查一次压差和温度,向暂停和完成状态迁移。暂停状态用于处理异常,比如温度过高或电压突变,暂停后条件恢复可以回到运行。完成状态记录均衡完成标志位,保存到Flash。

状态机的核心代码如下,我简化了外围逻辑方便理解:

typedef enum { BAL_STATE_IDLE = 0, BAL_STATE_PRECHARGE, BAL_STATE_RUN, BAL_STATE_PAUSE, BAL_STATE_DONE } bal_state_t; bal_state_t bal_state = BAL_STATE_IDLE; uint16_t bal_th_on_mv = 30; uint16_t bal_th_off_mv = 10; uint16_t bal_max_time_min = 120; void bal_state_machine(void) { uint16_t cell1_mv = adc_get_cell1_mv(); uint16_t cell2_mv = adc_get_cell2_mv(); int16_t delta = cell1_mv - cell2_mv; switch (bal_state) { case BAL_STATE_IDLE: if (abs(delta) > bal_th_on_mv) { bal_set_direction(delta > 0 ? DIR_CELL1_TO_CELL2 : DIR_CELL2_TO_CELL1); bal_set_current(100); mp2642gr_z_enable(1); bal_state = BAL_STATE_PRECHARGE; } break; case BAL_STATE_PRECHARGE: if (bal_precharge_tick >= 200) { if (mp2642gr_z_stat_ok()) { bal_set_current(300); bal_state = BAL_STATE_RUN; } else { mp2642gr_z_enable(0); bal_state = BAL_STATE_IDLE; bal_error_count++; } } break; case BAL_STATE_RUN: if (abs(delta) < bal_th_off_mv && bal_run_tick >= 5000) { mp2642gr_z_enable(0); bal_state = BAL_STATE_DONE; } else if (bal_run_tick >= bal_max_time_min * 60000) { mp2642gr_z_enable(0); bal_state = BAL_STATE_IDLE; bal_error_count++; } else if (bal_temp_over_limit()) { mp2642gr_z_enable(0); bal_state = BAL_STATE_PAUSE; } break; case BAL_STATE_PAUSE: if (!bal_temp_over_limit()) { mp2642gr_z_enable(1); bal_state = BAL_STATE_RUN; } break; default: break; } }

这个状态机的几个关键点值得展开说。停止条件同时要求压差低于阈值和保持时间超过5秒,这个时间延迟很重要。电芯在一个均衡循环后表面电压会有一个短暂的回落反弹过程,不加延迟直接停机,压差马上就回弹到启动阈值以上,导致反复启停。超时保护的意义在于防止电池内部出问题时均衡无限运行,把时间耗在无效发热上。

3.4 低功耗调度与安全逻辑

备用电源系统大部分时间不干活,MCU不能一直跑着响应均衡状态机。我这里用的方案是LPTIM定时唤醒,每分钟唤醒一次,采集两节电池电压,跑一轮状态机判断,没有均衡需求就继续进入Stop模式。整个唤醒采样过程大约十几毫秒,平均功耗可以压到很低的水平。

安全逻辑方面需要做几手准备。MCU内部看门狗要独立于均衡状态机运行,防止异常死循环把均衡芯片长期挂在运行状态。均衡芯片的使能脚在硬件上要加一个下拉电阻,MCU死机后引脚悬空也会被拉到关断状态。还有一个容易忽略的点:均衡芯片状态异常时要进入错误计数逻辑,连续几次异常就断开均衡并上报,不要每次异常都自动恢复,否则隐患一直被掩盖。

4. 调试过程中的关键参数记录

4.1 开关频率与电感的匹配

均衡芯片的工作频率通常可以通过外部电阻设定。频率选高了,电感体积可以缩小,但开关损耗增加,芯片和外围元件温升上来了。频率选低了,纹波电流大,对电感饱和电流要求高。我这边实际操作下来,400kHz是一个比较平衡的工作点,电感用33微亨,纹波电流大约七八十毫安,整体温升在可接受范围内。

用示波器抓电感前端的开关节点波形,能看到开通沿和关断沿之间有明显的死区时间。死区太短,上下管直通,电流尖峰直接爆表;死区太长,效率下降。这个参数一般由均衡芯片内部逻辑保证,但外部电感选型不当时,开关节点会出现严重的振铃,叠加在采样信号上。

4.2 均衡电流与热平衡

均衡电流的设定值不是越大越好。300毫安是我在大多数情况下推荐的值,均衡效果和热耗之间比较均衡。电流太小,压差收敛太慢,一个均衡周期要四五个小时;电流太大,电感、芯片、采样电阻的发热都上去,局部温升可能超过10摄氏度,反而加剧电池包内部温度不平衡。

均衡电流的设定可以通过PWM信号或外部电阻实现。我用的PWM配合RC积分输出模拟电压的方式,好处是MCU可以动态微调电流,预充阶段给一个小电流,正常运行再升上去。坏处是PWM频率不能太低,RC积分后的纹波要在毫伏级别,否则均衡电流会跟着PWM抖动。

4.3 实测压差收敛过程

拿两颗同批次磷酸铁锂电芯做测试,放电后SOC差约18%,静置两小时后开路电压差约120毫伏。设置300毫安均衡电流,跑了2小时20分钟左右,压差降到18毫伏。这时候我以为可以停了,结果静置半小时,压差又回弹到25毫伏左右,再开均衡跑约40分钟,才算稳定在10毫伏以内。

这个回弹现象是极化电压在起作用。均衡前期电流持续流过电池,电化学极化使得端电压不能真实反映SOC差,停止均衡后极化逐渐消退,真实压差才显出来。所以我后来把停止判据改成了压差低于10毫伏且保持5秒以上,其实条件还可以更严,保持几秒钟确保了均衡真正到位。

4.4 常见调参问题速查

参数调试阶段最容易出问题的集中在几个地方。电压采样不准会导致误均衡,这时候优先检查分压网络供电开关有没有完全开通,RC滤波稳定时间够不够。均衡电流上不去,重点检查电感有没有饱和、电流采样电阻阻值有没有漂移。均衡过程中芯片发热严重,要查开关节点波形看振铃是否异常,还有PCB上功率回路面积是否过大。

调参现象可能原因处理方向
压差降到阈值附近后均衡反复启停迟滞窗口过窄、停止判据无时间延迟扩大停止阈值,增加保持时间
均衡电流与设定值偏差大ISET滤波电容太小、PWM纹波大增大RC时间常数,提高PWM频率
采样值随负载波动地线污染、采样点离功率回路近单点接地,走线远离功率回路
静置后压差明显回弹停止时极化未消退增加极化静置时间,延长均衡保持判据

5. 常见故障与排查实操

5.1 均衡启动即报错

状态机进入预充阶段后芯片状态脚一直不正常,最直接的原因往往是使能脚时序不对。MCU的GPIO初始化和均衡芯片上电时序冲突,导致芯片在供电还没有稳定时就被强制使能。排查方法很简单,用示波器同时抓使能脚和电源轨,看波形时序是否正确。使能脚的电平在电源稳定后再拉高,这里可以加一个延时。

还有一种情况是电池电压超出芯片的输入范围。两节串联电池组如果其中一节已经是严重过压状态,整体电压接近芯片耐压上限,芯片会触发保护。这时候硬件上需要更早的过压保护先动作,不要等均衡芯片来报错。

5.2 采样电压跳变导致误判

电压采样跳变的来源按优先级排查:第一是地线噪声,功率回路瞬间电流变化在寄生电感上产生电压尖峰,耦合进采样地;第二是分压网络没有真正断开,均衡芯片工作时的开关纹波通过分压电阻串进ADC引脚;第三才是ADC本身配置问题。

我踩过一次坑:分压网络的受控MOSFET开关关断后,残留在采样电容上的电荷通过ADC引脚缓慢泄放,导致关机状态下ADC偶然唤醒采样到一个虚假的偏高电压。解决方式是采样前先对采样通道做一次接地放电,再开始正式采样。

5.3 均衡时芯片和电感温度偏高

正常情况下均衡过程中芯片外壳温度比环境温度高20摄氏度以内。如果超过这个范围,先看电感有没有饱和。电感饱和时电流尖峰上升,开关损耗急剧增加,芯片温度随之飙升。用示波器看开关节点电流波形,正常是三角波,饱和后变成尖峰状,这时候直接换饱和电流更大的电感。

死区时间异常也会导致温升。虽然死区一般由芯片内部控制,但如果外围元件选错,比如高边自举电容失效,高边开关无法完全导通,死区期间体二极管长时间续流,损耗大幅增加。

5.4 低功耗模式下待机电流异常

待机电流比数据手册值大很多,往往是外围电路没跟着断电。分压网络、均衡芯片、指示灯、调试串口,任何一个接在电池正负极上的器件都会贡献待机电流。均衡芯片即使被禁用,如果它的输入电源没有真正断开,静态电流还是在耗电。

我建议在硬件设计阶段就给分压网络和均衡芯片的电源分别设计独立的受控开关,MCU进入低功耗模式前统一关闭。这样调试低功耗时才能逐个排查节点的电流贡献。

6. 均衡策略的工程经验总结

做完整套方案,我对电池均衡的认知从“把电压弄平”变成了“把不一致性控制住”。均衡不是修复电池的手段,它改不了电芯本身的内阻和容量差异,只能延缓漂移趋势,延长电池组有效使用寿命。产品定义阶段就要想清楚这个边界,不要对均衡模块抱太多不切实际的期待。

均衡时机选择上,我强烈建议尽量在电池组静置或浮充阶段执行,不要在深度放电过程中做均衡。放电过程中极化电压干扰大,电压读数不可靠,而且此时电池本身在输出大电流,均衡电流加上放电电流,电池温度叠加会更高。备用电源系统平时一直挂在浮充母线旁边,每天定时唤醒做一次均衡判断,效果比连续不停跑要好得多。

最后分享一个关于均衡完成判据的小技巧:不要单纯看瞬间压差,而是看压差稳定后再持续一段时间。这个时间段内如果压差没有重新拉开,说明电芯之间的SOC确实已经被拉到足够接近,后面即使极化消退也不容易回弹。我把这个逻辑放在状态机的完成条件里之后,均衡效果的可重复性明显好转。

这个方案如果后续要多串扩展,MP2642GR-Z这类芯片可以做级联,多颗均衡芯片分别管理相邻电池单元对,MCU只需要扩展采样通道和方向控制。如果应用场景从备用电源转到便携储能,均衡策略可以复用,主要把精力花在浮充判断和充电末端均衡上就行。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询