1. 储能电池均衡项目的整体设计思路
1.1 为什么串联电池组必须做均衡
先聊一个很多人踩过的坑。两块标称容量、内阻都接近的电芯串起来用,充放电循环几十次之后,你会发现它们的端电压开始分道扬镳。原因不复杂:制造公差、温度梯度、老化速率差异,这些因素叠加起来,会让其中一块先到上限电压,另一块还差一截。充电时先到顶的那块被反复过充,放电时先到底的那块被反复过放。锂电芯最怕的就是这两件事,容量衰减加速,严重时直接鼓包。
储能系统和备用电源系统里,电池组往往是几十甚至上百节串联。只要有一节拖后腿,整组可用容量就被它锁死。所以均衡电路不是锦上添花,是刚需。被动均衡靠电阻放电,简单便宜但发热大、效率低;主动均衡把电量从高电压电芯搬到低电压电芯,效率高但电路复杂。这次我做的方案,是针对两个串联电池单元的主动均衡,用MP2642GR-Z这颗双向升降压充电管理芯片,配合STM32F412RE做主控,实现电芯之间的能量搬运。
1.2 方案选型的核心考量
选 MP2642GR-Z 不是拍脑袋决定的。这颗芯片本质是一个双向 buck-boost 控制器,支持对单节锂电进行充电和放电管理,输入输出范围宽,正好适合做“从总线取电给低压电芯补电”或者“把高电压电芯的能量回馈到总线”这类操作。它的开关频率可编程,外围只需要电感、MOSFET 和少量阻容,整体 BOM 可控。
主控选 STM32F412RE,看中的是它 100MHz 的 Cortex-M4 内核、1MB Flash、256KB SRAM,以及丰富的定时器和 12 位 ADC。均衡算法需要频繁采样电压、电流,还要跑状态机,F412 的资源绰绰有余。更重要的是它带 CAN 和多个 UART,方便和上位机 BMS 通信。
注意:MP2642GR-Z 的 datasheet 里对电感选型和电流采样电阻的布局有明确要求,后面会细说。很多人第一次画板子栽在采样走线上,导致电流读数跳变,均衡直接失控。
1.3 系统框图与能量流向
整个均衡系统可以拆成三层:采样层、控制层、功率层。
采样层用分压电阻加 RC 滤波,把每节电芯的端电压送到 STM32 的 ADC 引脚。同时用霍尔电流传感器或者采样电阻加运放,监测均衡电流。控制层就是 STM32F412RE,跑均衡策略、保护逻辑、通信协议。功率层是两片 MP2642GR-Z,分别对应两个电芯的均衡通道,通过电感把能量在电芯和中间总线之间搬来搬去。
能量流向有两种模式。充电均衡时,如果 Cell1 电压偏高,就让对应的 MP2642 工作在 buck 模式,把 Cell1 的能量放到中间总线,再由另一片 MP2642 以 boost 模式给 Cell2 充电。放电均衡则反过来。中间总线的电压设定在兩节电芯电压的中间值附近,这样两边都能高效工作。
2. 核心硬件细节与实操要点
2.1 MP2642GR-Z 外围关键参数计算
先看电感。MP2642 的开关频率我设在 400kHz,这个频率下电感和开关损耗比较平衡。假设均衡电流最大 2A,电芯电压范围 2.5V 到 4.2V,中间总线电压 3.4V。最恶劣工况是 buck 模式下占空比最小的时候,纹波电流取额定电流的 30%,也就是 0.6A。
电感计算公式:
L = (Vout × (1 - D)) / (fsw × ΔIL)代入 buck 模式 Vout=3.4V,Vin=4.2V,D=3.4/4.2=0.81,fsw=400kHz,ΔIL=0.6A:
L = (3.4 × (1 - 0.81)) / (400000 × 0.6) ≈ 2.7μH实际选 3.3μH 的标准值,饱和电流要大于 3A,直流电阻尽量小,我用的是一体成型电感,DCR 在 20mΩ 以内。
电流采样电阻选 10mΩ,配合 MP2642 内部的电流检测放大器。这里有个细节:采样电阻的 Kelvin 连接必须做到芯片的 CSP 和 CSN 引脚,走线要等长且尽量短。我第一版板子把采样电阻放在电感后面,结果开关噪声耦合进来,电流读数抖得没法用。第二版改到电感前面,并且用地平面隔离,问题解决。
2.2 STM32F412RE 的 ADC 采样与滤波
STM32F412RE 的 12 位 ADC 在 3.3V 参考下,分辨率是 0.8mV。电芯电压经过 1:1 分压后进 ADC,实际分辨率变成 1.6mV。对于锂电均衡来说,这个精度够用,但前提是参考电压要稳。我用的是外部 3.0V 基准源,比直接用 VDDA 靠谱得多。
采样策略上,我开了 ADC 的扫描模式,配合 DMA 循环搬运。每个电芯电压采 16 次,去掉最大最小各 4 个,剩下 8 个取平均。这样能有效抑制开关噪声。采样时机也很关键,我让定时器在 MP2642 的开关周期中间触发 ADC,避开开关沿。实测下来,这样处理后的电压波动在 ±2mV 以内。
提示:STM32F412 的 ADC 在快速通道和慢速通道之间切换时会有建立时间问题。如果电芯电压和电流采样交替进行,建议在通道切换后丢弃第一次转换结果。
2.3 功率路径的布局与散热
MP2642 驱动的是外置 MOSFET,我选的是双 N 沟道半桥封装,导通电阻 8mΩ。均衡电流 2A 时,导通损耗是 2²×0.008=32mW,可以忽略。但开关损耗不能忽视,400kHz 下,栅极电荷 15nC,驱动电压 5V,开关损耗大约是 0.5×15nC×5V×400kHz×2=30mW。两片芯片加起来不到 150mW,散热压力不大。
PCB 布局上,功率回路面积要最小化。输入电容紧贴 MOSFET 的漏极和源极,电感放在半桥输出旁边。模拟地和功率地单点连接,连接点选在芯片的 GND 引脚附近。我见过有人把模拟地直接铺到功率地上,结果 ADC 读数全是毛刺,均衡阈值判断频繁误触发。
3. 均衡策略与软件实现
3.1 电压阈值与均衡启停逻辑
均衡不是一直开着就好。我的策略是:当两节电芯压差超过 30mV 时启动均衡,压差降到 10mV 以下停止。这个迟滞设计是为了防止在阈值附近反复启停,造成振荡。
具体流程:STM32 每 100ms 采样一次两节电芯电压,计算压差。如果压差大于 30mV,且持续时间超过 1 秒,就进入均衡状态。均衡时,根据哪节电压高,决定能量流向。比如 Cell1 高,就让 MP2642-1 工作在放电模式,MP2642-2 工作在充电模式。均衡电流设定为 1A,这个值可以通过软件调整,写入 MP2642 的电流控制寄存器。
注意:均衡过程中如果总电压低于欠压保护阈值,或者温度超过 60℃,必须立即停止均衡。我在代码里加了硬件比较器做二级保护,软件来不及响应时直接切断 MOSFET 驱动。
3.2 状态机设计与代码框架
软件用一个简单的状态机来管理:
typedef enum { BAL_IDLE, BAL_PRECHECK, BAL_ACTIVE, BAL_FAULT } BalState_t; void Bal_StateMachine(void) { switch (bal_state) { case BAL_IDLE: if (Bal_CheckCondition()) { bal_state = BAL_PRECHECK; } break; case BAL_PRECHECK: if (Bal_VerifyVoltage()) { Bal_Start(); bal_state = BAL_ACTIVE; } else { bal_state = BAL_IDLE; } break; case BAL_ACTIVE: if (Bal_CheckStopCondition()) { Bal_Stop(); bal_state = BAL_IDLE; } break; case BAL_FAULT: Bal_Stop(); if (Bal_CheckFaultClear()) { bal_state = BAL_IDLE; } break; } }Bal_CheckCondition里做压差判断和超时判断,Bal_VerifyVoltage会连续采样 5 次确认压差稳定,避免误判。Bal_Start配置 MP2642 的寄存器,设置电流方向和大小。Bal_CheckStopCondition检查压差是否降到 10mV 以下,或者有没有故障标志。
3.3 与上位机的通信协议
STM32F412RE 的 CAN 接口用来和主 BMS 通信。我定义了一个简单的协议:每 500ms 上报一次两节电芯电压、均衡电流、芯片温度、状态字。主 BMS 可以下发指令强制启动或停止均衡,也可以修改压差阈值。
CAN 报文 ID 用 0x180 和 0x181,数据长度 8 字节。电压值放大 1000 倍用 uint16 传输,比如 3.856V 传 3856。状态字里 bit0 表示均衡是否激活,bit1 表示故障,bit2 表示充电中,bit3 表示放电中。
提示:CAN 总线的终端电阻别忘了加,120Ω 两端各一个。我调试时忘了加,通信时好时坏,查了半天才想起来。
4. 常见问题与排查技巧实录
4.1 均衡电流上不去或者波动大
这是最常遇到的问题。先查电感饱和电流够不够,如果电感在 2A 时已经饱和,电流会突然跳变。再查采样电阻的走线,CSP 和 CSN 之间如果有压差被地线噪声污染,芯片会误以为电流过大而限流。最后看 MOSFET 的驱动电压,如果 Vgs 不够 4.5V,导通电阻会急剧上升,效率暴跌。
我遇到过一次,均衡电流只能到 0.5A,查了半天发现是自举电容容量不够,高侧 MOSFET 驱动不足。换成 100nF 后正常。
4.2 ADC 采样值跳变导致均衡误触发
ADC 读数偶尔跳一下,压差判断就会误动作。除了前面说的滤波和采样时机,还要检查参考电压是否干净。我在 VREF+ 引脚加了 10μF 和 100nF 并联去耦,效果明显。另外,如果电芯引线太长,天线效应会拾取开关噪声,建议在 ADC 输入前加 RC 低通,截止频率设在 1kHz 左右。
4.3 MP2642 发热严重甚至烧毁
先确认功率回路有没有短路,特别是 MOSFET 的栅极驱动有没有直通。MP2642 的上下管死区时间是可编程的,如果设得太小,直通电流会瞬间烧管。我一般设 50ns 死区,兼顾效率和安全性。另外,如果电感饱和,电流会失控,芯片的逐周期限流也救不了,所以电感选型要留足余量。
4.4 常见问题速查表
| 现象 | 可能原因 | 排查方法 | 解决措施 |
|---|---|---|---|
| 均衡电流小 | 电感饱和、驱动不足、采样电阻偏大 | 示波器看电感电流波形、测 Vgs | 换电感、加自举电容、减小采样电阻 |
| 电流波动大 | 采样走线受干扰、地线噪声 | 示波器看 CSP-CSN 波形 | 开尔文连接、单点接地 |
| ADC 跳变 | 参考电压不稳、采样时机不对 | 测 VREF+ 纹波、调整触发时刻 | 加去耦、定时器同步触发 |
| 芯片发热 | 死区太小、开关损耗大 | 测栅极波形、算损耗 | 增大死区、降低开关频率 |
| 均衡不启动 | 压差阈值设太高、状态机卡死 | 打印状态变量、检查阈值 | 调整阈值、加看门狗 |
4.5 独家避坑经验
第一,MP2642 的使能引脚不要直接接 VCC,用 STM32 的 GPIO 控制,这样故障时能硬关断。第二,两片 MP2642 的中间总线电容要足够大,至少 100μF,否则能量搬运时总线电压会塌陷。第三,调试时先用电子负载代替电芯,确认功率级正常后再接真电池,避免意外过充过放。
我在实际项目中还发现,均衡阈值不能设得太小。有一次设了 10mV 启动,结果两节电芯电压本来就有 5mV 的采样误差,均衡频繁启停,效率极低。后来改成 30mV 启动、10mV 停止,稳定多了。
这个方案后续还可以扩展。比如增加第三片 MP2642 做三节均衡,或者把中间总线接到一个超级电容上,实现能量缓冲。STM32F412RE 的 Flash 还有富余,可以加个历史数据记录功能,方便分析电芯老化趋势。