两节电池串联,听起来是个很基础的结构,真正做储能和备用电源的人都知道,单体电压不一致带来的麻烦一点也不基础。大家喜欢用“木桶效应”形容电池组,容量短的那一块会拖垮整组,而且不是线性衰减,是越用越恶化。这段时间我在给一套后备储能系统做调试,系统核心就两块料:MP2642GR-Z 降压转换器和 PIC18LF46K40 单片机。方案目标很直接——对两个串联电池单元做主动均衡,把高电压电池的能量搬运给低电压电池,让两组电池始终贴合工作,而不是靠电阻把多余电压白白烧掉。这篇文章把我从硬件选型、均衡算法到实际调试踩坑的完整过程写了一遍,想给还在用被动均衡、或者正在挑选主动均衡方案的同行省点弯路。
这篇内容不是仿真报告,是一线实操记录。适合谁看?适合做便携储能、UPS 备用电源、户外电源这类 2S 锂电池应用的硬件工程师、单片机开发、电池包设计人员。如果你正好在纠结“两个电池电压差几十毫伏要不要管”“主动均衡到底怎么做”,那这篇应该能给你一个可以直接落地的参考。
1. 为什么这个项目会把“均衡”作为核心问题?
1.1 两节串联电池的痛点
在储能和备用电源里,2S 结构到处都是。两个电池串联,电压相加,看起来是最基础的电工常识,但化学电池不是理想电压源,每个单体的容量、内阻、自放电率、温度系数都有差异。出厂时配对可以控制得很好,循环几百次之后差异一定会被放大。其中较弱的那一块会最先触底或者过充,系统为了保护它,只能整组停机,结果整组系统的可用容量变成由最弱单体决定。
具体到备用电源场景,这个痛点更明显。备用电源大部分时间处于浮充或者待机状态,偶尔才做深度放电。单体自放电不一致,长期待机后两节电压差距能拉大到 100mV 甚至更大。如果主策略只是“整组充电到 8.4V 就停止”,那就会有一节电池先到 4.2V,另一节可能才 4.05V。长期下来,高电池在过充边缘反复摩擦,低电池又长期饥饿,整个系统的寿命和可靠性都会出问题。
均衡的作用书面上就八个字:让两个单体保持一致。但“一致”有两层含义:电压一致和容量(SOC)一致。对 2S 系统来说,由于两个电池额定容量通常相同,电压对齐大致可以近似成容量对齐,所以直接按端电压做控制是可行的。
1.2 方案选型:主动均衡而不是被动放热
均衡电路大致分两类:被动均衡和主动均衡。被动均衡的典型做法是把电压高的电池并联一个泄放电阻,让多出来的能量以热量形式耗散掉。电路是真的简单,一个 MOSFET 加一个电阻就能做。但被动均衡有两个硬伤:
第一,能量全部变成热。2S 系统空间紧凑,尤其是储能模块里,热管理成本很高。第二,均衡电流通常不敢做大,电池差异大的时候需要非常久才能把电压压下来。我遇到的场景是备用电源,有时候停电前设备已经一个月没有充放电了,如果出现 200mV 的严重不均衡,被动均衡可能要连续工作好几天,完全不可接受。
所以我直接锁定主动均衡。主动均衡的本质是能量搬运——把高能量单体的电,通过 DC-DC 或者开关电容,转移到低能量单体去。2S 结构只有两个电池,能量搬运非常直接:
- 如果单体 1 电压高于单体 2,就把单体 1 的能量搬给单体 2;
- 如果反过来,就把单体 2 的能量搬给单体 1。
好处在于,均衡过程不会白白放掉能量,系统损耗主要来自转换效率;而且均衡电流可以放宽,只要散热跟得上,几百毫安没有问题,几分钟到几十分钟就能把差异抹平。用在备用电源这种对长久待机敏感的场合再合适不过。
1.3 芯片组合的选择逻辑
选 MP2642GR-Z 的原因比较朴素,我看重的是它的同步降压结构和较小外围体积。在这个方案里,它担任均衡功率级。两节锂电串联时,电池堆电压在 6V 到 8.4V 之间,单节电池需要的均衡电压在 3.0V 到 4.2V 区间,正好是降压转换的主场。MP2642GR-Z 内置功率管和同步整流,效率通常能到 90% 以上,反馈环路上可以做精确的限流和电压设置,方便和单片机的 PWM 配合。
PIC18LF46K40 承担了测量和控制部分。它是低功耗产品线,待机电流很小,特别适合备用电源这种长期接市电、大部分时间不动作的环境。片上带 10 位 ADC、比较器、可配置逻辑单元(CLC)、数控振荡器(NCO)和 PWM,刚好满足电池采样、通道切换、限流脉冲控制的需求。可以在一个单片机里完成全部工作,不用额外加运放和逻辑芯片。低功耗这一项在备用电源里很关键——均衡系统自身的耗电也必须算进待机损耗,主控待机电流每多 1mA,整机一年的待机损耗就可能多出接近 9Wh,对小容量后备系统来说是非常可观的数字。
2. 整体架构与能量路径设计
2.1 系统框图与信号流
先给一个整体信号路径,方便后面看电路不迷路。我把系统分成四个环节:
- 电池堆输入:两个串联电池,总电压 BV+ / BV-;
- 均衡功率级:由 MP2642GR-Z 组成的同步降压,输入端接电池堆正负,输出端是经过调节的均衡母线;
- 选通矩阵:几颗 MOSFET 组成开关阵列,决定均衡母线对单体 1 还是单体 2 充电;
- 采样与核心控制:PIC18LF46K40 通过差分采样电路读取单体电压,控制开关阵列和 DC-DC 的使能,实现闭环均衡。
实际流向是这样的:PIC 每隔一段时间测量单体 1 和单体 2 的电压,算出差值。如果差值超过启动阈值,就确定目标电池——也就是电压偏低的那一个;然后 PIC 打开对应选通开关,同时使能 MP2642GR-Z 的降压输出,让均衡母线以受控的电流给目标电池充电。充电过程中 PIC 持续监视目标电池电压,一旦接近最高单体电压或差值进入死区,就停止均衡。
用一句话总结设计思想:用高电池的余量去补低电池的缺口,而不是把高电池的能量浪费成热量。
2.2 MP2642GR-Z 在均衡器中的角色
在这个设计中,MP2642GR-Z 被接成经典的降压反馈结构。输入 VBatt 接两节电池的正极,输出端接均衡母线,反馈引脚由分压电阻采样输出电压。使能引脚直接接单片机 GPIO,需要均衡时拉高,不需要时拉低,把整个功率级的空载损耗省掉。
这里有一个设计细节要特别提醒:均衡母线输出目标电压不是固定不变的。理想状态应该设置成比当前最高单体电压略高一点点,或者设置成单节恒压上限(比如 4.2V),然后利用 DC-DC 的电流极限来限制均衡电流。我在项目里更倾向于把输出设定在目标电池的浮充电压附近,再靠串接在回路里的检流电阻做电流闭环。这样做的好处是:即使选通开关之后电池电压反灌到 DC-DC 输出端,也不会因为压差过大致使均衡功率级损坏。
充电路径上还需要加限流和防倒灌措施。降压芯片输出端在未使能时,如果电池电压高于输出端,会通过续流管或体内二极管形成倒灌路径,所以必须在输出母线和选通开关之间加入方向性保护。最简单稳妥的方法是串一个肖特基二极管,或者用 MOS 管做理想二极管,细节放到后面的通道选通矩阵里一起说。
2.3 PIC18LF46K40 的外设分配
我实际用掉了这些资源:
- ADC 两路输入:分别经过外部差分放大后采样两节电池电压;
- GPIO 三路:分别控制均衡使能、通道选通 A、通道选通 B;
- PWM 一路:用于 DC-DC 的软启动或做低成本限流控制;
- CLC:搭建简易比较器逻辑,实现硬件上的过压保护,避免单片机程序跑飞时把电池接到错误通道;
- 内部参考电压(FVR):作为 ADC 参考,保证电池电压在不同节电模式下读数稳定。
单片机工作在低功耗模式,主循环用定时器周期性唤醒,唤醒间隔可以设在 20ms 到 500ms 之间。备用电源场景我直接设成 250ms,既保证均衡实时性,又不会让待机电流上升太明显。每次唤醒后完成采样、判断、动作三条流程,然后继续睡眠。均衡动作期间才让 MCU 保持全速运行,这个策略可以把整个控制系统对电池组的自耗电压得很小。
看这套外设分配,你可能会觉得 ADC 数量有点紧张。实际上两节电池串联,单片机的地是电池堆负极,要采样靠近正极的那节电池时,共模电压高达 3V 到 4V,直接拿 ADC 读是不可行的。加一个差动放大器是必须的,这个在后面硬件部分详细说。
3. 硬件电路与关键参数计算
3.1 降压电路配置与反馈电阻计算
MP2642GR-Z 的外围电路遵循典型降压布局:输入电容靠近芯片 VIN 引脚、电感接 SW、输出电容靠近 VOUT、反馈电阻从 VOUT 到 FB 再到地。具体电感值要看开关频率和最大负载电流,一般 4.7µH 到 10µH 都能用。我选了 6.8µH,同时兼顾了纹波和 DCR。
反馈电阻计算是重点。假设我们希望均衡母线稳定在 4.2V,FB 参考电压是 0.6V,那么根据典型分压关系:
VOUT = VFB ×(1 + R1 / R2)
想得到 4.2V 输出,可以选 R1 = 100kΩ,R2 ≈ 16.7kΩ。标准阻值没有 16.7kΩ,我实际用了 18kΩ 和 150kΩ 并联凑出约 16.47kΩ,得到 VOUT ≈ 4.24V,再用软件微调或者串一个小电阻修正。这种方法在需要固定输出的场合很实用。
注意 FB 分压电阻不要取太大。储能系统中 PCB 可能有轻微潮湿、助焊剂残留,如果 R2 在兆欧级别,任何漏电流都会被放大到 FB 引脚上,输出漂移非常明显。我一般把上下分压电阻控制在几十千欧到两百千欧之间,兼顾待机功耗和抗污染能力。
3.2 通道选通开关矩阵
这部分是容易出错的地方。均衡母线是相对电池负极的地来定义的,所以它只能自然地给下方的电池充电。要让它给上方的电池充电,必须改变参考地,或者用一串 MOS 管做浮地切换。
简单可靠的架构是:均衡母线正端通过一个 P 沟道 MOSFET 接电池 1 正极,均衡母线负端通过一个 N 沟道 MOSFET 接电池 1 负极。当两个管同时导通时,降压输出直接并联在电池 1 两端。因为降压输出端有输出电容,PIC 控制的导通顺序必须是先开电池 1 负极端的低端 MOS,再开高端 MOS,避免瞬间给 MOS 的栅极电容充电造成误触发。断开时顺序相反,先断高端,再断低端。
给电池 2 充电时,通道开关简单很多:低端 MOS 直接接系统 GND,高端 MOS 接电池 2 正极。由于电池 2 负极就在系统地,几乎没有高侧浮空问题。
我在原理图里把这四个 MOS 称为 Q_H1、Q_L1、Q_H2、Q_L2。PIC 的 GPIO 通过小电阻驱动栅极,每个 MOS 带 10kΩ 下拉电阻,防止单片机上电瞬间 GPIO 悬空造成通道误导通。这个下拉电阻非常关键,否则每次上电都可能让均衡母线误放电,严重的直接把电池保护板打挂。
3.3 电池电压采样与保护环节
单片机无法直接测量靠正极的那个单体电压,所以采样电路用差动方式处理。我在项目里用了两个低功耗运放,每个运放配置成差动减法器:
- 电池 1 采样:运放正输入接电池 1 正极,负输入接电池 1 负极,输出按比例缩小到约 1.05V,供 ADC 读取。
- 电池 2 采样:运放正输入接电池 2 正极,负输入接电池 2 负极,同样是 4.2V 满刻度按比例缩小到 ADC 满量程附近。
这里有一个隐藏问题:差动放大器的共模抑制比是有限值,电池堆电压越高,共模误差越大。为了让系统在全寿命范围内保持 10mV 级别的均衡精度,电阻匹配精度至少要 1%,最好选 0.1% 的精密电阻网络。不要小看这点成本差异,均衡启动阈值本来就只有几十毫伏,采样误差占一半的话,算法再漂亮也没用。
过压保护也不能省。PIC 程序即使写得再完善,也有极端情况:某块电池内阻异常导致采样读不到真实电压,或者 ADC 参考漂移造成误判。我在 CLC 里搭了一个电压窗口比较逻辑,把电池 1 的采样输出电压硬接到 CLC 输入,只有当采样值处于 3.0V 到 4.25V 窗口内时,才允许相应的通道 MOS 导通。这样即使固件跑飞,硬件上也不可能对一个过压电池继续充电。
4. 固件逻辑与均衡控制策略
4.1 电压测量与数据准备
固件第一步是把两节电池电压读准。我写了一个简单但有效的采样流程:
- 每次唤醒后先关闭均衡通道,让电池从充电回路中隔离出来;
- 延迟 10ms 等电压回稳;
- ADC 连续采样 16 次,剔除最大最小值,取平均;
- 用预先标定的斜率和截距换算成毫伏值;
- 再把毫伏值送入状态机判断。
为什么要 10ms 回稳?因为均衡刚停止时,电池端口上还残留着极化电压。极化电压不是真实开路电压,而是锂离子浓度扩散产生的表面电势。如果不等待就直接采样,读数会比实际 SOC 对应的电压高,系统会误判电池已经充满,从而提前结束均衡。在实验里,这种误差能达到 20mV 到 50mV,已经非常接近均衡阈值了。
换算公式我建议用两点标定法。先把 ADC 原始码和万用表读数对上两组数据,再解出线性参数。常见形式是:
V_mV = k × ADC_code + b
其中 k 由分压比、电源参考、ADC 分辨率决定,b 则吸收运放偏置电压和参考误差。这两个参数不能只靠计算一次就完,因为温度变化时运放偏置会漂,最好在出厂标定时留一组补偿表。
4.2 均衡状态机与迟滞控制
我把均衡流程设计成一个小状态机,状态包括:IDLE(空闲)、BAL1(给电池 1 充电)、BAL2(给电池 2 充电)、SETTLE(电压恢复)。
逻辑是这样的:
- IDLE 下测量两电池电压,计算差值 dV = V1 - V2;
- 如果 dV 大于 30mV,进入 BAL2,因为电池 2 偏低,需要给它充电;
- 如果 dV 小于 -30mV,进入 BAL1;
- 如果差值在 ±10mV 以内,保持在 IDLE,不做任何动作。
BAL2 状态里,打开电池 2 的通道,然后使能 MP2642GR-Z,均衡电流设定在 150mA 到 300mA。PIC 持续监测电池 2 电压:当电压升到“最高单体电压减去 10mV”,或者 dV 绝对值小于 10mV,就停止均衡,回到 IDLE。
迟滞机制必须有。30mV 启动、10mV 停止,是两组不同阈值,防止系统在边界反复导通断开。如果把启动和停止都设在 20mV,那系统会在 20mV 附近震荡,MOS 管连续开关,轻则增加损耗,重则产生噪声干扰 ADC。迟滞窗口设宽一点,还可以让均衡在低占空比的断续模式下运行,减少发热。
4.3 均衡子程序参考代码
下面给一个固件核心片段,用的是 PIC18 系列的 C 语法:
#define BAL_START_MV 30 #define BAL_STOP_MV 10 #define ADC2MV(k, b, code) ((int32_t)(code) * (k) / 1000 + (b)) void balance_task(void) { uint16_t v1, v2; int16_t dV; // 断开所有均衡通道,等待极化电压恢复 DISABLE_BAL_ALL(); __delay_ms(10); v1 = read_cell_mv(CELL_1); v2 = read_cell_mv(CELL_2); dV = (int16_t)(v1 - v2); if (state == IDLE) { if (dV > BAL_START_MV) { state = BAL2; // 电池2电压低 BAL2_ON(); } else if (dV < -BAL_START_MV) { state = BAL1; // 电池1电压低 BAL1_ON(); } } else if (state == BAL2) { if (dV <= BAL_STOP_MV || v2 >= V_TARGET) { BAL_ALL_OFF(); state = IDLE; } } else if (state == BAL1) { if (dV >= -BAL_STOP_MV || v1 >= V_TARGET) { BAL_ALL_OFF(); state = IDLE; } } }这段代码只是逻辑骨架,实际工程里还要加上过压保护、看门狗复位后状态恢复、充电完成等动作。你可能会有疑问:为什么给电池 1 充电时用的是 BAL1_ON,而判断条件是 dV >= -BAL_STOP_MV?因为 BAL1 的目标是提升 v1,v1 - v2 从负值往上升,当差值上升到接近 0,代表两节电池重新对齐。这个细节写反的话,均衡系统会在错误方向上越搞越不平衡。
5. 实测标定与调试过程
5.1 用电池模拟器做静态标定
先别急着接真电池,我建议用两路可编程电源模拟电池单体。把电源 1 设为 3.9V,电源 2 设为 4.05V,连接方式和真实电池相同,然后看采样系统能不能准确判断“电池 1 偏低”。
标定过程是这样的:
- 先测单体 1:把电源 1 从 2.8V 到 4.3V,每 0.1V 记录一次 ADC 读数,得到单体 1 的换算曲线;
- 再测单体 2:把电源 2 同样扫一遍,单独记录;
- 做完之后立即验证差值:设置电源 1 = 3.85V,电源 2 = 4.00V,单片机应该触发 BAL1,也就是给电池 1 充电。如果触发的是 BAL2,说明差值方向写反了,或者两根采样线接错了。
我实际踩过的坑是差动采样线序接反。单体 1 运放的正负输入在原理图上是概念性的,PCB 布线时被交换了,结果系统把电压高的电池当成低的,主动均衡变成了反向搬运。这个现象出现时不容易察觉,因为代码逻辑本身看不出问题,必须靠静态标定把方向验证一遍。
5.2 接真电池的实测记录
静态标定通过后,再接两节真实的磷酸铁锂单体做联调。我当时选的一对电池已经循坏了大约 300 次,初始实测电压分别是 3.31V 和 3.62V,差值 310mV,属于比较严重的不均衡。这个状态在真实储能场景里很常见,尤其是设备存放一个月以上之后。
均衡启动后,电流设定在 200mA,定时记录电压变化。前 20 分钟,低电压电池以大约每分钟 2mV 到 3mV 的速度上升,高电压电池在缓慢下降——因为能量从高电池经 MP2642GR-Z 转出来,高电池必然被微幅放电。整个过程持续了大约 2 小时 20 分钟,两节电池电压收敛到 3.49V 附近,差值稳定在 8mV 以内。
实测记录的关键不是最终数字,而是几个规律:
- 极化电压对读数影响确实大,均衡结束立刻读数可能显示差值已经小于 5mV,但休息十分钟后会回弹到 15mV;
- 均衡电流越大,对低电池的电压抬升越明显,但发热也越明显,我最后把上限限制在 300mA;
- MP2642GR-Z 在低负载时效率会掉一些,所以设计时不要把一个 2A 能力的 DC-DC 用在 100mA 均衡电流上,最好靠载波频率和占空比把负载率抬起来,或者干脆用断续模式。
5.3 调试中容易被忽略的细节
这部分总结成几条经验:
第一,参考电压不能直接用 VDD。PIC 的 VDD 由 DC-DC 或者 LDO 供,而 DC-DC 的输出本身会随输入电池电压、负载变化而波动。ADC 参考如果跟着抖,采样结果就会出现“读数是稳定的,实际电压已经在变”的错觉。我最后启用了内部固定参考电压(FVR),并让 ADC 的采样时钟远离开关电源噪声,效果明显。
第二,通道切换时的 MOS 开关顺序必须写在代码里,不能只靠硬件默认。PIC 上电后 GPIO 默认输出状态未必是期望值,必须在初始化里先把所有均衡通道关闭,再配置输出方向。如果漏了这步,单片机上电过程中可能有一个极短窗口期,高侧和低侧 MOS 同时导通,造成电源到地直通。这种问题不会每次都出现,但偶发起来非常难排查。
第三,降压输出电感的 DCR 损耗容易被忽略。均衡电流虽然只有几百毫安,但如果电感 DCR 是 200mΩ,300mA 时损耗就是 18mW,看起来不大。可在备用电源的封闭 PCB 空间里,一点点功耗都可能造成局部温升,影响 ADC 采样稳定。选电感时尽量把 DCR 控制在 80mΩ 以下比较安心。
6. 常见问题与可靠性优化
6.1 故障速查表
下面这张表是从实际调试里整理出来的,希望能帮你少走弯路。
| 现象 | 可能原因 | 排查与处理 |
|---|---|---|
| 均衡不启动 | 差值计算方向反了 | 对比采样换算和万用表读数,检查运放输入接线 |
| 一上电 MOS 发烫 | 上电瞬间 GPIO 悬空,通道直通 | 确认所有 MOS 栅极都有下拉电阻,初始化先清零 GPIO |
| 采样电压周期性漂移 | ADC 参考用了 VDD,VDD 纹波大 | 启用内部 FVR,提高采样滤波深度 |
| 均衡停止后电压回弹 | 极化电压被当成真实电压 | 停止后等待 10ms,或读取开路电压恢复值 |
| 低压电池越充越低 | 高低侧 MOS 导通顺序错误,造成反向放电 | 用示波器抓 MOS 栅极时序,先导通目标电池负极侧 MOS |
| 整机待机电流过大 | MCU 未进入低功耗模式,DC-DC 空载还在工作 | 不需要均衡时拉低使能,MCU 使用定时器休眠唤醒 |
这个速查表只能覆盖常见情形,真实故障更可能叠加出现。建议每次改完硬件先跑一遍静态功耗测试,确认 IDLE 态下整机电流与设计一致,再往下调功能。
6.2 长期运行可靠性建议
储能和备用电源讲究“少维护、跑得久”,均衡系统自身的可靠性很关键。有几个建议值得写在这里:
第一,把均衡功能的动作次数记录下来。PIC18LF46K40 有内部存储,每次均衡完成,把循环计数写进去。后续维护时,如果发现某块电池频繁触发均衡,说明该单体的自放电或者内阻已经劣化,可以考虑提前更换,而不是等系统出问题再排查。这个做法成本极低,价值却很大。
第二,加入看门狗和校验逻辑。均衡任务一旦进入异常状态,比如 MOS 误导通、运放输出饱和,状态机会卡在某个非预期分支。把看门狗喂狗放在主循环的唯一出口,保证无论什么异常,只要任务未正常执行,几秒内就复位。复位后初始化代码会把所有均衡通道关闭,再进入 IDLE,安全性有保障。
第三,做好 PCB 的漏电流防护。储能系统工作温度可能达到 60℃ 以上,PCB 受潮后表面电阻下降,均衡母线上的电压会通过助焊剂残留形成微小电流,干扰采样。我最后把所有采样走线用铺地铜箔包围,并在采样节点附近加 100nF 滤波电容,把干扰和漏电流都压住了。
均衡不是一个可以“写完代码就不管”的功能,它的成败最后都落在采样精度和开关时序上。把这两点打磨好,其他问题基本都能迎刃而解。
最后再分享一个实测中很有用的细节:调试这套系统时,我给均衡母线串入了一个 10mΩ 的检流电阻,把压降送到单片机的比较器输入,做硬件限流。这个设计让均衡电流意外失控的时候能自动锁死,不会继续给低电池硬灌。后来备用电源做满电静置测试时,这个硬保护确实救了一次场。如果你也打算做类似的两节串联主动均衡,建议把它加进去,成本十几分钱,但能给整机多一层保险。
实际使用中我还有一个偏方:正式发布前用一台可编程电子负载,把两个电池串联节点分别模拟成“5% 电量”和“80% 电量”,把整个均衡逻辑做 200 次循环测试,同时在示波器上盯着两个 MOS 的栅极波形。能连续跑完 200 次没有一次直通和复位,这套均衡才算真正能出货。