做储能和备用电源系统的人,迟早会被电池均衡这件事拉住。两个电芯串联成组,生产公差、自放电率、温度场稍微不一样,循环几十次之后电压差就会从几十毫伏滚到几百毫伏。我这里想完整记录的,是一套用 MP2642GR-Z 加 PIC18F55K42 做的两串主动均衡方案。它解决的问题非常具体:在两个串联电池单元之间把能量从高电压侧搬到低电压侧,而不是像被动均衡那样把多余能量烧掉。适合正在做 BMS、便携储能、或者备用电源开发的工程师参考。
1. 两串电池为什么需要主动均衡:方案定位
1.1 失配是怎么产生的,量级有多大
两串电池在储能里属于最基础也最容易被低估的组合。电芯出厂的一致性通常很好,同一批能做到容量差 1% 以内,但经过几十次充放循环之后,负极界面膜生长速度、电解液分解、正极材料结构变化都会把差距慢慢拉开。更麻烦的是自放电率不同,系统闲置半个月之后,一颗 3.60V、另一颗 3.42V 的情况非常常见。
串联回路里电流处处相同,所以充电时两颗电芯必须同时到达上限,可容量小的那颗先到;放电时同理,容量小的那颗先到下限。整组电池最终能用的容量不是两颗电芯容量的平均值,而是被比较差的那颗卡住,这个损失在备用电源里会直接表现为后备时间缩短。你花大价钱买的高容量电芯,因为旁边有一颗落后电芯,实际发挥不出来,这是大部分均衡项目要解决的核心矛盾。
我在前期测试里专门做过一轮加速老化模拟,把两颗标称 50Ah 的电芯放在不同温度环境下浮充三个月,充电电压一致,结果静置电压差最高到 180mV,按铁锂的开路电压曲线换算,SOC 差已经接近 15%。如果不做均衡,这个差距只会越来越大,保护板即使有单体过压和欠压保护,也只能在到达极限时切断系统,不能解决容量利用率的问题。
1.2 被动均衡的极限在哪里
很多低成本保护板都带被动均衡,原理很简单:检测到哪颗电芯电压高,就通过并联的电阻把多余电荷放掉,直到电压回落。一颗均衡电阻几十欧,按 3.3V 电芯算,单路电流通常只有 100mA 左右。对几安时的小电池包够用,但对储能级几十安时到上百安时的电芯来说,这个速度太慢了。
被动均衡还有一个绕不开的问题:热量。假如两颗电芯差了 5% 的 SOC,用 0.1A 去放掉这部分能量,需要连续放电几个小时,能量全部变成电阻上的热。在密闭的储能柜里,局部温升会进一步恶化电芯一致性,形成恶性循环。主动均衡则不同,它通过 DC-DC 把高电池的能量转移到低电池,效率做到 80% 以上,电流可以到 0.5A 甚至更高,而且不产生明显的局部热点。这是我选择主动方案的最直接原因。
1.3 系统构成与芯片分工
这套方案里,MP2642GR-Z 是功率执行部分,PIC18F55K42 是策略与保护核心。MP2642GR-Z 是一颗同步 Buck 拓扑的功率级,内部集成高低边开关管,外围只要电感、电容和反馈网络就能工作。用它做均衡的关键,不是让它按普通 Buck 那样固定输出一个电压,而是把它改造成一个能双向搬移能量的环节。
PIC18F55K42 负责采集两颗电芯的电压、判断均衡方向、调整功率级目标电压,同时通过片上比较器和 ADC 做硬件级保护。这颗 MCU 的优势在于带有 12 位 ADC、DAC、CLC 这类外设,很多信号调理可以在片内完成,不需要额外堆一大堆模拟电路。对于两串均衡这种规模刚好合适,用一块很小的板子就能把控制逻辑全部塞进去。
| 芯片/模块 | 承担角色 | 关键点 |
|---|---|---|
| MP2642GR-Z | 同步 Buck 功率级 | 强制 PWM 模式,支持能量反向 |
| PIC18F55K42 | 电压采样/状态机/保护 | 12 位 ADC,DAC 调节反馈,CLC 辅助 |
| 采样电阻与差分放大 | 均衡电流检测 | 判断电流方向和幅值 |
| 分压电阻/运放 | B1/B2 电压采集 | 共模范围与精度 |
2. 硬件链路:把 MP2642GR-Z 改成可双向搬移能量的均衡级
2.1 电路结构:同步 Buck 芯片怎么用来均衡
先定义一下电池节点:B1 是下面那颗电芯,B1 正极称为 M 点,B1 负极为系统地 GND;B2 是上面那颗电芯,B2 正极为 BAT+,B2 负极就是 M 点。两个电芯串联后的整组电压就是 BAT+ 对 GND 的电压。
电路接法并不复杂。MP2642GR-Z 的输入正极接 BAT+,输入地接 GND,SW 脚通过一颗电感接到 M 点。反馈分压电阻从 M 点取样,让默认输出目标落在 B1 的静置电压附近。这样看上去就是一个普通的降压电路,只不过输出负载不是电阻,而是一颗电池。
但电池本身是很大的电容,输出会被它钳位。所以当 MCU 把反馈目标电压调得比 B1 当前电压高一点时,芯片每个周期都在从整组电池取电,向 M 点灌电流,等效于给 B1 充电。因为输入电流是从整组电池抽的,而 B2 在这条通路上承担了大部分能量来源,所以整体效果是 B2 放电、B1 充电。
反过来,如果 MCU 把反馈目标电压调得比 B1 当前电压低,同步 Buck 的电感电流会反向流动。此时芯片不再向 M 点灌电流,而是把 M 点的电荷抽回输入端,等效于把 B1 的能量搬回整组电池,而 B1 放出的能量会被 B2 吸收。于是同一套功率级就完成了两个方向上的能量转移。
注意:这里必须让芯片工作在强制 PWM 模式,不能自动进入轻载 PFM。很多同步 Buck 芯片在轻载时会关掉低边管或者跳周期,一旦反向电流被切断,能量回流的路径就断了,均衡会变成单向,甚至出现电流断续带来的噪声和失控。
2.2 电感、电容和电流采样参数怎么定
电感是整个均衡链路的核心。按普通 Buck 的 CCM 电流纹波公式算即可:
ΔI_L = (Vin - Vout) × D / (fsw × L),其中 D = Vout / Vin。
以两颗铁锂电芯为例,整组电压约 6.8V,B1 目标电压约 3.4V,D 就是 0.5。如果开关频率取 500kHz,希望电感纹波电流控制在 0.3A 左右,那么 L 大约需要 11µH,实际取 10µH 或 15µH 都行。电感的饱和电流要留出余量,至少按最大均衡电流的 1.5 倍以上选。我测试时把最大均衡电流限制在 0.5A,电感饱和电流取 3A,波纹不大,磁芯也不热。
输出端电容在这个电路里可以很小,因为电池本身就是巨大的容性负载。但 SW 节点到 M 点之间还是建议放一颗 1µF 的高频陶瓷电容,吸收开关噪声,改善 ADC 采样附近的干扰。输入侧按数据手册推荐放一颗 10µF 陶瓷电容和一颗电解电容,因为输入是从整组电池取电,电池内阻很低,电容主要是给高频开关电流就近提供回路。
电流采样我用了一个 5mΩ 的合金电阻串在输入地回路里,再用一个差分放大器把压降送到 PIC18F55K42 的 ADC。5mΩ 在 0.5A 电流下只有 2.5mV 压降,必须用仪表类运放才能获得可用精度。如果板子上有条件,也可以用电感 DCR 采样,少一个功率电阻,但需要做温度补偿,原型调试阶段我用采样电阻更直接。
PIC18F55K42 的比较器可以直接拿采样电压和 DAC 设定的阈值比较,一旦电流超过设定值,硬件输出立刻关断或削波,不需要等 CPU 进中断。这个细节在保护场景里很重要,软件中断的延迟在 10MHz 主频下虽然只有微秒级,但功率回路故障往往是微秒级就能炸管的,能硬件处理就不要依赖软件。
2.3 PIC18F55K42 的采样通道和保护输入
B1 的电压测量最简单,从 M 点串联一个高阻分压电阻到 GND,中间接一个 RC 滤波电容。ADC 的参考电压建议用 3.3V 外部基准,这样才能保证长时间运行时电压测量不会跟着温度漂移。B2 的电压测量不能直接把 BAT+ 分压到 MCU 的 ADC 引脚,因为 B2 负端是 M 点,不是 GND,直接用两个单端采样相减会引入共模误差。我在板上用了一个差分运放,输入分别接 BAT+ 和 M 点,输出单端到 ADC,增益按 3.65V 满量程折算。
采样滤波也不能省。电池电压在充电瞬间会有极化现象,负载切换时也有毛刺。我在两路 ADC 输入前都放了 10kΩ + 0.1µF 的滤波,截止频率大约 159Hz,主要滤掉开关噪声和高频干扰。PIC18F55K42 的 ADC 支持硬件平均和相关触发,可以让 ADC 在 PWM 死区时间内自动采样,避开功率开关切换的尖峰时刻。这样读出来的电压稳定性会好很多,不用在软件里做大量滤波。
保护输入方面,我在板上留了电池正极温度 NTC、功率级过温 NTC,以及一个复位按键。NTC 信号进 ADC,由 MCU 状态机做温度降额:温度超过 60°C 时把均衡电流减半,超过 75°C 时直接停止均衡并报故障。这两挡在备用电源柜里非常实用,因为均衡电流虽然不大,但柜内散热条件差,长时间运行的时候温度累计效应不可忽视。
3. 均衡策略与软件状态机
3.1 电压判断的坑:平台电压、极化与采样噪声
很多工程师拿到板子以后第一反应是:只要 B2 电压比 B1 高,就启动均衡把 B2 往 B1 搬。实际跑起来会发现,电压方向会频繁翻转,均衡器像个二傻子一样来回切换。
原因是电池电压不等于 SOC。铁锂平台非常平坦,在 SOC 20% 到 80% 之间,开路电压可能只变化几十毫伏。稍微有点负载电流或者测量噪声,电压差就能盖过真实的 SOC 差。更麻烦的是极化:电池在刚充完电或刚放完电时,内部浓差极化会让电压偏离真实开路电压,静置几分钟之后又会回弹。这个时候按实时电压判断,很容易把一颗只是极化偏高的电池当成“真实偏高”。
所以我在设计均衡策略时加了一个原则:只在静置状态或者浮充稳定状态下启动均衡,负载突变期间不启动,已经启动的如果检测到负载电流超过某个阈值,先把均衡电流降下来,等系统稳定再恢复。对于备用电源来说,这个条件通常容易满足,因为大部分时间里系统就是浮充或空载。
3.2 阈值、死区与滞回设计
均衡不能一看到压差就开,也不能等压差完全归零才关。我实际用的启动条件是压差大于 30mV,停止条件是压差小于 5mV,中间用滞回避免临界点抖动。如果压差刚好在 20mV 上下振荡,状态机会一直保持当前状态不会反复开关;只有真正跨过停止阈值才会退出。
30mV 这个数值不是拍脑袋定的。铁锂在静置状态下,30mV 大致对应好几个百分点的 SOC 差,再小就容易淹没在测量误差和极化噪声里。对于三元锂,开路电压曲线更陡,阈值可以稍微降到 15mV;对于铅酸,则要更大一些。我建议把阈值做成配置项,通过一根 UART 命令或者一个配置文件来改,不要写死在代码里。
均衡电流也需要做降额处理。早期设定 1A 电流,两块电芯压差大时没觉得有问题,但压差慢慢变小之后,过大的电流会把低电池电压抬得很高,甚至出现电压倒灌。我在软件里做了一档电流表:压差大于 100mV 时用 0.5A,压差在 30mV 到 100mV 之间时用 0.3A,压差小于 30mV 时不启动。这样既保证大失配时能快速收敛,又避免小失配时过冲。
3.3 状态机与代码骨架
软件状态机不复杂,但状态切换的时机要卡得很准。我用四个状态:IDLE、BAL_FWD、BAL_REV、FAULT。BAL_FWD 表示 B2 电压高,能量从 B2 向 B1 搬;BAL_REV 表示 B1 电压高,能量从 B1 向 B2 搬。代码骨架如下:
typedef enum { IDLE = 0, BAL_FWD, BAL_REV, FAULT } bal_state_t; static int16_t v1_mv, v2_mv; static bal_state_t bal_state = IDLE; void bal_control(void) { int16_t diff = v2_mv - v1_mv; // 正数表示 B2 高 switch (bal_state) { case IDLE: if (diff > 30) bal_state = BAL_FWD; // B2 -> B1 else if (diff < -30) bal_state = BAL_REV; // B1 -> B2 break; case BAL_FWD: if (diff < 5) bal_state = IDLE; // 压差收敛 break; case BAL_REV: if (diff > -5) bal_state = IDLE; break; default: bal_state = FAULT; break; } if (v1_mv > 3650 || v2_mv > 3650) bal_state = FAULT; set_balance_output(bal_state, target_voltage_mv()); }真正的工程代码里还要有一个 ZERO_WAIT 中间态:状态切换前先把输出目标调到接近电池电压,让电感电流归零,延时 5~10ms 再反方向启动。直接从一个方向切换到另一个方向,电感电流会瞬变,轻则造成电流过冲,重则触发过流保护甚至损坏开关管。
PIC18F55K42 的 DAC 在这里很有用。我通过 DAC 输出一个电压,经过 RC 滤波后叠加到 MP2642GR-Z 的反馈引脚上,从而微调目标输出电压。DAC 更新时不要一步到位,而是按斜坡方式每 10ms 加一小步,让功率级平稳过渡。这也是我踩过坑之后改的:最初直接跳变目标电压,电感电流瞬间变化很大,示波器上能看到明显的振铃。
4. 调试实录:常见问题、波形与排查方法
4.1 四种典型异常及处理
我在调试这套均衡板的过程中,遇到过几个比较典型的问题,整理成一张表方便对照。
| 异常现象 | 可能原因 | 处理方式 |
|---|---|---|
| 均衡电流很小,达不到设定值 | 反馈目标电压太接近电池电压,被反电动势顶住 | 把目标电压偏移加大到 50~100mV,或者改用电流环控制 |
| 均衡方向频繁来回切换 | 极化回弹、电压采样噪声、阈值太小 | 强制静置启动,增大滞回,加 30s 确认延时 |
| 压差还没到 5mV,均衡就自动退出 | 芯片进入 PFM 轻载模式,电流断续 | 强制 PWM/FPWM,禁止轻载自动跳频 |
| 板子温度偏高,均衡电流又上不去 | 电感饱和导致损耗增大 | 换低 DCR、饱和电流更大的电感,检查电流波形 |
第一个问题最隐蔽。你设置了目标电压 3.45V,B1 当前电压也是 3.45V,芯片理论上因为目标等于当前电压不会持续输出电流。电池是电压源,不是电阻负载,要让它真正灌入电流,目标电压必须比当前电压高出一截。我后来把“均衡目标电压”和“电池当前电压”之间的差值作为一个可配置参数,默认 50mV,效果立刻正常了。
第二个问题在备用电源浮充状态下特别明显。浮充时 B1 和 B2 电压差可能只有 10mV 左右,但一会儿 B2 高、一会儿 B1 高,其实都是测量噪声加极化现象。我加了一个简单的“启动确认”逻辑:连续 30 次采样,也就是大约 1 秒内压差都大于启动阈值,才真的启动均衡,此后只要压差还在 30mV 以上就持续工作。启动后即便瞬时跳变,也不退出,除非压差连续低于 5mV 达 1 秒。
4.2 示波器怎么看均衡方向
调试时不要只依赖万用表看电压,示波器是必需的。重点看两个点:SW 节点的开关波形和电感电流波形。SW 波形能看出占空比是否合理,一个正常工作的同步 Buck,高电平接近 BAT+,低电平接近 GND,平均值大致等于目标输出电压。
电感电流波形能非常直观地看出能量流向。电流探头夹在电感回路里,如果电流在一个开关周期内整体为正向,说明正在从输入端向 M 点灌电流,也就是 B2 向 B1 搬能量;如果电流整体为负向,说明正在从 M 点抽电流回灌输入端,也就是 B1 向 B2 搬能量。这个判断比任何软件打印都可靠。
我第一次调通反向模式时,发现负向电流波形很乱,后来意识到是芯片自动进入了轻载模式。在数据手册里找到强制 PWM 选项,把模式引脚拉到固定电平之后,反向电流才成为连续的三角波。如果你选的芯片没有 FPWM 引脚,建议看看是否有寄存器可以禁止 PFM,或者直接换一颗支持强制 PWM 的同步 Buck,否则双向均衡很难做得干净。
4.3 个人经验:先跑通两串再向多串扩展
最后分享一点实际体会。两串均衡看似简单,但它是多串主动均衡的基石。你把两串之间的能量搬移逻辑、电流方向切换、阈值滞回和故障保护都调顺了,后面扩展成四串、六串时,只需要在相邻单元之间复制同样的功率级和策略。PIC18F55K42 的 ADC 通道和 PWM 资源也足够支撑多用几个均衡通道,但软件上最好从“后台循环查询”改成“事件驱动”,让 ADC 硬件结果直接触发策略更新,减少 CPU 占用。
我在 50Ah 铁锂电池组上把均衡电流设在 0.5A,长期浮充造成的 180mV 失配,大约两个半小时内被压回 10mV 以内。整个过程里电池温度只上升了不到 2°C,和被动均衡那种局部发热完全是两个状态。如果你的储能或备用电源系统也面临相似的两串失配问题,这套方案的方向是值得试的。先拿两节旧电芯搭个实验板,把示波器接好,再逐步加策略,比直接在成品系统上验证要稳妥得多。