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 引脚的 MCUI/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 的采样值会滞后软件里要加温度滤波。第三量产软件里最好固化均衡事件记录。每次均衡开启和关闭都写一条记录包含时间戳、电芯电压、均衡时长。这样客户如果反馈系统容量下降售后可以把日志导出来直接看到均衡动作是否正常、压差趋势是否恶化。这个功能成本很低但对定位“均衡无效”类投诉帮助极大。我个人在实际操作中最受益的一个小技巧是在每块板上预留两个电压测试点正好对应两节电芯的负极和中间节点。调试时万用表直接点测试点不依赖连接器和线束排查采样问题时能快速判断是硬件接触问题还是软件采样问题。这个习惯保留到现在已经成为我做所有带均衡功能主板的标准设计。