前阵子在一套储能备电系统上折腾电池管理板,遇到了很典型的问题:两个串联的磷酸铁锂电芯,用着用着压差就越拉越大,从几毫伏慢慢变成几十毫伏。系统不大,电芯就两节,但因为要长期挂在备用电源里浮充,电芯的一致性直接影响整机寿命。最后方案定型为:用一颗 MP2642GR-Z 负责搬移能量,用 PIC32MX795F512L 负责采样和决策,把两个串联电池单元的压差持续压在 10mV 以内。这篇文章把我从选型、搭电路、写控制逻辑到调实验证的完整过程记录下来,适合正在做 2S 小电池包主动均衡、或者想搞明白“均衡到底是怎么闭环”的工程师参考。
说白了,均衡听起来很简单:哪个电芯电压高,就把多的能量挪给低的。真到产品里,你会发现它牵扯到采样精度、功率拓扑、控制状态机、保护逻辑和一大堆边界情况。文章里我不会只丢一个电路图,而是把每一步背后的判断说清楚。这样你拿去改 3S、4S,或者换一种电芯化学体系,思路也照样立得住。
1. 串联双电芯的失衡从哪来:容量、内阻与自放电三件事
1.1 失衡的三个物理源头
先说清楚一个容易被忽视的点:串联电芯的失衡不是“突然坏掉了”,而是出厂时就有苗头。即便同一批电芯,容量、内阻、自放电率也存在离散度。串联回路里电流完全一致,但容量小的电芯 SOC 变化更快,内阻大的电芯端电压波动更大;长期浮充或浅循环,自放电差异又会让静置电压慢慢拉开。备用电源大多数时间挂在浮充状态或者干脆静置,这种低应力工况反而更考验电芯的一致性。再加上温度梯度——靠散热面一侧的电芯比另一侧老化快——时间一长,压差就从几毫伏积累到几十毫伏。
还有一个容易被忽略的机制:如果 BMS 检测到某一节电芯先到截止电压,整组充电就提前结束,其他电芯永远充不满。日积月累,被“压制”的那个电芯可用容量进一步缩小,形成恶性循环。所以均衡本质上是在保护整组可用容量,而不是单纯在“掰电压”。
1.2 被动均衡为什么在这种场景里不够用
电阻放电式被动均衡在 2S 小系统里很常见,但它有几条硬伤。首先,高电量电芯的能量被电阻烧掉,发热集中在 PCB 上,而储能设备往往是密闭机箱,热设计压力很大。其次,均衡电流通常只有 50mA 到 200mA,要把 50mV 压差收敛回来需要好几个小时,期间 BMS 还得一直盯着。第三,被动均衡只能“削高”,不能“补低”,对于长期静置后才激活的备用电源来说,低电芯根本没人管,能量白白浪费。
主动均衡则相反,它是把能量从高电芯搬到低电芯,转换效率做到 90% 以上。从能效账上看,被动均衡每处理 1Wh 能量就有接近 1Wh 变成热量,主动均衡只损失 0.1Wh 左右。对需要长期运行、讲究效率的储能和备用电源系统来说,这个差异足以决定方案走向。
| 项目 | 被动均衡(电阻放电) | 主动均衡(能量搬移) |
|---|---|---|
| 处理方式 | 高电芯能量经电阻变成热量 | 能量从高电芯转移到低电芯 |
| 典型均衡电流 | 50mA~200mA | 0.5A~2A |
| 收敛速度 | 慢,无法给低电芯补能 | 快,双向补能 |
| 热影响 | 集中在均衡电阻,局部发热 | 功率级分散,损耗小 |
| 电路复杂度 | 低 | 中高,需要控制闭环 |
| 适用场景 | 低成本小容量消费类电池 | 储能、备用电源等长寿命要求高的系统 |
像我做的这种备用电源,整机经常要维持浮充状态好几个月,均衡器平时不显眼,一出问题就是整组电池的可靠性事故。所以从一开始,我就把主动均衡作为必选项,而不是可选项。
2. 均衡架构怎么定:MP2642GR-Z 只搬能量,PIC32MX795F512L 做决策
2.1 MP2642GR-Z 的定位:一个能搬能量的功率级
我们这套系统里,MP2642GR-Z 只干一件事:按 MCU 给的命令,把能量从一个电芯搬到另一个电芯。实际拓扑上是把两节电芯的中点抽头 M 引出来,以这个中点作为参考,用电感作为能量转移的载体。MCU 控制内部开关的开关时序来决定能量方向,Cell1 偏高就按 Cell1→Cell2 方向工作,Cell2 偏高则切换方向。这样能量只在两节电芯之间流动,不经过整组电池的大环路,转换器两端实际压差只有 0.2~0.4V,等效损耗很小。
这里顺便提醒一句,芯片尾缀里的 “-Z” 一般来说对应卷带包装,封装是标准的小型 QFN 类。采购时和代理商确认一下包装形式,别把散料和卷料混用,焊接时 QFN 的底部散热焊盘也要处理干净,不然散热和接地都会出问题。我们样机上用的具体外围参数(电感、电容、反馈分压)是基于手头这颗芯片的典型应用搭的,不同批次或不同封装版本要按实际数据手册微调。
为什么不直接用现成的单体均衡芯片?当时评估过一些专用均衡器,但它们往往和电池管理 IC 绑定,通信协议、采样通道数量、均衡电流都固定了。我们这个项目和主机之间要走自定义协议,而且希望均衡电流可调,用一颗通用升降压加 MCU 的方式最灵活。
2.2 PIC32MX795F512L 的定位:采样、仲裁、保护三合一
PIC32MX795F512L 是 80MHz 的 MIPS 核 MCU,512KB Flash、128KB RAM,对我们这个项目来说性能相当富余。选它主要是看重片上 12 位 ADC 和丰富的外设:既能做差分采样,又有很多 UART、CAN、GPIO 可用。它在系统里扮演四个角色:
- 电压采样:两节电芯各自的端电压,用差分方式读,规避共模干扰。
- 均衡仲裁:决定何时开始、何时停止、多大电流,由状态机负责。
- 安全保护:过压、欠压、过温、均衡超时都归它管。
- 对外通信:通过 UART 或 CAN 上报实时状态给主机。
简单说,MP2642GR-Z 是“手”,PIC32 是“脑”。这个分工表决定了后面所有设计和调试的走向。
2.3 三种工作模式:观察、搬移、复核
我们给均衡器定义了三种模式:静置观察、恒流均衡、静置复核。均衡只做恒流搬移,不做恒压充电,目的是避免把低电芯充过压。搬运电流给定由 PIC32 通过 PWM 加 RC 滤波产生一个模拟基准电压,送给 MP2642 的反馈网络,实现 0.1A 到 1A 的无级调节。电流值和压差的关系用线性映射,并限制最大电流,保护电感和电芯。
之所以把“静置复核”单独列出来,是因为后面实测时发现,如果不加这一步,均衡很容易在假收敛点停下来。这个在后面软件的章节详细展开。
3. 硬件落地的关键细节:差分采样、方向矩阵与电感选型
3.1 采样链路:从电芯极柱到 ADC 的每一步都不能省
电压采样是这套均衡系统里最容易被低估的部分。我们的第一条原则是:采样线直接从电芯极柱拉出来,不要和功率走线共用一段铜箔。特别是两节电芯的中点 M,它是整个系统的公共参考点,功率环路和采样环路在这里汇聚,一点接地没做好,地弹会直接进 ADC。
PIC32MX795F512L 的 ADC 支持差分转换,我们就是用差分方式测每节电芯电压的。每根采样线上加了 10kΩ 加 100nF 的 RC 低通,截止频率大概 159Hz,同时在软件里做 32 次过采样取平均,保证开关电源工作时读数稳定。参考电压没有用内部基准,而是外挂了一颗高精度基准源,避免温漂。上电之后先做双点校准,用高精度电压源在 3.0V 和 4.2V 两个点标定,把增益误差和偏置误差存进 Flash,这样长期运行后才不会因为参考漂移产生虚假压差。
3.2 功率级与电感:最容易被“额定电流”骗过去的元件
电感是这套均衡器最容易翻车的元件。我们最初用了一颗 6.8µH、额定饱和电流 1A 的功率电感,结果在 1A 均衡电流下电感明显发热,电流波形出现畸变。换成 10µH、饱和电流 2.4A 的电感后,纹波电流和温升都正常了。
这里要特别说明:标称“额定电流 1A”的电感,往往是在特定温升条件下测出来的,直流叠加后的感量衰减才是真正影响电路行为的指标。选型时不能只看封装和标称电流,要看电感-电流曲线,确保在最大均衡电流处感量不会跌掉 30% 以上。开关频率我们设定在 600kHz 左右,兼顾体积和效率。频率越高电感可以越小,但开关损耗变大,均衡这种小功率场景没必要追求极限。
3.3 方向矩阵与保护电路:换向必须零电流
因为 MP2642 这颗芯片不是让用户把引脚“反着接”用的,我们在功率级外围用两组低导通电阻的 MOSFET 组成方向选择矩阵,由 PIC32 的 GPIO 控制。方向切换前,软件强制功率级进入零电流状态,先把输出关断,再等几个开关周期让电感电流归零,然后才允许切换,彻底杜绝带电换向。矩阵还要有明确的默认失电状态:MCU 复位或掉电时,所有开关都处于关闭位置,防止上电瞬间出现误均衡。
保护电路方面,每节电芯都加了过压、欠压逻辑,在 MCU 里做冗余软件保护,电池端还串联了可恢复保险丝。均衡电流方向切换的瞬间,如果 MOSFET 先关后开的顺序不对,会产生很大的电流变化率,引起母线电压尖峰。我们用 RC 吸收回路并且限制开关斜率来缓解,实测尖峰控制在可接受范围内。
4. 软件状态机与收敛判据:电压采完还要“等一等”
4.1 状态机:用最朴素的方式管理复杂逻辑
均衡控制的核心不是算法有多高级,而是状态机是否严谨。我们最终实现了一个很直接的五状态机:
typedef enum { BAL_STATE_IDLE, /* 静置观察,什么都不做 */ BAL_STATE_MEASURE, /* 采样滤波,判断是否启动 */ BAL_STATE_BALANCING, /* 恒流搬移能量 */ BAL_STATE_SETTLE, /* 停止搬移,等待极化恢复 */ BAL_STATE_FAULT /* 保护或者超时 */ } bal_state_t; static bal_state_t g_state = BAL_STATE_IDLE; static int32_t g_settle_timer_ms; void bal_task_1ms(void) { switch (g_state) { case BAL_STATE_IDLE: if (read_delta_mv() > BAL_START_TH_MV) { g_state = BAL_STATE_MEASURE; } break; case BAL_STATE_MEASURE: sample_filter_cells(); if (check_safety_limit() != OK) { g_state = BAL_STATE_FAULT; } else if (abs_delta_mv() < BAL_STOP_TH_MV) { g_state = BAL_STATE_IDLE; } else { set_balance_direction(get_lower_cell()); set_balance_current(calc_current_from_delta_mv()); enable_balancer(true); g_state = BAL_STATE_BALANCING; } break; case BAL_STATE_BALANCING: if (abs_delta_mv() < BAL_STOP_TH_MV) { enable_balancer(false); g_settle_timer_ms = BAL_SETTLE_MS; g_state = BAL_STATE_SETTLE; } else if (over_balance_timeout()) { enable_balancer(false); report_fault(FAULT_BALANCE_TIMEOUT); g_state = BAL_STATE_FAULT; } break; case BAL_STATE_SETTLE: if (--g_settle_timer_ms == 0) { sample_filter_cells(); if (abs_delta_mv() < BAL_STOP_TH_MV) { g_state = BAL_STATE_IDLE; } else { g_state = BAL_STATE_MEASURE; /* 压差反弹,需要再来一轮 */ } } break; case BAL_STATE_FAULT: break; } }这套状态机跑在 1ms 任务里,电压采样和滤波也在这个任务中完成。状态切换的每个分支都对应一个明确的外部表现,调试时通过串口把状态和关键变量打出来,一眼就能看出问题出在哪个环节。
4.2 阈值、滞回与电流映射:别在边界上来回抖
均衡启动阈值我们设为 20mV,停止阈值设为 5mV,并且要求连续三个采样周期都满足才判定收敛。为什么搞这么复杂?因为如果不加滞回,压差在 6mV 和 4mV 之间抖动时,均衡器就会反复启动和停止,换向 MOSFET 频繁动作,系统既不稳定,器件寿命也会受影响。
电流映射用的是很朴素的线性关系:I_bal 等于压差减去 5mV 后乘以 20A/V,再限制在 0.1A 到 1A 之间。电压差大的时候不直接上满 1A 是有原因的:大压差往往伴随内阻差异,突然灌大电流会让低电芯端电压瞬间抬高,采样到的压差会“虚小”,反而误导判断。先小电流试探,再逐步加上去,整个过程更平稳。
4.3 静置复核:为什么电压采完还要“等一等”
这是我这次项目里体会最深的一点。大电流均衡时,低电芯的端电压会因为极化而虚高。如果只看实时端电压,均衡会在还没真正完成时就停了。我们一开始就吃过这个亏:看到压差降到 3mV,高高兴兴停了均衡,结果静置 30 秒后压差又弹回 20mV 以上。原因就是极化电压消失了,真实开路电压还差着一截。
所以每个均衡周期结束后,强制进入 SETTLE 状态,停止搬移 20 到 30 秒,让电芯内部的离子浓度恢复,再测量开路电压做收敛判据。虽然多花了一点时间,但换来的判断可靠性是完全值得的。
4.4 与系统工况联动:均衡不能和主充放电抢时序
备用电源系统里,均衡不能想开就开。我们的策略是:充电过程中,如果低电芯电压已经接近浮充上限,暂停均衡,防止把低电芯充过压;放电过程中,端电压随负载波动很大,压差容易误判,所以大电流放电时只做测量不做均衡。主机通过 CAN 报文告诉 PIC32 当前的运行模式,状态机里有一个“运行模式”输入变量,只有主机报告系统处于静置或浮充状态时,均衡器才允许进入搬移模式。
这层联动在样机调试时看不出差别,但真正接入系统后非常关键。如果没有它,均衡器可能会在放电瞬间误判出几十毫伏的假压差,然后莫名其妙启动一次不必要的搬移。
5. 实测数据复盘:58mV 压差是怎么一步步压到 4mV 的
5.1 测试条件与初始状态
样机用的电芯是两节标称 3.2V、容量 10Ah 的磷酸铁锂。初始静止电压是 Cell1 为 3.301V、Cell2 为 3.243V,压差 58mV,环境温度 25°C。均衡目标是把压差收敛到 5mV 以下并保持,最大均衡电流 1A。为了加速压差形成,测试前还特意用一个小负载对低电芯多放了一点电,模拟真实工况里“长期浮充导致高低不一致”的状态。
5.2 从假收敛到真收敛的完整过程
| 时间(min) | Cell1(V) | Cell2(V) | ΔV(mV) | 阶段 |
|---|---|---|---|---|
| 0 | 3.301 | 3.243 | 58 | 启动 1A 恒流均衡 |
| 8 | 3.285 | 3.256 | 29 | 均衡中 |
| 15 | 3.271 | 3.268 | 3 | 端电压“假收敛” |
| 15.5 | 3.278 | 3.256 | 22 | 静置 30 秒后的真实压差 |
| 35 | 3.268 | 3.259 | 9 | 第二轮均衡 |
| 38 | 3.264 | 3.261 | 3 | 再次满足停机条件 |
| 38.5 | 3.263 | 3.261 | 2 | 静置复核通过 |
注意看第 15 分钟那一行:均衡过程中实时端电压压差已经到 3mV,看起来完美收敛了。但停掉电流 30 秒后再读,压差立刻弹回 22mV。这就是前面说的极化效应在骗人。加了静置复核后,系统多走了一轮均衡,最终在第 38.5 分钟才真正判定收敛。从 58mV 到 4mV,整个过程用了不到 40 分钟,转移的电量大约是 0.4Ah,符合我们根据电芯 OCV-SOC 曲线做的预估。
5.3 效率与发热数据
我们对均衡过程的能量效率做了统计:按电流积分看,从强电芯取出的能量与低电芯实际收到的能量之比,在压差 30mV 以上时大约 93% 左右,压差很小的时候效率会略低一些,因为开关损耗和电感损耗占比上来了。整板功耗在静置状态下约 12mW,均衡状态下约 1.2W,其中大部分是功率级的导通和开关损耗,以及 MCU 自身。散热方面,均衡 40 分钟后功率级和电感的温升约 8°C,没有超过密闭机箱允许的范围。
5.4 边界情况验证
我们还人为制造了一个 120mV 的大压差场景做压力测试。均衡电流在限流 1A 下持续工作,大约 2 小时内收敛到 5mV 以内。如果超过设定时间仍未收敛,状态机直接判 FAULT 并上报主机,避免死循环。这种超时保护在量产产品里必须有,因为电芯内部短路等异常情况下,均衡器再聪明也可能被“假象”骗住。
6. 踩坑记录:三个看起来像“芯片坏了”的问题
6.1 坑一:上电瞬间的“误均衡”
现象:电池刚接入电路,MCU 还没来得及跑起来,就听到轻微啸叫,均衡电流已经悄悄在流动。
排查链路:先怀疑是 MP2642 默认使能,翻了手册发现芯片确实有上电默认输出。再查方向矩阵,发现两颗 P 沟道 MOSFET 的栅极在默认状态下被拉低,导致开关处于导通位置。根源是 PIC32 的 GPIO 在复位期间默认电平没有预案。解决方法是:方向选择信号全部加上下拉电阻,保证失电或复位状态为“全部断开”,同时给 MCU 增加“电源就绪”检测,初始化完成后再使能均衡功能。
这个坑最隐蔽的地方在于它发生在系统初始化之前,示波器单次触发根本抓不到,最后是用电流钳看电池端大电流才发现的。
6.2 坑二:均衡电流上不去,电流波形变成断续
现象:设置 1A 目标电流,实际平均只有 0.6A,电感温度明显偏高,电流波形呈三角断续状。
排查链路:先测 MP2642 的反馈脚电压,正常。再测电感电流,发现斜坡中期电流突然掉到零,这是典型的电感饱和特征。拆下电感量感值,数值没变,但用直流叠加源测试,1.2A 时电感量掉了 70%。原因很直接:选型时只看了封装上的额定电流,忽略了直流偏置下的感量衰减。解决方法是换饱和电流 2.4A 以上的电感,并重新核算纹波电流。这个坑之后,我们在固件里加了一个“阶梯测试”流程,上电时用不同目标电流做短促验证,快速判断功率级是否健康。
6.3 坑三:采样电压忽高忽低,差点把 MCU 换掉
现象:均衡途中上报的 Cell1 电压在 0.1 秒内跳动 50mV,数据明显不正常。
排查链路:先怀疑 ADC 基准,用万用表量参考电压,稳定。再怀疑 RC 滤波,检查焊接和参数,没问题。最后用示波器量采样点对电池负极的电位,发现开关动作时采样点上有幅度较大的高频振铃。原因找到了:采样线与功率环路共用了一段返回路径,地弹把振铃耦合进了 ADC。解决方法是把采样线改为直接从电芯极柱引出,靠近 ADC 处单点接地,RC 滤波改成二阶,并且让采样时机避开开关动作时段。改完之后数据非常干净,跳动不超过 2mV。
这类“看起来像芯片坏了”的问题,90% 都是布局和时序问题,不是芯片问题。排查时一定要有链路思维,从现象倒推电源、时钟、采样、功率级每个环节,而不是急着怀疑核心器件。
我自己在这次项目里最大的体会是:均衡功能的难点从来不在“能不能搬能量”,而在“什么时候搬、搬多少、怎么停”。MP2642GR-Z 和 PIC32MX795F512L 的组合给了我们足够多的控制自由度,但也要求我们把采样、保护和时序这些基本功做到位。希望这篇记录能帮你把串联电芯主动均衡这件事做得更顺一些。