两串锂电池主动均衡方案:MP2642GR-Z与PIC18F57K42实战
今年调一套小型储能样机时被一组两串磷酸铁锂电池坑了一把。两节电池出厂内阻很接近结果连续十几个充放电循环之后高压侧总是先一步顶到保护阈值系统提前切出整机可用容量直接打八折。一开始怀疑电池质量问题换了一组新的还是同样现象后来才想明白串联电池只要存在微小差异循环过程中差异就会被放大不加均衡就只能一直将就。也是因为这个原因我把 MP2642GR-Z 和 PIC18F57K42 放到了一起——前者负责主动均衡的能量搬移后者担任采样、判定和保护控制的大脑。下面就把我从原理选型到电路搭建、再到调试排坑的完整过程梳理一遍如果你也在做储能、备用电源或者电池包 BMS 方向这个思路应该能直接用上。1. 两节串联电池的失配问题为什么储能系统绕不开均衡1.1 串联电池为什么天然会失衡所有串联电池组都会面临同一个物理规律串联回路里电流处处相等但每一节电池的容量、内阻、自放电率、温度系数不可能完全一致。哪怕出厂时筛选得很严格使用几十个循环后差异依然会冒出来。举一个直观的例子。两节电池串联给负载放电内阻大的一节压降更高发热也更大发热又反过来加速这一节的老化让它的容量掉得更快。充电的时候也一样内阻大的一节先到达电压上限系统为了保护它只能停充另一节明明还没充满也跟着停。结果就是整个电池组的实际可用容量永远被最弱的那节电池卡住。储能和备用电源恰恰是这种问题的重灾区储能系统充放电频繁备用电源则长期浮充浮充状态下端电压看起来都差不多掩盖了失配的事实可一旦真正切到放电压差就会在一分钟内暴露出来。用两个蓄水池来类比自己体会更深。两个池子串联向下游供水如果池壁漏水速度不同上游液位就会持续偏高。电池均衡要做的就是在上游水多的时候把水搬到下游让两个池子的液位始终保持在合理范围。1.2 均衡方案的三种路线被动、主动与能量搬移工程上常见的均衡方案可以归成三类我做了个对比表方案工作原理优点缺点适用场景被动均衡高电压电池通过并联电阻泄放能量电路简单、成本低、控制容易能量被电阻烧掉发热大均衡时间长容量小、压差不严重、成本敏感的消费类保护板主动均衡通过电感、电容或变压器把高电压电池的能量搬给低电压电池能量利用率高、发热小、均衡速度快器件多、控制复杂、成本高储能、备用电源、大容量动力电池充电机协同均衡依靠充电器对每个单元单独调节充电电量不需要额外功率级依赖充电系统放电过程无法主动处理部分大型储能电站的分级管理表里说得很清楚了。储能系统追求的是长期循环寿命和效率能量不能随便烧掉备用电源虽然平时不放电但关键时刻要能顶住均衡速度和可靠性同样重要。所以这两类场景都应该选主动均衡。被动均衡不是不能用只是在大容量场景下电阻发热和均衡时间都让人头疼六节电芯的被动均衡板热起来甚至能到七八十度放在机箱里隐患很大。1.3 这套方案里均衡的目标与边界标题里说的“两个串联电池单元”典型场景是一组两串锂电池包比如两串磷酸铁锂标称6.4V或两串三元锂标称7.4V容量可以从小几百毫安时到几十安时不等。这类电池包在便携储能电源、小型UPS、应急照明、通信备电里都非常常见。我按照常规工程实践把均衡目标定在充电末端和放电末端两节电池电压差控制到30mV以内均衡电流设计在0.5A到2A范围视电池容量和芯片能力而定均衡只在特定状态下工作不是每时每刻都在搬能量。这里要提醒一句如果做的是大容量后备电源均衡电流不能只按压差来算还要考虑电池极化。同样100mV压差20Ah电池和5Ah电池需要搬运的能量完全不同电流太小等于没均衡电流太大又会导致电芯升温所以边界条件一定要先想清楚。2. MP2642GR-Z 的角色定位从器件选型到均衡电路搭建2.1 为什么把 MP2642GR-Z 放在能量搬运的核心位置做均衡方案很多人的第一反应是MCU直驱MOS管加电感的纯分立方案或者用电池保护芯片里自带的被动均衡。纯分立方案的优势是灵活、成本低但环路设计、电感充放电时序、死区控制全都要自己写出问题很难查。普通保护芯片的均衡呢本质上还是电阻放电谈不上主动。MP2642GR-Z 在这个系统里承担的角色很明确它是能量转移的开关控制器。PIC18F57K42 负责判断“该不该均衡、往哪个方向均衡、均衡多久”而 MP2642GR-Z 负责执行实际的功率开关动作把高电压电池的能量抽出来以受控的方式灌进低电压电池。这类集成控制器通常会把功率MOS管、驱动逻辑、电流检测集成在一起外部只需要很少的元件就能搭出双向升降压均衡拓扑。从器件选型的角度看我选它而不是搭分立方案核心原因是可靠性。储能和备用电源的维护成本很高一旦均衡功率级出现故障轻则均衡失效重则烧MOS管甚至影响电池。集成控制器把关键功率路径封进芯片里原厂在设计和可靠性验证上比我手搓的强得多。另外它和MCU的接口也很简单使能、方向、故障反馈几个引脚而已省掉了一堆模拟比较电路。2.2 均衡功率级拓扑与外围关键参数两节电池之间的主动均衡拓扑最典型的是电感式升降压搬移结构。我用文字描述一下这条功率路径电池正端、均衡电感、中间开关节点、电池负端之间构成回路芯片内部的两组开关管交替导通。第一段时间里电压高的那节电池给电感储能第二段时间里电感把存储的能量释放到电压低的那节电池。如此反复能量就从高电压单元往低电压单元转移了。因为是被受控的电感和开关管管理所以电流方向和大小都可以控制不会像电阻放电那样白烧能量。外围元件的核心是电感和采样电阻。电感的选择有个简单的推导关系开关管导通期间电感电流的变化量 ΔI V × D × T / LV是电池电压差D是占空比T是开关周期。举个例子假设电池压差 V1V开关频率100kHz占空比0.5周期 T10μs。如果电感取10μHΔI就是 1×0.5×10 / 10 0.5A这个电流变化量偏小均衡速度不够快如果把电感降到4.7μHΔI大约1A就相对合适。当然这只是单次开关周期里的变化量实际峰值电流还要叠加初始电流所以电感饱和电流至少要留2倍以上的余量以免在大压差工况下电感进入饱和那就不是均衡而是短路了。采样电阻的取值主要看电流检测灵敏度和功耗的平衡。阻值大信号容易采但损耗 P I²R 会上去阻值小损耗低但检测信号容易淹没在噪声里。我的做法是先定最大均衡电流再按采样电阻满量程电压不超过几十毫伏来选这样既保证了信号可读性又不会在长时间均衡时产生明显温升。2.3 使能接口、故障回传与安全联动的接线要点芯片侧和MCU侧的接口通常是这么几条使能信号、方向信号、故障/状态回传。PIC18F57K42 的I/O引脚通过电平转换或者直接控制这些引脚MCU判断压差超过阈值后置高使能并根据哪节电压高来设置方向。这个环节最容易出问题的不是接线本身而是时序和去抖。使能信号拉高后芯片内部启动需要一段时间如果MCU立刻去读故障状态很可能会读到启动过程中的假故障。我现在的做法是使能之后延时几十毫秒再开始检测状态故障回传信号也加上RC去抖并处理成中断而不是在主循环里反复查询。还有一个安全细节MP2642GR-Z 的故障回传脚要接到PIC的硬件中断引脚上配合PIC18F57K42的CLC模块可以直接硬件关断PWM不用等软件中断排队。这一点在量产场景里非常重要软件死循环或者被高优先级任务卡住时硬件通道还能把均衡功率级拉掉避免失控。3. PIC18F57K42 上的均衡控制逻辑采样、判定与保护3.1 为什么选带 ADCC 和 CLC 的 PIC18F57K42 来做控制大脑均衡控制这件事对MCU的要求其实集中在三点电压采样精度、判定响应速度、故障处理可靠性。PIC18F57K42 的12位ADC配合合适的外部基准理论上一个LSB大约0.8mV加上硬件平均之后完全可以分辨毫伏级别的电池电压差。这个精度对均衡触发阈值来说足够了毕竟我们一般不需要10mV以下的精度。更重要的是它的ADCC模块支持自动采样和计算比如连续采样8次后由硬件求平均MCU只需要等一个标志位CPU不用在每次转换后都去搬数据这让我可以在主循环里同时处理通信和状态机。另一个核心点是它的CLC可配置逻辑单元。CLC可以把比较器输出、振荡器信号、GPIO状态这些组合成硬件逻辑直接产生PWM关断信号。举个实际场景如果电池温度超过设定值外部比较器输出一个电平CLC把这个电平与PWM使能信号做逻辑与温度超限时PWM被硬件立即关断。这个动作不需要软件参与延迟从微秒级变成纳秒级对热失控保护来说是质变。3.2 电压采样电路与均衡状态机的实现电压采样的硬件上我在每节电池电压引脚到ADC输入之间加了一级RC低通滤波典型值是 R1kΩ、C100nF截止频率大约1.6kHz。这个截止频率既能滤掉大部分开关噪声又不会让采样值反应太慢。不过要注意RC滤波会引入相位延迟充电末端的电压变化很快如果RC过大采样值会有几十毫秒的滞后均衡判定就会跟不上。均衡状态机我用枚举状态实现代码很直接#define EQ_TRIGGER_MV 30u #define EQ_RELEASE_MV 10u #define EQ_MAX_TICKS 3000u typedef enum { EQ_IDLE, EQ_ACTIVE } eq_state_t; static eq_state_t bal_state EQ_IDLE; static uint16_t bal_timer 0u; /* * v1_mv: 第一节电池电压 * v2_mv: 第二节电池电压 * 由ADC转换结果换算为毫伏后传入 */ void balancer_poll(uint16_t v1_mv, uint16_t v2_mv) { int16_t dv (int16_t)v1_mv - (int16_t)v2_mv; uint16_t absv (dv 0) ? (uint16_t)(-dv) : (uint16_t)dv; if (bal_state EQ_IDLE) { if (absv EQ_TRIGGER_MV) { EQ_ENABLE(); bal_state EQ_ACTIVE; bal_timer 0u; } return; } if (absv EQ_RELEASE_MV) { EQ_DISABLE(); bal_state EQ_IDLE; return; } if (bal_timer EQ_MAX_TICKS) { EQ_DISABLE(); bal_state EQ_IDLE; /* 上报超时可置标志位或清零故障计数器 */ return; } }这套状态机看起来简单实际上把迟滞、超时、方向三个关键点都覆盖了。触发阈值30mV释放阈值10mV中间留了20mV迟滞窗口防止临界状态下反复开启关断。EQ_MAX_TICKS是均衡超时保护万一压差一直不收敛也不能让均衡无休止地跑下去否则电池会一直处于被搬动状态影响寿命。方向信号在真正工程代码里要另外映射比如dv大于0时让能量从V1往V2搬反之则反。3.3 保护与安全策略过压、过温、通信异常均衡必须要放在整个BMS安全策略下面而不是单独存在。我至少了加四层保护电芯过压保护任何一节电压超过最大允许值立即停止均衡不能靠均衡去“救”一颗已经过压的电池。电芯过温保护NTC温度超过45℃时停止均衡降到40℃以下才恢复。均衡动作本身会产生热量所以阈值的判断要带迟滞。单次均衡时间上限上面代码里的EQ_MAX_TICKS就是干这个的时间到了强制退出冷却一段时间再进入。通信异常降级如果是储能系统里由主控下发均衡命令通信丢失超过一定时间从机必须自动降级为本地默认策略避免浮空指令导致异常状态。PIC18F57K42 的看门狗在这类场景里一定要开。主循环里有个心跳变量每轮喂狗一旦程序跑飞看门狗复位后默认把所有均衡使能引脚配置为无效电平保证上电复位瞬间不会误开均衡通道。4. 联调实测与踩坑排查均衡失效、纹波异常与温升处理4.1 均衡回路不动作一次典型的逻辑陷阱样机焊接完成之后第一次上电我把两节电池用不同的电压状态接上压差已经有100多毫伏软件也打印出了“均衡使能”的标志但电流表显示均衡电流为零完全没动作。排查链路是这样的先用万用表直接量采样电阻两端的电压发现完全是0mV这至少说明功率级没有电流流过。接着用示波器抓芯片使能引脚的波形软件明明把它置高了但实际引脚电平是低。问题不在硬件而是我把使能极性搞反了——这颗芯片的使能引脚是低电平有效而我按高电平有效的习惯写的代码。把逻辑反转之后均衡回路马上开始工作电流也出来了。这个坑非常典型或者说它其实是“太想当然”的后果。很多文档的引脚名看起来像高有效实际真值表可能刚好相反。我现在拿到任何新芯片第一件事就是先查数据手册里的真值表再用万用表量引脚默认电平而不是上来就写代码。4.2 均衡纹波污染采样导致的“反复横跳”均衡正常工作后另一个更隐蔽的问题冒了出来。压差稳定在80mV左右均衡启动但运行几秒后软件采到的压差数值开始来回跳一度出现“V1高于V2均衡动作下一次采样又是V2高于V1方向翻转”的振荡现象。把示波器接到ADC采样点一看功率开关切换的尖峰清楚地在采样波形上出现了幅度有几毫伏。根源有三层。第一采样线走线离电感太近电磁耦合进了噪声第二ADC采样时刻没有避开功率管的开关瞬间刚好采到了边沿第三RC滤波参数偏小没能把尖峰压到ADC分辨率以下。解决方法依次排队布局上把电压采样线改成开尔文连接直接接到电池端不让采样线经过功率电流回路采样线上R和C同时加大R从1kΩ调到4.7kΩC从100nF调到1μF截止频率降下来ADC改用定时器触发采样点放在功率管开关动作之后的一段稳定区间均衡状态机里本来就有的迟滞窗口发挥作用10mV释放阈值有效规避了临界抖动。改完拓扑之后采样波形干净了很多均衡方向不再来回翻转压差收敛过程变得平滑。4.3 温升、效率与满载验证样机在较长时间均衡测试中MP2642GR-Z 的温升比预期高。最开始均衡电流调到了1.5A连续跑了20多分钟后芯片表面温度接近70℃这已经接近我设定的降额线了。用热成像看发现芯片底部的散热焊盘没有可靠连接到覆铜过孔数量也不足。这是很多手工样机的通病散热焊盘是芯片最主要的散热路径如果下面没有完整的铜皮和过孔阵列热量就会堆在封装里出不去。我重新调整了PCB铺铜在散热焊盘下加了12个过孔并连接到背面覆铜同时把开关频率从100kHz左右降到80kHz附近电感饱和电流也换大了一档。这些改动之后同样工况下芯片表面温度降到了55℃上下均衡电流波形从略带削顶变成了平滑的三角波。最后做一个完整的均衡验证人为把两节电池做成120mV的压差然后投入均衡。3小时后压差收敛到8mV左右触发了释放阈值均衡自动退出。整个过程中没有出现过温、过压报警纹波干扰导致的振荡也没有再出现。对于储能和备用电源的使用场景来说这套状态已经满足要求了。4.4 备用电源特有的浮充陷阱这里单独写一段是因为这个问题只有做备用电源的人才会碰到。备用电源长期处于浮充状态两节电池的端电压都被充电器钳制在很接近的水平压差可能只有几毫伏均衡完全不会触发。但一旦切换到放电状态两节电池的电压很快就会被拉到几十甚至上百毫伏的压差这时候再启动均衡已经晚了。解决办法是在系统层面提前介入。我的做法是当电池从浮充状态切换到大电流放电时如果检测到放电电流超过一定值立即触发一次“预均衡”——不等到压差拉大后再处理而是在放电初期就把能量主动搬向电压偏低的那节。这个逻辑和上面状态机的框架是一样的只是触发条件从“压差超过阈值”扩展成了“放电事件压差趋势”对备用电源场景的提升非常明显。5. 工程化的扩展思考从两节到多节、从样机到量产5.1 两节均衡模块如何级联到多串系统两节单元的均衡方案最舒服的地方是可复用性。多串电池组可以看成多组两串子单元的叠加每组子单元配上独立的 MP2642GR-Z 功率级由一颗 PIC18F57K42 统一管理或者每个子单元配一颗从机MCU。级联要注意地环路问题。多个均衡功率级如果直接共地功率电流可能会流过采样地线把采样参考电平抬掉。工程上一个稳妥的做法是把均衡模块和主控模块通过隔离通信连接比如用CAN或串口加隔离收发器采样地和功率地单点连接。PIC18F57K42 自带EUSART做从机节点时正好用上。5.2 与充电策略和储能系统的联动均衡不应该是一个孤立功能它必须和充电策略联动才有意义。恒流充电前期均衡没有必要一直工作因为压差可能还没被放大到恒压阶段后期电流下降压差开始体现这时候均衡的价值最大。我的策略是接收主控下发的“当前工作模式”在均充阶段提高均衡电流在浮充阶段降低或关闭均衡在放电阶段启用预均衡逻辑。通信链路断了怎么办PIC18F57K42 侧保存一份本地默认策略表通信超时后自动切换成本地段工作模式均衡阈值保守一点确保不会在异常状态下把电池弄坏。这个降级逻辑看着简单但量产现场调试时能省掉大量麻烦。5.3 产线参数、测试预留与可维护性设计量产阶段有几个参数必须做成可配置而不是烧死在代码里均衡触发阈值、释放阈值、最大均衡时长、过温阈值。原因很简单不同批次电池的一致性不同顶盖封死之后既没法改电阻也没法改代码只能在产线上通过串口或预留的I2C接口写EEPROM调整。我建议再预留两到三个GPIO作为产线测试脚一个用来强制使能均衡通道一个用来模拟故障输入一个作为备用。产线测试员不用懂代码按测试工装的操作步骤把引脚拉高拉低就能独立完成均衡功能验证和故障保护验证。5.4 我个人的几项工程心得这套方案做下来我最深的体会是均衡设计的目标不是把压差均到零而是把失配控制在电池能接受的范围内。追求零压差会带来无休止的电流搬动和额外损耗30mV的触发阈值、10mV的释放阈值在能量效率和均衡效果之间已经是一个很实用的平衡点。调试过程中还有个具体建议遇到均衡波形异常时先把开关频率降下来一档再看示波器。低频下的电流波形和噪声分布更容易分析等找到了问题再提频恢复远比你在一堆高频噪声里猜原因快得多。另外数字地和功率地的分割一定要做好。我第一次改版就因为原地靠近电感导致ADC采样的地电位被干扰均衡判定跟着抖。走线的事多画几次、多量几次都不亏。希望这篇记录能帮你少走几步弯路。