前阵子完成了一个小项目:用 MP2642GR-Z 搭配 STM32F405RG,给储能和备用电源系统里的 2 串锂电池组做主动均衡。很多人一听“只有两节电芯”就觉得是小题大做,实际做下来才发现,麻雀虽小五脏俱全,均衡策略、采样精度、热设计、故障保护,一个都跑不掉。这篇文章把整套方案的选型逻辑、硬件设计、软件状态机和调试过程中的实测数据完整写出来,适合正在做小容量储能、备电 BMS,或者打算从被动均衡转向主动均衡的开发者参考。
1. 为什么 2 串电池也值得上主动均衡
1.1 串联电芯的不一致性从哪来
电池包里的每一节电芯都不是完全相同的个体。容量、内阻、自放电率、温度特性都存在出厂离散,在储能和备用电源场景中,这种离散还会随着时间持续放大。两节串联电芯,哪怕出厂时配得再好,运行几个月后也会慢慢拉开差距。
举一个具体例子:两节 100Ah 磷酸铁锂电芯,一节自放电率 3%,另一节 5%。静置一个月,前者损耗 3Ah,后者损耗 5Ah,电量差 2Ah,反映到电压上就可能拉开几十毫伏。再叠加内阻差异引起的动态压降、温度梯度造成的局部老化,压差会越拉越大。在储能系统里,整组电池的可用容量受电压最低那节电芯限制;在备用电源里,压差过大会导致充电时一节过充、另一节却充不满,备电时间越用越短。
1.2 被动均衡与主动均衡的取舍
传统低成本方案是被动均衡,做法很简单:给每节电芯并联一个放电电阻和开关,电压高的电芯通过电阻放掉多余能量,直到和其他电芯对齐。这个方案在小容量消费电子产品里完全够用,但在储能和备电场景中缺点很明显。
被动均衡只能“放”不能“搬”。它把高电压电芯多余的电量变成热量浪费掉,储能系统动辄几十上百安时的容量,靠毫安级的均衡电流去放,压差改善速度极慢。均衡电阻发热也带来热管理压力,放在密闭的备电机箱里,温度升高又会反过来加速电芯老化。更关键的是,放电时的被动均衡方向是固定的,高电压电芯一直放,低电压电芯始终被动接收,整组可用容量并没有真正提升。
主动均衡则完全不同。它把能量从电压高的电芯搬入电压低的电芯,实现“削峰填谷”,理论上能量只在电芯之间转移,系统总能量几乎不变。储能系统对效率敏感,备用电源对老化敏感,主动均衡虽然成本高一些,但长期收益很明显。这次选择 MP2642GR-Z 这类开关电容方案,核心原因就是它用很小的外围电路实现了真正的能量搬移。
1.3 这套 2S 方案要解决什么
两串电池组在储能系统中通常作为分布式 BMS(电池管理单元)的最小模块存在,在备用电源中则是非常常见的电池包配置。MP2642GR-Z 加上 STM32F405RG 这套方案的目标很明确:
- 把两节串联电芯的静态压差长期控制在 20mV 以内。
- 在充电过程中对电压偏高的一节进行能量搬移,防止过充。
- 在浮充待机场景中定期巡检,抵消自放电差异带来的电压漂移。
- 让 MCU 承担电压采样、均衡决策、温度保护和通信上报,形成真正可落地的电池管理单元,而不是单纯搭一个均衡电路。
2. 核心器件选型与整体架构
2.1 MP2642GR-Z 均衡核心:开关电容如何搬能量
MP2642GR-Z 面向两节串联锂电芯,内部是开关电容电荷泵结构。它用一组功率开关网络配合外部飞跨电容,在两条通路之间快速切换:第一拍把高电压电芯的输出端接到飞跨电容,让电容充到高电压电芯的电压;第二拍把电容从高电压电芯断开,改接到低电压电芯两端,电容上的电荷自然流向低电压电芯。如此反复,能量就从高电压电芯持续搬运到低电压电芯。
这个原理和电荷泵升压类似,只是目标不是把电压抬高,而是搬移电荷。整个过程可以实现非常高的效率,因为没有电感,也就没有电感损耗和 EMI 问题。相比电阻放电均衡,它的均衡电流可以做得很可观,而且外围只需要几个电容和电阻。
控制接口上,MP2642GR-Z 给出均衡使能引脚和状态输出引脚,MCU 通过 GPIO 就能控制启停。它天然是双向的:哪节电压高,能量就自动往哪节方向搬。软件里不需要判断“当前是第一节高了还是第二节高了”,只需要判断压差是否超标。这一点比 PWM 定向控制的方案简单太多,也是我选择它的重要原因。
2.2 STM32F405RG 的角色和选型理由
STM32F405RG 是一款基于 Cortex-M4 内核、主频 168MHz 的 MCU,在 BMS 主控中属于性能非常充裕的选择。2 串电池管理并不需要复杂的矩阵开关控制,也不需要多路高精度采样通道,那为什么不用一颗便宜的小 MCU?
原因在于储能和备用电源场景的附加需求:要和上层监控通过 RS485/CAN 通信,要支持远程参数下发和固件升级,要能记录历史故障,还要留出后续扩展空间。F405 拥有丰富的 UART、SPI、CAN 外设接口,内置多位 12 位 ADC 和独立的比较器,内部直接支持 DMA 搬运采样数据,CPU 几乎不参与数据搬运过程。整套均衡策略跑起来,CPU 负载也就几个百分点,剩余的算力完全可以用来跑 SOC 估算、绝缘检测逻辑或者通信协议栈。
对比专用的电池管理 AFE 芯片,MCU 方案更灵活。AFE 通常把均衡开关、采样、保护集成在一起,适合快速量产;但 AFE 的均衡策略往往受寄存器逻辑限制, 参数调整要经过厂商工具链,而且两串应用的专用 AFE 选择本来就少。用 MCU 自己控制均衡芯片,阈值、时序、保护策略全部掌握在自己手里,后续换电芯化学体系也不用改硬件。
2.3 系统组成和能量路径
整套系统由电池组、均衡器、电压采样电路、保护 MOS、主控 MCU、通信接口和辅助电源组成。信号流是:电池电压经分压和差分运放进入 STM32F405RG 的 ADC,MCU 计算出两节电芯电压和压差,根据温度、运行状态、充电/放电状态决定是否启动 MP2642GR-Z 均衡器。均衡功率路径完全独立:高电压电芯输出端接均衡芯片的第一检测端,飞跨电容连接两个检测端之间,芯片输出端接低电压电芯,开关网络内部的死区逻辑保证任何时候都不会形成直通短路。
主控供电从电池组总压取电,经过开关电源降到 3.3V。这里有一个重要的设计决策:均衡芯片的使能引脚在 MCU 复位和上电期间必须保持有效低电平,因此硬件上要用下拉电阻默认拉低,由 MCU 在上电初始化完成后主动拉高。这样即使程序跑飞或者看门狗复位,均衡器也不会失控工作。
3. 硬件设计中的每一步
3.1 均衡器外围参数的计算和选择
MP2642GR-Z 外围最关键的器件是飞跨电容。它的容量直接决定单次搬运的电荷量,需要选择低 ESR、低 ESL 的陶瓷电容。电容太小,均衡电流上不去;电容太大,开关切换瞬间的浪涌电流可能超出芯片内部开关管的应力。优先选择大封装 X7R 材质电容,比如 0805 封装、10uF、25V 耐压,并在芯片附近并联一到两个 0.1uF 的高频旁路电容。
需要注意陶瓷电容存在直流偏压效应:加上直流电压后有效容量会下降。10uF 电容在 4V 直流偏压下有效容量可能只剩 6~7uF,设计时要留足裕量。如果实测均衡电流偏低,首先要怀疑的往往就是电容有效容量不足,而不是芯片坏了。
开关频率通常可以通过一个外部电阻设定,也可以在引脚上配合电容形成振荡。频率的选择需要在均衡电流、功耗和 PCB 布局之间折中。开关频率越高,单次搬运周期越短,但开关损耗越大;频率太低,均衡电流又上不去。工程上比较合理的起点是让开关频率落在几十到几百 kHz 范围,具体以该芯片数据手册给出的推荐曲线为准。我习惯先按手册典型值设置,再用示波器电流探头实测,根据均衡电流和芯片温升反向调整。
3.2 电压采样电路怎么搭才准
两节串联电芯测量有一个天然难点:第一节电芯的负端是系统地,可以直接用电阻分压单端测量;第二节电芯悬浮在第一节之上,不能直接接 ADC,否则采到的是总压。
我见过不少早期方案用软件减法:先采总压,再采第一节电压,两者相减得到第二节。这个做法硬件最省,但精度很差。两次采样之间存在时间差,充电电流或者均衡电流稍微波动一下,总压和第一节点位就变了,减法结果可能差出几十毫伏。均衡控制基于毫伏级的压差判断,这种误差不可接受。
最终方案是在分压网络之后加一级差分放大器。第二节电芯的电压通过高精度电阻分压,从悬浮电压映射到差动输入,再经运放单端输出到 ADC。电阻全部选用 0.1% 或者 1% 低温漂系列,分压比设计成把 2.5V 到 4.5V 的电压范围映射到 0.3V 到 3.0V 左右,既给 ADC 留出余量,又不会超出运放输出摆幅。第一节电压虽然可以单端测量,但我同样采用差分结构,避免大电流充放电时地弹噪声影响采样。
校准方面,出厂阶段用高精度电压源做两点校准,把每节电芯的增益误差和偏移误差记录到 flash。ADC 使用 12 位分辨率,配合多次采样平均和滑动滤波,最终电压读数稳定在 5mV 以内。这个精度对均衡控制来说已经非常宽裕。
3.3 保护机制:软硬件双重保险
均衡器直接连接电池,任何失控都可能造成电芯过放或过充,保护机制必须冗余。硬件层面,MP2642GR-Z 的使能引脚由 MCU GPIO 通过三极管或者 MOS 驱动,同时引脚下拉电阻默认关断。芯片本身有内部过温和输入电压保护,这是第一道防线。
软件层面,MCU 每秒检查一次均衡状态。如果两节电芯的电压、电池组总压、电芯温度任何一个参数超出安全窗口,立即拉低使能引脚关闭均衡器。安全窗口要区分磷酸铁锂和三元锂:磷酸铁锂充电上限 3.65V、放电下限 2.5V;三元锂充电上限 4.2V、放电下限 3.0V。均衡温度窗口我限制在 5 到 45 摄氏度,低于 0 度或高于 55 度强制禁止均衡。低温下电芯内阻大,大电流搬运能量会加剧析锂风险,储能系统尤其要谨慎。
充放电保护 MOS 的控制也要和均衡逻辑联动。充电状态下,均衡器可以全功率运行,被均衡的电芯少充一点,其他电芯多充一点,这个动态平衡过程正是我们想要的。放电状态下要小心:均衡电流会等效加重高压电芯的放电负载,如果在系统接近欠压时还开着均衡,有可能把某节电芯拉低到过放阈值。我的处理方式是放电且 SOC 低于 20% 时禁止均衡,静置和充电时正常允许。
3.4 PCB 布局的实战教训
第一次画板子时我犯了典型错误:把均衡芯片摆得太远,飞跨电容和芯片之间的走线绕了一圈,均衡电流环路面积很大。实测均衡电流比预期小,用热像仪一看,铜箔走线在发热,开关振铃还串进了电压采样回路。后来重新布局,有几点经验值得写在这里:
- 飞跨电容必须紧贴 MP2642GR-Z 的引脚放置,中间不要过孔,保证功率环路面积最小。
- 均衡芯片的输入输出检测线从电池采样点直接引出,采用开尔文连接,不要和充放电功率线共用铜箔。
- 模拟采样地在 MCU 附近单点汇集,再连接到功率地,避免均衡开关噪声通过地平面传导。
- 均衡芯片底部铺整片地铜并打密集过孔散热,内部 MOS 的功耗需要良好散热路径,否则温度保护会过早触发。
- 温度传感器放在芯片附近而不是电芯附近,芯片温度和电芯温度分别监控,接到 MCU 的不同通道。
4. 软件策略与均衡控制实现
4.1 初始化与采样链路搭建
MCU 工程初始化逻辑并不复杂,但有几个关键点值得强调。ADC 使用 DMA 循环模式,把所有需要的模拟通道一次性采样完成,避免 CPU 在中断里反复取数。时钟配置走 PLL,ADC 时钟尽量压低,采样时间设置为最慢档,对于电池电压这种缓变信号,单次采样时间长一点反而有助于抑制高频噪声。
GPIO 初始化时,均衡使能脚必须设置成普通推挽输出,初始电平为低。用 DMA 搬运采样结果到数组后,主循环每 50ms 取一次最新数据,做中值滤波和滑动平均。中值滤波能有效剔除偶发尖峰,滑动平均则让读数平滑稳定。
下面是采样和滤波核心代码的简化示意:
static void adc_dma_init(void) { // 使能 ADC1 和 DMA2 时钟 // 配置 ADC1 为扫描模式,规则通道依次对应 CELL1、CELL2、TEMP // DMA 配置为循环模式,搬运数量与 ADC 通道数一致 ADC_InitStructure.ADC_ScanConvMode = ENABLE; ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; ADC_InitStructure.ADC_NbrOfChannel = 3; ADC_Init(ADC1, &ADC_InitStructure); // 启动 DMA 后,数据自动更新到 adc_buf 数组 } static float get_cell_voltage(uint8_t cell) { static uint16_t history[CELL_HISTORY_NUM][2]; // 采集 5 次取中值,再与之前的窗口数据做滑动平均 }4.2 均衡状态机的设计
均衡逻辑我用一个简单的状态机管理:空闲、均衡中、完成、故障。状态机每 100ms 执行一次,入口先读取最新电压和温度,然后计算压差。阈值设置要留回滞,否则均衡器会在启停边界反复震荡。
我采用的一组典型参数:压差大于 30mV 启动均衡,压差低于 15mV 停止均衡,单次最长均衡时间 15 分钟,超时后暂停 30 秒重新评估。添加回滞和超时这两个关键参量后,均衡器就不会在临界点来回通断。给状态机加一个超时保护还有一个好处:万一 MCU 的电压采样因为某种原因出现偏差,均衡器不会无限运行下去。
状态机核心逻辑参考如下:
typedef enum {BMU_IDLE, BMU_BALANCING, BMU_DONE, BMU_FAULT} bmu_state_t; void bmu_service(void) { float v1 = get_cell_voltage(1); float v2 = get_cell_voltage(2); float diff = fabsf(v1 - v2); switch (bmu_state) { case BMU_IDLE: if (diff > 30e-3f && temp > 5 && temp < 45) { enable_balancer(); bal_entry_diff = diff; bal_timeout = 0; bmu_state = BMU_BALANCING; } break; case BMU_BALANCING: bal_timeout++; if (diff < 15e-3f) { disable_balancer(); bmu_state = BMU_DONE; } else if (bal_timeout > 9000) // 15分钟 { disable_balancer(); bmu_state = BMU_FAULT; } break; case BMU_DONE: // 等待下一次压差漂移触发 if (diff > 30e-3f) { bmu_state = BMU_IDLE; } break; case BMU_FAULT: // 记录故障码,需要上层确认或人工重启 break; } }4.3 充电、静置和浮充场景的差异化控制
同一套状态机不能在所有场景裸跑,备用电源系统尤其需要场景感知。充电时电池电压整体抬升,压差会被动态放大,这是均衡器最应该发挥作用的时间窗口;静置时压差主要来自自放电差异和不完全充电残留,均衡速度可以慢一些;放电时压差主要由内阻差异造成,此时强行均衡反而会让高压电芯放得更快。
我的策略是给状态机前置一个模式选择:读取当前是否有充电电流、是否有放电电流,以及电池组总压趋势。充电模式下,均衡启动阈值适当放宽到 25mV,只要电压安全窗口允许就一直均衡。静置模式下,启动阈值提高到 30mV,并且引入“每 30 分钟带载均衡 5 分钟”的巡检机制,避免长期浮充导致的微小压差累积。放电模式下,当 SOC 高于 50% 时允许均衡,低于 20% 强制关闭。浮充状态的识别是通过长时间电压恒定且电流极小的特征判断,识别后进入周期巡检逻辑。
4.4 故障记录和通信上报
STM32F405RG 的资源非常适合做本地故障记录。RAM 里维护一个环形缓冲区,把每次均衡启动、停止、超时、温度告警、过压欠压事件都记录下来,通过串口输出供调试。正式的 RS485 报文中,每帧包含两节电芯电压、板载温度、均衡状态、故障码和累计均衡时间。
上报频率不需要太高,备电系统 1 秒一次足够。通信协议我选择私有精简协议:帧头、地址、命令、数据、CRC。后续如果接入上层储能 EMS,只要在 MCU 端换一个协议解析层,硬件完全不用动。这也是选择通用 MCU 而非专用 AFE 的最大好处:通信协议栈、故障记录、均衡策略都在自定义范围内。
5. 调试验证与实测效果
5.1 测试平台搭建
实验室里模拟电池组不均衡状态,最靠谱的方法是人为制造电量差。我用可编程电源给第一节电芯单独充电,让电压比第二节高 100mV 以上;再用电子负载给第二节放掉一部分电量,模拟自放电差异。为了保证环境可控,把整个电池组放进恒温箱,温度设定在 25 摄氏度。
测量设备包括六位半万用表、示波器配电流探头、热像仪。万用表直接接到电池采样点,读取两节电芯的真实电压作为基准;示波器电流探头夹在均衡芯片的飞跨电容回路上,观察实际均衡电流的波形。热像仪对准均衡芯片和 PCB 铜箔,记录温升变化。这样一套测量组合可以同时验证采样精度、均衡效果和热表现。
5.2 均衡过程实测记录
初始状态:第一节电芯 3.412V,第二节电芯 3.284V,压差 128mV,处于充电完毕后的静置状态。MCU 检测到压差超过 30mV,启动均衡器。实测均衡电流的波形是典型的开关电容锯齿波,有效值约 0.58A。前 5 分钟压差快速下降,从 128mV 降到 82mV,因为压差大时每一次能量搬移的电荷量也大。
10 分钟时压差降到 45mV,均衡电流已经衰减到 0.28A。15 分钟时压差 22mV,电流进一步降到 0.12A。此时接近状态机的停止阈值,但由于单次最长均衡时间 15 分钟的限制,我先让均衡器暂停,重新评估。重新启动后只过了两轮,压差稳定在 11mV 左右,进入“完成”状态。
从 128mV 压差到稳定 11mV,总耗时约 25 分钟,电池组容量没有明显损失。相比之下,被动均衡用 0.1A 放电电流,处理同样 128mV 压差,光是发热量就不可同日而语。
表格记录如下:
| 时间(min) | 压差(mV) | 均衡电流(A) | 芯片表面温度(℃) |
|---|---|---|---|
| 0 | 128 | 0.58 | 34 |
| 5 | 82 | 0.47 | 48 |
| 10 | 45 | 0.28 | 52 |
| 15 | 22 | 0.12 | 49 |
| 20 | 14 | 0.04 | 45 |
| 25 | 11 | 0 | 38 |
5.3 效率与热表现
从表格可以看到,均衡器在压差较大阶段满载运行,芯片表面温度从 34 度升到 52 度。这个温升在当前 PCB 布局下可以接受,但已经不应该长时间持续。均衡电流随压差降低而自然衰减,这正是开关电容均衡的良性特征:压差小的时候能量搬移速度放慢,等效损耗也在降低。
效率方面,主动均衡的能量只是从一节搬到另一节,理论上没有系统级损耗。但实际飞跨电容充放电、MOS 导通电阻和开关损耗都会产生热量,大部分损耗集中在芯片和铜箔上。实测满载阶段芯片温升约 18K,效率估算在 85% 到 90% 之间,对于两串应用完全够用。如果你追求更高的均衡效率,可以减小飞跨电容容量换得更小的浪涌电流,但那样均衡速度会下降,需要根据系统需求权衡。
6. 常见问题与排查技巧实录
6.1 均衡器完全不动
最典型的症状是 MCU 判断压差符合条件,使能引脚也输出高电平,但均衡电流零。排查步骤从使能信号开始:用示波器量 EN 引脚,确认有没有真正被拉高,注意 MCU 上电瞬间如果引脚配置错误,反而会把均衡器打开。接着量芯片供电引脚和电池连接,确认 VCELL 端接到了正确的电芯位置。
还有一个容易被忽略的问题:飞跨电容虚焊。电容一端虚焊时,均衡器无法工作,但万用表量电容两端反而是有电压的,很容易误判。最可靠的办法是用示波器电流探头直接在电容支路看有没有脉冲电流,没有电流,优先怀疑焊接。
6.2 电压测量跳变
均衡器一旦启动,PCB 上的开关电流会对采样回路产生干扰。如果发现启动均衡后电压读数跳变超过 20mV,大概率是采样线走线和功率环路太近。应急的软件办法是在均衡启动瞬间屏蔽采样,等开关稳定后延迟 10ms 再采集;治本的办法还是重新布局,把采样线和功率线彻底分开。我最终板子上采样线独立走线,并在 MCU 的 ADC 输入引脚加 100nF 滤波电容,配合软件滑动平均,实测读数在均衡运行期间波动小于 3mV。
6.3 均衡时 MCU 复位
这个问题我在早期版本遇到过。均衡器刚启动瞬间,飞跨电容充电相当于对电池组做了一个短路冲击,瞬间拉低电池电压。如果主控供电 DCDC 的输入电容裕量不足,一次冲击就可能让输出电压跌落超过复位阈值。
解决思路有两个方向:一是软件软启动,MCU 通过 PWM 控制均衡使能,逐渐增加占空比,让飞跨电容缓慢建立电荷;二是硬件上给主控供电增加足够的前端储能电容,同时在均衡芯片输入端加小阻值限流电阻限制浪涌冲击。我实际使用第二套方案,问题彻底消失。
6.4 均衡电流低于预期
均衡电流受飞跨电容有效容量、开关频率、电池压差和路径阻抗共同影响。实测电流偏低时,按顺序排查:先确认电池间压差确实存在,压差太小会导致均衡电流本身就小;再检查飞跨电容容值是否因为直流偏压打折扣,必要时更换更大容值或者并联配置;最后确认开关频率设置电阻是否焊接正确,频率跑偏导致电荷泵效率下降。
6.5 从 2 串向更多串扩展的注意点
MP2642GR-Z 是面向 2 串的均衡芯片,储能系统做到 4 串、8 串甚至 16 串时,可以采用多片级联。级联时每一片芯片只负责管理两个相邻电芯,芯片之间预留通信间隔,MCU 分别控制各片的使能和状态读取。需要注意的是,多片级联后电池组总压升高,MCU 的采样系统必须做隔离,CAN 收发器也要使用隔离型;均衡芯片与 MCU 之间的逻辑控制信号建议通过光耦或数字隔离器传递。PCB 上的安全间距更要重新考虑,高压爬电距离不是一句空话。
6.6 备用电源长期运行的可靠性
备用电源设备常年挂在线上,均衡器不会每一次都全功率运行,但芯片和电容一直在承受电压应力。选购电容时一定要选择额定耐压高于电芯最高电压 1.5 倍以上的型号,比如两串磷酸铁锂最高电压 7.2V,飞跨电容用 25V 耐压非常稳妥。均衡器周边焊盘要做三防漆处理,防潮防尘,这些细节在储能现场环境中比实验室更容易暴露问题。
整套方案做下来,我个人最大的体会是:均衡的本质是管理差异,而不是消灭差异。两节电芯之间的压差永远存在,均衡器的职责只是把差异控制在安全区间。这套 2S 方案的信号链路短、控制逻辑清晰,跑通之后再回头看高压电池组的多片级联设计,心里会非常有底。当你拿到一块新均衡芯片,先花半天时间用示波器看清楚它的能量搬移波形,后面所有参数调试都会顺利得多。