第一次接触这个需求时,我心里其实是犯嘀咕的:两节电池串在一起,有必要专门上一颗均衡芯片再加一个主控去管吗?随便一块带均衡的保护板不都能应付?但真正在储能和备用电源项目里跑过一段时间后,我的结论反过来了——双串电池的均衡,恰恰是所有串联结构里最难做得“恰到好处”的一个环节。它不涉及多高的算法难度,却直接决定整组可用容量、循环寿命和安全性。
这套方案我最终落地的形态很简单:MP2642GR-Z 负责把高能量单体里的电荷往低能量单体里搬,STM32F446RE 负责判断什么时候搬、搬多久、以及搬完之后的闭环验证。整篇文章围绕的就是这五个字:怎么搬得准。我会把硬件设计分工、均衡策略、固件状态机和实际踩过的坑全部摊开讲,适合正在做 2S 电池包管理、储能模块、后备电源系统的朋友直接参考。
1. 为什么2S电池组也要专门做均衡:储能和备电场景最容易被忽略的木桶短板
1.1 双串结构里的“木桶效应”到底有多亏
很多人觉得 2S 电池组只有两个单体,容量小的那节和容量大的那节放一起,顶多损失一点点容量。这个直觉在消费类小电池上可能还说得过去,但在储能和备用电源的循环深度下,根本不是“一点点”的事。
假设两节 100Ah 的磷酸铁锂串联,出厂时自放电率略有差异,静置三个月后实际容量一个 100Ah、一个 97Ah。充电的时候,97Ah 的那节先达到充电截止电压,系统为了保护电池必须停止充电,整组只能充到 97Ah。放电时同样,97Ah 的先放空,系统停止放电,整组也顶多放出 97Ah。也就是说,3% 的单体容量差异,直接变成整组容量损失,而且这个损失在每次深度循环中都会被重复放大。更麻烦的是,长期不一致意味着每次放电低容量单体都会比另一个更早接近过放边界,极化内阻增大、局部温升上升,老化速度进一步被拉开差距。这是一个正反馈恶化过程。
我在储能场景中更关注的其实是“浮充期不一致”。备用电源绝大多数时间处于浮充状态,浮充电压施加在整串电池组上,等于给两个“性格不同”的单体硬灌同一个外部电压。自放电率高的那节承受的实际过充程度更深,析气、腐蚀、容量衰减都会加速。这个时候如果不做均衡,表面上看电池电压都正常,实际上某一节已经在慢性损伤了。
1.2 无源均衡与主动均衡的本质差异:能量是“烧掉”还是“搬走”
传统锂电池保护板上的被动均衡方案,原理是在每个单体上并联一个放电电阻。当管理系统发现某节电压偏高时,就把这节多余的能量通过电阻直接烧成热量消耗掉。这种方案的优点非常突出:电路简单、成本极低、控制逻辑清晰。缺点同样明显:均衡电流受限于电阻功耗,通常只有几十毫安,且只在充电阶段才有机会消耗能量。对储能和备电这类喜欢长时间搁置在浮充状态下的系统来说,被动均衡几乎等于“慢性挂水”,作用有限得很。
主动均衡的思路则完全不同。它不把能量浪费掉,而是通过电力电子变换手段,让高电压单体里的电荷“搬”到低电压单体里去。这样一次均衡动作,既拉低了高电量单体,又抬高了低电量单体,能量利用率高,均衡电流也可以做得比被动方案大得多。这种差异就好比两个水桶,被动均衡是拿瓢把高桶里的水往地上泼,主动均衡是拿水泵把水抽到矮桶里。前者看着也在处理问题,后者才是真正在做系统优化。
回到 2S 这个特定场景,主动均衡的价值更容易体现:两节电池压差达到 50mV 时,主控决定开启均衡,电荷在两节之间来回搬运,整个过程不依赖充电器是否在线,系统无论是充电、放电还是静态待机,都能按需工作。这也是我最后选择 MP2642GR-Z 这类开关电容均衡芯片的根本原因。
2. 器件选型与系统分工:MP2642GR-Z 和 STM32F446RE 各管哪一段
2.1 MP2642GR-Z 的开关电容均衡原理与外圈电路
MP2642GR-Z 是一颗针对双节串联电池设计的开关电容型主动均衡芯片。理解它的工作不需要把内部电路抠得太细,抓住“电荷泵”三个字就够了。
芯片内部集成了受控的开关管,外部只需要配置一颗飞跨电容。均衡过程分成两个阶段:第一阶段,内部开关把飞跨电容并联到电压较高的电池两端,让电容充电到近似该节电池的电压;第二阶段,开关组翻转,把飞跨电容改接到电压较低的电池两端。由于此时飞跨电容两端的电压比低电压单体的端电压高,电荷就会从电容流向该电池,从而完成一次“从高到低”的能量搬运。开关管按一定频率不断重复这两个状态,就形成了持续的均衡电流。
均衡电流的大小可以用一个粗略的工程公式估算:
Ibal ≈ 2 × f × CF × ΔV其中 f 是开关频率,CF 是飞跨电容容量,ΔV 是两节电池当前的压差。以我的手头调试板为例,飞跨电容选 22uF,压差 50mV 时,实测均衡电流大概在 70~90mA 这个量级,和估算值能对上。这也意味着一个客观规律:电池压差越大,搬得越快;压差越小,搬得越慢。接近均衡终点时速度自然放缓,不会出现“冲过头”的问题。这种物理特性天然适合均衡控制,不需要额外做复杂的闭环限流。
外围电路方面,MP2642GR-Z 需要的元件非常少:飞跨电容、电源去耦电容、必要的采样/保护电阻,再加上使能控制引脚。整套均衡功率级不涉及电感,这对板上的 EMI 和布局面积都很友好。没有电感意味着没有续流、振铃、磁饱和这些电感和变换器设计中常见的头疼问题,原型阶段调试压力小很多。板子上核心位置留出来,周围布上电容和三两个电阻,均衡功率部分就完成了。
2.2 STM32F446RE 的角色定位:决策大脑而非执行机构
如果 MP2642GR-Z 是干活的手,STM32F446RE 就是决定什么时候干活的脑。芯片本身只管按开关模式搬运电荷,它并不知道当前时刻适不适合均衡、均衡多久、以及均衡结果是否达标。这些判断必须由外部主控负责。
STM32F446RE 在 F4 系列里属于性价比较高的型号,Cortex-M4F 内核带 FPU,主频 180MHz,ADC、DAC、定时器、CAN、UART、SPI、I2C 等外设齐全,工作电压和功耗范围也适合电池管理系统。在这个项目里,它的具体职责可以列成一张表:
| 职责 | 实现方式 |
|---|---|
| 采集两节单体电压 | ADC 分时采样,分压网络加 RC 滤波 |
| 采集电池温度 | 热敏电阻分压进 ADC,或通过数字温度传感器 |
| 判断均衡启停 | 状态机比较压差、温度、SOC、时间条件 |
| 控制均衡器 | GPIO 输出 EN 信号,高电平使能 MP2642GR-Z |
| 与上位机/监控系统通信 | UART 自定义协议上报电压、压差、均衡状态 |
| 异常处理 | 过温、过放、均衡超时等条件下强制关断均衡 |
主控和均衡芯片之间其实只是一根简单的 GPIO 控制线。我把 MCU 的一个 IO 接到 MP2642GR-Z 的使能端,稳定时保持低电平,均衡条件满足时拉高。芯片使能后自己按内部逻辑跑电荷泵动作,不需要主控持续干预;主控需要采集数据时,只要先把均衡关掉或者避开开关切换的采样窗口,就能拿到比较干净的电压值。这种“粗粒度控制、芯片内部自治”的分工方式,比主控直接介入每一个开关周期要省心得多。
3. 均衡策略设计:什么时候动、动多久、怎么停
3.1 电压采样方案:2S 拓扑下的共模电压问题
2S 电池组的采样不是简单地把 ADC 直接接到电池两端就完事。低端电池负极接地,高端电池负极其实是低端电池的正极,两者之间存在一个约等于单节电压的共模电位。如果直接用 ADC 采集高端电池正极对地的电压,那采到的是两节串联总压,并不是高端单体电压。所以实际布线要采三路:总电压、低端单体电压或中点电位。
我的做法是采用三个分压电阻网络,分别采总压、电池1电压、电池2电压。电池1的分压网络从正极拉到地,读出的是总压;电池2的分压网络从中点拉到地,读出的是低端单体电压;高端单体电压用总压减电池2电压得到。分压比为 2:1 左右,让 ADC 在满量程 3.3V 范围内留有余量。电阻必须使用 1% 精度,长期稳定性也要有保证,分压电阻出问题会直接导致均衡误判。
ADC 采样上还需要做抗混叠滤波。开关电容均衡器在工作时会让电池电压波形叠加上高频纹波,如果不滤波,ADC 采出的数值会明显跳动,严重时甚至能把 10mV 以内的正常压差淹没掉。我在每个采样点后面加了一级 RC 低通滤波,时间常数取 10ms 左右,采样代码里再做 8 次中位平均。中位平均比简单算术平均抗尖峰能力更强,是我从实践里确认更适合 BMS 场景的做法。
除了电压,温度也必须纳入策略。锂离子电池在低温下内阻增大,端电压中包含大量极化分量,这时用电压差判断 SOC 差异很容易误判。我的策略是:电池温度低于 0℃ 或高于 45℃ 时,禁止启动均衡;已经处于均衡状态的,达到边界后也会在下一轮任务中关断。
3.2 启停判据与回滞设计:45mV 启动,10mV 停止
均衡策略的核心是启停阈值。阈值设得太大,系统长期处于不均衡状态,容量损失持续存在;设得太小,均衡器频繁启停,开关管和飞跨电容慢性疲劳,还可能因为采样噪声导致抖振。
我最终使用的参数是:压差大于 45mV 且持续 10 秒以上,启动均衡;压差小于 10mV,停止均衡。这里有两个关键细节。第一,启动前要有“持续确认”过程,而不是单次采样超过阈值就立刻动作。第二,停止阈值比启动阈值低很多,形成一个回滞带。回滞带避免系统在阈值附近反复横跳,这是工程控制里最常用也最有效的抗抖振手段。启动阈值 45mV 对应大约百分之零点几的 SOC 差异,已经足够保证系统性能;10mV 停止则是对单节采样精度和均衡器自身波动的一个合理下界。
除了压差,还要给均衡动作加时间和 SOC 限制。我在策略里规定:电池 SOC 低于 30% 时强制不均衡。原因是电池低电量时内阻大,端电压的瞬时差异并不能真实反映容量差异,这时候强行均衡可能在搬运少量电荷的同时增加过放风险。同时,单次均衡持续时间上限设为 2 小时,如果 2 小时后压差没有收敛或者只是原地波动,就判定为异常,关闭均衡并上报告警。这些安全约束看起来繁琐,却能在真实系统中有效避免“均衡器把自己玩死”的尴尬局面。
4. 固件落地:从 ADC 采样到均衡调度的实现要点
4.1 先把主控资源理顺:ADC、定时器、GPIO 怎么分配
STM32F446RE 的外设资源很充裕,但规划不当照样会在调试时手忙脚乱。我这版固件按照最小可用系统的思路做了如下分配:
- ADC1 承担全部电压和温度采样,通道依次为电池1、电池2、总压、热敏电阻。
- 一个基础定时器 TIM6 产生 200ms 周期中断,作为均衡调度任务的时间基准。
- GPIO PA8 作为 MP2642GR-Z 的使能输出,默认低电平。
- USART2 用于向上位机发送数据,波特率 115200,8 位数据,1 位停止位。
ADC 使用定时器触发采样,而不是在主循环里手动启动。这样做的目的是把采样节奏固定下来,避免中断嵌套和主循环调度抖动导致采样间隔不均匀。每次触发后,DMA 把结果搬到内存缓冲区,主循环直接处理即可。
这里分享一个容易忽略的细节:ADC 采样 2S 电池电压时,绝不能在均衡开启期间直接采。MP2642GR-Z 工作时会在电池端产生周期性纹波,即便有 RC 滤波,采到的值也会受影响。我的做法是先把均衡使能关掉,等待 50ms 让电压稳定,再开始一轮采样;采样完成后如果满足继续均衡条件,则重新打开使能。这样做的代价是每次采样会暂停均衡约 50ms,但换来的是数据的可信度,非常值得。
4.2 核心状态机:IDLE → BALANCING → VERIFY
均衡调度我实现成一个简单的三状态机,跑在 200ms 的任务里:
- IDLE:空闲态。检测压差和温度,满足启动条件则进入 BALANCING。
- BALANCING:均衡态。EN 置高,累计均衡时间,持续检测压差。
- VERIFY:验证态。EN 拉低,等待电压稳定后再采样,确认压差是否已经落入停止范围,随后回到 IDLE。
状态机的好处是每个时刻系统处在哪个阶段一目了然,调试时可以很直观地判断“卡在哪了”。核心判定代码大致如下:
#define EQ_START_MV 45 #define EQ_STOP_MV 10 #define EQ_TIMEOUT_MS 7200000 typedef enum { EQ_IDLE, EQ_BALANCING } eq_state_t; static eq_state_t eq_state = EQ_IDLE; static uint32_t eq_start_tick = 0; void eq_task(void) { uint16_t v1 = get_cell_voltage(ADC_CH_V1); uint16_t v2 = get_cell_voltage(ADC_CH_V2); int16_t delta = (int16_t)v1 - (int16_t)v2; if (eq_state == EQ_IDLE) { if ((delta > EQ_START_MV || delta < -EQ_START_MV) && temperature_ok() && soc_ok()) { HAL_GPIO_WritePin(EQ_EN_GPIO_Port, EQ_EN_Pin, GPIO_PIN_SET); eq_start_tick = HAL_GetTick(); eq_state = EQ_BALANCING; } } else if (eq_state == EQ_BALANCING) { if (abs(delta) < EQ_STOP_MV) { disable_eq(); eq_state = EQ_IDLE; } else if (HAL_GetTick() - eq_start_tick > EQ_TIMEOUT_MS) { report_balance_alarm(); disable_eq(); eq_state = EQ_IDLE; } } }这个逻辑足够简单,但恰恰因为简单,长期运行不易出幺蛾子。我需要强调一点:这里不要追求复杂的模糊控制或者实时预测算法。对 2S 均衡来说,系统状态少、控制目标单一,状态机加回滞已经是最优选。算法越复杂,出问题的面越大,调试成本不成比例地升高。
4.3 上报与调试:没有上位机也能看清均衡过程
均衡系统如果只是个黑盒子,现场工程师会很难受。我在固件里做了一个很简洁的调试上报功能:每个调度周期把电池电压、压差、均衡状态、均衡持续时间和告警标志打包成一帧,通过 USART2 发出去。帧格式自定义:帧头、数据长度、数据区、CRC 校验。
调试阶段我直接在 PC 上接一个 USB 转串口模块,用串口助手看数据。真正有用的不是单纯盯数字,而是把数据记录下来画时间曲线。均衡开启后,压差从 50mV 下降的斜率非常直观,能看出来当前均衡电流够不够大、策略参数是否合理。如果某个版本固件改了阈值,对比曲线就能快速评估效果。这套调试手段成本几乎为零,但对整个开发周期帮助很大,建议做同类项目时一定要留出这个口子。
5. 实测结果与踩坑复盘:一组数据、三处问题
5.1 完整均衡过程的实测数据
我在项目现场用两节容量规格相同、但静态压差明显偏大的电池做了完整测试。初始状态:电池1电压 3.45V,电池2电压 3.40V,压差 50mV 左右。系统上电后,主控每 500ms 上报一次数据,我记录了均衡开启后的关键节点:
| 时间点 | 电池1 (V) | 电池2 (V) | 压差 (mV) | 状态 |
|---|---|---|---|---|
| 0min | 3.450 | 3.400 | 50 | 均衡启动 |
| 30min | 3.432 | 3.417 | 15 | 均衡中 |
| 60min | 3.423 | 3.411 | 12 | 均衡中 |
| 90min | 3.414 | 3.405 | 9 | 压差落入停止带 |
| 24h后 | 3.401 | 3.396 | 5 | 停止,保持 |
从数据看,均衡前半程把 50mV 压差快速压到 15mV,后半程收敛速度明显放慢,完全符合开关电容均衡“压差越大搬得越快”的物理特性。90 分钟左右的搬运量换算下来大约 60mAh,这个数字对维持整组一致性来说已经足够。24 小时后压差只漂移了 4mV,说明停止阈值和回滞带设计是合理的,没有明显的过度均衡或反弹。
这个结果也告诉我一个经验:对 2S 系统,不需要追求把压差压到 1mV 以内。压差在 5~10mV 区间时,系统已经处于非常健康的状态,继续均衡只会增加无效工作和等待时间。真正决定均衡效果的,是能否及时启动、稳定收敛、并在合适位置停住。
5.2 原型阶段最典型的三类问题
第一个让我印象深刻的坑是 ADC 采样值在均衡开启后严重跳变。排查了很久,最终定位到两点:一是飞跨电容开关产生的纹波直接耦合到了采样回路;二是采样时机恰好落在了电荷泵的开关瞬间。解决办法是分层叠加:硬件上加强 RC 滤波,软件上增加“先关均衡、再采样、再恢复”的时序,跳变问题彻底消失。这个坑提醒我,BMS 软件设计里“什么时候采样”有时比“怎么采样”更重要。
第二个坑出现在上电瞬间。MP2642GR-Z 的使能引脚如果直接由 MCU 的 GPIO 控制,在 MCU 尚未完成初始化时,GPIO 会处于高阻态。芯片如果把这个状态识别为高电平,就会在上电瞬间误启动均衡。我遇到的情况是电池装进设备后还没开主机,电池组自身就开始缓慢放电。解决办法是给使能引脚加 100kΩ 下拉电阻,同时在板级设计上确保 MCU 的复位输出在系统上电期间把均衡器钳制在关断状态。这个细节如果不注意,量产阶段会非常被动。
第三个是硬件层面的发热。初版原型中飞跨电容温度明显偏高,我用热成像看了下,温度集中在电容本体和附近铜箔。问题出在飞跨电容的等效串联电阻偏大,以及 PCB 布局环路过长。换用低 ESR 的电容,并把飞跨电容的布局尽量贴近芯片引脚、加大铺铜后,温度恢复正常。开关电容方案的发热本来就比功率电感方案小得多,如果还发热明显,基本可以断定是布局或器件选型的问题。
5.3 板级设计与后续优化建议
总结一下这块 2S 均衡板最终版本的关键经验:分压电阻用 1% 精度且温漂系数相近;ADC 参考电压来自独立 LDO,不要直接挂在 MCU 的 3.3V 数字电源上;采样回路和均衡功率回路在接地上单点汇合;所有电池采样线上串联 1kΩ 保护电阻,防止接错线或 ESD 打坏主控。
备用电源场景还有一个特有的需求:低功耗待机。系统大部分时间处于备电状态,整板电流必须压到极低。我的处理方式是把均衡相关电路全部放在系统主电源域内,系统休眠时主电源断开,STM32 进入 stop 模式,均衡器彻底断电。这样既保证了均衡能力,又不影响备电系统几个月待机不掉电的核心诉求。
下个版本我计划把均衡电流进一步提升到 150mA 以上,方案上会考虑选用更大容量的飞跨电容,或者用两只电容并联以降低 ESR。与此同时,把均衡器的开关频率同步提高,让纹波落在更容易滤波的频率段。就当前这套 MP2642GR-Z 加 STM32F446RE 的方案来说,已经足够应付大多数 2S 储能和备电项目的均衡需求,关键是把“什么时候均衡”这件事想清楚,再把“均衡完如何验证”跑扎实,系统的整体表现就不会差到哪里去。