1. 从两个串联电芯的电压差说起:为什么被动均衡在储能场景下依然能打
储能和备用电源系统里,两串电芯的架构非常常见——小到便携式储能电源,大到通信基站的后备电池组,很多设计都会先用两节锂电芯串联得到一个基础电压平台,再通过多组并联来扩容。但串联带来的问题也很直接:两节电芯出厂容量、内阻就有差异,用久了差异还会被放大,充电时容量小的那节先到上限,放电时它又先到下限,整组可用容量被最弱的那节拖死。这时候就需要均衡电路介入。
均衡分两条技术路线:被动均衡和主动均衡。主动均衡用变压器、电感或者电容在电芯之间搬能量,效率高、发热小,但电路复杂、成本高、EMI难搞。被动均衡说白了就是给电压高的那节电芯并一个电阻放电,把多出来的能量以热的形式消耗掉,直到两节电压拉平。听起来很“笨”,但在两串小容量储能和备用电源场景里,被动均衡的性价比反而最高——元件少、控制简单、可靠性高,而且两串架构下需要泄放的能量本来就不大。
我这次做的方案,核心是一颗MP2642GR-Z均衡管理芯片搭配STM32L162ZE主控。MP2642GR-Z 负责两串电芯的电压采集和被动均衡执行,STM32L162ZE 负责逻辑判断、状态机调度和对外通信。选 STM32L162ZE 而不是更常见的 F103,主要是看中它的低功耗特性——备用电源系统很多时候处于待机监测状态,主控功耗直接决定系统静态电流,L162 系列在低功耗运行模式下的表现能明显拉低整机待机功耗。
这篇文章我会把整个方案从选型逻辑、硬件连接、均衡策略、固件实现到实测踩坑完整讲一遍。适合正在做两串锂电管理、储能BMS或者备用电源监控的硬件和嵌入式工程师参考,尤其是那些不想上复杂主动均衡、又希望均衡逻辑可控可调的场景。
2. MP2642GR-Z 与 STM32L162ZE 的分工逻辑:谁采集、谁决策、谁执行
2.1 为什么不让主控直接做电压采集和均衡
很多人第一反应是:两串电芯而已,STM32 的 ADC 通道那么多,直接分压采集两节电压,再用两个 GPIO 控制两个 MOS 管加泄放电阻不就行了?理论上可行,但实际做下来问题不少。
第一,STM32 的 ADC 参考电压和分压电阻精度直接决定采集误差,12 位 ADC 在 4.2V 满量程下理论分辨率约 1mV,但分压电阻的温漂和 ADC 自身的偏移会让实际误差到十几甚至几十毫伏,而均衡判断往往需要 10mV 级别的精度。第二,两串电芯的高端电压采集需要处理共地问题,分压电路的地和主控地之间的电位关系要仔细设计,否则会引入额外误差。第三,泄放电阻的开关控制如果直接由 GPIO 驱动 MOS,还要考虑驱动能力、续流和短路保护。
MP2642GR-Z 这类专用均衡芯片把这些事都封装好了:内部集成高精度 ADC、均衡开关和驱动电路,通过 I2C 或类似接口把电压数据和状态报给主控。主控只需要做“读数据、判断、下指令”三件事,采集精度和保护逻辑交给专用芯片,分工清晰,可靠性也更高。
2.2 MP2642GR-Z 在方案里承担的具体角色
MP2642GR-Z 在这套两串架构里主要干三件事:
- 电芯电压采集:分别采集两节电芯的正极对地电压,内部差分得到每节电芯的实际电压,精度能满足锂电均衡判断需求。
- 被动均衡执行:当主控通过接口下发均衡指令后,芯片内部对应的均衡开关导通,把外部泄放电阻接入电压较高的那节电芯两端,开始放电。
- 状态与保护:芯片自身会监测过压、欠压等异常状态,通过状态寄存器或中断引脚通知主控,避免在异常情况下继续均衡。
这里有个关键点:MP2642GR-Z 的均衡电流由外部泄放电阻决定,芯片内部的开关 MOS 有最大电流限制。选电阻时不能只按“我想放多快”来算,还要看芯片手册里均衡开关的导通电阻和最大允许电流。我一般会把单节均衡电流控制在 50mA 到 150mA 之间,两串小容量电芯(比如 2Ah 到 5Ah)用这个电流已经足够,再大发热和电阻功率都上去了。
2.3 STM32L162ZE 的决策层设计
STM32L162ZE 在这套方案里是“大脑”,它不直接碰电芯,只通过 I2C 和 MP2642GR-Z 通信。它要做的事包括:
- 周期性读取两节电芯电压,做滤波和异常判断。
- 根据电压差和系统状态决定是否启动均衡、均衡哪一节。
- 控制均衡的启停节奏,避免持续大电流泄放导致局部过热。
- 通过 UART 或 CAN 把电池状态上报给上位机或系统主控。
- 在低功耗待机时降低采样频率,维持必要的监测。
选 L162ZE 的另一个原因是它的低功耗定时器和 STOP 模式唤醒机制很适合这种“大部分时间在睡、偶尔醒来采集”的场景。备用电源系统对静态功耗敏感,主控如果一直全速跑,待机电流很容易做到毫安级,而 L162 在 STOP 模式下可以做到微安级,配合 RTC 定时唤醒,整机待机功耗能压下来一个数量级。
3. 硬件连接与关键参数计算:从原理图到均衡电阻选型
3.1 两串电芯与 MP2642GR-Z 的接线要点
两串电芯的接线看起来简单,但有几个地方容易出错。假设两节电芯分别为 CELL1(下端)和 CELL2(上端),CELL1 负极接系统地,CELL1 正极就是 CELL2 负极,CELL2 正极是整组正极。MP2642GR-Z 需要分别采集 CELL1 正极对地电压和 CELL2 正极对地电压,内部做差得到每节电压。
接线时要注意:
- 采集引脚的分压电阻要靠近芯片放置,走线尽量短,避免引入噪声。
- 两节电芯的采样点要从电芯端子直接引出,不要从大电流路径中间取,否则走线压降会影响采集精度。
- 均衡电阻的回路要独立于采样走线,避免均衡电流在采样线上产生压降。
我见过一个案例,采样线和大电流放电路径共用了一段走线,结果充电时采集到的电压比实际高了 30mV,均衡判断直接失准。后来把采样点改到电芯端子根部才解决。
3.2 均衡电阻和电流的计算
均衡电流由泄放电阻决定,公式很简单:
I_balance = V_cell / R_balance
其中 V_cell 是电芯电压,R_balance 是外部泄放电阻。假设电芯满电 4.2V,想要 100mA 均衡电流,那么:
R_balance = 4.2V / 0.1A = 42Ω
实际选 39Ω 或 43Ω 标准值都可以。但还要算电阻功率:
P = V_cell² / R_balance = 4.2² / 42 ≈ 0.42W
所以电阻至少要选 0.5W 以上,实际我会选 1W 的封装留余量,因为均衡可能持续几十分钟甚至更久,电阻温升会让阻值漂移,功率余量不足会加速老化。
另外,MP2642GR-Z 内部均衡开关的导通电阻也要算进去。假设开关导通电阻 5Ω,那么实际回路电阻是 42+5=47Ω,实际电流约 89mA,比理论值低。这个偏差在可接受范围内,但如果你的均衡电流要求很精确,就要把开关电阻纳入计算。
| 参数 | 数值 | 说明 |
|---|---|---|
| 电芯满电电压 | 4.2V | 单节锂电上限 |
| 目标均衡电流 | 100mA | 两串小容量场景常用值 |
| 理论泄放电阻 | 42Ω | 按欧姆定律计算 |
| 实际选用电阻 | 39Ω/1W | 标准值,留功率余量 |
| 开关导通电阻 | 约5Ω | 芯片内部,需查手册 |
| 实际均衡电流 | 约95mA | 含开关电阻后的实际值 |
3.3 STM32L162ZE 与 MP2642GR-Z 的接口设计
两者之间用 I2C 通信,STM32L162ZE 做主机,MP2642GR-Z 做从机。I2C 线上要加上拉电阻,典型值 4.7kΩ,如果总线电容较大可以降到 2.2kΩ。通信速率不用太高,100kHz 足够,因为电压采集和均衡指令的数据量很小。
STM32L162ZE 这边还需要一个 GPIO 连接 MP2642GR-Z 的中断输出,用于异常状态快速响应。比如芯片检测到过压时拉低中断引脚,主控在 STOP 模式下也能被外部中断唤醒,及时处理。
电源方面,STM32L162ZE 用 3.3V 供电,MP2642GR-Z 的供电范围要查手册确认,通常支持 3.3V 或 5V,如果芯片支持宽压输入,直接从整组电池经 LDO 降压供电也可以,但要注意 LDO 的静态电流,别把低功耗设计毁在电源上。
4. 均衡策略的固件实现:状态机、滤波与低功耗调度
4.1 电压采集与滑动滤波
STM32L162ZE 通过 I2C 读取 MP2642GR-Z 的电压寄存器,原始数据会有噪声,直接用来判断均衡会频繁误触发。我的做法是做一个长度 8 的滑动窗口滤波,每次采集新值后替换最旧值,取平均值作为判断依据。
#define FILTER_LEN 8 typedef struct { uint16_t buf[FILTER_LEN]; uint8_t idx; uint32_t sum; } filter_t; uint16_t filter_update(filter_t *f, uint16_t new_val) { f->sum -= f->buf[f->idx]; f->buf[f->idx] = new_val; f->sum += new_val; f->idx = (f->idx + 1) % FILTER_LEN; return (uint16_t)(f->sum / FILTER_LEN); }这个滤波对抑制随机噪声很有效,但要注意它也会引入延迟。8 次采集如果每 100ms 一次,窗口时间就是 800ms,对于均衡这种慢过程完全够用,但如果你要做快速过压保护,就不能只依赖滤波后的值,还要看原始值。
4.2 均衡启动与停止的阈值设计
均衡判断的核心是两节电芯的电压差。我设定的逻辑是:
- 当 |V1 - V2| > 30mV 且持续时间超过 10 秒,启动均衡。
- 均衡对象是电压较高的那节。
- 当 |V1 - V2| < 10mV 时停止均衡。
- 如果任意一节电压低于 3.0V 或高于 4.25V,禁止均衡。
为什么启动阈值是 30mV、停止是 10mV?这是迟滞设计。如果启动和停止用同一个阈值,电压差在阈值附近波动时均衡会频繁启停,既影响效率又增加发热。30mV 启动、10mV 停止,中间 20mV 的迟滞带能保证均衡一旦启动就会持续到电压差明显缩小才停。
10 秒的持续时间判断是为了过滤瞬态压差。比如系统突然大电流放电,两节电芯内阻不同会导致瞬时压差拉大,但这不是真正的容量差异,不应该触发均衡。加一个持续时间条件就能避开这类误判。
4.3 低功耗调度与 STOP 模式唤醒
备用电源系统大部分时间没有充放电动作,主控不需要一直全速运行。我的调度策略是:
- 正常监测模式:每 100ms 采集一次电压,做滤波和均衡判断。
- 待机模式:如果连续 5 分钟没有充放电电流(通过外部电流检测判断),进入低功耗监测,每 2 秒采集一次。
- 深度待机:如果连续 30 分钟无动作且电压差小于 10mV,进入 STOP 模式,用 RTC 每 10 秒唤醒一次做快速采集。
STOP 模式下 STM32L162ZE 的功耗可以降到微安级,RTC 和 I2C 外设保持供电。唤醒后先读 MP2642GR-Z 的状态寄存器,如果有异常立即处理,否则快速判断是否需要继续睡。
这里有个坑:STOP 模式下 I2C 外设时钟会停,唤醒后要重新初始化 I2C 或者确保 I2C 在 STOP 模式下能正常工作。我一开始没注意,唤醒后 I2C 读数据一直失败,后来查手册发现需要在唤醒后加一段延时等 I2C 总线稳定,再重新发起通信。
void enter_stop_mode(void) { // 配置RTC唤醒周期 HAL_RTC_SetWakeUpTimer(&hrtc, 10, RTC_WAKEUPCLOCK_CK_SPRE_16BITS); // 进入STOP模式 HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI); // 唤醒后重新配置时钟 SystemClock_Config(); // 延时等待I2C总线稳定 HAL_Delay(5); MX_I2C1_Init(); }4.4 均衡过程中的温度监控
被动均衡是把能量变成热,虽然两串小容量场景下均衡电流不大,但电阻和芯片周围的温升还是要关注。我在均衡电阻附近放了一个 NTC 热敏电阻,STM32L162ZE 用 ADC 采集温度。如果电阻附近温度超过 85°C,就暂停均衡,等温度降下来再继续。
这个保护逻辑看起来多余,但实际做长时间均衡测试时真的触发过。当时环境温度 40°C,均衡电阻 1W 封装在密闭壳体内温升到了 90°C 以上,如果没有温度保护,电阻长期高温会加速老化甚至开路。加了温度监控后,均衡变成“放一会儿、停一会儿”的节奏,虽然总时间变长,但安全性大幅提升。
5. 实测中暴露的问题与排查过程
5.1 均衡不启动:从电压读数到阈值判断的完整排查
第一版固件烧进去后,两节电芯明明有 50mV 压差,均衡就是不启动。排查过程如下:
第一步,确认 MP2642GR-Z 的 I2C 通信是否正常。用逻辑分析仪抓 I2C 波形,发现主控发送读命令后从机有 ACK,数据也能读回来,通信没问题。
第二步,检查读回的电压值。把原始数据打印出来,发现两节电压读数分别是 3.85V 和 3.87V,压差只有 20mV,没到 30mV 启动阈值。但用万用表实测两节分别是 3.85V 和 3.90V,压差 50mV。说明采集环节有误差。
第三步,查采集误差来源。MP2642GR-Z 的采集精度依赖外部电阻,我用的分压电阻是 1% 精度,但温漂是 100ppm/°C。当时实验室温度比校准温度高了 15°C,电阻漂移导致采集偏差。另外,采样走线经过了一段大电流路径附近,有耦合噪声。
第四步,修正。把分压电阻换成 0.1% 精度、25ppm/°C 低温漂的型号,采样走线改到电芯端子根部并加屏蔽地线。重新校准后,采集值和万用表实测值差在 5mV 以内,均衡正常启动。
这个坑的核心教训是:均衡判断的精度不只取决于芯片,外部电阻和走线布局同样关键。很多人选芯片时看手册精度很高,实际做出来误差大,问题往往出在外围。
5.2 均衡启停振荡:迟滞阈值没设对
第二版固件把启动阈值改成 20mV,停止阈值也设 20mV,结果均衡开始后电压差降到 20mV 附近时,均衡停一下、电压差又回到 21mV、再启动,如此反复,MOS 开关频繁动作,电阻温度快速上升。
原因就是没有迟滞。后来改成启动 30mV、停止 10mV,振荡消失。这个经验在任何一个带阈值判断的控制系统里都适用:只要被控量和控制动作之间有耦合,就必须设迟滞带,否则一定振荡。
5.3 STOP 模式唤醒后 I2C 通信失败
前面提到过这个问题,这里展开说排查过程。现象是系统进入 STOP 模式后,RTC 唤醒,但 I2C 读 MP2642GR-Z 一直返回错误。
先怀疑是 MP2642GR-Z 在 STOP 期间掉电了,用示波器看它的供电引脚,电压一直稳定,排除。
再怀疑是 I2C 上拉电阻在 STOP 模式下被拉低,检查 GPIO 配置,发现 I2C 引脚在进入 STOP 前没有正确配置为复用开漏模式,而是被其他初始化代码改成了普通输出。唤醒后 I2C 初始化没有重新执行,引脚状态不对。
修复方法是在进入 STOP 前把 I2C 引脚配置为复用开漏并保持上拉,唤醒后重新执行 I2C 初始化。另外在唤醒后加 5ms 延时,等电源和总线稳定后再通信。改完后唤醒通信正常。
5.4 均衡电阻温升超出预期
前面提到温度保护触发,这里补充具体数据。用 39Ω/1W 电阻,均衡电流约 95mA,电阻功耗约 0.35W。单独测电阻表面温度,室温 25°C 时约 55°C,看起来没问题。但装进密闭壳体后,壳体内部温度升到 45°C,电阻表面到了 90°C。
原因是密闭空间散热差,电阻的热量散不出去。后来把电阻功率从 1W 换成 2W 封装,虽然阻值一样、功耗一样,但 2W 封装表面积更大,散热更好,同样条件下表面温度降到 70°C 左右。另外在壳体对应位置开了散热孔,进一步改善。
| 问题现象 | 根本原因 | 解决措施 |
|---|---|---|
| 均衡不启动 | 分压电阻温漂+走线噪声导致采集偏差 | 换低温漂电阻,采样走线改到端子根部 |
| 均衡启停振荡 | 启动/停止阈值相同,无迟滞 | 启动30mV、停止10mV,加迟滞带 |
| STOP唤醒后I2C失败 | 引脚配置在STOP期间被改,唤醒未重新初始化 | 进入前配置复用开漏,唤醒后重新初始化并延时 |
| 均衡电阻温升过高 | 密闭空间散热差,1W封装余量不足 | 换2W封装,壳体开散热孔 |
6. 几个容易被忽略的设计细节和实操建议
6.1 均衡电阻的布局位置
均衡电阻不要放在 MP2642GR-Z 正下方或紧挨着芯片,否则电阻的热量会直接烤芯片,导致芯片温度升高、采集精度下降。我的做法是把电阻放在芯片对角位置,中间留出至少 10mm 间距,如果 PCB 空间允许,把电阻放在板边靠近散热孔的位置。
另外,电阻的走线要足够宽,95mA 电流虽然不大,但走线太细会有压降,影响实际均衡电流。我一般用 0.5mm 以上线宽,如果走线较长就加到 1mm。
6.2 采样点的选择比想象中重要
前面反复提到采样点要从电芯端子根部取,这里再强调一次。大电流路径上的走线电阻虽然只有几毫欧,但在几安培电流下会产生十几毫伏压降。如果采样点取在大电流路径中间,充电时采集电压偏高、放电时偏低,均衡判断完全失准。
正确做法是每个电芯的正负极都从电芯端子单独引一条采样线到 MP2642GR-Z,采样线上不走大电流。如果电芯和芯片距离较远,采样线可以用双绞线或加屏蔽,减少噪声耦合。
6.3 均衡期间要不要禁止充电
这个问题没有绝对答案,取决于系统设计。我的做法是:均衡期间如果检测到充电电流,暂停均衡,等充电结束后再继续。原因是充电时电芯电压本身在上升,均衡判断的基准在变,容易误判;而且充电时电芯内阻上的压降也会影响采集。
如果系统要求充电时也能均衡,那就要用更复杂的算法,比如根据充电电流和电芯内阻做补偿,或者等充电进入恒压阶段、电流降下来后再均衡。两串小容量场景下,我建议直接禁止充电时均衡,逻辑简单、可靠性高。
6.4 固件升级和参数可配置
均衡阈值、滤波窗口长度、低功耗调度周期这些参数,不要写死在代码里。我通过 UART 或 CAN 留了一组配置寄存器,上位机可以读写。这样在不同项目、不同电芯上复用时,不用重新编译固件,改配置就行。
配置参数存在 STM32L162ZE 的内部 Flash 或外部 EEPROM 里,上电时读取。注意 Flash 写入次数有限,不要频繁写,只在配置变更时写一次。
6.5 测试时用可编程电源模拟电芯
调试均衡逻辑时,如果直接用真实电芯,充放电慢、状态不好控制。我一般用两路可编程电源分别模拟两节电芯,设定不同的电压值,观察均衡启动和停止是否符合预期。这样可以快速遍历各种电压组合,测试效率高很多。
但要注意可编程电源的输出阻抗和真实电芯不同,均衡电流可能会比真实情况大,测试时要把电源限流设好,避免烧电阻。等逻辑验证通过后,再用真实电芯做最终验证。
7. 写在最后:两串被动均衡的适用边界
这套 MP2642GR-Z 加 STM32L162ZE 的方案,我在几个备用电源项目里都用过,整体表现稳定。但它有明确的适用边界:两串架构、单节容量不大、对均衡速度要求不高、成本敏感。如果你的系统是四串以上、或者单节容量几十安时、或者要求快速均衡,那被动均衡就不合适了,得上主动均衡或者专用多串 BMS 芯片。
另外,STM32L162ZE 的低功耗特性在这套方案里是加分项,但如果你的系统一直有外部供电、不在乎待机功耗,用 F103 甚至更便宜的 MCU 也能做,没必要为低功耗多花钱。选型永远看场景,不看参数表谁好看。
最后分享一个我在实际调试中的小习惯:每次改完均衡阈值或滤波参数,先用可编程电源跑一遍全电压范围的扫描测试,把均衡启动点、停止点、振荡情况都记录下来,形成一张表。下次再改参数时,有这张表做对比,能快速判断改动是变好了还是变差了。这个习惯帮我省了很多反复调试的时间。