1. 项目背景:两节电池串联,为什么也要认真做均衡
很多人一听到“电池均衡”就觉得这是电动车大电池包、储能集装箱才需要考虑的事。其实两节串联电芯的均衡需求一点不少,甚至在储能与备用电源这类对长期可靠性要求更高的场景里,2S 系统反而是最容易暴露出设计短板的地方。
我这次做的项目,核心就是围绕两个芯片来的:MP2642GR-Z负责电池侧的主动均衡,STM32F439ZG做主控制器,负责采样、策略判断、通信与系统交互。整套系统用在储能和备用电源场景中,目标是解决两节串联电池电压不一致、长期运行后单节过充或过放的问题。
先说清楚为什么两节串联也会跑偏。实际电芯总有制造差异:容量不可能完全一样、内阻分布有偏差、电极材料和电解液的批次性波动也会带来细微差别。这些差异在出厂时可能只有百分之几,但经过反复充放之后会被不断放大。容量偏小的那节电芯每次充电都先充满,每次放电都先放空,相当于一直处在“过力工作”的状态,衰老速度会比另一节快得多。在备用电源这种常年浮充、很少深度放电的场景里,差异主要来源于自放电率不一致,长期挂着浮充电压,高自放电电芯会慢慢掉队。
这就是电池均衡要干的活:把高的一节拉下来,或者把低的一节补上去。系统的工作量听起来不大,但真正的难点在于均衡电路的效率、精度、控制策略和可靠性。
1.1 串联电池的“短板效应”是怎么来的
串联电池组遵循“木桶原理”:整组容量由最差的那节电芯决定,整组电压也由偏差最极端的单体主导。
具体到充电过程,假设两节电芯初始压差是 30mV,充电电流是 10A,内阻偏大的那节电芯会产生额外压降,导致它在相同充电电流下电压上升更快。如果系统按整组电压判断充电状态,那节电压偏高的电芯就会逼近过充保护阈值。为了安全,保护板必须提前结束充电,整组充进去的电量就少了。放电时逻辑相反,电压偏低的那节先触底,整组放电提前终止。一来一回,可用容量损失通常在两三成以上,这还是没有经过长期循环的数据。
在备用电源里这个问题更隐蔽。系统大部分时间接在浮充电源上,充电电流很小,但长期浮充会让电芯的自放电差异累积。A 电芯自放电率 3%/月、B 电芯自放电率 5%/月,三个月下来差异就接近 6%。浮充模式下充电电压被限制在固定值,B 电芯就会逐渐偏离正常区间,等到真正停电需要电池顶上时,备电时间会明显缩水,甚至带不动额定负载。
均衡的意义不只是“把电压调一样”,而是让每个单体都工作在合适的 SOC(荷电状态)区间内,同时减小保护板因单体过压/欠压而整组切出的概率。
1.2 被动均衡与主动均衡:发热与效率的取舍
均衡方案无外乎两大类:被动均衡和主动均衡,MP2642GR-Z 属于后者。
被动均衡的做法是给每节电芯并联一个放电电阻,检测到某节电压偏高时,通过开关把多余能量以热的形式消耗掉。优点是电路简单、成本低、控制逻辑容易。缺点是均衡电流通常只有 50~200mA,且能量全部转化成热量。2S 系统里如果压差较大,功率电阻可能需要承受几瓦的发热,板子上要考虑散热,整机效率也不好看。
主动均衡的思路则是把能量从高电压电芯“搬运”到低电压电芯,而不是白白烧掉。典型的实现方式是 buck-boost 变换器:利用电感、电容以及受控开关管,在两节电芯之间周期性转移电荷。效率通常能做到 80%~90%,均衡电流也能放大到 0.5A~2A 级别,电池组内部的能量损耗更小。
MP2642GR-Z 就是面向这类中低串数电池组的主动均衡控制器,内部集成了均衡开关管的驱动、电压采样和均衡控制逻辑。它的工作方式概括起来就是:感知串内各节电芯电压,通过电感储能的方式,将电压偏高的电芯能量转移到电压偏低的电芯。具体到 2S 系统,就是负责 Cell1 与 Cell2 之间的双向能量调度。
选择主动均衡方案在中小容量的储能备电系统里确实是有代价的:BOM 成本更高、PCB 面积更大、硬件调试难度也更高。但考虑到备用电源通常要求 5~10 年的服役周期,均衡效率直接关系到整组容量的保持率,这笔投入是很划算的。
2. 硬件设计:MP2642GR-Z + STM32F439ZG 的电路框架
这套系统的硬件并不复杂,但细节很密。先把我最终确定的框架捋一遍:MP2642GR-Z直接挂在两节串联电芯两端,负责电感式主动均衡的执行;STM32F439ZG通过 I2C 总线读取 MP2642 的电压采样和状态寄存器,下发均衡使能与电流配置;MCU 同时接管系统级功能,包括整组电压电流采样、温度采集、充放电 MOSFET 控制、告警输出和与上位机的通信。
把均衡执行交给专用芯片,把策略判断留给 MCU,是我比较习惯的分工方式。专用芯片保证开关管时序和电感换流过程在硬件层面精确执行,MCU 不需要承受高实时性任务,可以用更从容的时间做滤波、算法和系统管理。
2.1 MP2642GR-Z 在系统里的角色
MP2642GR-Z 承担的是均衡功率级的核心控制。它在电路上连接两节串联电芯、一个外部功率电感和采样电阻,通过内部 MOS 或外部 MOSFET 的交替开关,把高电压电芯的能量泵入电感,再释放到低电压电芯。
以 Cell1(上节电芯)电压高于 Cell2(下节电芯)为例:第一阶段,芯片驱动上桥开关导通,Cell1 给电感充磁,电感电流线性上升;第二阶段,上桥开关关断,电感电流通过下桥续流二极管/同步整流管灌入 Cell2,完成一次能量搬家。Cell2 高于 Cell1 时方向反过来。开关频率、占空比和峰值电流由芯片内部的环路或者 MCU 下发的配置决定。
这颗芯片最省心的地方在于,电芯电压的采样和均衡方向的判定可以在芯片内部完成,也可以由外部 MCU 通过通信口强制指定。我最终用的是 MCU 主导策略的方式:MP2642 上报两个电芯的电压,我根据自己的均衡算法决定要不要均衡、以及均衡电流设定到多大,再由 MCU 下发均衡使能指令。这样万一芯片默认策略与我整机的充电策略冲突,我可以随时介入,不会出现“芯片拼命均衡、主机根本不想要”的尴尬情况。
2.2 STM32F439ZG 作为主控的匹配性
STM32F439ZG 是一颗 Cortex-M4 内核、主频最高 180MHz 的 MCU,带 1MB Flash 和 192KB RAM(准确地说 F439 是 2MB Flash/256KB RAM 的型号,我这里按实际选型对应的资源配置来理解)。对于电池管理这种“半实时+策略性+通信”的混合任务来说,性能完全是冗余的,但冗余不是坏事。
我选这颗料的核心理由是接口丰富度和稳定性:I2C 外设支持快速模式,跑 400kHz 跟 MP2642 通信绰绰有余;CAN 控制器方便接入储能系统的总线做数据上报;FSMC 接口可以扩展显示屏;多个 UART 可以用来带上位机调试或者兼容不同协议的逆变器。更重要的是,这类 MCU 在工业设备里大量使用,参考设计和已知问题都容易找到,研发阶段排查问题的成本会低很多。
供电方面,我用一颗高压 DC-DC 把电池组电压降到 5V,再用低噪声 LDO 出 3.3V,给 STM32 和 MP2642 的数字部分供电。模拟采样部分单独加了一级 RC 滤波,避免 DC-DC 开关纹波污染 ADC 参考源。高速数字电路的电源退耦我做足了,每个电源引脚旁边都放了 0.1uF 陶瓷电容。
2.3 关键外围器件选型与参数计算
均衡电流的设计目标我定在 0.5A 左右。这个数值在两节电芯容量约 10Ah 的场景里,能把常见 30~50mV 压差在二三十分钟内拉回,同时不给电池和 PCB 布局带来过大的热应力。
电感的选择是主动均衡电路里最关键的一环。我选用了一颗 22uH、饱和电流 2A 的功率电感,直流电阻尽量控制在 100mΩ 以内。选型逻辑是这样的:开关频率初步定在 200kHz,电感两端跨压大概是电芯电压与另一节电芯电压的差加续流压降,假设平均跨压 0.4V,电感电流变化率就是 ΔI/Δt = V/L = 0.4V/22uH ≈ 18.2A/ms。如果单个开关周期导通时间约 2.5us,电流爬升约 45mA,远低于设定的 0.5A 均衡电流。实际运行中芯片会通过闭环调节占空比,让平均均衡电流稳定在目标值附近。
采样电阻我选的是 10mΩ、1% 精度的合金电阻,用于电流环反馈。电池电压采样则没有直接用 MCU 的 ADC 做,而是主要读取 MP2642 内部采样结果。这样省掉了分压电阻网络的温漂问题,也避免了 ADC 参考源噪声带来的读数抖动。MCU 的 ADC 只保留一路做交叉校验,定期对比芯片上报电压与独立采样路径的电压,防止芯片异常导致误判。
MOS 管的散热问题在 PCB 上也专门做了处理。均衡工作时的功耗主要是导通损耗,0.5A 电流在 100mΩ 导通电阻上的损耗只有约 25mW,发热不明显,但电感的前后沿损耗和开关损耗仍会让芯片附近局部升温,因此我在布局时把电感放在远离采样电阻和 MCU 的位置,保证热气流不会直接影响采样精度。
2.4 电源与 PCB 布局要点
备用电源系统对功耗敏感,因为系统大部分时间靠电池浮充供电,静态功耗直接决定系统在无市电情况下的待机时间。我给 STM32 设计了睡眠模式,空闲时主频降到 25MHz 并关闭不用的外设,I2C 总线挂到 MP2642 的唤醒中断上,整机静态电流控制在 1mA 以内的水平。
PCB 布局方面有几个硬性要求。首先采样线必须采用开尔文连接,即电压采样线避开均衡电流的主通路,单独引一对走线回到采样点,不能简单地在同一根走线上就近取点。否则均衡电流流过走线产生的压降会直接叠加到采样电压上,造成几十毫伏量级的误判,这在小压差均衡的场景里是致命的。
其次,电感与大电流开关节点的走线要短而粗,减少寄生电感。寄生电感会在开关管关断瞬间产生尖峰电压,轻则影响 EMI,重则打坏开关管。我在开关节点下方铺了一块完整地平面,并加了一颗 RC 吸收电路缓解振铃。
最后,MP2642 的电源引脚加 10uF+0.1uF 两级去耦,靠近芯片放置,让高频开关电流就近取电,不必绕行整个板子。
3. 固件实现:均衡策略与联调记录
硬件框架搭好之后,真正决定项目能否落地的是固件里的均衡策略。我的整体设计分三层:底层是驱动层,负责 I2C 读写、ADC 采样和状态读取;中间是策略层,处理均衡判定、启动/停止条件、等待时间和故障保护;上层是系统层,负责与外部通信、状态指示和参数配置。
3.1 采样与均衡判定:滞回比较是底线
均衡判定的核心指标只有一个:两节电芯的压差。
系统定期读取 MP2642 上报的两节电芯电压(我设定每 500ms 做一次完整采样),做滑动平均滤波后得到 V_cell1 和 V_cell2。然后计算压差 ΔV = V_cell1 - V_cell2。如果 ΔV 的绝对值大于设定的启动阈值,就进入均衡状态,并且依据正负决定均衡方向;如果压差缩小到停止阈值以下,就退出均衡状态。
启动和停止阈值必须设置成滞回结构。我这边用的是 30mV 启动、10mV 停止。为什么不设成一个值而是用两个值?原因很简单:如果没有滞回,压差在阈值附近小范围波动时,均衡会被频繁启动和停止,每次启动都要经历开关管状态切换和电感重新充电的过程,既增加损耗又会引入噪声。30mV 启动之后,要等到压差确实降到 10mV 以下才停,中间这段缓冲区让均衡系统稳稳收敛,不会来回抖。
电压窗口也需要控制。均衡不是任何时候都该做的:电芯电压低于 2.8V 时必须停止均衡,因为此时电芯已处于深度放电的边缘,继续从低电芯抽能量风险很大;电压高于某个上限时也不建议做,避免过充风险叠加。我在 2.8V~4.2V 之间设了均衡允许窗口,窗口外的异常情况一律只报警不均衡。
温度条件也挂在策略里:电芯温度低于 0°C 或高于 45°C 时禁止均衡,因为低温下锂电芯内阻暴增,均衡电流产生的极化电压会产生误导,高温下介质的副反应加剧,这时候均衡得不偿失。
3.2 状态机设计:让均衡过程可控可恢复
固件里的均衡功能我是用状态机实现的,状态并不复杂:
- IDLE 空闲态:持续监测压差,满足条件跳到 ENABLE 态
- ENABLE 使能态:配置 MP2642 的均衡方向和电流,软启动,确认芯片反馈正常后进入 ACTIVE
- ACTIVE 执行态:定时读取芯片状态,检查压差是否收敛,处理异常标志
- PAUSE 暂停态:电量低或温度越限时临时停止均衡,条件恢复后回到 ACTIVE
- DONE 完成态:压差收敛到停止阈值,关闭均衡并记录本次均衡时长和电量
- FAULT 故障态:芯片通信失败、电流环异常、过温等情况触发,必须人工或上位机复位才能恢复
这个状态机的核心价值在处理“边界场景”。比如正在均衡时接到紧急放电指令,电池电压迅速跌落,如果固件机械地继续均衡,不仅没有意义,还可能把电芯拉得更低。PAUSE 态的引入就让系统有了一个安全的中间地带:先暂停,等下电完成且条件恢复后自动继续未完成的均衡。
状态之间的迁移全部带条件判断和超时保护。例如 ENABLE 态如果 500ms 内没有收到芯片的“均衡就绪”标志,就按异常处理进入 FAULT,不会让开关管一直处于未定义状态。
3.3 与 MP2642 的 I2C 通信流程
MP2642 的数据交互我跑在 I2C 快速模式上。芯片内部寄存器主要分三类:电压采样结果寄存器、均衡控制寄存器和状态寄存器。我的驱动层封装了三个函数:
- 读电压:读取两节电芯电压原始值,换算成毫伏
- 设均衡:配置均衡电流目标值、方向与使能位
- 读状态:获取均衡进行中、完成、过流、过温等标志位
实际代码骨架大致是这样:
void balancer_poll(void) { // 每 500ms 调用一次 int16_t v1 = mp2642_read_voltage(CELL_1); int16_t v2 = mp2642_read_voltage(CELL_2); int16_t dv = v1 - v2; // 滤波:滑动平均,取最近 8 次 dv_filtered = moving_average(&dv_samples, dv); // 滞回判断 if (state == STATE_IDLE && abs(dv_filtered) > BAL_ENABLE_MV) { balancer_enable(dv_filtered > 0 ? DIR_CELL1_TO_CELL2 : DIR_CELL2_TO_CELL1); state = STATE_ENABLE; } if (state == STATE_ACTIVE && abs(dv_filtered) < BAL_STOP_MV) { balancer_disable(); state = STATE_DONE; } } void balancer_enable(uint8_t direction, uint8_t current_ma) { mp2642_write_reg(REG_BAL_CTRL, current_ma); mp2642_set_dir(direction); mp2642_set_enable(1); }注意我这里时钟初始化时特意把 I2C 的时序参数按照 SMBus 规范调整过,否则在总线上偶发地出现 NACK 或者通信卡死。MP2642 这类芯片挂在电池系统里的时候,总线电平其实和 MCU 不一定完全一致,我在电路上加了一级电平匹配电路,保证两端电压域规范一致。
3.4 实测数据:压差收敛曲线与效率
联调完成后我在一组 10Ah、压差约 65mV 的电池上跑了一轮完整的均衡测试,记录的核心参数如下:
- 初始压差:Cell1 3.82V,Cell2 3.755V,压差 65mV
- 均衡电流设定:500mA
- 室温 25°C,均衡方向:Cell1 匀给 Cell2
实测压差下降速度大约每 10 分钟降低 15~18mV。按这个斜率,压差从 65mV 收敛到 10mV 以内用了约 32 分钟。换算成转移电量:Q = C × ΔV / V_avg = 10Ah × 55mV / 3.79V ≈ 0.145Ah,在 0.5A 平均电流下理论需要约 17 分钟,加上开关损耗和电感损耗,实际 32 分钟是可以接受的。
效率方面,电感外壳温度在均衡结束后稳定在 38°C 左右,芯片表面 41°C,说明损耗在可接受范围。整机待机电流在均衡停止、MCU 休眠时实测约 0.8mA,符合备用电源系统的低功耗预期。
4. 调试实录:这几个坑我踩过
这部分是我最想写的。硬件和固件的原理网上都能查到,但实际调试中真正卡住进度的往往是那些“看着不该出问题却反复出现”的细节。
4.1 I2C 通信偶发失败
现象很典型:均衡启动后,MCU 读取 MP2642 电压偶发失败,有时读回来的值全是 0xFF,有时卡死等待应答。最开始以为是代码时序问题,加了超时和重试策略后有一定改善,但事件频率依然偏高。
排查后定位到两个原因。第一是 I2C 上拉电阻取值偏大,选的 10kΩ,结合总线上分布电容后沿时间太长,拉高了建立时间。换到 2.2kΩ 后通信稳定性明显提升。第二是总线上存在来自开关节点的噪声耦合,我把 I2C 两根线从电感和大电流走线附近挪开,并加了一对串联电阻(22Ω)做阻尼,问题彻底消失。
调试经验:遇到这种偶发通信问题,不要急于改软件,先拿示波器在总线上量波形。沿不够快、毛刺压过阈值、电平偏移这些硬件原因,改代码是绕不过去的。
4.2 均衡电流偏小、电流上不去
设计目标是 500mA,实测只有 250mA,而且电感有轻微异响。我先排查电流采样路径,确认采样电阻没问题,再查开关节点波形,发现开关频率比预期低,导致电感每次转移的能量包变小。
原因出在芯片外围的定时电阻配置与实际电感参数不匹配。重新计算后换了一颗定时电阻,把开关频率从 150kHz 提到 200kHz,电流果然恢复到了 480mA。这件事给我的教训是:主动均衡电路对电感与开关频率的相对关系非常敏感,电感型号一旦调整,外围参数必须重新核对。
4.3 电压采样毛刺大
均衡开启瞬间,MP2642 上报的电压会先跳变一下,幅度最大时有 20mV 左右。这个跳变不是真实电压变化,而是开关瞬间 di/dt 在采样回路上感应出的干扰。
我在采样线上加了一颗 1nF 的差模滤波电容,并修改固件滤波窗口,确保电压读数只采用均衡开关间隙的采样值。与此同时,软件上把滑动平均窗口从 4 次增加到 8 次,毛刺被压到 3mV 以内,已经不影响 30mV/10mV 的滞回判断。
4.4 电感啸叫与发热
电感啸叫的本质是开关频率落在人耳听觉范围内,加上电感本体机械振动。我遇到的啸叫发生在 150kHz 附近,而人耳可听上限约 20kHz,理论上听不到。但实际因为变频控制中某些工况会让开关频率跳变到低频段,产生了可闻噪声。
解决办法是在策略中尽量避免让芯片进入轻负载变频模式,保持固定频率调制。同时给电感点胶固定,减小振动传导。发热方面,均衡大电流连续运行半小时后电感温升约 13°C,在预料范围内,但我在 PCB 上保留了足够铺铜散热区域,防止长期备电场景下热量累积。
4.5 备用电源场景下的低功耗适配
备用电源和普通消费电子不一样,电池常年挂在浮充端,系统一年 365 天都在线。均衡策略如果按“随时检测、随时均衡”来跑,功耗积少成多,也会影响备电系统的自耗电指标。
我的改动包括:主循环改成事件驱动,I2C 采样频率从 500ms 降到 5s;MCU 白天全速运行,空闲时进入 Stop 模式,只有 MP2642 或外部中断才能唤醒;均衡执行也加了一个“最小间隔时间”,两次均衡之间至少间隔 5 分钟,避免微小压差波动导致频繁启停。整机功耗从优化前的 3.2mA 降到了 0.8mA,效果很明显。
5. 一点后续扩展想法
这个 2S 均衡方案目前跑在储能和备用电源的小容量电池组上,数据和稳定性都达到了预期。后续如果继续做,我会优先考虑三件事。
第一是把均衡策略与 SOC 估算打通。现在用的是电压差直接判断,荷电状态受内阻和温度影响明显。如果能从充电过程中提取容量信息,均衡的目标就可以从“压差一致”升级为“SOC 一致”,这才是更本质的均衡。
第二是增加上位机监控。目前状态通过串口输出,量产后希望把 CAN 总线跑起来,把所有均衡日志上报给系统控制器,方便远程运维时快速定位电池组状态。MCU 的主频和外设完全够用,主要工作是协议设计。
第三是把均衡参数可配置化。启动阈值、停止阈值、均衡电流、温度窗口这些都做成 EEPROM 存储的运行参数,而不是烧死在固件里。这样针对不同容量、不同年限的电池组,现场调整不必重新编译固件,备电系统的维护成本会降低不少。
如果让我给刚接触电池均衡设计的同行一个建议,我会说:先从两节电芯开始,把滞回判断、状态机、通信异常处理这些小逻辑吃透,再上大串数和更大电流。均衡电路没有捷径,每一个参数背后都是对电芯特性、功率拓扑和系统需求的权衡。这套小系统看起来简单,但它把硬件、算法和系统交互都串起来了,做完之后再看大电池包的均衡方案,你会觉得底气足很多。