1. 项目背景与核心需求拆解
1.1 为什么两串电池组需要主动均衡
储能和备用电源系统里,两串锂电芯串联是最常见的低压架构之一。串联之后电压叠加,容量不变,但问题也随之而来:两颗电芯从出厂那一刻起就不可能完全一致,内阻、自放电率、实际可用容量都有细微差别。充放电循环跑上几十上百次之后,这种差异会被不断放大,最终表现为一颗先充满、另一颗还没满,或者一颗先放空、另一颗还有余量。
这种不一致带来的后果很直接。充电时,先到上限的那颗会触发保护,整组被迫停止充电,另一颗永远吃不饱;放电时,先到下限的那颗触发欠压保护,整组停止放电,另一颗的容量被白白浪费。长期处于这种状态,落后那颗电芯会加速老化,整组可用容量呈阶梯式衰减。对于备用电源这种要求随时能顶上的场景,容量虚标是致命的。
被动均衡靠电阻放电,把电压高的那颗多余的能量以热量形式烧掉,结构简单但效率低、发热大,而且只能在充电阶段慢慢耗。主动均衡则是把能量从高电压电芯搬到低电压电芯,效率高、发热小,充放电全程都能工作。这个项目要做的,就是用MP2642GR-Z这颗双向主动均衡芯片,配合STM32F405RG做主控,搭一套针对两串电池单元的主动均衡方案。
1.2 选型逻辑:为什么是这两颗芯片
先说 MP2642GR-Z。这是一颗专门为两串电池主动均衡设计的芯片,内部集成了双向 buck-boost 功率级,能在两颗电芯之间双向转移能量。它的工作逻辑是检测两颗电芯的电压差,当差值超过设定阈值时启动均衡,把高电压侧的能量通过电感转移到低电压侧。芯片本身集成了功率管和驱动,外围只需要一颗电感和少量电容,PCB 面积小,特别适合空间受限的储能模组。
选它而不是分立方案,核心原因是集成度高、控制逻辑内置,不需要自己写复杂的 PWM 时序和死区控制。对于两串这种小规模场景,分立方案的成本和调试工作量都不划算。MP2642GR-Z 的均衡电流可以通过外部电阻设定,典型值在几百毫安到一安培级别,对于中小容量电芯足够用。
再说 STM32F405RG。这颗 MCU 是 STM32F4 系列里的经典型号,Cortex-M4 内核带 FPU,主频 168MHz,1MB Flash,192KB SRAM,外设资源丰富。选它主要看中几点:一是 ADC 精度和采样速率够用,能同时采两颗电芯电压和均衡电流;二是定时器资源多,方便产生控制时序和做保护逻辑;三是 CAN、UART、SPI、I2C 全都有,方便和上位机或 BMS 主控通信;四是工业级温度范围,储能场景对可靠性要求高。
注意:MP2642GR-Z 的均衡阈值和电流设定依赖外围电阻,选型阶段就要把电芯容量、期望均衡电流、允许发热量算清楚,不要等 PCB 打样了再改。
1.3 适用场景与目标读者
这套方案适合几类人参考。一是做中小型储能模组的工程师,比如家庭储能、便携式电源、通信基站备用电源,两串架构用得很多;二是做电池管理系统(BMS)的开发者,想了解主动均衡的具体实现;三是电子爱好者或学生,想动手做一个能实际工作的主动均衡板。
不管你是哪一类,这篇文章会从原理、选型、电路、代码、调试几个层面把整个方案讲透。我不会只贴一堆代码让你抄,而是把每个参数怎么来的、每个坑怎么踩的都讲清楚。你照着做,大概率能一次点亮;就算出问题,排查思路也给你整理好了。
2. 核心原理与关键参数计算
2.1 主动均衡的工作机制
MP2642GR-Z 的核心是一个双向 buck-boost 变换器。两颗电芯串联,中间节点作为参考,芯片通过电感连接两颗电芯的正极。当上电芯电压高于下电芯时,芯片工作在上电芯到下电芯的 buck 模式,能量从高电压侧流向低电压侧;反之则工作在 boost 模式,能量反向流动。
这个过程不是一直进行的,而是由芯片内部的比较器判断电压差。当压差超过设定阈值(比如 30mV),均衡启动;当压差缩小到滞回窗口以内(比如 10mV),均衡停止。这种滞回设计是为了防止在阈值附近频繁启停,造成振荡和额外损耗。
均衡电流的大小决定了均衡速度。假设两颗电芯容量都是 5000mAh,初始压差 100mV,均衡电流 500mA,那么理论上转移的能量对应容量差大约是 5000mAh × (100mV / 3.7V) ≈ 135mAh,均衡时间约 135mAh / 500mA ≈ 0.27 小时,也就是十几分钟。实际会因为电芯内阻和效率打折扣,但量级是对的。
2.2 均衡电流设定与电阻计算
MP2642GR-Z 的均衡电流通过一个外部检测电阻来设定。芯片内部有一个电流检测比较器,当检测电阻上的压降达到内部基准时,电流被限制在设定值。假设内部基准是 50mV,你想要 500mA 的均衡电流,那么检测电阻 R_sense = 50mV / 500mA = 0.1Ω。
这个电阻的功率也要算。P = I² × R = 0.5² × 0.1 = 0.025W,选 0805 或 1206 封装的 0.1Ω 电阻就够了,但要注意温漂。金属膜电阻温漂小,比厚膜更适合做电流检测。
实际调试时,均衡电流不一定要拉满。电流越大,电感和芯片发热越明显,效率也会下降。对于小容量电芯(比如 2000mAh 以下),300mA 左右就够用;大容量电芯(5000mAh 以上)可以设到 800mA 到 1A。我的经验是先用 500mA 跑一轮,摸一下温升,再决定要不要调。
2.3 电感选型与参数计算
电感是 buck-boost 的核心储能元件,选型主要看三个参数:电感值、饱和电流、直流电阻。
电感值决定了纹波电流。纹波电流 ΔI = (V_in × D) / (L × f_sw),其中 D 是占空比,f_sw 是开关频率。MP2642GR-Z 的开关频率典型值在 500kHz 左右(具体看数据手册)。假设 V_in = 3.7V,D = 0.5,L = 10μH,那么 ΔI = (3.7 × 0.5) / (10e-6 × 500e3) = 0.37A。纹波电流大约是均衡电流的 70%,有点大,可以把电感加到 22μH,纹波降到 0.17A 左右。
饱和电流要大于均衡电流加上一半纹波电流。500mA 均衡电流,纹波 0.17A,峰值电流约 0.585A,选饱和电流 1A 以上的电感比较稳妥。直流电阻越小越好,减小导通损耗,一般选 50mΩ 以内的。
提示:电感选屏蔽式,减少 EMI。绕线电感性价便宜但漏磁大,可能干扰旁边的 ADC 采样。
2.4 电压采样与 ADC 配置
STM32F405RG 的 ADC 是 12 位,参考电压 3.3V,理论分辨率 3.3V / 4096 ≈ 0.8mV。但实际有效位数会受噪声影响,做好滤波的话能到 10 到 11 位有效,分辨率约 1.6mV 到 3.2mV。对于均衡阈值 30mV 来说,这个精度足够了。
两颗电芯的电压采样需要分压。上电芯电压是两颗之和,最高 8.4V(4.2V × 2),超过 ADC 量程,必须分压。下电芯电压最高 4.2V,也超过 3.3V,同样要分压。分压电阻选高精度 1% 的金属膜电阻,阻值根据分压比算。
假设上电芯分压比 1/3,用 100kΩ 和 50kΩ 串联,那么 8.4V 分压后是 2.8V,在量程内。下电芯分压比 1/2,用 100kΩ 和 100kΩ,4.2V 分压后 2.1V。分压电阻会引入误差,因为 ADC 输入阻抗不是无穷大,但 STM32 的 ADC 输入阻抗在采样时间足够长时可以忽略。采样时间设长一点,比如 480 个 ADC 周期,让采样电容充分充电。
软件上要做滑动平均滤波,比如连续采 16 次去掉最大最小值再平均,能有效抑制开关噪声。均衡工作时电感会辐射噪声,采样时刻要避开开关瞬间,可以在 PWM 周期中间触发 ADC。
3. 硬件电路设计与实操要点
3.1 整体框图与供电设计
整个系统分三块:电池组、均衡功率级、控制与采样。电池组是两颗串联电芯,中间节点引出作为参考地。MP2642GR-Z 的 VIN 接上电芯正极,GND 接中间节点,SW 引脚接电感一端,电感另一端接中间节点。下电芯正极就是中间节点,所以芯片的供电来自上电芯。
STM32F405RG 的供电需要 3.3V,可以从电池组经过 LDO 降压得到。但要注意,电池组电压范围是 6V 到 8.4V,LDO 要选宽压输入的,比如支持 3V 到 18V 输入的型号。LDO 的静态电流要小,备用电源场景下待机功耗很关键,选静态电流几十微安的。
如果 MCU 要和上位机通信,UART 或 CAN 的隔离要做好。储能系统里电池组和主控之间往往有电位差,不隔离容易烧接口。用数字隔离器或者光耦都行,成本允许的话用磁隔离,速度快、寿命长。
3.2 MP2642GR-Z 外围电路细节
MP2642GR-Z 的外围电路不复杂,但有几个细节容易翻车。
输入电容要靠近 VIN 引脚,选低 ESR 的陶瓷电容,10μF 加 0.1μF 并联。输入电容的作用是吸收开关瞬间的电流尖峰,离得远的话尖峰会串到采样电路上,导致电压读数跳动。
电感要选对方向。虽然电感是无极性元件,但布局上要让电感的走线尽量短,减少辐射环路面积。SW 节点的走线是高频开关节点,面积越小越好,不要在上面挂测试点。
检测电阻的走线要用开尔文接法,也就是从电阻两端单独引两根线到芯片的检测引脚,不要和功率走线共用。否则功率走线上的压降会叠加到检测信号上,导致电流设定不准。
注意:MP2642GR-Z 的使能引脚不要悬空,要么拉高要么拉低,悬空可能引入干扰导致芯片误启动。
3.3 STM32F405RG 最小系统与引脚分配
STM32F405RG 用 3.3V 供电,外部晶振用 8MHz,配合内部 PLL 倍频到 168MHz。复位电路用 10kΩ 上拉加 100nF 电容,BOOT0 下拉到地,从 Flash 启动。
引脚分配上,ADC 通道选两个,一个采上电芯分压,一个采下电芯分压。定时器选一个高级定时器,比如 TIM1,用来产生控制时序和触发 ADC。UART 选 USART1 做调试输出,CAN 选 CAN1 做上位机通信。GPIO 留几个做状态指示和使能控制。
PCB 布局时,模拟部分和数字部分要分开。ADC 采样走线远离电感和 SW 节点,最好用地平面隔开。晶振靠近 MCU,走线短且包地。LDO 的输出电容靠近 MCU 的 VDD 引脚。
3.4 保护电路与可靠性设计
储能和备用电源对可靠性要求高,保护电路不能省。
过压保护:两颗电芯电压超过 4.25V 时,MCU 要能切断充电回路。可以用 MCU 控制一个 MOS 管或者继电器,但更稳妥的是用独立的保护 IC,比如带过压检测的电池保护芯片,硬件层面直接切断,不依赖软件。
过流保护:均衡电流超过设定值 1.5 倍时,MP2642GR-Z 内部有电流限制,但 MCU 也要监测,异常时拉低使能引脚。
温度保护:在电感和芯片附近贴 NTC 热敏电阻,MCU 定期读温度,超过 85℃ 降额或者停止均衡。
反接保护:电池组反接会烧芯片,输入端加一个肖特基二极管或者 P-MOS 防反接电路。肖特基压降大,P-MOS 压降小但成本高,看预算选。
4. 软件架构与控制逻辑实现
4.1 系统初始化与外设配置
软件用 C 语言,基于 HAL 库开发,方便移植。初始化流程分几步:时钟配置、GPIO 配置、ADC 配置、定时器配置、UART 配置、CAN 配置。
时钟配置把 HSE 8MHz 倍频到 168MHz,APB1 分频到 42MHz,APB2 分频到 84MHz。ADC 时钟不能超过 36MHz,所以 ADC 预分频要设对。
ADC 配置成扫描模式,两个通道轮流采。采样时间设 480 个周期,12 位分辨率。用 DMA 搬运数据,不占 CPU。定时器 TIM1 设成 1kHz 中断,每次中断触发一次 ADC 采样,同时做均衡控制的状态机更新。
UART 设 115200 波特率,8 数据位,1 停止位,无校验。CAN 设 500kbps,标准帧。
4.2 电压采样与滤波算法
ADC 读到的原始值是 0 到 4095,要转换成电压。转换公式:V = raw × 3.3 / 4096 × 分压比。上电芯分压比 3,下电芯分压比 2。
滤波用滑动平均加中值滤波。维护一个长度 16 的数组,每次新数据进来,去掉最大最小值,剩下 14 个求平均。这样既能抑制随机噪声,又能滤掉脉冲干扰。
代码示例:
#define FILTER_LEN 16 static uint16_t adc_buf[2][FILTER_LEN]; static uint8_t adc_idx = 0; float get_cell_voltage(uint8_t cell) { uint16_t max = 0, min = 4095; uint32_t sum = 0; for (int i = 0; i < FILTER_LEN; i++) { uint16_t v = adc_buf[cell][i]; if (v > max) max = v; if (v < min) min = v; sum += v; } sum -= max; sum -= min; float avg = (float)sum / (FILTER_LEN - 2); float ratio = (cell == 0) ? 3.0f : 2.0f; return avg * 3.3f / 4096.0f * ratio; }这个函数每 1ms 调用一次,更新电压值。实际调试时发现,如果均衡正在工作,采样值会有周期性波动,可以在均衡启动后延迟几毫秒再采样,避开开关瞬间。
4.3 均衡控制状态机
均衡控制用一个状态机实现,状态包括:空闲、检测、均衡中、故障。
空闲状态:均衡关闭,定期检测电压。如果压差超过启动阈值(比如 30mV),进入检测状态。
检测状态:连续采样几次,确认压差稳定超过阈值,进入均衡中。如果压差掉到阈值以下,回到空闲。
均衡中:拉高 MP2642GR-Z 的使能引脚,启动均衡。同时监测压差和温度。如果压差缩小到停止阈值(比如 10mV),拉低使能,回到空闲。如果温度超限或者压差反而扩大,进入故障。
故障状态:拉低使能,记录故障码,通过 UART 和 CAN 上报。等待上位机复位或者自动恢复。
状态机每 1ms 跑一次,用 switch-case 实现。状态转换要加去抖,比如连续 5 次满足条件才切换,防止在阈值附近抖动。
4.4 通信协议与数据上报
UART 用于调试,每秒打印一次电压、电流、温度、状态。格式简单点,方便用串口助手看。
CAN 用于和上位机通信,定义几个报文 ID。比如 0x100 上报电压,0x101 上报状态,0x200 接收控制命令。数据用大端格式,浮点数转成整数传输,避免字节序问题。
上报周期可以设 100ms,太快占带宽,太慢响应不及时。如果压差变化快,可以动态调整上报周期,压差大时加密上报。
提示:CAN 总线两端要接 120Ω 终端电阻,不接的话通信距离短且容易出错。
5. 调试过程与常见问题排查
5.1 上电调试步骤
第一次上电不要直接接电池,先用可调电源模拟电池组。上电芯设 3.8V,下电芯设 3.7V,中间节点接电源地。观察电流消耗,正常应该在几十毫安以内(MCU 加 LDO 静态电流)。
然后测 MP2642GR-Z 的使能引脚,默认应该是低电平,均衡关闭。用万用表测两颗电芯的采样电压,和实际值对比,误差应该在 1% 以内。如果误差大,检查分压电阻阻值和 ADC 参考电压。
接着手动拉高使能引脚,测均衡电流。用电流钳或者串联一个毫欧电阻测压降。如果电流和设定值差很多,检查检测电阻和电感。
最后接真实电池,跑一轮充放电,观察均衡效果。正常的话,压差应该逐渐缩小,最终稳定在 10mV 以内。
5.2 常见问题速查表
| 现象 | 可能原因 | 排查方法 | 解决方法 |
|---|---|---|---|
| 均衡不启动 | 压差未超阈值 | 测两颗电芯电压 | 调低阈值或检查采样 |
| 均衡电流偏小 | 检测电阻偏大 | 测检测电阻阻值 | 换小阻值电阻 |
| 均衡电流偏大 | 检测电阻偏小 | 测检测电阻阻值 | 换大阻值电阻 |
| 芯片发热严重 | 电感饱和或电流过大 | 测电感电流波形 | 换大饱和电流电感或降电流 |
| 电压采样跳动 | 噪声干扰 | 示波器看采样点 | 加滤波电容或改采样时刻 |
| 通信失败 | 波特率或终端电阻 | 测总线波形 | 核对波特率,加终端电阻 |
| 均衡效果差 | 电芯老化严重 | 测电芯内阻 | 更换电芯 |
5.3 独家避坑经验
第一个坑是电感选型。我一开始选了个便宜的非屏蔽电感,结果均衡一启动,ADC 采样就跳得厉害,电压读数偏差超过 50mV。换成屏蔽电感后立刻好了。所以电感一定要选屏蔽的,别省这个钱。
第二个坑是采样时刻。最初 ADC 是自由触发的,均衡工作时采样值波动很大。后来改成定时器在 PWM 周期中间触发,波动小了很多。因为开关瞬间噪声最大,周期中间相对干净。
第三个坑是检测电阻的走线。第一版 PCB 把检测电阻和功率走线共用,结果电流设定比预期大了 20%。改成开尔文接法后,误差降到 5% 以内。
第四个坑是温度保护。有一次连续均衡了半小时,电感温度到了 90℃,芯片也烫手。后来加了 NTC,超过 70℃ 就降电流,超过 85℃ 就停止,再也没出现过热问题。
5.4 性能优化方向
如果想让均衡更快,可以适当提高均衡电流,但要同步升级电感和散热。如果想让待机功耗更低,可以降低 MCU 主频,关闭不用的外设,用低功耗定时器唤醒。
如果要多组电池级联,可以把 CAN 总线做成菊花链,每组一个节点,上位机统一调度。这时候要注意 CAN ID 分配和冲突避免。
如果要做算法优化,可以引入电芯模型,根据内阻和容量差异动态调整均衡策略,而不是单纯看电压差。不过这需要更多传感器和计算资源,看需求取舍。
6. 实测数据与效果评估
6.1 均衡速度实测
用两颗 5000mAh 电芯,初始压差 120mV,均衡电流设 500mA。实测下来,压差从 120mV 降到 10mV 用了约 22 分钟。理论计算是 18 分钟左右,实际多了 4 分钟,主要是电芯内阻和变换效率的影响。效率大概在 85% 到 90% 之间,损耗主要来自电感和芯片的导通电阻。
如果把均衡电流提到 800mA,时间缩短到 14 分钟左右,但电感温度从 45℃ 升到 65℃。所以电流不是越大越好,要平衡速度和发热。
6.2 待机功耗实测
均衡关闭时,整板功耗约 8mA,主要是 MCU 和 LDO 的静态电流。MCU 跑 168MHz 时电流约 30mA,降到 16MHz 后约 8mA。如果做低功耗优化,关掉不用的外设,待机可以降到 2mA 以下。对于备用电源场景,这个功耗可以接受。
6.3 长期运行稳定性
连续跑了 200 次充放电循环,均衡功能一直正常。压差始终能收敛到 10mV 以内,没有出现振荡或者失效。温度保护触发过两次,都是因为环境温度高加上均衡电流大,降额后恢复正常。
采样精度方面,和万用表对比,误差在 5mV 以内,满足 30mV 阈值的判断需求。如果要做更精细的均衡,可以换 16 位外置 ADC,但成本会上去。
7. 方案扩展与个人体会
这套两串主动均衡方案的核心思路,其实可以扩展到更多串。MP2642GR-Z 是两串专用,如果要做四串或者更多,可以用多颗芯片级联,或者换支持多串的均衡芯片。控制逻辑大同小异,都是检测压差、转移能量、监测保护。
STM32F405RG 的资源对于两串来说绰绰有余,如果做更多串,可以换引脚更多的型号,或者用外部多路复用器扩展 ADC 通道。通信方面,CAN 总线天然支持多节点,扩展起来方便。
我个人在实际操作中的体会是,主动均衡的价值在电芯不一致的中后期才真正体现。新电芯一致性好的时候,被动均衡也能凑合;但跑了一两年之后,主动均衡能把整组容量多榨出 10% 到 20%,对于备用电源这种要求随时满血的场景,这个提升很关键。
最后分享一个小技巧:调试阶段可以在均衡回路上串一个毫欧级的采样电阻,用示波器看电流波形。波形干净、没有尖峰,说明布局和电感选型没问题;波形毛刺多,就要检查走线和屏蔽。这个比只看万用表读数有用得多。