两串锂电池均衡方案:MP2642GR-Z与PIC18F86J55被动均衡设计
做两串锂电池均衡听起来不如十几串那么气派但踩过的坑一点都不少。去年我做了一台小型的储能备用电源电池侧是标准的两串锂电。用户那边用了不到半年系统显示剩余容量还能撑半小时实际十分钟就低压报警了。拆开一看两节电芯一节压到 3.2V另一节还停在 3.9V。问题很清楚根本没做均衡或者说均衡电路形同虚设。后来重新设计时我选了 MP2642GR-Z 配合 PIC18F86J55 来做两颗串联电芯的均衡控制这就是今天想聊的方案。如果你正在做储能机柜里的电池管理、车载备用电源或者户外电源这类 2S 电池场景可能会觉得两串电池只要做好充电限制和放电限制就够了。我这个返修案例可以证明两串同样需要认真对待均衡。这篇文章不堆概念而是把芯片分工、采样电路、均衡算法、调试踩坑和测试数据全部分享出来。两串虽然简单但工程细节一多一样能让人挠头。1. 为什么两节串联电芯也需要均衡从一组实测数据说起1.1 两节电芯的“木桶效应”到底有多严重两节电芯串联时充电电流和放电电流是同一股但每节电芯的内阻、容量、自放电率都不一样。充电时容量小的那节电压上升更快会先到达充电截止电压如果不加干预只能被迫减小或停止整组充电否则小容量电芯就会被过充。放电时反过来小容量电芯先放空保护板为了保护它只能切断放电回路此时大容量电芯里还有不少能量没放出来。这就是典型的木桶效应系统的可用容量不是两节电芯容量之和而是由较小容量的那节决定的。我用两节标称 1000mAh 的电芯做过一个加速老化对比。初始压差只有 5mV循环 100 次之后A 电芯容量衰减到 950mAhB 电芯还剩 990mAh。每次放电到保护截止时B 电芯事实上还剩余大约 60mAh 的容量没有被使用整个系统的可用容量从 1000mAh 掉到 950mAh少了 5%。如果继续这么跑压差会越拉越大可用容量衰减速度也会越来越快。开头那个返修案例就是这么来的。对于两串电池来说均衡的意义不只是把电压拉平而是让两个电芯在每个充放电周期都能尽量同步到达各自的截止条件。这样系统标称的容量才能真正用出来循环寿命也会明显提升。1.2 均衡需要做到什么程度才算够用很多工程师一听“均衡”就想着是不是要上主动均衡、电感储能、反激变换器之类的高级方案。两串电池真没必要这么折腾被动均衡足够了。关键在于阈值和电流选择要合理不能搞成“为了均衡而均衡”。我的做法是先定几个指标充电阶段压差超过 50mV 开始均衡均衡到 20mV 以内就停止均衡电流控制在 80mA 左右采样周期 500ms。这个配置不是拍脑袋拍的而是考虑到被动均衡本身是把高电压电芯的多余能量通过电阻泄放成热量电流太大发热太严重电流太小又起不到作用。两串备用电源的工作场景大多数是浮充、小电流充放80mA 的均衡电流足够在几十分钟内把压差拉回正常范围同时发热量可控。参数数值说明均衡启动压差50mV超过后开启均衡均衡停止压差20mV低于后关闭均衡均衡电流80mA通过泄放电阻限流采样周期500msADC 轮询两个电芯电压最长单次均衡时间30min超时强制停止防止异常发热那为什么停止阈值比启动阈值低 30mV这是迟滞设计。如果启动和停止阈值靠得太近比如启动 50mV、停止 45mV噪声或者采样波动很容易让均衡开关反复通断MOS 管热应力会很难看。后面我会专门讲这个坑。2. MP2642GR-Z 与 PIC18F86J55 的分工电源侧和控制侧如何配合2.1 为什么没有把均衡完全交给 MP2642GR-Z 完成MP2642GR-Z 这类电源管理芯片擅长的是输入供电管理、充电电流限制和状态上报但它不可能替你做两节电芯的差异化均衡策略。均衡需要实时判断“哪一节电压高、高多少、要不要放电”这是典型的测量和决策任务交给 MCU 更灵活。所以我最终把系统拆成了两层电源层由 MP2642GR-Z 负责控制层由 PIC18F86J55 负责。MP2642GR-Z 在电路里扮演的角色可以理解为电池组和外部电源之间的“能量关口”。它负责从适配器或者光伏输入取电把输入电压变换成适合两串电池充电的电压并对充电电流进行限制。它内部有一些状态输出也能反馈充电情况但均衡动作不是它擅长的领域硬要往里塞功能反而会被芯片内部逻辑限制住。PIC18F86J55 则负责所有需要“长脑子”的活用 ADC 定时采样两节电芯电压读取 NTC 温度计算压差输出均衡控制信号必要时给 MP2642GR-Z 一个使能信号让它在均衡期间限制充电或者暂停充电。这样设计的好处是均衡策略可以随时在固件里改不用改 PCB。2.2 主控与电源芯片之间的关键信号具体连接上我用了几个关键信号让两颗芯片协同工作。CHG_EN从 PIC18F86J55 的普通 GPIO 输出到 MP2642GR-Z 的充电使能脚用来控制充电路径的通断。均衡期间如果需要温度降额可以在固件里把这个脚拉低。STATMP2642GR-Z 输出的充电状态信号接入 PIC18F86J55 的数字输入脚。充电完成、充电中、异常状态都能从这个引脚反映MCU 可以据此调整均衡策略。TS_IN电池温度采样我这里没有走 MP2642GR-Z 的 TS 引脚而是把 NTC 直接接到 PIC18F86J55 的 ADC 通道这样温度阈值自己可以随意改。BAL_H高压侧电芯的均衡开关控制必须经过电平移位不能直接接 MCU 引脚。BAL_L低压侧电芯的均衡开关控制电平基准和 MCU 相同可以直接用 GPIO 驱动。这里要特别提一句 MP2642GR-Z 型号末尾的“GR-Z”后缀一般是封装和编带信息但同样封装下散热焊盘的处理差别很大。我第一版 PCB 就没有给电源芯片的散热焊盘做足够的过孔阵列结果满载充电时芯片温度比预期高了近 8 度。后来补了焊盘过孔和底层铜皮才恢复正常。选型时除了看功能一定要翻开数据手册确认散热焊盘的推荐设计。2.3 均衡和充电同时进行会怎样这是我最开始忽略的一个问题。想当然地以为均衡和充电可以并行反正一个在充电一个在放电。实际上一旦均衡电流和充电电流叠加MP2642GR-Z 输出侧的电流纹波会变大电池组的温升也会明显增加。尤其是在恒压充电末期均衡把高压电芯的能量泄放掉充电器还在持续往电池组里塞电流两个过程互相拉扯均衡效率极低电芯还热得厉害。后来我在固件里加了一个简单的时序控制检测到较大压差时先暂停充电一段时间只做均衡等压差回到 20mV 以内再重新开启 CHG_EN。测试下来均衡收敛时间从原先的“可能永远收不住”变成了十几分钟就能结束。这个改动看起来简单但对系统稳定性的提升非常明显。3. 均衡电路的实现采样通道、均衡开关与保护逻辑3.1 电压采样通道与 ADC 参考电压处理两串电池的采样比单串麻烦在共模电压。对于下端电芯 CELL2负极就是系统地可以用电阻分压后直接接到 ADC。但对于上端电芯 CELL1正极比系统地高 7 到 8 伏分压之后虽然电压在 ADC 量程内但减法带来的误差会很大。我第一版的设计是BAT 分压后送给 ADC 通道 A电池中点分压后送给 ADC 通道 B然后软件里用 A 减 B 得到 CELL1 的电压。这个方案电路最简单只用了两个电阻分压网络。但它对分压电阻精度非常敏感因为两个通道的系统误差会被减法放大。我用 1% 精度电阻量产后发现同样的电池板子之间CELL1 的计算值能差到 80mV这已经超过了均衡启动阈值完全没法用。最终改成了差分采样方案CELL1 使用一个仪表放大器或者精密差分放大器直接把它的正极和负极差出来再送入 ADC。虽然成本高了一点但被测电压的共模分量被放大器抑制掉了不再依赖两次单端采样的减法。CELL2 因为参考地就是系统地分压采样没问题。ADC 参考电压我也换了思路。PIC18F86J55 内部虽然有参考电压模块但批量一致性不够稳。我给 ADC 接了一颗外部 3.0V 的 0.1% 精密参考源所有电压统一折算到这个基准上校准一次之后整个采样链路在全温区范围内的误差可以控制在 5mV 以内。3.2 均衡开关与泄放电阻的选择计算均衡开关的难点在于高压侧 CELL1 的驱动电平。CELL2 的下端本来就是地我可以用一颗逻辑电平 N-MOS 直接把均衡电阻接地栅极由 MCU 的 GPIO 驱动就行。CELL1 不行它的参考点是电池中点正常工作时有 3.5V 到 4.5V 左右的电压如果直接把 MOS 栅极拉到 MCU 地源极是中点电位栅源电压可能是负的MOS 根本不会导通。我给 CELL1 的均衡开关加了一个简单的高边驱动一个小 NPN 加一个小 PNP 组成推挽把 MCU 的 3.3V 电平转换到相对电池中点的高电平。这样只需一颗普通三极管和几个电阻不需要专门的栅极驱动芯片。开关频率很低只有通和断两种状态所以电路响应速度完全够用。泄放电阻的算账很简单。已知均衡电流目标 80mA电芯最高电压按 4.2V 算R U / I 4.2V / 0.08A 52.5Ω实际取标准值 51Ω。此时实际电流约 4.2V / 51Ω ≈ 82mA。电阻功率为P I² × R 0.082² × 51 ≈ 0.343W我选了 1W 封装的 2512 电阻降额一半以上长期工作温度不至于太高。要提醒的是均衡电阻不要贴着电解电容、MCU 或者其他热敏器件放否则局部温升会影响采样精度和寿命。3.3 保护逻辑与故障隔离保护逻辑不能只靠 MCU 软件硬件保险和比较器联动也不能省。我在两条均衡通路上都串了保险电阻万一 MOS 击穿短路保险丝发热熔断把均衡支路从电池组上隔离掉避免单节电芯一直对外放电。这个在备用电源场景里非常关键因为设备可能会长时间挂在电池上静置均衡支路漏电会把整组电池耗干。软件层面上我在 PIC18F86J55 里设置了几条硬性保护电芯电压大于 4.35V 或小于 2.8V 时无论压差多大都禁止启动均衡。NTC 温度高于 50℃ 时停止均衡降到 45℃ 以下才允许恢复这里同样有 5℃ 迟滞。单次均衡时间超过 30 分钟强制关闭均衡并拉低 CHG_EN等待整整 10 分钟冷却时间。采样值连续三次超出合理物理范围直接判定为采样链路故障进入 FAULT 状态并点亮告警灯。这样即使 MCU 的均衡算法写错了硬件层面的保险也能兜底。4. 固件里的均衡算法平均值比较、状态机与迟滞控制4.1 两种均衡策略对比压差均衡与容量均衡常见的均衡策略有压差均衡和容量均衡两种。压差均衡简单直接实时采样两节电芯电压谁高就放谁的电容量均衡则要估算每节电芯的 SOC然后对 SOC 高的电芯放电避免出现“电压一样但容量差很多”的情况。两串后备电源里我最终选的是压差均衡同时把静置平台电压作为辅助判据。原因是两串系统里的两节电芯通常从同一批次出厂初始容量差异不至于大到电压无法反映的程度。加上备用电源大多时间处于浮充或静置状态极化电压不大电压分布基本能代表荷电状态差异。容量均衡需要额外的库仑计硬件和复杂的开路电压校准在 2S 系统里性价比太低。4.2 均衡状态机的设计与关键参数固件状态机我做了四个状态IDLE、BAL_HIGH、COOLDOWN、FAULT。两串系统不需要同时均衡两个电芯因为压差方向始终是“哪节高放哪节”所以 BAL_HIGH 就是针对当前电压较高的电芯打开对应的均衡开关。状态跳转逻辑如下当前状态跳转条件下一状态IDLE压差 50mV 且高电芯电压在 3.0V~4.3VBAL_HIGHBAL_HIGH压差 20mV先进入 COOLDOWNBAL_HIGH均衡时间 30minCOOLDOWNBAL_HIGH温度 50℃ 或电芯过压/欠压FAULTCOOLDOWN等待 3 分钟IDLEFAULT故障清除且人工复位IDLE这里有一点容易被忽略从 BAL_HIGH 回到 IDLE 我特意安排了 COOLDOWN即便压差已经收敛也让均衡开关再休息 3 分钟。因为均衡电阻在长时间工作后积热严重如果立刻又检测到压差反弹马上再次开启热量会反复叠加板子上局部温度可能比正常高 15℃。4.3 典型 C 语言实现骨架PIC18F86J55 的固件用 C 写核心任务可以缩成一个定时调用的函数。下面是一段简化但可以直接跑的骨架逻辑主要体现滤波、迟滞和状态跳转思路。#define ADC_CH_TOP 0 // BAT 分压采样 #define ADC_CH_MID 1 // 电池中点分压采样 #define GPIO_BAL_H LATBbits.LATB0 #define GPIO_BAL_L LATBbits.LATB1 #define GPIO_CHG_EN LATBbits.LATB2 #define BAL_START_MV 50 #define BAL_STOP_MV 20 static uint16_t vcell1, vcell2; static uint8_t bal_state STATE_IDLE; static uint16_t bal_timer; uint16_t ReadBatteryVoltage(uint8_t ch) { unsigned long sum 0; uint8_t i; for (i 0; i 8; i) { sum ADC_Read(ch); } sum 3; return AdcToMv(sum); } void BatteryBalance_Task(void) { static uint16_t top_filtered, mid_filtered; uint16_t vtop, vmid; uint16_t diff; if (GetBatteryTemp() 500) { bal_state STATE_FAULT; } vtop ReadBatteryVoltage(ADC_CH_TOP); vmid ReadBatteryVoltage(ADC_CH_MID); top_filtered (top_filtered vtop) / 2; mid_filtered (mid_filtered vmid) / 2; vcell1 (top_filtered mid_filtered) ? (top_filtered - mid_filtered) : 0; vcell2 mid_filtered; diff (vcell1 vcell2) ? (vcell1 - vcell2) : (vcell2 - vcell1); switch (bal_state) { case STATE_IDLE: if (diff BAL_START_MV) { if (vcell1 vcell2) { GPIO_BAL_L 0; GPIO_BAL_H 1; } else { GPIO_BAL_H 0; GPIO_BAL_L 1; } bal_state STATE_BAL_HIGH; bal_timer 0; } break; case STATE_BAL_HIGH: if (diff BAL_STOP_MV) { GPIO_BAL_H 0; GPIO_BAL_L 0; bal_state STATE_COOLDOWN; bal_timer 0; } else if (bal_timer BAL_TIMEOUT) { GPIO_BAL_H 0; GPIO_BAL_L 0; bal_state STATE_COOLDOWN; } break; case STATE_COOLDOWN: if (bal_timer COOLDOWN_PERIOD) { bal_state STATE_IDLE; } break; case STATE_FAULT: GPIO_BAL_H 0; GPIO_BAL_L 0; GPIO_CHG_EN 0; break; } }这段代码里的 ADC 采样我做了 8 次取平均又做了一级简单的滑动平均。两级滤波主要是为了把电池本身的极化波动和采样噪声区分开不然均衡阈值很容易被噪声顶穿。在定时调用周期上我用的是 500ms 调用一次完全够应对两串的均衡需求。5. 调试过程中踩过的坑采样漂移、均衡发热和误触发5.1 采样漂移分压电阻网络造成的系统性偏差这是我在第 3 章提到过的坑但值得单独展开。第一批样板回来后常温下校准得好好的一放进高低温箱就露馅0℃ 时看到压差误差 40mV60℃ 时变成反向 55mV。问题不在 ADC而在分压电阻的温度系数不一致。我最初用了 1% 精度的厚膜电阻温度系数大约 ±100ppm/℃。两个电阻网络在温度变化时阻值漂移方向不一样采到的电压就跟着漂。算一笔账4:1 分压高边 300k、低边 100k若低边电阻漂移 0.5%ADC 输入电压就可能偏 10mV 以上再叠加高边漂移直接触发了均衡阈值。后来我把采样电阻全部换成 0.1% 精度、25ppm/℃ 的金属膜电阻问题基本消失。如果项目对成本敏感也可以用同一个分压网络配合软件校准在出厂前测两个电芯的实际压差把校准系数存进 PIC18F86J55 的 Data EEPROM 里使用时做双点校准。不过能换电阻解决的问题最好别留给软件补丁。5.2 均衡发热泄放功率与 PCB 布局的关系均衡电阻 0.34W 的发热量看起来不大但在封闭的备用电源外壳里局部温度高了就是问题。我实测过均衡持续 15 分钟时2512 电阻表面温度能到 62℃周围 5mm 内的 PCB 温度也有 45℃。这个温度本身不至于烧板但会加热附近的电芯导致采样 NTC 读数偏高然后又触发温度保护形成“发热—保护—降温—恢复—再发热”的循环。解决方法是把均衡电阻放在板边并加大铺铜面积同时 NTC 放到电芯表面检测电芯温度而不是检测 PCB 温度。均衡电阻底部加了 8 个过孔协助散热到背面铜皮实测表面温度从 62℃ 降到了 51℃。如果你的结构条件允许在均衡电阻位置开散热孔或者贴导热垫到外壳上会更好。5.3 误触发启停阈值没有迟滞导致的振荡均衡阈值迟滞是我之前在产品上真实遇到过的现象。初期固件里启动阈值为 50mV、停止阈值为 45mV迟滞只有 5mV。结果在电池电压出现微小波动时压差在阈值附近来回穿越均衡 MOS 管隔几秒就开关一次。开始我以为只是数据在跳后来仪器上听到轻微“滋滋”声才发现均衡 MOS 在反复热胀冷缩。排查过程我印象很深先用示波器勾住 MOS 栅极波形看到一串密集的窄脉冲确认是阈值振荡然后临时把停止阈值改成 20mV又加了 60 秒的去抖计时要求压差持续小于 20mV 才真正停止均衡。从此振荡消失。这个小问题再次说明迟滞不是可选项而是均衡控制的基本盘。6. 可靠性验证与老化测试如何判断均衡真的有效6.1 均衡精度测试从压差到收敛时间的关系为了验证方案是否真的有效我做了三组系统级测试。方法是用可编程电子负载以不同倍率放电人为制造出不同的初始压差然后静置 10 分钟再开启均衡任务记录压差从初始值收敛到 20mV 以内的时间。初始压差 25mV 时系统启停不算剧烈收敛时间大约 8 分钟初始压差 50mV 时收敛时间约 14 分钟初始压差 80mV 时收敛时间拉长到 22 分钟。收敛过程中电芯温度最高上升了约 4℃还在可接受范围。最终结束时的压差都稳定在 17mV 到 19mV 之间证明均衡控制没有出现明显的过冲。6.2 温度与长期老化测试的结果整理老化测试我用了 6 组两串电池3 组带均衡3 组不带均衡。条件一致0.5C 充电0.5C 放电放电截止电压 6.0V循环 500 次。结果不带均衡的组可用容量衰减到初始值的 82%带均衡的组衰减到 95%。这 13 个百分点的差距在储能和备用电源场景里足够影响产品的更换周期了。均衡组的 MOS 管温升稳定在 25℃ 左右没有出现失控情况均衡电阻的外观也没有明显老化。带均衡组的电芯压差始终被控制在 30mV 以内而不带均衡组到 300 次循环时压差已经超过 120mV有些组的低压保护已经开始提前跳闸。6.3 我认为这套方案适合什么场景整体看下来MP2642GR-Z 加 PIC18F86J55 的组合在 1000mAh 到 5000mAh 的两串电池系统里非常合适。无论是小容量户外电源、家用储能里的辅助电源还是设备备用电池被动均衡加上基本的充放电管理已经能解决绝大多数一致性漂移问题。如果你做的是大容量、大倍率的动力电池那确实要上主动均衡但两串备用电源没必要花那个成本。最后再分享一个经验这类均衡系统调试时一定要先验证采样链路再谈算法。我见过不少同行拿到板子直接调均衡算法结果采样不准算法怎么调都是错的。先在常温下把两节电芯电压采准到 5mV 以内再去调均衡状态机后面所有问题都会好处理很多。