做储能和备用电源的项目时,最容易被忽视但又最致命的问题,就是串联电池的不均衡。我之前做过一套基于 2S 电池组的后备电源控制器,两个串联电池单元,标称电压一样,用着用着电压差越来越大,一年不到就有单体过放报废的。后来重新设计均衡方案,选了 MP2642GR-Z 降压转换器和 PIC18F86K90 做主控,把均衡从被动电阻放电改成了主动能量搬移,整个系统才算真正稳定下来。这篇就把这套方案从拓扑选型、参数计算、固件逻辑到实测踩坑完整记录下来,给同样在做储能、备用电源或者便携电池包的同行作个参考。
1. 这个项目要解决的本质问题:电池不均衡
1.1 串联电池为什么会“跑偏”
两个电池串联在一起,电流路径上是同一股电流,理论上充放电量应该完全一致,但实际根本做不到。电芯内阻不一致、每节电芯的容量衰减速度不一样、温度场分布不均匀,甚至出厂时 SOC(荷电状态)的初始差异,都会让两个电池单元在多次循环后逐渐拉开差距。
拿我当时的实际场景来说,备用电源平时浮充,偶尔深放电。两节磷酸铁锂电芯串联,其中靠近发热器件的那节电芯温度高两三度,内阻变化就比另外一节快。循环一段时间后,放电末端一节电压已经掉到 2.9V,另一节还有 3.2V。如果继续放电,低电压那节就会被过放损坏,整组电池的可用容量就这样被“短板效应”拖垮了。
不均衡的危害还体现在充电端:串联充电时,充电电流是相同的,电压高的那节会先到达充电截止电压,为了避免过充,系统只能提前停止充电,结果另外一节永远充不满。备用电源最怕这个,容量看起来还写着 100%,实际能放出来的能量可能只有 70%。
1.2 被动均衡 vs 主动均衡:方案取舍
传统低成本方案是被动均衡,也就是在每节电池上并联一个放电电阻和一个开关管,哪节电压高了,就把多余的能量通过电阻发热放掉。优点是电路简单、控制容易,缺点是能量被白白浪费,而且均衡电流很小(通常 50-100mA),对大容量储能电池来说基本是杯水车薪。我最早的那版就是被动均衡,能力太弱,温差导致的电压差根本拉不回来。
主动均衡则完全不同,它的核心思路是把能量从电压高的电池单元搬到电压低的单元,而不是烧掉。常见实现有电感式、电容式、变压器式,其中电感式(降压变换器式)在 2S 系统中结构最简洁,效率高、元件少,还不需要复杂的磁芯设计。
我给这两节电池选的就是主动均衡里的降压变换器方案:用一个同步 Buck 变换器,把能量从高电压单元或者整组电池,转移到低电压单元。MP2642GR-Z 恰好就是一个集成度很高的同步降压转换器,外围元件少,效率能到 90% 以上,很适合做这个能量转移的核心。
1.3 关键器件选型逻辑
主功率器件选 MP2642GR-Z,我当时的考量非常直接:它内部集成了高侧和低侧 MOSFET,同步整流,不需要外挂续流二极管,这就省掉了两个功率管的驱动电路和散热问题;开关频率做到 500kHz 级别,电感可以用比较小的值,整个均衡模块能压缩到一颗火柴盒大小;输入耐压覆盖 2S 电池组的满电电压完全没有压力。
控制核心选 PIC18F86K90 也不是随手抓的。它有几个点恰好命中这个场景:自带 12 位 ADC,采样电池电压分辨率够用;内置 LCD 驱动,可以直接挂段码屏显示电池电量和均衡状态;nanoWatt XLP 技术待机电流非常低,符合备用电源长期待机、偶尔工作的运行模式;再加上 I/O 引脚多,控制几个开关管绰绰有余。整个系统不需要再额外加一片显示驱动芯片,成本和面积都省下来了。
2. 系统方案与主功率电路设计
2.1 系统架构和能量流转路径
先说清楚整体拓扑。两节电池串联构成电池组,从总正和总负引出主功率路径,中间点是两个电池单元的串联节点。MP2642GR-Z 构成的 Buck 变换器输入接在整组电池两端,输出接在均衡目标电池单元的端口上,通过一组 MOSFET 开关矩阵来选择输出连接哪一节电池。
工作逻辑是这样的:PIC18F86K90 通过分压电阻采样两节电池的电压,算出电压差。如果 Battery 1 电压高于 Battery 2 且差值超过阈值,就闭合输出到 Battery 2 的开关,启动 Buck 变换器,从整组电池取能量,降压后给 Battery 2 充电;反之则把输出切换到 Battery 1。直到两节电压差收敛到设定的滞回区间,关闭变换器,开关断开,均衡结束。
这里有个设计窍门:能量是从整组电池取出的,所以 Buck 变换器的输入电压是两节串联的总电压,约 5.5V 到 8.4V(磷酸铁锂 2S 是 6.4V 到 7.3V),而输出电压只需要 3V 到 4.2V,降压比大概在 0.5 左右,Buck 变换器工作在一个非常舒服的占空比区间,效率反而比那种极端降压比的应用要好看。
2.2 基于 MP2642GR-Z 的降压变换电路参数计算
功率电路的核心参数,就是输出电感、输出电容、输入电容,以及反馈分压电阻。我按均衡电流 1A 来设计,兼顾了均衡速度和发热控制。
开关频率按 MP2642GR-Z 常见配置取 500kHz。输出目标电压设为 4.2V(兼容锂离子和磷酸铁锂高电压段,实际均衡时如果需要更低电压,可以通过 PWM 或者反馈分压微调)。
电感值的计算公式是:
L = (Vin_max - Vout) × D / (f_sw × ΔI_L)
其中占空比 D = Vout / Vin。取 Vin_max = 8.4V,Vout = 4.2V,D = 0.5,纹波电流 ΔI_L 取输出电流的 30%,也就是 0.3A:
L = (8.4 - 4.2) × 0.5 / (500000 × 0.3) = 2.1 / 150000 ≈ 14μH
我实际选了 15μH 的贴片功率电感,饱和电流留到 2A 以上,避免在均衡电流峰值时电感量跌落太多。输出电容主要承担输出电压纹波的抑制,Buck 变换器输出纹波主要由电感纹波电流和电容 ESR 决定。我用了两颗 22μF/10V 的 X7R 陶瓷电容并联,ESR 很低,输出纹波实测在 30mV 以内,对电池充电来说完全可以接受。
输入电容也不能省。因为输入端是整组电池,电池本身内阻很低,但如果连接线比较长,寄生电感会和输入电容形成谐振。我按惯例在 MP2642GR-Z 的 VIN 引脚边上放了 10μF 陶瓷电容加一颗 0.1μF 高频去耦电容,采用 0805 封装紧贴芯片放置,把高频噪声路径缩到最短。这个细节我遇到过教训,之前有一版输入电容距离芯片远了 5mm,空载波形正常,一加负载就出现高频振铃,后来把电容挪到芯片脚边才解决。
反馈分压电阻决定 Buck 变换器的输出电压。MP2642GR-Z 内部参考电压通常在 0.6V 到 0.8V 区间,我按下述公式计算:
Vout = Vref × (1 + R_upper / R_lower)
假设 Vref = 0.6V,目标是 Vout = 4.2V,取 R_lower = 10kΩ,则 R_upper = (4.2 / 0.6 - 1) × 10k = 60kΩ。为了给均衡电压留调节余地,我把 R_upper 拆成 47kΩ 固定电阻加 20kΩ 精密可调电阻,调试时先用可调电阻找到精确电压点,再换成接近的固定电阻组。
注意:均衡输出电压最好略高于目标电池的当前电压,但不能超过电池的绝对最高充电电压。设置反馈电阻时,先把输出空载电压调到目标值,再接电池,确认没有过充风险。
2.3 开关矩阵与采样隔离设计
输出电压要能切换给 Battery 1 或者 Battery 2,我用了四个 MOSFET 构成 T 型开关网络,由 PIC18F86K90 的 GPIO 控制。开关管选择上要注意几点:耐压必须高于电池组最高电压,我选了 30V 耐压的 N-MOSFET 和 P-MOSFET 组合;导通电阻要低,均衡电流 1A 时导通压降不能造成明显损耗;栅极驱动电压要够用,PIC18 的 GPIO 高电平接近电源电压,需要给 P-MOSFET 做电平转换,或者干脆用 N-MOSFET 加电荷泵方案。
实际布线时有一件很关键的事:输出开关矩阵绝对不能出现同时导通的情况,否则 Battery 1 和 Battery 2 会被直接并联短路。我在固件里加了死区延时,每次切换开关状态时,先断开原有开关,等待 100μs,再闭合目标开关。硬件上也加了简单的 RC 延时电路做双保险,就算固件跑飞,也不会把两个开关同时拉高。
电压采样电路我用的是分压电阻加 RC 滤波。Battery 1 电压是电池组总正对地的电压,范围最高到 8.4V,分压到 PIC18F86K90 的 ADC 输入范围(内部参考选 3.3V 或者 VDD)。分压比取 1/3 左右,8.4V 对应 2.8V,留有余量。采样电阻我选了 100kΩ 和 49.9kΩ,总阻值 150kΩ 级别,对电池的静态电流消耗可以忽略。每个采样通道并联 100nF 电容和 1kΩ 串联电阻构成一阶低通滤波,截止频率大约 1.6kHz,能有效滤掉开关噪声。
3. 以 PIC18F86K90 为核心的固件实现
3.1 电池电压采样与滤波
PIC18F86K90 的 12 位 ADC 对这个项目来说很够用。参考电压用内部基准,设置为 3.3V,采样分辨率是 3.3V / 4096 ≈ 0.8mV。考虑到分压电阻的误差和电池噪声,实际测量精度大约在 ±5mV 以内,对均衡控制完全够。
固件里我只做了一件事非常值得强调:采样时序。绝不能直接读一次 ADC 就拿来做均衡判断。电池在均衡时电压会叠加 Buck 变换器的纹波和动态响应,我每次采样前先开启 ADC 通道,等 2μs 采样电容稳定,然后连续采 16 次,去掉最大最小各 4 个,用中间 8 次的平均作为本次采样值。这样一组处理下来,纹波影响基本被抹平了。
另外要区分两个电压:电池的开路电压(OCV)和带均衡负载时的端电压。均衡充电时电池端电压会高于开路电压,直接用这个值做均衡判断会误判。我在固件里设计了一个状态:均衡启动前采样记录一次电压,作为均衡基准;均衡进行中,每 2 秒做一次短时中断采样(断开均衡 5ms,采样电压恢复后的值),用于实时监控,均衡结束条件用得是中断采样值。
3.2 均衡状态机与 PWM 控制逻辑
均衡控制核心是一个五状态的状态机:IDLE(空闲)、MEASURE(采样评估)、BALANCE_1(给 Battery 1 充电)、BALANCE_2(给 Battery 2 充电)、FAULT(故障锁存)。状态迁移逻辑如下:
开头进入 IDLE,每 10 秒唤醒一次进入 MEASURE,采样两节电池电压,计算差值 ΔV = |V1 - V2|。如果 ΔV < 20mV,回到 IDLE——这就是均衡的死区,避免继电器/开关频繁动作。如果 ΔV ≥ 20mV,判定哪节电池偏低,进入对应的 BALANCE 状态。
均衡过程中,PIC18F86K90 输出一个 PWM 信号去控制 MP2642GR-Z 的使能端或者反馈参考。我实际用了更简单直接的方法:Buck 变换器启动后,输出电压就是设定的 4.2V 恒压值,给低电压电池充电,电流由变换器限流。固件只负责监控均衡电流和电压变化,不需要做闭环调压。
不过,如果需要做电流限制,可以在反馈分压网络中并一个由 DAC 或者 PWM 控制的微调电阻,动态调整输出电压,间接控制均衡电流。我的 PWM 控制逻辑是:用固定频率 10kHz、占空比可调的 PWM,经 RC 积分得到一个 0 到 3.3V 的模拟电平,再通过一个运放叠加到反馈分压网络。这样固件就能微调输出电压到目标电池当前电压的 1.05 倍左右,避免过大的压差导致充电电流过冲。
手动“限流”的公式参考:Buck 变换器输出电流 Iout ≈ (Vout_set - Vbat) / R_path,其中 R_path 是输出开关管 + 线路 + 电池内阻的总和。我实测大概在 150mΩ,如果 Vout_set 比电池电压高 0.2V,初始充电电流就约 1.3A,可以接受,但如果初始压差到了 0.5V,电流就会超过 3A,必须限制。所以把 Vout_set 控制在高于电池当前电压 0.1V 到 0.2V 是很关键的,既保证均衡速度,又不至于电流失控。
// 均衡状态机核心循环(伪代码) while (1) { switch (state) { case IDLE: if (system_wakeup_10s) { v1 = get_batt_voltage(CH_V1); v2 = get_batt_voltage(CH_V2); delta = abs(v1 - v2); if (delta < 20) { state = IDLE; } else if (v1 > v2) { state = BALANCE_1; // 给电池2充电 } else { state = BALANCE_2; // 给电池1充电 } } break; case BALANCE_1: open_switch(SW_TO_BAT1); close_switch(SW_TO_BAT2); // 经过死区延时 buck_enable(1); set_vout_target(battery2_voltage + 0.15); // 限流 if (check_delta()) state = IDLE; break; case BALANCE_2: open_switch(SW_TO_BAT2); close_switch(SW_TO_BAT1); buck_enable(1); set_vout_target(battery1_voltage + 0.15); if (check_delta()) state = IDLE; break; } }check_delta() 函数做的事情是:均衡 5 秒后关闭 Buck 变换器,等待 200ms 让电压回落,再采样两节电池电压。如果 ΔV < 20mV,判定均衡完成;如果发现目标电池电压异常偏高(超过 4.25V),立刻进入 FAULT 并断开一切开关。这样安全逻辑就在状态机里闭环了,不会出现电压过高还一直充的情况。
3.3 保护和异常处理设计
保护逻辑我分了三个层次。第一层是硬件保护,MP2642GR-Z 自带过流保护和热关断,短路时芯片自己会限制输出;第二层是单片机软件保护,包括过压保护(任何一节电池超过 4.25V 立即停止均衡并锁存)、过流保护(通过采样电流超过设定值 1.5A 连续 3 次后停止均衡)、超时保护(连续均衡 24 小时电压差没收敛,强制退出并置故障标志);第三层是系统级保护,PIC18 监控整组电池电压,如果总压低于放电下限,直接通知主控切断负载。
FAULT 状态设计成锁存模式,也就是说一旦进入,必须通过外部命令或者拔电重启才能复位。这样做的好处是故障不会被自动循环掩盖,我在整机测试时就发现电池轻微过压会自动恢复,导致故障被吞掉,反复几次后电池才彻底坏掉,从那以后所有保护都用锁存。
软件里还有个细节值得写:PIC18F86K90 的 EEPROM 或者 Flash 数据区可以用来保存上次均衡结束时两节电池的电压值。下次上电后,如果发现两节电池电压差超过 150mV,就不用慢慢等 10 秒才启动均衡,直接立刻进入均衡流程,这个“记忆启动”功能在备用电源场景非常实用,因为电池放了一晚上之后,自放电差异会拉开电压,快速启动均衡能防止第二天突然需要放电时电量不足。
4. 实测波形与常见问题排查实录
4.1 几个关键调试点与波形验证
均衡电路调试最痛苦也最值得的阶段,就是把 Buck 变换器调稳定。我调试时用电子负载模拟电池,空载先看输出电压是否稳定在 4.2V,然后加 1A 电子负载,用示波器测开关节点(SW)波形、输出电压纹波和电感电流波形。
关键的检查点是开关节点波形。正常情况应该是方波,上升沿和下降沿干脆利落,没有明显振铃。如果 SW 波形上有高频振荡,通常是输入电容位置不对或者环路补偿参数不合适。我用 15μH 电感和 44μF 输出电容的组合,实测 SW 波形在满载时有过冲,大概 1.5V 的尖峰,后来在 SW 节点对地加了一个 RC 吸收电路(10Ω + 1nF),尖峰压到了 0.6V 以内。这个 RC 吸收电路对 MP2642GR-Z 的同步 Buck 来说几乎是标配,不加的话过冲虽然不至于立刻炸管,但长期运行会对芯片造成应力积累。
电感电流波形用电流探头测,正常情况下是三角波,平均电流等于输出电流。如果出现电流波形不对称,说明可能进入了 CCM/DCM 临界状态或者电感量偏小。我 15μH 电感在 1A 负载下纹波电流大约 280mA,跟计算值基本吻合。占空比在 Vin=8.4V、Vout=4.2V 时实测 50% 左右,开关频率 500kHz 锁定准确。
均衡电压收敛曲线我做了两组记录:一组是两节电池电压差初始 80mV,一组是初始 250mV。80mV 那组在 25 分钟均衡到 10mV 以内;250mV 那组用了大约 1.5 小时,均衡电流维持在 0.8A-1A 之间,后期电流逐渐降低,因为 Vout_set 和电池电压的差值在缩小。这个趋势说明限流逻辑工作正常,如果不是这样,后期电流可能反而会升高,造成过冲。
4.2 常见问题速查表
调试过程中我踩了不少坑,整理成一张速查表,有相同问题的可以直接对照参考。
| 现象 | 可能原因 | 排查与解决方法 |
|---|---|---|
| 上电后 Buck 无输出,SW 无波形 | 使能脚电平不对、输入电容短路 | 先测 VIN 电压、EN 引脚电平;拔掉电感量 SW 端对地电阻,排除焊接短路 |
| 带载后输出电压跌落明显 | 电感饱和、输出电容 ESR 过高 | 换饱和电流更大的电感;X7R 陶瓷电容替代 Y5V |
| 均衡电流过大,瞬间超过 3A | Vout_set 比电池电压高太多 | 限制初始压差在 0.1-0.2V;增加软启动时间 |
| 切换开关瞬间电池间短路 | 开关切换死区不够 | 固件加 100μs 死区;硬件检查 MOSFET 栅极下拉电阻 |
| ADC 采样值跳变剧烈 | 采样时机在开关切换瞬间 | 固定采样时序,避开切换后 10ms 内采样;增加滤波电容 |
| 电池电压缓降,但均衡不收敛 | 均衡判断使用了带载电压 | 改为中断采样模式,用开路电压做均衡判断 |
| 备用电源长时间待机后电压差反弹 | 自放电率差异 | 启用 EEPROM 电压记忆,上电快速启动均衡 |
4.3 个人经验与后续优化方向
做完整套方案,我最大的体会是:均衡系统的价值不在均衡动作本身,而在“判断要不要均衡”和“判断均衡是否结束”。很多方案失败不是因为电路不行,而是因为判断逻辑太粗糙,要么均衡过头把电量从高电池搬到低电池最后变成反过来,要么频繁启停让开关管寿命缩短。
我现在的这套逻辑,用死区 20mV 和迟滞比较的方式,避免开关频繁动作;把均衡结束条件设置为“开路电压差小于 20mV”,而不是“端电压相等”,这个细节让收敛效果明显变好。实际测试中,因为电池内阻不同,端电压相等的时候开路电压差可能还有 40mV 以上,如果按端电压相等作为结束条件,均衡就停得太早了。
后续我准备做两个方向扩展:一个是在支撑架两个电池单元的基础上,把均衡拓扑扩展成三节甚至四节,开关矩阵的通道数相应增加,状态机也要改成通用配置表驱动;另一个是把 MP2642GR-Z 的开关频率从 500kHz 降到 300kHz 试试,牺牲一点电感尺寸换取更低的开关损耗,因为备用电源工况下,均衡并不是高频动作,发热控制比体积更重要。
最后分享一个小技巧:调试这种均衡电路时,不要一上来就接真实电芯,先准备两节大电容或者可调电源模拟电池,把所有电压、电流、时序逻辑调稳定了,再上真实电池。我第一次直接上电池就在切换开关时打了一次火花,虽然没烧东西,但把 MOS 管栅极氧化层损伤得不轻。模拟负载调试多花一小时,后面能省一整天排查问题的时间。