做过储能备电的人对“均衡”这个词都不陌生,但很多人有个误区:电池串数少就不需要均衡。我手头这套两串铁锂电池的备用电源模块,让我彻底改了这想法——两节电芯串联,老化和容量失配一样会发生,照样会拖垮整个系统。解决思路是主动均衡:用一颗MP2642GR-Z做能量搬移的功率级,再用PIC18F4525负责电压采集、均衡判定与保护逻辑。这篇文章把从硬件拓扑到软件状态机的完整设计过程和数据都摊开讲,想给准备做小模组主动均衡的同行一个可复现的参考。
这套系统不是什么新鲜发明,它就是把“两节串联电池的压差控制”这件事做扎实。储能设备里最常见的方案是专用BMS均衡IC,但专用IC的阈值、方向、电流都是死的,调试不方便。我这里换了一种组合:MP2642GR-Z负责功率变换,PIC18F4525负责“大脑”。好处是均衡策略完全由软件定义,改一个宏就能调整压差门限,不用重新画板子。下面我会把选型理由、功率级计算、采样与状态机设计、实测踩坑都捋一遍。
1. 两串电池的失配问题:为什么少串数也必须做主动均衡
1.1 不一致性从哪里来:制造差异与老化放大
很多工程师觉得两节电芯是同一个批次,出厂电压一样,内阻差不多,串联起来不会有问题。实际上只要跑几百次充放循环,差异就会自己冒出来。根源有三个:一是制造公差,哪怕同一个批次的开路电压、容量、自放电率也只是相对接近,绝对做不到一致;二是温度梯度,电芯离功率管近的那节长期更热,热的那节自放电率更高,时间一长SOC就跑偏;三是循环反馈,内阻偏大的电芯每次充放都多发热,发热又加速SEI膜增厚,内阻进一步变大,最后变成一个恶性循环。
在两串系统里,这个失配的后果会被“短板效应”放大。放电时容量小的那节先触底,BMS为了保护只能切断放电,另一节明明还有不少电量却放不出来;充电时正好反过来,容量小的那节先触顶,系统停止充电,整个备用电源的可用容量被单节电芯锁死。我实际测试过两节标称100Ah的铁锂,初始容量差只有3%,跑了一段时间之后,可用放电量损失接近10%,这个数字对备用电源来说是绝对不能接受的。
所以结论很清楚:两串也必须做均衡,而且要趁早做。等压差已经拉大到几百毫伏再去补救,均衡过程本身就剧烈发热,电芯还会被折腾出新的衰减。
1.2 被动均衡的问题:算一笔热账就明白
被动均衡是最传统的做法,原理很简单:每节电池并联一个功率电阻,高电压那节通过电阻把多余能量烧掉。我经常看到小容量电池组用这种方式,因为电路便宜、管理容易,但放到储能和备用电源场景里就不好受了。
算一笔账。假设两节电池压差0.3V,均衡电流做1A,被动均衡的耗散功率就是0.3W。单个0.3W并不起眼,但备用电源大多是密封外壳,长期浮充状态下均衡可能连续工作好几个小时,这0.3W会稳定地变成热量。更关键的是,被动均衡把能量白白扔掉了,低电压那节并没有得到充电,能量利用率是0。在储能系统里,能量本身是有成本,这种浪费完全没意义。
主动均衡做的是能量搬移:把高电压电池的电能抽出来,暂时存在电感里,再灌到低电压电池。整个过程基本不产生净热量,能量只是从一节挪到另一节。被动均衡和主动均衡的核心差异我用一张表来对比。
| 对比维度 | 被动均衡 | 主动均衡 |
|---|---|---|
| 能量去向 | 电阻发热耗散 | 转移到低电压电芯 |
| 均衡电流上限 | 受散热限制,一般很小 | 由功率级设计决定,可到1A以上 |
| 热管理压力 | 大,密封壳尤其明显 | 小,热量主要是功率器件损耗 |
| 调试自由度 | 阈值固定,基本不可调 | 参考/门限由MCU设置,可在线调整 |
| 成本 | 几块钱 | 增加一颗控制IC和功率器件 |
两串小系统用主动均衡,成本增加并不多,但换来的是能量不浪费、温升可控、策略可调,这笔投入值。
1.3 选型思路:为什么是MP2642GR-Z加PIC18F4525
我最早想过直接用专用均衡芯片,省事是真省事,但也带来了约束。专用均衡IC的均衡开启电压、关闭迟滞、电流方向往往是芯片内部写死的,项目做到一半想改门限,就必须换芯片。而且很多专用均衡方案是给3串以上设计的,两串的小模组反而选不到完全匹配的型号。
MP2642GR-Z属于通用电源控制器,它的角色相当灵活。PIC18F4525通过PWM输出或者参考电压设置来告诉功率级“本次均衡目标电流是多少”,相当于给了一个可变的刻度盘。均衡阈值、迟滞窗口、超时保护全部由软件决定,硬件板子不用动,跑一批固件就能改策略。PIC18F4525这边,我比较看中它的10位ADC和两个CCP模块,做两路电压采样加一路PWM电流设定刚好够用,IO电平是5V,直接控制功率级的逻辑引脚很省事。
这套组合本质上是把一个“两串主动均衡器”拆成了一个大功率执行单元加一个小决策单元。执行单元负责能量搬运,决策单元负责测量、判断、保护。后面几节我会按这个思路把每一部分展开。
2. MP2642GR-Z构建的升降压功率级:拓扑、电感与环路
2.1 功率级的角色定位:它不是充电IC,是一个受控能量泵
MP2642GR-Z在这块板上的角色很容易被误解为“充电管理芯片”。实际上均衡和充电是两码事。充电是从外部电源向整组电池补充能量,均衡是在电池组内部把能量从一节挪到另一节。所以功率级应该被理解成一个受控的“能量泵”,方向由PIC决定,流量由参考电压决定。
我采用的拓扑是开关电感式双向变换:高电压节通过开关管向电感充电,电感储能,然后开关切换,电感电流续流到低电压节。一个开关周期就是一次小额转账,开关频率设得越高,单次转账越精细,但开关损耗也越大。MP2642GR-Z内部的同步整流驱动、电流检测放大和误差放大器,正好把这些底层细节接住,PIC只需要给方向和电流设定值。
方向切换我放在功率级外部,用一个方向选择信号去切换“谁是输入、谁是输出”。调试初期我甚至用过继电器做方向切换,速度慢但直观,方便确认每一路信号。后来定型才改成MOS开关组,整个功率级就是一个可控的双向buck-boost。这里提醒一句:方向切换信号和PWM使能信号之间必须加一个安全间隔,确保功率级完全关断后再换向,不然容易出现瞬间直通。
2.2 开关频率、电感量与限流参数的计算过程
频率选型方面,我最终定在250kHz。理由有三个:高于20kHz避开了可听噪声,不会出现电感啸叫;远低于芯片和PIC PWM模块的上限,驱动损耗可控;第三点是采样方便,250kHz的周期是4us,留给MCU的采样时机调整空间比500kHz以上宽裕得多。
电感量按buck-boost的纹波电流公式计算:ΔI = Vin × D / (f × L)。取输入电压Vin最低值3.2V,占空比D按0.5估算,频率f=250kHz,目标平均均衡电流1A,纹波按40%设计也就是0.4A。代入算:
L = Vin × D / (f × ΔI) = 3.2 × 0.5 / (250000 × 0.4) = 16uH
实际取15uH,饱和电流留两倍余量,选2A饱和。DCR越低越好,我用的电感DCR低于50mΩ,这样1A电流下自身压降不到50mV,发热可控。限流电阻的取值也比较关键,我用0.1Ω采样电阻,MP2642GR-Z的电流比较门槛设为150mV,那么最大均衡电流就是1.5A。日常策略把目标电流限制在0.8A,留出余量给异常波动。
环路补偿我按常规做法:COMP引脚放一个RC串联网络,把中频带宽压在开关频率的十分之一到五分之一,也就是25kHz到50kHz之间,相位裕度尽量留45度以上。没有网络分析仪的话,就靠阶跃响应看动态过程,给一个0.5A到1A的电流阶跃,观察是否出现过冲和振荡,反复调RC的值,直到响应干脆利落、不啸叫、不超调。
2.3 版图与采样走线:最容易翻车的部分
功率级画板子,最忌讳的是功率回路面积过大。输入电容、MOS、电感、采样电阻、输出电容要像“绕圈”一样紧密排布,让高频电流回路的包围面积最小。我第一版就是图省事把采样电阻放在板边,结果开关噪声把整个模拟地搅乱了,后面花了好几天才抓出来。
采样线必须走Kelvin接法:从采样电阻两端的焊盘单独引差分线到MP2642GR-Z的电流检测引脚,不要跟功率地共线,避免大电流在PCB铜箔上产生的压降影响限流精度。另一个容易忽略的是功耗,MP2642GR-Z如果带散热焊盘,要焊接在铺铜区域并打过孔到背面,否则持续1A均衡电流工作半小时,焊盘附近会明显烫手。
功率级地和PIC数字地之间我用单点连接,这样开关噪声只能从一个路径耦合到模拟地。均衡工作时,PIC的ADC采样会更容易受干扰,这一点在第4节我会详细讲。
3. PIC18F4525的采集与均衡算法:状态机比你想的更关键
3.1 电压采样电路:中间点浮动不是想当然的
两节串联的中间点电压是浮动的,不能直接把第二节电池的负极当GND来测。我的做法是两路分压采集:一通道测Cell1正极对地电压,另一通道测Cell2正极对地电压。Cell2的电压在软件里用第二通道减去第一通道得到。分压电阻我用100k对20k,分压比1/6,磷酸铁锂最高充电电压3.65V时,ADC引脚电压约0.6V,安全余量足够。
ADC参考电压要用内部2.048V或者单独的高精度参考源,不要直接用VDD。VDD会随着负载波动,测量结果飘得没法看。我这边ADCON1配置为模拟输入通道AN0和AN1,把负参考设为VSS,正参考接内部参考。配置完成以后,每次转换前要给采样保持电容留足充电时间,20us左右比较保险,然后再拉高GO位启动转换。
3.2 ADC滤波与采样时机:别让开关纹波骗了状态机
均衡开启之后,功率级的开关噪声会通过地线耦合到采样回路,导致ADC读数波动。软件上不能只靠硬件滤波器硬扛,采样时机也要配合。我的做法是:每次功率级开关动作后,等100us再触发采样;连续采样8次,去掉一个最大值一个最小值,剩下的取平均。这个滤波算法不用大数据量,几行指令就够,但能把大部分开关纹波削掉。
采样代码我用XC8风格写了一个通用函数,大家可以按自己用的IDE适当调整寄存器名。
unsigned int battery_raw_read(unsigned char ch) { ADCON0bits.CHS = ch; // 选择模拟通道 ADCON0bits.ADON = 1; // 打开ADC模块 __delay_us(20); // 等待采样电容充电 ADCON0bits.GO = 1; // 启动转换 while (ADCON0bits.GO); // 等待转换完成 return (unsigned int)((ADRESH << 8) + ADRESL); } unsigned int battery_voltage_filtered(unsigned char ch) { unsigned int samples[8]; unsigned long sum = 0; unsigned char i; for (i = 0; i < 8; i++) { samples[i] = battery_raw_read(ch); __delay_us(20); } // 去掉最大值和最小值后求平均 // 实现时用一个简单排序或者线性扫描找出极值剔除 for (i = 0; i < 8; i++) { sum += samples[i]; } // 此处先返回原始均值,如需完整滤波请补极值剔除逻辑 return (unsigned int)(sum / 8); }为了拿到真实的中值平均效果,建议把8个样本先排序再掐头去尾,只取中间6个平均。每次采样后加20us延时,8次采样总共多花不到2ms,对均衡这种慢变量来说完全够用。
3.3 均衡状态机:迟滞窗口、电流设定与超时保护
均衡策略的核心不是把压差压到0,而是控制在合理范围内。我设计的状态机很简单:压差大于30mV才启动均衡,小于10mV就停止。中间这20mV的迟滞窗口非常重要,没有迟滞的话,系统会在临界点来回抖动,反复启停功率级,反而把电芯折腾得够呛。
状态机分四个状态:空闲、正向均衡(Cell1高,向Cell2转移)、反向均衡(Cell2高,向Cell1转移)、超时保护。PIC18F4525用CCP1模块输出一个20kHz到200kHz的PWM,经过RC低通滤波后变成0到2.5V的参考电压,送给MP2642GR-Z的误差放大器,用来设定目标均衡电流。PWM占空比每次只调整1%到2%,给RC滤波电容留缓冲时间,不要让电流设定值突变。
超时保护也是必须的。我设了连续均衡4小时就强制停下,记录一次“均衡超时”标志,等下一次上电再评估。如果每次都超时,说明电芯之间的失配已经超出均衡机制的挽救范围,再继续使劲只会把热量堆在内部,没什么用处。温度保护同样重要,我接了外部NTC,超过45摄氏度直接停均衡,等温度回落到40度以下再恢复。
4. 样机实测:四个典型问题与完整排查链路
4.1 问题一:均衡启动后电压采样跳变,状态机来回翻转
这个现象非常典型:不开均衡的时候,两节电池的电压读数都正常,一开均衡,PIC读到的电压开始上下跳,状态机在“正向均衡”和“空闲”之间反复横跳,均衡电流根本稳不住。
我的排查链路是这样走的:先用示波器直接钩在ADC引脚上看波形,发现开关噪声尖刺确实存在,并且和功率级开关沿同步。然后排查采样代码,发现采样时机没有避开开关瞬态。最后两步修正:第一步,在每次功率级开关动作后插入100us以上延迟再采样;第二步,在分压电阻后面加了一级RC低通,10k电阻配100nF电容,截止频率约160Hz。均衡是慢变量,响应慢点没关系,稳定压倒一切。改完以后读数基本稳定,状态机不再乱翻。
这个问题的根因总结起来是一句话:ADC采样不能“想采就采”,必须跟功率级的开关动作对齐。
4.2 问题二:电感啸叫而且均衡电流只有设定值的一半
均衡电流上不去还有个常见原因:软件PWM频率和功率级工作频率打架。我一开始把PIC的PWM周期寄存器设置得很随意,结果实测输出约19kHz,刚好落进人耳可听范围,电感就开始滋滋叫,效率也下降。
这次的排查很直接,用示波器看PWM输出引脚,数了一下周期,发现频率不对。查寄存器计算,原来PR2设太大了。我的晶振是20MHz,Timer2预分频1:1,PWM频率 = 20MHz / (4 × (PR2+1))。想要200kHz,PR2必须是24。改完以后啸叫消失,均衡电流也恢复到设定值。
另外一个容易混进来的坑是电感饱和。如果电感量偏小或者饱和电流余量不足,大电流下电感会出现磁饱和,电流波形畸变,也会导致啸叫且效率骤降。用手摸电感,如果烫得厉害,多半就是饱和,换更大饱和电流的规格再验证。
4.3 问题三:功率MOS温度比预期高30摄氏度
刚开始跑1A均衡时,功率管的温升明显超预期,手摸上去几乎不敢久碰。我判断问题出在开关损耗上。先看驱动波形,发现开关沿不够陡,MOS长时间工作在放大区,损耗自然大。
处理方法是把栅极串联电阻从10欧降到4.7欧,同时检查MP2642GR-Z的驱动配置,确认死区时间足够。这里有一条重要经验:上下桥臂的死区不能完全依赖控制器内部,初次上电前最好用电流探头看输入总线的电流波形,如果开关沿附近出现明显的电流尖峰,说明有交叉导通,必须增加死区。最终我把均衡电流从1A降到0.8A,驱动电阻调低以后,温度降了二十几度,系统安静稳定。
4.4 问题四:首次上电保护直接熔断,怀疑功率级直通
这个问题最吓人。第一版样机上电瞬间,保险丝直接熔断,不用查都知道是出现了直通短路。原因很典型:PIC上电复位期间IO处于高阻态,功率级的使能引脚没有被拉死,外部干扰或者内部上拉让功率级在错误方向上打开了通路,两个电池通过开关管直接打穿。
修复分三步:第一,使能引脚外部加10k下拉电阻,串联1k电阻进PIC的IO,只有PIC主动拉高才允许功率级工作;第二,PIC上电后先配置所有GPIO为输出低电平,再初始化外设,最后才把控制权交给状态机;第三,给MP2642GR-Z设置欠压锁定阈值,输入电压不足时禁止输出。改完以后再上电,保险丝不再动作。
这个问题也让我养成了一个习惯:任何使能路径的默认状态都必须是“不工作”,而不是“等待MCU来关闭”。工程上永远假设上电瞬间MCU是不存在的,硬件必须先自保。
| 故障现象 | 根因 | 排查顺序 | 解决措施 |
|---|---|---|---|
| 采样跳变 | 开关噪声耦合、采样时机不对 | 示波器看采样点,再查代码时序 | 延迟采样加RC滤波 |
| 电感啸叫 | PWM频率落在音频区,电感饱和 | 看PWM波形,手摸电感温度 | 查周期寄存器,换可靠电感 |
| MOS过热 | 开关损耗大、交叉导通 | 看驱动波形,测总线电流尖峰 | 调栅极电阻,优化死区 |
| 上电熔断 | IO高阻态导致误使能 | 查上电时序,测使能引脚电平 | 下拉电阻,确保默认关断 |
5. 扩展思路:从两串到多串,以及最后一点体会
5.1 两串模块做级联:隔离与地线策略
两串均衡做好之后,最容易被问的是“能不能直接扩展到更多串”。可以,但要处理地线问题。多串系统中,不同模块之间的参考地不再相同,如果简单地把所有模块的地连在一起,均衡电流会通过通信地形成环流,干扰通讯甚至引发错误动作。我的建议是每一个“两串均衡子板”保持完全独立,板间通讯用隔离式RS485,隔离器或者磁耦都可以,总之不能把数字地粗暴拉通。
主控板通过RS485汇总每块子板的电压和状态,再做整组层面的宏观协调。子板本身独立执行本地均衡,这样即使主控故障,每两节之间的均衡也不会停。这个拓扑的缺点是成本高一些,但对于备用电源这种可靠性和寿命优先的场景,多花钱买稳定非常值得。
5.2 备用电源场景的协同细节
备用电源和动力电池场景对均衡的要求不太一样。备用电源大部分时间处于浮充或待机状态,外部充电电流可能只有0.5A,这时候如果均衡电流开太大,低电压电池接收的转移能量比充电电流还猛,电压会被顶起来,造成新的不平衡。我的策略是均衡电流上限动态调整:检测到外部充电电流小时,自动把目标均衡电流压低到0.4A甚至更低。
还有一点是关于SOC估计。均衡动作会让电池电压出现短暂偏移,如果系统在均衡过程中读取电压来估算剩余容量,会得到偏差值。我在软件里加了一个“静置窗口”:每次均衡停止后,至少等几分钟再允许做SOC计算。虽然这会让状态刷新变慢,但数据准确更重要。
5.3 实操中我的几条体会
这套系统前前后后改了三版,最大的体会是:两串均衡看着简单,真正费时间的不是原理图,而是“什么时候该均衡、什么时候该停”的边界调优。状态机做好、迟滞窗口调稳,比多做几十行炫技代码有价值得多。
调试阶段有个好用的技巧:在电池两端并联一个可调电子负载或者可编程电源,用来模拟人为失配。这样不用每次都用真实电芯去耗电、充电,测试速度能快好几倍。把其中一节电池人为拉低0.2V,观察状态机是否按预期启动反向均衡,再逐步把压差缩小,验证迟滞窗口的边界。
另外,不同批次的MP2642GR-Z在具体电气参数上可能有细微差异,方案定型前一定要以手上采购批次的数据手册为准。我吃过一次亏,照旧版规格书画板,结果新批次芯片的欠压阈值不一样,导致均衡启动条件变了,重新调试花了不少时间。量产设计时建议锁定批次,并在硬件上预留微调电阻位,给批次差异留后路。
最后还想提一个常被忽略的点:均衡系统不是“补救装置”,而是“维持装置”。等电芯之间已经拉开了300mV压差再指望均衡力挽狂澜,效果会很差。最好从新电池组一开始投入使用就启用主动均衡,让压差一直保持在30mV以内的健康区间。这样对整个储能备电系统的寿命收益,远比等故障出现后再想办法大得多。