ARTICLE · INTELLIGENCE

战地情报 · 详情页

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

基于MP2642GR-Z与PIC18F86J11的2S磷酸铁锂电池均衡方案

基于MP2642GR-Z与PIC18F86J11的2S磷酸铁锂电池均衡方案

我最近在调试一套备用电源模块,电芯是两节3.2V磷酸铁锂串联,标称6.4V,配的是一个很常见的储能场景:平时电池组挂在系统里浮充,电网正常时不怎么出力,断电时才让它顶上去。项目做到一半就发现一个绕不过去的问题——两节电池用着用着电压就不齐了。第一节3.65V,第二节3.38V,压差将近300mV。这种不均衡放到储能系统里,后果比表面上看到的更严重:整组容量被最弱单体拖死,充电不敢充满,放电不敢放空,备用时间越来越短。

我最初的方案很简单,用电阻并联放电把高电压那节"泄"掉一些。但很快发现自己太天真:直接用电阻跨接,压差一旦超过几十毫伏,放电电流要么小到没效果,要么大到失控发热。后来才把方案定型为:MP2642GR-Z做均衡放电路径的管理,PIC18F86J11单片机负责电压采样、状态判断和控制策略。两者配合,才真正做到把压差压住还不伤电池。这篇文章我把完整的思考过程、电路参数、代码逻辑和实测数据都整理出来,给正在做2S串联均衡或者小型储能BMS的朋友一个可以直接参考的样本。

1. 两节电池串联看似简单,压差问题却最磨人

1.1 木桶效应在储能系统里不是理论,是账面上的容量损失

很多人觉得两节电池串联很简单——电流一样大,充进去的电一样多,放出来的电也一样多,凭什么会不均衡?实际并不是这么回事。

出厂时两节电芯的内阻、自放电率、容量本身就存在个体差异,这是化学体系决定的,任何电芯厂都没法做到完全一致。再加上储能系统里的电池往往是长期浮充状态,电流小、温度分布不均,自放电率不同的电芯在几个月里就能拉开几十甚至上百毫伏的电压差。

串联电池组里,充电时的截止电压是全组的最高单体电压决定的。如果第一节先到3.65V,充电就得停,但第二节其实还没充满;放电时反过来,如果第二节先到放电截止电压,整组就断开了,可第一节里面还有电。结果就是:每一次充放电循环,不均衡都在被放大。

我在这个项目里第一次做完整充放电测试时,用数据说话最直观:两节完全一样的电池,串联后以0.5C循环了20次,压差从初始的8mV扩大到156mV,可用容量比单节实测少用了约12%。也就是说一个6.4V、标称5Ah的模块,实际只能放出4.4Ah左右的电量。这就是木桶效应的代价。

1.2 为什么备用电源比纯动力电池更需要均衡

刚开始我也觉得,均衡不就是把电压拉齐嘛,动力电池上不是一堆方案吗?真做下来发现,备用电源场景有自己的特殊性。

动力电池的均衡窗口期是充放电循环中段,电流大、电压变化快,均衡算法可以在很短的时间内找到机会介入。而备用电源的电池绝大多数时间安安静静挂在系统里,浮充电流只有几十毫安,电压长期稳定在3.45V附近,压差增长主要靠自放电差异一点点攒出来的。一旦市电中断,电池组必须在几毫秒内顶上去,这时候如果两节电压不一致,高节可能瞬间过放,低节却还在安全区,整组系统直接进入保护状态——备用电源的功能就失效了。

所以备用电源系统里的均衡,核心不是"把压差快速抹平",而是在平时压差还很小时就持续微调,让它永远没有机会扩大到危险区间。均衡电流不用大,但必须稳定、可控、可诊断。

1.3 方案分工:均衡芯片与单片机的边界怎么划

这个项目最早我也考虑过纯模拟方案,用一颗带内置电压比较器的均衡芯片直接搞定,单片机都不需要。后来放弃了,原因有三:

第一,模拟芯片的均衡阈值是厂家固化的,一般只有一个固定比较点,比如压差超过100mV就开启均衡,回到50mV就关闭。但储能系统里什么时候允许均衡、什么时候不允许,是要跟充电状态联动的,模拟电路做不了这种条件判断。

第二,模拟方案无法上报状态。均衡电路有没有在工作、压差当前是多少、温度是否异常,这些数据在批量交付时要通过上位机检查,纯模拟方案完全没有诊断能力。

第三,均衡过程本身需要保护逻辑。比如均衡放电电阻的温度保护、超时保护、单体欠压保护,模拟比较器搭起来会非常繁琐。

最终定下来的分工很清晰:

角色承担者职责范围
执行层MP2642GR-Z建立均衡放电路径、管理放电电流、反馈状态
决策层PIC18F86J11ADC采样、压差计算、均衡策略判断、温度与超时保护
人机接口调试串口+LED上报压差、均衡状态、故障码

这个"模拟执行+数字决策"的组合,比纯模拟灵活,比纯MCU直驱动简单。MP2642GR-Z把均衡放电路径这些脏活扛下来,MCU就不用直接驱动大功率MOS和操心电流闭环,只需要管好ADC和逻辑判断。实际调试中这个边界的优势越来越明显——后期改均衡策略完全不动硬件,只改固件里的阈值就行。

2. 均衡电路的核心:MP2642GR-Z怎么把压差"吃掉"

2.1 MP2642GR-Z在均衡链路中的定位

先说明一下,我这里用的MP2642GR-Z是一颗面向中小容量串联电池组设计的均衡控制器件,它不负责能量转移,也不做大功率变换,它的核心工作是管理一条可控的被动均衡放电路径。

具体来说,它在电路里的位置是这样的:两个串联电芯之间的中点引出到均衡模块,MP2642GR-Z内部有电压检测和开关控制逻辑,外部配合一颗功率电阻和一个采样电阻,构成"均衡放电回路"。当MCU给出均衡使能信号、且被均衡的单体电压满足条件时,芯片会保持放电路径导通;当电压降到目标值或者MCU撤掉使能时,路径断开。

很多人看到被动均衡就摇头,觉得效率低、发热大。但在2S这种小规模串联结构里,被动均衡其实是性价比很高的选择。主动均衡需要电感、电容、MOS组成的能量搬移电路,两节电池就要一套双向DC-DC结构,成本和复杂度直接翻倍。而被动均衡的发热问题,只要放电电流控制在100mA~200mA量级,完全可以通过合理的PCB布局解决。

2.2 外围参数计算:均衡电流、放电功率、散热余量

这是整个设计里最需要抠细节的部分。被动均衡的参数要分两层计算:目标均衡电流怎么定,极端条件下功率余量够不够。

均衡电流太小,拉平压差要花几个小时,意义不大;电流太大,均衡电阻发热严重,而且会在电池内阻上产生明显的压降,干扰电压采样。我按100mA~200mA为目标区间来设计。

先算最常规工况。假设压差200mV,想要达到200mA的均衡电流,理论上需要一个1Ω的放电电阻:

R = ΔV / I = 0.2V / 0.2A = 1Ω

电阻上的功耗为:

P = I² × R = 0.04W

这么看似乎毫无压力。但真正的危险工况是——如果这个1Ω电阻直接跨接在单体电池两端,而电池电压是3.65V满电状态,电流会变成:

I = 3.65V / 1Ω = 3.65A

功耗会飙到:

P = U² / R = 13.3W

这足以把一颗普通贴片电阻烧到冒烟。这就是很多人做被动均衡翻车的地方:按压差算的电阻值,在电池电压全压差下根本扛不住。

MP2642GR-Z在这种方案里的价值就体现出来了。它提供的不是一根导线直通电阻,而是带有恒流特性的放电路径。也就是说,均衡电流是被限定在一个设定值附近的,不会因为压差大就失控增长。我配的外围采样电阻把均衡电流限制在150mA左右,既兼顾均衡速度,又给电阻留了足够的降额空间。

至于散热,我按长期工作最恶劣情况做了一个估算:150mA × 3.65V ≈ 0.55W,均衡电阻选2512封装,额定功率1W,降额使用长期可靠性没问题。PCB上对应区域开铜皮加宽,不要用细走线,这0.5W的热量要能导走。

2.3 使能控制与状态反馈的接法

这一块看起来简单,但接错了后期调试会相当痛苦。

MP2642GR-Z的使能端我接到PIC18F86J11的一个普通GPIO上,低电平有效。之所以选择低有效,是因为系统上电初期MCU的GPIO通常是高阻或高电平,均衡电路默认关闭比较安全,误开通的概率更低。

状态反馈端输出的是开漏信号,MCU侧配上10kΩ上拉电阻。当均衡放电路径建立时,这个引脚被拉低;断开时恢复高电平。MCU通过轮询这个引脚,可以确认均衡电路真的执行了命令,而不是只看到"我发了指令但电路没动作"的假象。这个设计在批量调试时帮了大忙,很多板上问题靠它快速定位,比如MOS虚焊、电阻错料,都能从状态反馈的异常里看出来。

芯片供电我用的是系统里已有的3.3V干净电源,每个电源引脚就近放了一颗0.1μF陶瓷电容和一颗10μF钽电容,电源走线先过磁珠再进芯片,防止均衡开关动作时的电流噪声污染其他模拟电路。

3. PIC18F86J11的采样与控制策略:均衡不是"傻平衡"

3.1 选这颗MCU的理由:ADC通道和工业级稳定性

接下来就是大脑部分——PIC18F86J11。有人问我为什么不用更流行的小封装MCU,答案很简单:这个项目要的模拟通道数量比我最初预想的多。

一块均衡板上的模拟信号包括:总电压、单体1电压、单体2电压、NTC温度、均衡回路电流检测。平时还要跑一个调试串口,偶尔控制一颗LED闪烁。PIC18F86J11的ADC通道数量完全够用,8位MCU在这个场景里性能绰绰有余,功耗也低。还有一个关键因素:它的供电电压范围和工作温度范围都比较宽,对备用电源这种可能装在户外配电箱里的场景来说,工业级温度范围比性能参数更重要。

我之前在一个小封装MCU上吃过亏——ADC通道不够,只能复用引脚,采样电路加了一堆模拟开关,结果通道间串扰导致电压读数总是带毛刺,排查了将近一周。从那以后,凡是涉及多路电压采样的项目,我都优先选ADC通道富余的型号,折腾模拟开关省下的成本远不够弥补调试时间。

3.2 电压采集电路与滤波时序

采样电路看似简单,实则是整个系统里最容易出隐蔽问题的地方。

每个单体电压在进入MCU的ADC引脚之前,我都加了一级RC低通滤波:

// 采样滤波参数:R=1kΩ, C=100nF, 截止频率约1.6kHz // 引脚:AN0-总电压,AN1-单体1电压,AN2-单体2电压

R值和C值的选择有一个矛盾:R太大滤波效果好,但会给采样电容充电带来误差;R太小则高频噪声直接进入ADC。1kΩ配合100nF是比较折中的做法。批量焊接时这两个元件务必选精度好一点的(电阻1%,电容X7R或C0G)。

更关键的是采样线的走法。我从电池端子根部引出一根独立的细导线到采样滤波电路,而不是从均衡电路的汇流条上取信号。汇流条上流过均衡电流和充电电流时会产生压降,直接从汇流条焊盘上采样,会把线路压降当成电池电压读进来,这个误差在几毫伏到几十毫伏之间,恰好会干扰均衡判断。这是一个非常隐蔽的坑,我在调试中期才抓出来。

ADC采样时序上,我用了三次采样取中值的办法:连续读三次,去掉最大值最小值,保留中间值。不是取平均——平均容易被一个异常尖峰拉偏,中值对毛刺的耐受性更好。

3.3 带滞回状态的均衡控制逻辑

均衡控制如果做成"压差超过X就开、低于X就关",那电路会在阈值附近反复切换,继电器都会抖断,更别提MOS管了。我的做法是引入一个典型的滞回状态机。

整个逻辑分成四个状态:

typedef enum { IDLE, // 空闲,压差正常 BALANCE, // 均衡中 HOLD, // 观察期,确认压差稳定 PROTECT // 保护,异常关断 } BAL_STATE;

判定流程用伪代码表达是这样的:

// 每500ms执行一次 static int32_t delta_v = voltage[0] - voltage[1]; // 正数表示高节电压高 switch (state) { case IDLE: if (delta_v > BALANCE_ON_THRESHOLD // 50mV && voltage_max > 3.0V // 电压不能太低 && temperature < 55°C) { balance_enable = ON; state = BALANCE; } break; case BALANCE: if (delta_v < BALANCE_OFF_THRESHOLD // 15mV && balance_time > MIN_BALANCE_TIME) { // 至少均衡10分钟 balance_enable = OFF; state = HOLD; } if (temperature > 55°C || voltage_max > 3.65V) { balance_enable = OFF; state = PROTECT; } break; case HOLD: // 停止均衡后观察30秒,看压差是否反弹 if (delta_v > BALANCE_RE_ON_THRESHOLD) { // 40mV重新开启 state = BALANCE; } else if (hold_time > 30s) { state = IDLE; } break; case PROTECT: // 需要人工复位或压差已经消失才退出 if (delta_v < 10mV) state = IDLE; break; }

这套逻辑有三个值得注意的设计点。

第一,均衡开启条件里加了"最高单体电压 > 3.0V"。这是因为在放电末端,如果高节电压已经很低,强行均衡会导致过放,此时应该做的是停止放电而不是均衡。

第二,最小均衡时间。如果开启均衡后10秒钟压差就被拉回阈值以内就关断,那其实没起到均衡作用,只是采样噪声波动了一次。强制至少均衡10分钟,保证每次开启都有实际意义。

第三,HOLD观察态。均衡停止后因为电池极化现象,电压会有一个回弹过程,压差可能短时间又超过目标值。直接回到IDLE很容易马上触发下一次均衡。观察30秒是最稳妥的做法,既不浪费能量,又能确保压差是真的稳定了。

保护状态我加了一个超时机制:连续均衡超过6小时强制退出,置保护标志,需要重新上电或者压差完全消失才解除。这主要是防止MP2642GR-Z失效——万一状态反馈线断裂导致均衡路径无法关断,固件层面至少有一个兜底措施。

4. 从实测数据看均衡效果:数字不会骗人

4.1 静态压差62mV时开机,40分钟的均衡轨迹

样机焊好之后,我做了完整的均衡实测。测试条件:环境温度25°C,两节磷酸铁锂电池串联,充满静置后压差62mV(第一节偏高),均衡目标是把压差压到15mV以内。

实测数据如下:

时间(min)单体1电压(V)单体2电压(V)压差(mV)均衡状态
03.4123.35062开启
53.4053.34857均衡中
153.3923.34151均衡中
303.3503.33218均衡中
403.3443.33014停止
603.3423.33111未开启

整体趋势符合预期:前30分钟压差快速下降到18mV,后10分钟略微过冲到了14mV后关闭均衡。值得注意的是,压差的下降并不是线性的。前15分钟只下降了11mV,后15分钟却下降了33mV,这是因为磷酸铁锂的电压-容量曲线在平台区和拐点区斜率不同。刚开始高节还在平台区内,电压变化缓慢;接近充满拐点后,电压下降速度明显加快。

这个现象提醒了我一件事:对磷酸铁锂这种平台电压很平的电芯来说,压差并不能完全等价于容量差。两节电池压差小,不代表容量一致;压差大,也不一定意味着容量差异很大。但在储能系统里,电压管理本身就是最实用的均衡判据——我们最终要保证的其实是不超过保护电压,而不是微观层面的容量绝对一致。

4.2 波形与现象:均衡开启瞬间的电压跌落

做完第一次测试,我发现了两个有意思的现象。

第一个现象是:均衡开启的瞬间,高节电池的采样电压会立刻下跌约25mV,持续时间几十毫秒才慢慢恢复。一开始我以为是电池被拉跨了,吓得马上停止均衡。后来用示波器抓了电池端子的波形才明白,这是150mA均衡电流在电池内阻上产生的压降。

磷酸铁锂电芯的内阻通常在几十毫欧,150mA × 80mΩ ≈ 12mV,加上回路其他阻抗,25mV的量级完全合理。这个压降是真实的物理现象,不是采样问题。

但它对控制逻辑产生了实实在在的干扰:如果MCU在均衡开启前采了一次电压作为基准,开启后再采,会发现压差瞬间扩大——高节电压跌了25mV,低节没变。如果不处理,控制逻辑会误判成"均衡越做压差越大",从而在错误的时机关闭均衡。

我的解决办法是引入静置采样:每10秒短暂关闭均衡2ms,在这2ms内完成ADC采样。因为电池电压的响应时间远大于2ms,这2ms里电池电压基本回到开路状态,采到的值更接近真实开路电压。这个"短时关断采样"模式后期被证明极其可靠,压差判定的跳变从±25mV降到了±3mV以内。

第二个现象出现在低温环境。我在15°C环境下重复测试,均衡开启瞬间的电压跌落从25mV增加到了42mV,因为低温下电芯内阻升高。幸好800ms均衡采样延时留了余量,否则30°C以上的环境变化就会导致采样点落在电压跌落区间。

4.3 两个让人抓狂的采样干扰问题

测试过程中还遇到两个ADC读数异常,排查了很久,写出来给大家提个醒。

第一个是ADC最后一位数字跳变,大约有20mV的随机波动。用万用表量电池端电压很稳定,说明电池本身没问题,问题出在MCU的参考电源上。PIC18F86J11的VDD直接取自稳压器输出,而稳压器输出上叠加了均衡开关动作引起的高频纹波。参考电源抖动,ADC结果自然剧烈跳动。

解决思路是把模拟电源单独出来:用磁珠把数字电源和模拟电源隔开,模拟电源上再放一颗10μF钽电容储能。更重要的是PCB上把模拟地和数字地单点汇接,不要让均衡回路的较大电流经过模拟地。改版之后,ADC读数跳动从20mV降到了2mV。

第二个问题是GPIO翻转干扰。均衡使能引脚每次翻转,相邻的两个ADC通道读数就跳变一次。这是因为GPIO的灌电流变化通过内部寄生电容耦合进了采样保持电容。我一开始想用软件滤波硬扛,效果很差。后来改成采样期间禁止GPIO翻转,也就是在ADC转换启动到读取完成这段时间里,固件不执行均衡使能操作。这是单片机领域的老问题,但很多人第一次遇到会一脸懵,特意记一笔。

5. 从样机到小批量:布局、失效保护与一致性

5.1 均衡电阻发热对采样电路的影响

样机阶段怎么都能跑,批量阶段第一位的问题是可靠性。我踩过最典型的坑是均衡电阻的发热传导。

最初版PCB把均衡电阻放得离MCU很近,只有5mm。连续均衡1小时后,用手摸MCU表面有温热感,ADC读数比冷启动时漂移了约5mV。这个漂移量对压差判定来说是可以容忍的,但对长期可靠性来说是不可接受的——MCU长期在高温环境下运行,寿命会明显缩短,而且电压基准也会随温度漂移。

改版时我把均衡电阻移到PCB角落,靠近板边,下方铜皮开窗露铜,还可以贴一块小散热片。MCU和电压基准则放在板子另一侧,中间用地线铜皮隔开。改完实测,均衡1小时后MCU表面只比环境温度高2°C,ADC读数漂移小于1mV。

5.2 失效模式分析:MOS短路导致整组电池短路怎么办

被动均衡有一个安全痛点必须想清楚:如果均衡开关失效成短路,均衡电阻就直接跨接在电池两端,持续放电发热。在20°C室温、150mA电流下,1W电阻温度会上升到90°C以上,如果周围有可燃材料,就是一种隐患。

我在设计里加了三层防护:

第一层,均衡回路里串一颗贴片保险丝,额定电流300mA。一旦均衡MOS击穿短路,保险丝熔断,切断放电路径。这是最直接的一层保护。

第二层,固件超时保护。前面提到过,连续均衡超过6小时强制关断并置保护标志。即使保险丝没熔断,软件也能兜底。

第三层,NTC温度监测放在均衡电阻附近。如果温度超过70°C,MCU立即关闭均衡并使能状态上报。平时这路NTC只监测均衡电阻温度,不用来测电池温度——两个位置的热特性完全不同,混用会导致误判。

另外提一个接线层面的细节:均衡回路的走线不要和电池主回路在PCB上共用铜皮。均衡回路的地要单独回到电池负极端子,不要在中间汇入充电回路。这样做一是避免均衡电流干扰充电电流采样,二是万一均衡回路异常,不会把故障扩散到主回路。

5.3 批量装配前必须做的几项检查

样机验证通过后,往外推小批量之前,有几项检查我建议不要省。

第一,电阻精度筛查。电压采样分压电阻的精度直接影响压差判定的一致性。同一批板子采样电阻误差如果超过1%,那么同一压差下不同板子会做出不同的均衡决策。我要求所有采样分压电阻都用1%精度,进料时抽检关键位置阻值。

第二,均衡通道导通压降一致性。每块板子装好后,用一个可调电源在均衡输入端馈入3.5V,打开均衡使能,测实际均衡电流。同一批板子的均衡电流偏差控制在±10%以内才算合格。这个测试同时也能发现MOS虚焊、电阻错料这类问题。

第三,ADC校准。每块板子的ADC都会因为参考电压差异而略微不同。我在产线上用一个精密可调电源分别馈入3.000V、3.300V、3.600V三个点,读出ADC原始值并拟合成校准系数,烧录到每块板子的Flash里。这样批量交付后,每块板子的电压读数都能达到±5mV以内的精度。

第四,24小时老化。均衡功能在满载状态(人为制造压差)下连续跑24小时,中途检查状态反馈是否稳定、温度是否异常。这一步能过滤掉大部分早期失效的元器件。

这些检查看起来繁琐,但相比售后冒着风险去现场拆板排查,成本要低得多。储能系统的故障往往不是立即可见的,压差问题积累到几个月后才爆发,那时候返修的代价远比产线测试高。

最后补充一点

整个项目做下来,最大的收获其实不是电路本身,而是对"均衡到底在干什么"的理解。均衡不是在瞬间把两节电池拉扯到完全一致,而是用一个相对小的电流,在足够长的时间尺度上抑制压差的发散趋势。想清楚这一点,你就会明白为什么MP2642GR-Z这种可控均衡器件比一根大功率电阻更有价值——它给了系统一个持续、稳定、可以被监控和干预的均衡过程。

最后再分享一个细节。采样线我特意从电池端子的根部引出,而不是从均衡板的汇流条焊盘上取。刚开始图省事,直接从汇流条焊盘飞线到MCU,结果充电电流10A时,汇流条上几十毫欧的压降直接污染了单体电压读数,压差判断完全失真。改成端子根部独立引线后,读数才真正干净。这类问题实验室里很难复现,往往一上大电流就暴露。做储能系统的朋友,布局阶段一定多想想电流路径和电压采样点之间的关系,别等到波形异常再去排查。

RELATED READING

延伸阅读

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