ARTICLE · INTELLIGENCE

战地情报 · 详情页

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

基于MP2642GR-Z与STM32F429NI的两串电芯被动均衡BMS设计实战

基于MP2642GR-Z与STM32F429NI的两串电芯被动均衡BMS设计实战

1. 从两个串联电芯说起:为什么被动均衡在储能BMS里依然是主流选择

储能和备用电源系统里,电池组通常由多节电芯串联而成,目的是把电压堆到逆变器或直流母线需要的水平。但串联结构有个绕不开的麻烦:每节电芯出厂时的容量、内阻、自放电率就有细微差异,用久了差异还会被放大。充电时,容量最小的那节最先到达上限;放电时,它又最先跌到下限。整组电池的可用容量,实际上被最弱的那节电芯卡死了。

解决这个问题的思路分两条路:被动均衡和主动均衡。主动均衡用变压器、电感或电容把能量从高电压电芯搬到低电压电芯,效率高,但电路复杂、成本高、占板面积大。被动均衡则是给电压偏高的电芯并联一个耗散电阻,把多余的能量以热量形式放掉。听起来很“浪费”,但在中小容量储能和备用电源场景里,被动均衡的可靠性、成本和设计简洁度优势非常明显。

我这次要聊的方案,就是用MP2642GR-Z这颗均衡前端芯片,配合STM32F429NI主控,对两个串联电池单元做被动均衡。两颗电芯的串联结构在备用电源里很常见,比如小型UPS、通信基站备电、光伏储能的小型电池包。选这个组合的原因很直接:MP2642GR-Z 集成了均衡开关和驱动,外围器件少;STM32F429NI 有足够的定时器、ADC和通信接口,能同时管采样、均衡逻辑和上位机通信。

注意:被动均衡的本质是“削峰”,不是“补谷”。它只能把高电压电芯的能量放掉,不能给低电压电芯充电。所以均衡策略的核心是判断“什么时候该放、放多久、放到什么程度”。

这篇文章会从芯片选型逻辑、硬件连接、均衡控制算法、STM32固件实现、实测数据与踩坑记录几个角度展开。如果你正在做两串电芯的BMS,或者想理解被动均衡从原理到落地的完整链路,下面的内容可以直接参考。

2. MP2642GR-Z 与 STM32F429NI 的选型逻辑与硬件连接细节

2.1 为什么是 MP2642GR-Z 而不是分立MOS方案

分立方案做被动均衡,通常需要一颗MOSFET、一个均衡电阻、一个栅极驱动电阻,再加采样电路。两串电芯就是两套,看起来不复杂,但实际布板时会遇到几个问题:MOSFET的栅极驱动电压需要和电芯电压匹配,高边电芯的驱动参考点会浮动;均衡电阻的功耗和散热要单独算;采样和均衡如果共用引脚,还要考虑时序隔离。

MP2642GR-Z 把均衡MOSFET和驱动集成在芯片内部,外部只需要接均衡电阻和少量滤波电容。它的工作电压范围覆盖两串锂电的典型电压区间,均衡电流通过外部电阻设定,芯片本身负责开关控制和状态反馈。对我这种追求“少器件、少故障点”的场景来说,集成方案的优势很实在。

选型时我重点看了三个参数:均衡电流能力、导通电阻、以及和STM32的接口方式。MP2642GR-Z 的均衡电流由外部电阻决定,公式是 I = V_cell / R_balance,但实际还要考虑芯片内部开关的导通电阻。假设单节电芯电压3.7V,想做到100mA均衡电流,外部电阻大约取37Ω,但芯片内部导通电阻会分走一部分压降,所以实际电阻要略小一点。这个计算在后面实测部分会再验证。

2.2 STM32F429NI 在这个方案里承担的角色

STM32F429NI 是Cortex-M4内核,主频180MHz,有丰富的外设。在这个两串均衡方案里,它主要做四件事:

  • 通过ADC采集两节电芯的电压,判断哪节偏高
  • 控制MP2642GR-Z的均衡通道开关
  • 管理均衡策略,比如启动阈值、停止阈值、最大均衡时间
  • 通过UART或CAN把状态上报给上位机

选F429NI而不是更小的MCU,主要是考虑到后续扩展。两串均衡本身用F103都够,但F429NI的浮点单元和更多定时器资源,方便后面加温度采样、电流积分、甚至简单的SOC估算。而且F429NI的ADC精度和采样速率在电池电压采集场景里够用,12位分辨率配合外部基准,单节电压采集误差可以控制在几毫伏以内。

2.3 硬件连接:从电芯到芯片再到MCU

两串电芯的硬件连接需要特别注意参考地的问题。电芯串联后,BAT-是系统参考地,BAT1+是第一节正极,BAT2+是第二节正极也是整组正极。MP2642GR-Z 的均衡通道分别对应这两节电芯,但高边通道的参考点是BAT1+,不是BAT-。如果布板时把高边通道的地接错,均衡开关会一直导通或者完全不受控。

我采用的连接方式是:

  • 电芯1正负极分别接MP2642GR-Z的CELL1+和CELL1-
  • 电芯2正负极分别接CELL2+和CELL2-
  • 每节电芯的均衡电阻跨接在对应的CELL+和CELL-之间,但实际是芯片内部开关串联外部电阻
  • 芯片的通信或控制引脚通过电平转换或直接连到STM32的GPIO

提示:高边电芯的电压采集和均衡控制,如果直接用STM32的ADC采集,需要做分压或者用差分放大器。我这次用的是电阻分压加跟随器的方式,分压比1:1,把第二节电芯的电压降到ADC量程内。分压电阻的精度直接影响采集误差,建议用0.1%的电阻。

PCB布局上,均衡电阻的散热要留够铜皮。100mA电流在37Ω电阻上功耗是0.37W,两颗电阻就是0.74W,如果板子空间小,电阻温升会很明显。我实际用的是2512封装的电阻,底部铺铜散热,实测温升在30℃左右,可以接受。

3. 均衡策略设计:阈值、回差与时间控制的工程取舍

3.1 启动阈值和停止阈值为什么不能设成同一个值

最朴素的均衡逻辑是:如果两节电芯压差超过某个值,就打开高电压那节的均衡开关,直到压差降到零。但实际调试时会发现,如果启动阈值和停止阈值相同,比如都是20mV,均衡开关会在阈值附近反复开关,形成振荡。原因是均衡电阻一打开,电芯电压会因为负载效应瞬间下降,压差变小,开关关闭;关闭后电压又回升,压差再次超过阈值,开关又打开。

解决方法是设置回差,也就是滞环。比如启动阈值设为30mV,停止阈值设为10mV。压差超过30mV时启动均衡,压差降到10mV以下才停止。这样在10mV到30mV之间,均衡状态保持不变,避免了频繁开关。

我实测下来,回差设20mV比较合适。太小了还是会振荡,太大了均衡结束后的压差偏大,影响整组容量。具体取值还要看电芯特性和均衡电流大小。均衡电流越大,电压跌落越明显,回差需要相应加大。

3.2 均衡电流的选择:不是越大越好

均衡电流决定了均衡速度,也决定了热耗散。假设两节电芯容量差1%,电芯容量是10Ah,那么容量差是100mAh。如果均衡电流是100mA,理论上需要1小时才能把容量差补平。如果均衡电流是200mA,时间减半,但功耗翻倍。

选择均衡电流时要考虑几个因素:

均衡电流均衡电阻单电阻功耗适用场景
50mA约74Ω0.185W小容量备用电源,散热受限
100mA约37Ω0.37W中等容量储能,常规散热
200mA约18.5Ω0.74W大容量电池包,强制散热

我这次选的是100mA,原因是备用电源的电池包容量不大,100mA均衡电流在几小时内能把典型压差拉平,同时电阻功耗在2512封装的可承受范围内。如果电池包容量更大,或者均衡时间要求更短,可以加大电流,但必须重新评估散热。

注意:均衡电流不是恒流,它随电芯电压变化。电芯电压高时电流大,电压低时电流小。计算均衡时间时要用平均电流,不能直接用初始电压算。

3.3 最大均衡时间限制:防止过放和过热

被动均衡有个风险:如果某节电芯因为自放电异常或者采样故障,电压一直偏高,均衡开关会一直打开,把这节电芯放到过放。所以固件里必须加最大均衡时间限制。我的做法是单次均衡连续时间不超过30分钟,超过后强制关闭,等待一段时间再重新判断。如果压差依然存在,再启动下一轮。

这个30分钟不是随便定的。它要大于正常均衡所需时间,又要小于电芯过放的时间窗口。对于10Ah电芯和100mA均衡电流,30分钟能转移50mAh容量,相当于0.5%的容量差。如果压差对应的容量差超过这个值,一轮均衡不够,需要多轮。多轮之间的间隔让电芯电压恢复稳定,避免误判。

另外,均衡电阻的温度也要监控。如果板子上有NTC,可以定期读温度,超过85℃就暂停均衡。没有NTC的话,至少要在固件里限制最大占空比,比如均衡30秒、停10秒,降低平均功耗。

4. STM32F429NI 固件实现:从ADC采样到均衡状态机

4.1 ADC采样与电压换算的精度控制

STM32F429NI 的ADC是12位,参考电压我用的是外部3.3V基准。两节电芯的电压范围分别是3.0V到4.2V,第二节电芯叠加后是6.0V到8.4V。直接采集第二节电芯会超过ADC量程,所以必须分压。

第一节电芯电压在3.0V到4.2V之间,可以直接采集,但为了统一,我也用了1:1分压,实际到ADC的电压是1.5V到2.1V。第二节电芯经过1:2分压后,到ADC的电压是1.5V到2.1V。这样两路ADC的输入范围一致,换算公式也统一。

ADC采样用DMA加定时器触发,采样率设为1kHz,每100个样本做一次均值滤波。这样既能滤掉开关噪声,又不会引入太大延迟。电压换算公式:

#define VREF 3.3f #define ADC_RES 4096.0f #define DIV_RATIO 2.0f // 分压比 float cell_voltage = (adc_value / ADC_RES) * VREF * DIV_RATIO;

实测下来,用0.1%分压电阻,ADC采样误差在±5mV以内。对于均衡阈值30mV来说,这个精度够用。如果要求更高,可以用外部ADC或者校准。

4.2 均衡状态机的设计

均衡逻辑我用一个简单的状态机实现,状态包括:IDLE、BALANCING_CELL1、BALANCING_CELL2、COOLDOWN。

  • IDLE:定期采集电压,计算压差。如果压差超过启动阈值,且没有超时,进入对应均衡状态。
  • BALANCING_CELLx:打开对应均衡通道,持续采集电压。如果压差降到停止阈值以下,或者均衡时间超过30分钟,关闭通道,进入COOLDOWN。
  • COOLDOWN:等待一段时间,比如10秒,让电芯电压恢复稳定,然后回到IDLE。

状态转换的关键是电压采集要在均衡关闭时进行,否则负载效应会导致误判。我的做法是在BALANCING状态下,每隔一段时间关闭均衡开关几毫秒,采集电压,再打开。这个“采样窗口”要足够短,不影响均衡效果,又要足够长,让ADC完成转换。实测5ms的关闭时间就够。

typedef enum { STATE_IDLE, STATE_BALANCING_CELL1, STATE_BALANCING_CELL2, STATE_COOLDOWN } balance_state_t; balance_state_t state = STATE_IDLE; uint32_t balance_start_time = 0; uint32_t cooldown_start_time = 0; void balance_task(void) { float v1 = get_cell1_voltage(); float v2 = get_cell2_voltage(); float diff = v1 - v2; switch(state) { case STATE_IDLE: if (diff > START_THRESHOLD) { enable_balance_cell1(); state = STATE_BALANCING_CELL1; balance_start_time = HAL_GetTick(); } else if (diff < -START_THRESHOLD) { enable_balance_cell2(); state = STATE_BALANCING_CELL2; balance_start_time = HAL_GetTick(); } break; case STATE_BALANCING_CELL1: if (diff < STOP_THRESHOLD || (HAL_GetTick() - balance_start_time) > MAX_BALANCE_TIME) { disable_balance_cell1(); state = STATE_COOLDOWN; cooldown_start_time = HAL_GetTick(); } break; // 类似处理CELL2和COOLDOWN } }

4.3 通信与状态上报

STM32F429NI 通过UART把均衡状态上报给上位机,波特率115200。上报内容包括:两节电芯电压、压差、当前状态、均衡累计时间、板载温度。数据格式用简单的文本协议,方便调试。

printf("V1=%.3f,V2=%.3f,Diff=%.3f,State=%d,Time=%lu,Temp=%.1f\r\n", v1, v2, diff, state, balance_time, board_temp);

如果需要更可靠的通信,可以改用CAN。F429NI有CAN控制器,配合收发器就能用。CAN的抗干扰能力比UART强,适合储能系统这种电磁环境复杂的场景。

5. 实测数据与踩坑记录:从振荡到稳定收敛

5.1 第一版固件的振荡问题

第一版固件我把启动阈值和停止阈值都设成20mV,结果均衡开关在压差20mV附近反复开关,频率大概几赫兹。用示波器看均衡电阻两端电压,能看到明显的脉冲。这个问题在3.1节已经分析了原因,解决办法就是加回差。改成启动30mV、停止10mV后,振荡消失。

但回差加大后,均衡结束时的压差是10mV左右,比之前大了。这10mV的残余压差对整组容量的影响很小,可以接受。如果追求更小的残余压差,可以减小停止阈值,但要注意采样精度和噪声。我的ADC噪声峰峰值大约3mV,停止阈值设10mV是合理的下限。

5.2 高边电芯采样受均衡干扰

调试时发现,当均衡第二节电芯时,第一节电芯的采样值会跳动,跳动幅度大概10mV。原因是均衡电流在PCB走线上产生压降,影响了参考地。解决方法是把采样地和功率地分开,单点接地。具体做法是:ADC的模拟地单独走线,在芯片下方单点连接到电池负极。均衡电阻的电流回路尽量短,不要和采样走线平行。

改板后,采样跳动降到2mV以内。这个坑很典型,凡是涉及电流和采样的混合系统,地线处理都是关键。

5.3 均衡电阻温升与长期可靠性

100mA均衡电流下,37Ω电阻功耗0.37W。我用热成像仪看了下,2512封装电阻表面温度在65℃左右,环境温度25℃。这个温升在可接受范围,但如果是密闭外壳,环境温度可能到50℃,电阻温度会到90℃,接近降额上限。

长期运行的话,建议用更大封装的电阻,或者两个电阻并联分担功耗。我后来改成两个75Ω电阻并联,等效37.5Ω,每个功耗0.185W,温升明显降低。虽然多了一个器件,但可靠性提升值得。

5.4 均衡效果实测

用两节容量差2%的电芯做测试,初始压差45mV。启动均衡后,压差逐渐下降。前10分钟下降较快,因为电芯电压高,均衡电流大。后面下降变慢,因为电压降低,电流减小。整个过程用了约50分钟,压差降到8mV,均衡停止。静置30分钟后,压差稳定在6mV。

这个结果说明,100mA均衡电流对2%容量差的两串电芯,大约1小时能拉平。如果容量差更大,或者要求更快,需要加大电流或延长均衡时间。

时间压差状态
0min45mV启动均衡
10min28mV均衡中
30min15mV均衡中
50min8mV停止均衡
80min6mV静置后

6. 从两串到多串:这个方案的扩展边界与注意事项

两串均衡是最简单的场景,但实际储能系统往往是多串。MP2642GR-Z 本身支持多节串联,STM32F429NI 的GPIO和ADC资源也够扩展。但多串之后,几个问题会变得突出。

首先是高边电芯的电压采集。两串时,第二节电芯的分压采集还比较简单。到了四串、八串,高边电芯的共模电压会很高,电阻分压的误差和温漂会累积。这时候建议用专用的电池采样前端,或者用隔离放大器。MP2642GR-Z 如果支持菊花链,可以用隔离通信把多颗芯片串起来,减少MCU的ADC通道压力。

其次是均衡策略的复杂度。两串时只需要比较两节电压,多串时需要找最高和最低,或者设定一个目标电压,对高于目标的电芯均衡。算法从两两比较变成排序或求极值,固件复杂度上升。但核心逻辑不变:采样、判断、开关、超时保护。

最后是热管理。多串同时均衡时,总功耗是单串的N倍。如果八串同时以100mA均衡,总功耗接近3W,全部变成热量。PCB布局时要把均衡电阻分散开,避免热集中。必要时加风扇或者导热垫。

提示:多串系统的均衡电流不一定要每串都做到100mA。可以根据电芯容量和均衡时间要求,适当降低单串电流,用更长的均衡时间来换取更低的热耗散。

这个方案我从两串验证到四串扩展,核心代码和硬件架构没有大改,主要是增加了采样通道和状态机的分支。如果你也在做类似的项目,建议先把两串调稳,把采样精度、回差、超时保护这些基础打牢,再往多串扩展。基础不牢,多串之后问题会成倍放大。

个人实操体会

被动均衡看起来简单,但真正调稳需要关注很多细节。采样精度决定了阈值能不能设小,地线处理决定了均衡时采样会不会跳,散热决定了能不能长期可靠运行。我踩过的坑里,最值得分享的是:不要迷信仿真,实际板子上的噪声和温升往往和理论计算有差距。留足够的调试余量,比一开始就追求最优参数更实际。

RELATED READING

延伸阅读

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