ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

2S电池均衡方案:MP2642GR-Z与PIC18F86J11实现储能备用电源均衡控制

2S电池均衡方案:MP2642GR-Z与PIC18F86J11实现储能备用电源均衡控制

做储能和备用电源系统的,基本都吃过电池不均衡的亏。特别是 2S 这种两个串联电池单元的小系统,看起来简单,实际调试起来一点不比大系统轻松。这篇文章把一套方案完整拆开讲:用 MP2642GR-Z 这颗前端芯片负责电池电压采样和均衡执行,用 PIC18F86J11 做系统主控,在储能和备用电源场景里对两个串联电池单元做均衡控制。文章会先讲为什么需要均衡,再讲选型、电路参数、软件状态机,最后把调试中踩过的坑和排查方法整理出来,供正在做同类 2S 均衡产品的朋友参考。

1. 项目概述与需求拆解

1.1 两个串联电池单元,为什么一用就“分家”

很多人第一次做 2S 电池组,都会有个错觉:两节电池都是新的,参数也挑过,串联起来应该很稳。实际跑几十个循环就露馅了:充电时一号电芯先到 4.2V,放电时二号电芯先到 3.0V,整组系统容量肉眼可见地缩水。

原因其实不复杂。串联回路电流相同,但两节电芯的容量、内阻、自放电率、温度特性不可能完全一致。假设两颗电芯出厂容量差 1%,在满充满放循环里,容量小那颗每次都会比另一颗早一点充满、早一点放空。这个差距不会自己消失,反而会因为每次过充或过放被放大:过充加速老化,老化又让容量进一步减少,形成恶性循环。用生活里的例子说,就像两个水桶串在一起抽水,小桶总先满、先空,时间越久越难同步。

均衡要解决的就是这个问题。不过有一点需要先想清楚:均衡的目标不是让两节电池的端电压一毫伏不差地相等,而是让它们的 SOC(荷电状态)尽量接近,电压差只是最直观的间接指标。对锂电池来说,静置状态下的端电压与 SOC 有强相关关系,但在大电流充放电时,内阻压降和极化电压会把电压读数带偏。所以整个方案设计的核心难题,不是“怎么把电压拉平”,而是“在什么时机、用什么方式、以什么为依据去拉平”。

1.2 储能和备用电源,对均衡的要求其实不一样

同样是 2S 均衡,储能产品和备用电源产品的侧重点完全不同。储能系统循环频繁,电池经常深充深放,均衡机会出现在充电末端、放电结束后的静置期,这时候系统不在乎多耗一点电,更看重均衡速度和效率。备用电源则相反,大部分时间挂在线上浮充待机,只在市电异常时才切到电池放电,均衡系统必须长期低功耗运行,还要能自动周期巡检,不能因为一个均衡功能把待机电流拉高好几毫安。

另外,备用电源里最常见的失效模式,是长期浮充导致某一节电芯被“顶”到过压。两节串联电池,如果容量有差异,恒压浮充时容量小的那节电压会偏高,系统充电管理芯片可能只看总电压,结果单节电压超标而不自知。均衡在这种场景下的角色,不仅是提升可用容量,更是安全保护的一部分。

2S 电池组大量出现在小型 UPS、便携储能电源、应急照明和安防备电设备里,主板面积和 BOM 成本都卡得很紧。这也是我在这套方案里最终选择“MP2642GR-Z 前端芯片 + PIC18F86J11 主控 MCU”结构的原因:前端芯片负责把模拟小信号处理干净,MCU 负责做策略和通信,各管一段,调试起来边界清晰。

2. 核心器件选型思路

2.1 为什么均衡执行要交给 MP2642GR-Z 这样的前端芯片

如果只做均衡,理论上用 MCU 的 ADC 加两个 MOS 管也能凑合。但实际做过就会知道,这条路很坑:电芯电压要通过分压电阻进 ADC,分压电阻精度直接影响测量结果;均衡电阻上的电流会在采样回路产生压降,导致电压读数漂移;还需要自己搭精密基准源。一套下来,PCB 面积没省,精度还不一定够。

MP2642GR-Z 属于电池前端监测与均衡控制这一类芯片,从型号定位看,它把两节串联电芯的差分电压采样、均衡开关驱动、通信接口集成在了一起,MCU 只需通过 I2C 或 SPI 读取电压/温度数据,再下发均衡开关命令。这样有几个直接好处:差分采样能抑制共模干扰,均衡开关与采样网络在芯片内部做了隔离,测量链路的一致性比分立搭出来的好得多。

选这种前端芯片时,我一般只看三个硬指标。第一,支持串联电芯节数,2S 项目至少要两通道,选四通道以上的型号也没问题,只是成本和封装浪费;第二,均衡通道的控制方式,是内置 MOS 还是外置驱动,内置 MOS 的芯片适合小电流均衡,外置驱动的芯片可以灵活选大电流 MOS;第三,通信接口和寄存器读写的便利性。MP2642GR-Z 在这三点上正好匹配项目需求,外围元件少,均衡控制命令也简单。拿到具体批次芯片后,还是要对照数据手册确认寄存器映射和均衡电流上限,不同版本可能会有差异。

2.2 PIC18F86J11 在系统中的作用

如果均衡动作只是“电压高了就放电”,确实不需要很强的主控。但在储能和备用电源系统里,MCU 还要管充电流程、放电保护、继电器切换、状态显示、参数存储、上位机通信,这些任务累加起来,一颗 8 脚小单片机就不够用了。

PIC18F86J11 是一颗 80 引脚的 MCU,I/O 资源丰富,片上集成的 MSSP 模块可以复用为 I2C 或 SPI,用来和 MP2642GR-Z 通信正合适;自带多路 ADC 可以用来采集温度、系统电压等辅助信号;多个定时器可以构建调度节拍和均衡超时保护。对我来说,选它还有一个很实际的原因:开发工具链成熟,调试器便宜,遇到问题网上能搜到大量案例,团队上手成本低。

在这套架构里,PIC18F86J11 的角色不是“均衡执行者”,而是“策略大脑”。它负责周期读取 MP2642GR-Z 上报的电芯电压、温度、充放电状态,运行均衡判定算法,决定是否开启或关闭某一节电芯的均衡通道,同时把均衡事件记录到 Flash,方便后续追溯。这种分工让硬件和软件都变得清爽:前端芯片管测量精度,MCU 管逻辑复杂度。

2.3 整体架构与信号流走向

整个系统的信号链路可以这样理解:电池组正极、中间节点、负极分别连接到 MP2642GR-Z 的差分采样通道,芯片内部把模拟电压转换成数字量;MCU 通过 I2C 总线读取这些数据,再结合充电 MOS、放电 MOS 的状态以及温度信息做决策;决策结果有两种输出方向,一种是回到前端芯片去控制均衡开关,另一种是控制充电/放电 MOS 管和备用电源的切换继电器。

PCB 设计时,把这套逻辑映射到实际走线,就能看出几个关键点:电芯采样线必须从电芯端子单独引出,不能从均衡电阻或功率走线上取;I2C 总线的 SCL/SDA 要加合适的上拉电阻并远离功率走线,防止开关瞬间的干扰把通信打乱;均衡电阻的接地点要单独规划,避免均衡电流窜到采样地。这些细节会在后面电路设计部分展开说。

3. 核心电路设计与实操参数

3.1 被动均衡还是主动均衡

在 2S 这种等级的小系统里,均衡拓扑的取舍其实是成本与复杂度的权衡。被动均衡把高电芯的多余能量通过电阻耗散掉,电路简单可靠,成本极低,缺点是能量被浪费、产生热量;主动均衡用电感或电容把能量从高电芯转移到低电芯,效率高、发热小,但需要额外的功率开关、磁性元件和控制环路,故障点明显变多。

我的判断是,2S 储能和备用电源系统优先做被动均衡。理由很直接:两节电池之间的电压差通常只有几十毫伏,即使全部靠被动均衡放掉,损耗也就是瓦级;而主动均衡的电感转移电路要想把几十毫伏压差下的能量搬过去,电流检测和控制复杂度远高于收益。只有当单节电池容量很大、压差长期很大,或者系统对发热极其敏感时,才值得考虑主动均衡。

选定被动均衡后,接下来就要认真对待热设计。均衡电阻是最主要的发热源,不能随便丢在板子上。我的做法是先把最恶劣工况算清楚:假设两节电芯满电静置时最大压差 100mV,均衡电流 100mA,功耗不到 1W,听起来不大,但如果电阻封装太小、又靠近电芯或电容,持续工作几小时也可能让局部温度升得很高。所以均衡电阻的选型和布局,会直接影响这个方案的长期可靠性。

3.2 均衡电阻、均衡电流与功耗计算

均衡电流的取值是第一个要拍板的参数。电流太大,电阻发热和 PCB 散热压力大;电流太小,几十毫伏的压差可能要好几个小时才均衡完,充电末端根本来不及。对备用电源这种待机时间长的场景,我一般取 100mA 左右;如果电池容量只有几百毫安时,可以降到 30-50mA;如果是大容量储能 PACK,可以考虑 150-200mA,但必须用外置 MOS 和更大封装的电阻。

均衡电阻的阻值按这个公式估算:

R_bal = (V_cell_max - V_MOS_drop) / I_bal

以单节满电 4.2V、均衡电流 100mA、开关管压降 0.1V 计算,电阻压降约 4.1V,阻值 41Ω,最接近的标称值是 39Ω 或 43Ω。取 39Ω 时实际电流约 105mA,取 43Ω 时约 95mA,都在可接受范围。电阻功耗按 P = I² × R 计算,100mA 通过 39Ω 电阻时功耗约 0.39W,加上 MOS 导通损耗,选 1W 额定功率的电阻比较稳,封装建议 1210 以上,不要用 0603。

均衡时间也可以提前估算。假设电芯容量 2000mAh,两节 SOC 相差 2%,对应的电量差约 40mAh。用 100mA 均衡电流清零,理论需要 0.4 小时。实际考虑到电池极化恢复、电压回升、滞回区间等因素,至少要留 2 倍余量,也就是连续均衡 1 小时左右。如果计算出来的时间太久,就要提高均衡电流或调整均衡启动阈值,否则充电末期会出现“一直开着均衡,电压还是压不住”的情况。

3.3 采样与保护的几个细节

均衡系统最怕的不是算法差,而是采样不准。电芯电压是判断 SOC 差别的核心依据,如果采样链路把电压读偏 20mV,均衡逻辑再精巧也没有意义。所以采样线必须用开尔文接法:从每节电芯的正负极端子单独走两根线到 MP2642GR-Z 的采样输入,不经过任何功率连接点。电池连接器弹片的接触电阻也要纳入考虑,长期振动后接触电阻变大,会导致采样电压忽高忽低。

前端芯片的输入通常要加 RC 滤波,用来滤除高频噪声。RC 参数不能取太大,否则电压跟随速度变慢,均衡开关动作后芯片读到的还是旧值,容易引起误判。我常用的组合是 100Ω 串联电阻加 100nF 电容,时间常数约 10μs,既能滤掉开关噪声,又不至于影响均衡响应。如果系统里有大功率逆变器或电机类负载,滤波电容可以加大到 1μF,但采样周期也要相应拉长。

保护功能要做两级。MP2642GR-Z 这类前端芯片通常有过压/欠压比较器,可以在 MCU 死机时直接切断均衡或触发保护,这是硬件级兜底;PIC18F86J11 的软件里再做一次阈值判断和动作,例如压差超过 100mV 连续 5 个采样周期才确认,防止毛刺误触发。温度保护也不能省,均衡电阻附近要放一个 NTC,温度超过 50-60°C 就暂停均衡,等温度降下来再恢复。没有温度保护的均衡板,在高环境温度下长时间工作,电阻附近的 PCB 很容易发黄变形。

4. 软件状态机与均衡策略实现

4.1 均衡状态机怎么设计

软件不能把均衡做成一个“开了就不管”的独立循环,必须放在整机状态机里统一调度。我常用的状态划分是:待机(IDLE)、充电恒流(CHARGING_CC)、充电恒压(CHARGING_CV)、放电(DISCHARGING)、均衡(BALANCING)、故障(FAULT)。均衡并不是一个完全独立的状态,它更像在待机和恒压充电状态下允许开启的子功能,这样状态切换时的逻辑会更清楚。

状态机的核心节拍用定时器驱动,比如每 10ms 跑一次任务调度,每 100ms 读一次电芯电压,每 1000ms 做一次均衡判定。不要把均衡判定放在中断里做,中断里只做标志位,否则 I2C 读到一半被打断,寄存器数据容易错乱。

typedef enum { STS_IDLE, STS_CHARGING_CC, STS_CHARGING_CV, STS_DISCHARGING, STS_FAULT } sys_state_t; sys_state_t sys_state = STS_IDLE; uint32_t tick_100ms;

状态切换条件其实不复杂:检测到充电电压就进 CC,电流小到接近截止电流就进 CV,移除充电且没有放电负载就回 IDLE,发生保护动作就进 FAULT 并锁存。均衡子功能只允许在 IDLE 和 CHARGING_CV 两个状态下运行,放电状态下强制关闭。

4.2 均衡判定、滞回与超时保护

均衡判定的基本逻辑是:读取两节电芯电压,求出压差,压差超过开启阈值就打开电压较高的那节电芯的均衡通道,压差降到关闭阈值就关闭。但这里有个很容易踩的坑:如果不做滞回,均衡开关会在阈值附近反复抖动。因为开启均衡后,高电芯电压会缓慢下降,降到开启阈值以下后又想关闭,关闭后电压又回升,结果开关频繁动作,前端芯片寄存器被刷来刷去,还会引入开关噪声。

我实际用的参数是:开启阈值 50mV,关闭阈值 20mV。压差超过 50mV 开启,低于 20mV 才关闭,中间这 30mV 就是滞回区间。这样毛刺和正常的电压波动不会引起反复开关。同时还要加电压窗口限制,只在单节电压处于 3.2V 到 4.1V 范围内时允许均衡,低于 3.2V 可能接近欠压,高于 4.1V 接近满电,都不适合盲目放电均衡。

#define BAL_TH_ON 50 // 压差开启阈值,单位 mV #define BAL_TH_OFF 20 // 压差关闭阈值,单位 mV #define BAL_MIN_MV 3200 // 均衡下限电压 #define BAL_MAX_MV 4100 // 均衡上限电压 #define BAL_TIMEOUT 4 * 3600 // 单次均衡超时,单位秒 void balance_task(uint16_t cell0_mv, uint16_t cell1_mv) { int16_t diff = (int16_t)cell0_mv - (int16_t)cell1_mv; uint16_t max_mv = (diff > 0) ? cell0_mv : cell1_mv; if (sys_state != STS_IDLE && sys_state != STS_CHARGING_CV) { afe_balance_disable(); return; } if (max_mv < BAL_MIN_MV || max_mv > BAL_MAX_MV) { afe_balance_disable(); return; } if (diff > BAL_TH_ON && cell0_mv < BAL_MAX_MV) { afe_balance_enable(CHANNEL_0); } else if (diff < -BAL_TH_ON && cell1_mv < BAL_MAX_MV) { afe_balance_enable(CHANNEL_1); } else if (abs(diff) < BAL_TH_OFF) { afe_balance_disable(); } if (balance_running && balance_timer > BAL_TIMEOUT) { afe_balance_disable(); log_event("balance timeout"); } }

超时保护是必须的。任何均衡动作都可能在极端条件下停不下来,比如电压采样漂移导致判定一直满足开启条件,或者低电芯侧电压同步上升导致压差一直打不开。我给单次均衡设置了 4 小时上限,超时强制关闭并记录日志,既不干扰正常使用,也能让售后查问题时有据可依。

4.3 与充放电流程的协同

均衡不能在所有阶段都乱开。放电大电流时,电池内阻会在端电压上产生明显的压降,两节电芯内阻不一致的话,压差会被放大或缩小,这时候做均衡判定完全是自欺欺人。充电恒流阶段也有类似问题,极化电压让端电压虚高,判定结果不可靠。真正适合均衡的窗口只有两个:恒压充电阶段和静置待机阶段。

恒压阶段均衡的意义在于防止单节过充。充电器按总电压稳压,两节电芯容量不一致时,容量小的那节电压会先顶到上限,这时对高电压那节放电,就能拉低它的电压,让恒压阶段多维持一会儿,小容量电芯也不至于一直被过压摧残。不过要注意均衡电流不能太大,否则恒压充电电流被均衡电流分掉,充电效率会变难看。

备用电源的待机场景更讲究周期巡检。设备在市电正常时长期不放电,均衡电路如果一直满功耗运行,既耗电又发热。我通常让 MCU 每小时唤醒一次,读电压、算压差,压差小就直接回去休眠;压差大才开启均衡,并连续运行一段时间,比如 10 分钟后再次判定。这样做待机平均电流可以控制在很低的水平,两节电池的压差又能被持续压制住。

5. 调试实录与常见问题排查

5.1 均衡开启瞬间的电压跳变

这个现象在调第一版时差点把我搞郁闷。板子静态测试没问题,接上真实电池一开均衡,前端芯片读回来的电压立刻跳高十几毫伏,压差从 40mV 变成 60mV,系统以为均衡没生效,继续加大力度,结果越开越乱。

后来定位到两个原因。第一个是采样走线。均衡电阻的功率回路和采样回路共用了一小段铜箔,均衡电流 100mA 不算大,但铜箔上只要有 0.1Ω 的电阻,就会产生 10mV 压降。加在采样点上,就变成了“假的”电压跳变。解决方法是把采样线改成开尔文接法,并且把均衡电阻的功率地单独走线,直接回到电池负极,不在采样路径上取任何支点。

第二个原因是极化电压恢复。均衡关闭后,之前被放电的那节电芯电压会慢慢回升,这是锂离子电池正常的极化恢复,不是均衡失效。如果你刚关闭均衡就立刻采样,会发现压差又变大了,然后系统又开启均衡,形成低频振荡。解决办法是在关闭均衡后加一段静置时间,比如 10 秒内不做判定,等极化恢复稳定后再进入下一轮。

5.2 常见问题速查表

调试过程中遇到的问题远不止电压跳变这一种,这里把几个典型场景整理成一张表,方便后续排查时直接对照。

现象可能原因检查方向与解决办法
电压读数整体偏高或偏低前端芯片基准偏差、分压电阻精度不够、采样点接触电阻用高精度万用表校准,必要时在软件里加系数校准;采样线重插或更换连接器
均衡开启后电阻明显发烫均衡电流过大、电阻封装功率不足、PCB 散热铜箔过小降低均衡电流或改用外置 MOS;电阻换 1W 及以上封装;增铺铜和散热过孔
均衡开关不受控I2C 时序被干扰、寄存器写入失败、初始化时芯片还没 ready示波器抓 I2C 波形,检查上拉电阻;增加寄存器回读校验;初始化后延时再通信
充电末期某一节频繁过压均衡启动阈值太晚、均衡电流偏小、恒压时间不够把均衡开启提前到恒流末期;分档提高均衡电流;检查充电截止电流是否合理
长期浮充后整组容量下降浮充阶段均衡未运行,单节长期微过压增加周期唤醒巡检,在浮充期间对高电压电芯进行间歇均衡
均衡关闭后压差反弹严重极化恢复被误判、关闭阈值太高增加关断后的静置时间;把关闭阈值从 30mV 降到 20mV 左右

5.3 测试和量产的几点经验

最后聊几句测试和量产阶段的体会。第一,不要一上来就拿真实电池做均衡测试,虽然 2S 系统电压不高,但均衡板和电池接错线,或者均衡电阻长时间过载,照样会出危险。我习惯用两台可调电源串联,分别模拟两节电芯的电压,再把均衡电阻串进去当负载,这样能在完全受控的条件下验证阈值、滞回和超时逻辑。可调电源的响应速度要够快,否则均衡开启瞬间电压跌落看起来很夸张,其实不是电路问题。

第二,均衡功能的验证不能只看电压数值,还要看温度。连续运行 4 小时均衡后,用热成像仪检查均衡电阻、前端芯片和相邻电容的温度,环境温度取 40°C 做高温老化,这样量产才不会因为夏天温度高出现批量故障。均衡电阻到 MCU 的 ADC 温度输入之间如果走线太长,NTC 的采样值会滞后,软件里要加温度滤波。

第三,量产软件里最好固化均衡事件记录。每次均衡开启和关闭都写一条记录,包含时间戳、电芯电压、均衡时长。这样客户如果反馈系统容量下降,售后可以把日志导出来,直接看到均衡动作是否正常、压差趋势是否恶化。这个功能成本很低,但对定位“均衡无效”类投诉帮助极大。

我个人在实际操作中最受益的一个小技巧,是在每块板上预留两个电压测试点,正好对应两节电芯的负极和中间节点。调试时万用表直接点测试点,不依赖连接器和线束,排查采样问题时能快速判断是硬件接触问题还是软件采样问题。这个习惯保留到现在,已经成为我做所有带均衡功能主板的标准设计。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进