今年调一套小型储能样机时,被一组两串磷酸铁锂电池坑了一把。两节电池出厂内阻很接近,结果连续十几个充放电循环之后,高压侧总是先一步顶到保护阈值,系统提前切出,整机可用容量直接打八折。一开始怀疑电池质量问题,换了一组新的还是同样现象,后来才想明白:串联电池只要存在微小差异,循环过程中差异就会被放大,不加均衡就只能一直将就。也是因为这个原因,我把 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 / L,V是电池电压差,D是占空比,T是开关周期。举个例子,假设电池压差 V=1V,开关频率100kHz,占空比0.5,周期 T=10μ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低通滤波,典型值是 R=1kΩ、C=100nF,截止频率大约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采样的地电位被干扰,均衡判定跟着抖。走线的事,多画几次、多量几次都不亏。希望这篇记录能帮你少走几步弯路。