ARTICLE · INTELLIGENCE

战地情报 · 详情页

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

基于MP2642与STM32的两串电池主动均衡方案设计与实现

基于MP2642与STM32的两串电池主动均衡方案设计与实现

1. 储能电池均衡的工程背景与核心需求

1.1 为什么两串电池组需要主动均衡

做储能和备用电源的兄弟都清楚,电池组最怕的不是单节性能差,而是串联之后的不一致。两节电芯出厂时容量、内阻、自放电率就有微小差异,经过几十上百次充放电循环后,这种差异会被放大——容量小的那节先充满、先放空,整组可用容量就被它拖死了。更危险的是,充电时容量小的那节已经到4.2V了,另一节可能才4.0V,如果继续恒压充电,前者就会过充,轻则鼓包,重则热失控。

两串架构在便携储能、小型UPS、太阳能路灯、医疗备用电源里非常常见。相比四串、八串,两串的均衡电路成本敏感度更高,但安全性要求一点不低。被动均衡靠电阻放电,效率低、发热大,在两串大容量场景下基本不够看;主动均衡能把高电压电芯的能量搬到低电压电芯,效率能做到85%以上,这才是正经方案。

1.2 MP2642GR-Z 与 STM32F071VB 的角色分工

这套方案里,MP2642GR-Z是一颗双向同步Buck-Boost控制器,专门为两串电池主动均衡设计。它内部集成了四个MOSFET驱动,配合外部电感就能实现能量在上下两节电芯之间的双向转移。关键参数:输入电压范围2.7V到20V,支持I2C编程,开关频率可设,均衡电流能到5A级别。封装是QFN-26,占板面积小,适合紧凑型BMS。

STM32F071VB是ST的Cortex-M0主力,48MHz主频,128KB Flash,16KB RAM,带I2C、SPI、USART、12位ADC。它在这套系统里干三件事:一是通过I2C配置MP2642的工作模式、均衡电流、保护阈值;二是采集两节电芯的电压、温度,做逻辑判断;三是跟上层系统通信,上报状态、接收指令。

选F071VB而不是更便宜的F030,是因为均衡算法需要一定的运算余量,而且F071VB的ADC采样速率和I2C外设更稳,工业级温度范围也够用。下面这张表把两颗芯片的核心参数对齐一下:

项目MP2642GR-ZSTM32F071VB
核心功能双向Buck-Boost均衡控制器系统主控MCU
供电范围2.7V-20V2.0V-3.6V
通信接口I2CI2C/SPI/USART
关键外设4路MOS驱动、电流采样12位ADC、定时器
封装QFN-26LQFP48
保护特性OVP/UVP/OCP/OTP看门狗、低功耗模式

1.3 适用场景与目标读者

这套方案适合做2串锂离子/磷酸铁锂电池组的主动均衡,典型应用包括:500Wh以内的便携储能、通信基站备用电源、AGV小车电池包、太阳能储能路灯。目标读者是嵌入式硬件工程师、BMS开发人员、储能产品定义者。如果你正在选型两串均衡方案,或者手头有MP2642但不知道怎么跟MCU配合,这篇内容能直接抄作业。

注意:MP2642GR-Z的I2C地址由ADDR引脚决定,默认0x60,但不同批次可能不同,上电第一件事是扫描I2C总线确认地址。

2. 硬件设计与关键参数计算

2.1 外围电路拓扑与电感选型

MP2642GR-Z的外围电路不复杂,但电感选错整个均衡效率就崩了。典型应用电路是:两节电芯串联,中间节点接电感一端,电感另一端接芯片的SW引脚,芯片内部通过控制四个MOS管实现Buck-Boost。均衡电流从高电压电芯流向低电压电芯时,芯片工作在Buck模式;反向时工作在Boost模式。

电感值计算公式:

L = (Vbat × (1 - D)) / (fsw × ΔIL)

其中Vbat取单节电芯电压3.7V,D是占空比,fsw设500kHz,ΔIL取均衡电流的30%。假设均衡电流2A,ΔIL=0.6A,算下来L≈4.7μH。实际选型用4.7μH/5A的屏蔽电感,饱和电流要大于峰值电流的1.5倍,DCR越小越好,建议小于20mΩ。

2.2 采样电阻与电流检测精度

均衡电流的检测靠一颗10mΩ/1%的采样电阻,放在电感和电芯之间。MP2642内部有电流放大器,增益固定50倍,采样电压送到芯片的CS引脚。10mΩ电阻在2A电流下产生20mV压降,放大后1V,正好落在ADC最佳量程。

这里有个坑:采样电阻的温漂直接影响均衡电流精度。普通厚膜电阻温漂100ppm/°C,温度升高50°C,阻值变化0.5%,电流误差就上来了。建议用合金电阻,温漂25ppm/°C,虽然贵一点,但均衡一致性有保障。

2.3 STM32F071VB的ADC采样与基准

F071VB的ADC是12位,参考电压用内部1.5V或外部3.3V。测电芯电压时,两节电芯串联最高8.4V,不能直接进ADC,必须用电阻分压。分压比设1/3,8.4V变成2.8V,留足余量。分压电阻用1%精度的,100kΩ+50kΩ,功耗控制在100μA以内。

温度采样用10kΩ NTC,跟100kΩ电阻分压,接到ADC另一通道。NTC的B值选3950,-40°C到125°C范围内线性度够用。代码里用查表法或者Steinhart-Hart公式换算温度,实测误差能控制在±1°C。

提示:ADC采样时一定要开过采样,F071VB支持硬件过采样,16次平均后有效位数能到14位,电压分辨率从0.8mV提升到0.2mV,对均衡判断帮助很大。

3. 均衡控制策略与软件实现

3.1 均衡启动条件与阈值设定

均衡不是随时都开的,乱均衡反而会加速电池老化。我的策略是:静置状态下,两节电芯压差大于30mV才启动均衡;充电时压差大于50mV启动;放电时压差大于80mV启动。为什么放电时阈值更高?因为放电时电压波动大,压差大不一定是真实不一致,可能是负载瞬态导致的。

阈值设定还要考虑回差。比如启动阈值30mV,停止阈值设10mV,避免在阈值附近反复启停。这个回差逻辑用软件实现,状态机里加一个balance_active标志位。

3.2 MP2642GR-Z的I2C配置流程

MP2642的寄存器不多,但上电顺序有讲究。我的初始化流程是这样的:

  1. 上电后延时100ms,等芯片内部LDO稳定
  2. 读DEVICE_ID寄存器,确认通信正常
  3. 写CONFIG寄存器,设开关频率500kHz,使能双向模式
  4. 写ILIM寄存器,设均衡电流上限2A
  5. 写OVP/UVP寄存器,设过压4.25V、欠压2.8V
  6. 写OTP寄存器,设过温保护85°C
  7. 最后写CTRL寄存器,使能均衡,但此时BALANCE_EN位先不置1

关键点:配置寄存器必须在使能均衡之前完成,否则芯片可能用默认参数跑一瞬间,产生大电流冲击。我试过先使能再配置,结果电感啸叫,电流冲到4A,差点烧MOS。

3.3 状态机设计与故障处理

软件用一个五状态机:IDLE、BALANCING、FAULT、CHARGE、DISCHARGE。IDLE状态下每500ms采样一次电压温度;BALANCING状态下每100ms采样,动态调整均衡电流;FAULT状态下关闭均衡,上报错误码。

故障处理要分等级:过温是可恢复故障,温度降到75°C以下自动恢复;过压是严重故障,必须等电压降到4.1V以下且收到清除指令才恢复;I2C通信失败连续3次就进FAULT,尝试重新初始化。

typedef enum { STATE_IDLE, STATE_BALANCING, STATE_FAULT, STATE_CHARGE, STATE_DISCHARGE } SystemState; void balance_task(void) { static uint32_t last_tick = 0; uint16_t v1 = adc_get_voltage(CELL1); uint16_t v2 = adc_get_voltage(CELL2); int16_t diff = v1 - v2; switch(sys_state) { case STATE_IDLE: if (abs(diff) > 30) { mp2642_set_current(abs(diff) * 10); mp2642_enable_balance(); sys_state = STATE_BALANCING; } break; case STATE_BALANCING: if (abs(diff) < 10) { mp2642_disable_balance(); sys_state = STATE_IDLE; } else { mp2642_set_current(abs(diff) * 10); } break; // ... 其他状态处理 } }

3.4 均衡电流的动态调整

均衡电流不是越大越好。小压差用大电流会过冲,压差从30mV直接掉到-20mV,来回振荡。我的做法是:压差大于100mV时用2A,50-100mV用1A,30-50mV用0.5A,10-30mV用0.2A。这样均衡过程平滑,不会过冲。

MP2642的电流设置是通过I2C写ILIM寄存器,步进100mA。实际写进去的值要跟采样电阻匹配,10mΩ电阻对应满量程5A,写50就是5A,写20就是2A。注意寄存器值跟实际电流的线性度,我实测在0.5A以下偏差较大,所以最小均衡电流设0.2A。

4. 实测数据与问题排查

4.1 均衡效率与温升实测

用两节18650电芯,初始压差200mV,环境温度25°C,均衡电流设1A。实测数据:

时间(min)上节电压(V)下节电压(V)压差(mV)芯片温度(°C)
03.953.7520026
53.893.818042
103.863.842048
153.853.85045

均衡效率算下来约87%,芯片最高温度48°C,电感温度52°C,都在安全范围内。效率损失主要来自MOS导通损耗和电感DCR,如果想再提升,换更低DCR的电感,或者降低开关频率到300kHz。

4.2 常见问题速查表

现象可能原因排查方法解决措施
均衡不启动I2C通信失败示波器看SCL/SDA波形检查上拉电阻,确认地址
均衡电流偏小采样电阻阻值漂移万用表测电阻实际值换合金电阻,重新校准
芯片发热严重开关频率过高测SW引脚波形降到300kHz,加大散热铺铜
压差振荡均衡电流过大观察电压曲线降低电流,加回差逻辑
ADC读数跳动参考电压不稳测VREF引脚加100nF+10μF滤波
过温误报NTC接触不良测NTC阻值重新焊接,加导热硅脂

4.3 踩过的坑与避坑经验

第一个坑:电感啸叫。刚开始用非屏蔽电感,均衡时听到滋滋声,示波器看SW波形有振铃。换成屏蔽电感后解决,同时SW引脚加RC吸收电路,10Ω+1nF。

第二个坑:I2C死锁。MP2642在异常情况下会把SDA拉低不放,导致总线死锁。解决方法是加I2C复位电路,用MCU一个GPIO控制MOS管给SDA放电,或者用I2C多路复用器隔离。

第三个坑:ADC采样时机。均衡工作时SW引脚开关噪声会耦合到ADC,导致电压读数偏差20mV。后来改成在均衡间歇期采样,或者加RC滤波,100Ω+100nF,截止频率16kHz,把500kHz噪声滤掉。

第四个坑:低温均衡。0°C以下锂离子电芯内阻增大,大电流均衡会导致电压骤降,触发欠压保护。我的做法是低温下限制均衡电流到0.5A,或者干脆等温度升上来再均衡。

注意:MP2642GR-Z的散热焊盘必须接到大面积铺铜,最好打过孔到背面地平面。我第一版PCB散热焊盘只接了细线,芯片温度直接飙到90°C,重新铺铜后降到50°C。

4.4 扩展思路:从两串到多串

两串方案跑通后,如果想扩展到四串,有两种路子:一是用两颗MP2642,分别管上下两串,MCU通过I2C多路复用器切换;二是换多串专用均衡芯片,但成本会上去。我的建议是,四串以内用两颗MP2642堆叠,性价比最高,软件上把状态机扩展成多实例就行。

另外,STM32F071VB的Flash还有富余,可以加历史数据记录功能,把每次均衡的起止时间、压差变化、温度曲线存到Flash里,方便后期分析电池健康状态。这个功能在售后排查时特别有用,能直接看出电池是不是已经严重不一致了。

最后分享一个小技巧:均衡电流的步进调整不要用固定值,用压差的平方根。比如压差200mV,电流设2A;压差50mV,电流设1A;压差10mV,电流设0.45A。这样均衡速度更快,过冲更小。我实测下来,200mV压差均衡到10mV以内,用平方根策略比固定步进快30%左右。

RELATED READING

延伸阅读

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