串联电池均衡这件事,做过储能和备用电源的人都有体会:电池单体标称一致,但容量、内阻、自放电率总有差异,串联用一段时间后电压就会拉开。这个项目用的核心器件是MP2642GR-Z和PIC18F97J60,目标是管理一个2S电池组中两个串联单元的均衡,既要保证充电不过压,又要保证放电不欠压,还得把运维人员最关心的电池数据远程上报。
我先把话放前面:这种两个串联单元的均衡方案,看起来比几十串的大BMS简单很多,但真做起来,采样精度、均衡策略、保护逻辑一个都不能少。这篇文章把从硬件选型、电路设计到软件算法、调试踩坑的完整过程拆开讲清楚,适合正在做小容量储能、UPS备用电源、便携储能电源的工程师参考,也适合刚接触BMS均衡设计的人拿来当一份实战地图。
1. 项目概述与均衡需求拆解
1.1 为什么两个串联电池也必须要均衡
很多人有个误区,觉得两串电池没说头,均衡不均衡无所谓。实际完全不是这么回事。铅酸、磷酸铁锂、三元锂,只要两个电芯是串联的,充放电电流就是同一个回路电流,但两只电芯的荷电状态变化量却可能不一样。
原因是多方面的:电芯出厂容量有离散性,同一个厂家同一批次,容量可能差1%到3%;内阻不一样,同样的电流流过,发热和端电压变化就不同;自放电率不同,静置几天后开路电压就会拉开。最关键的是,温度梯度会让差异进一步放大,靠近发热源的那只电芯温度高,化学反应速度快,表现出的电压和容量特性会跟另一只明显不同。
不均衡的后果分两个场景看:
- 充电场景:两只电芯串联,充电电流傻乎乎地一视同仁,先充满的那只电压会持续升高。过压保护如果没触发,电芯就会析锂或者膨胀,安全风险直接拉满。就算保护触发,整个电池组也因为“木桶效应”充不进去多少电,可用容量被严重浪费。
- 放电场景:容量小的那只先放干,电压迅速跌落,再继续放电就变成过放,电芯内部结构受损,容量永久衰减。系统表现为带载时间越来越短,用户觉得电池不耐用。
在我做的这个储能备电项目里,客户对两个电芯的要求是:充电截止时两只电芯电压差不大于30mV,放电末端电压差不大于50mV。这个指标单靠挑选电芯配对是维持不住的,必须靠主动均衡策略去压住。
1.2 方案选型:主动均衡与被动均衡的取舍
均衡电路有两条主流路线,先帮大家理清楚区别。
被动均衡的思路很直接,哪只电芯电压高了,就给它并联一个放电电阻,把多余的能量以热量形式放掉,直到跟低电压那只齐平。优点极其突出:电路简单,成本低,不需要复杂控制,一颗采样芯片加几个MOSFET和电阻就够。缺点也明显:能量被白白浪费掉,均衡功率大的时候发热量可观,PCB散热处理不好会很难看。
主动均衡的思路是把能量从高电压电芯搬到低电压电芯去,理想情况下能量不浪费。工程上常见两种实现方式:电感式(buck-boost拓扑)和开关电容式(飞渡电容)。电感式均衡效率高、均衡电流大,但控制复杂,需要PWM驱动、电流检测、续流路径设计。开关电容式结构更简单,但均衡电流受开关频率和电容容量限制,效率也不如电感式。
这个项目最终选定的是电感式主动均衡路线。核心原因有两个:第一,备用电源系统对效率敏感,被动均衡的发热在紧凑的机箱里不好处理;第二,MP2642GR-Z这颗芯片本身就是为双向有源均衡设计的控制器,用它搭buck-boost均衡拓扑,电路复杂度可控,外围器件数量反而不比被动均衡方案多太多。主控端用PIC18F97J60负责电压监测、均衡决策、以太网通信,形成完整的控制闭环。
| 对比项 | 被动均衡 | 电感式主动均衡 |
|---|---|---|
| 能量流向 | 高电压电芯经电阻放电 | 高电压电芯向低电压电芯转移 |
| 效率 | 低,热量损耗 | 高,一般可达85%以上 |
| 均衡电流 | 受散热限制,通常50-200mA | 可以做到1A以上 |
| 控制复杂度 | 简单,开/关控制 | 需要PWM和电流/电压闭环 |
| 适用场景 | 消费电子、小容量电池组 | 储能、备电、动力电池等大容量场景 |
选型也考虑了成本。虽然主动均衡的BOM成本比被动均衡高一些,但在备用电源这种“常年在线、浮充储能”的应用里,均衡充进去的每一瓦能量都是有经济价值的,多花十几元硬件成本换来更长的电池寿命和更少的运维次数,这笔账算得过来。
2. 硬件核心:MP2642GR-Z 与 PIC18F97J60 的分工特性
2.1 MP2642GR-Z 在均衡通路里扮演的角色
MP2642GR-Z在这套系统里是均衡功率级的控制核心。我用它搭建了一个基于同步buck-boost拓扑的双向均衡变换器,它负责产生驱动信号,控制功率MOSFET的开关时序,把高电压电芯的能量搬运到低电压电芯。
这颗芯片的几个关键特性对设计很有用:
第一,它支持双向能量流动。均衡不需要人为判断方向,芯片根据控制信号自动调整PWM占空比和开关时序,能量能从电池1流向电池2,也能从电池2流向电池1。这正好匹配电池均衡场景——充电时高电压那只是放电侧,放电时容量小那只是被充电侧,方向实时变化。
第二,集成了峰值电流控制环路。均衡变换器工作在CCM(连续导通模式)下,电流控制环路让电感电流精确可控,均衡电流设定值由外围电阻或控制引脚决定,不用在MCU里跑复杂的PID。主控只需要告诉芯片“我要多大电流”,芯片自动维持这个电流,电压闭环、限流保护、短路保护都有硬件兜底。
第三,保护功能齐全。过流保护、过温保护、欠压锁定这些都有内部比较器实现,动作速度是微秒级的,比MCU中断快得多。储能系统维修时经常带电操作,保护功能多一层,安全余量大一分。
外围电路的核心器件选型同样关键。举几个参数聊聊:
- 功率MOSFET:均衡电流设计目标是1.2A,MOSFET选择耐压30V以上的N-MOS,导通电阻尽量低于20mΩ,栅极电荷Qg不要太大,否则驱动损耗会增加。我用的两颗MOSFET是相同的型号,保证上下管对称性,避免其中一颗先发热。
- 储能电感:电感量决定纹波电流大小。在这个拓扑里,开关频率设定在300kHz,按照1.2A输出电流,纹波电流按30%设计,电感量取22µH。电感饱和电流要大于峰值电流的1.3倍,DCR越低效率越高,我用的是绕线贴片电感,DCR在50mΩ左右。
- 电流采样电阻:采样电阻用1%精度的低阻值合金电阻,阻值在10mΩ级别。电压信号会送到MP2642GR-Z内部的电流检测放大器,实现高边或低边电流采样。注意采样走线必须用开尔文接法,直接从电阻两端引脚走差分线,千万不能经过过孔和长走线,不然采样到的电压会被功率电流的IR压降污染。
2.2 PIC18F97J60 的资源分配与管理中枢职责
PIC18F97J60这颗MCU最特别的地方是内置了以太网MAC和PHY,不需要再接外部网络芯片,省掉了并口连接和驱动代码,在储能和备用电源这种需要远程监控的场景里非常合适。
我在项目里把它的角色定位成“大脑”加“通信网关”,承担以下任务:
- 电池电压采样:两个电池单元的电压通过分压电阻网络送入ADC,PIC18F97J60的ADC是10位精度,参考电压用外部2.5V基准源。分压比设计成在满电电压4.2V时ADC输入约3.0V,留足余量。10位分辨率在3.3V量程下每LSB约3.2mV,折算到电池端约4.5mV,用来做均衡判断还是够用的。如果追求更高精度,可以用外部16位ADC扩展,通过SPI接口读取,这个我放在后面的扩展建议里细说。
- 均衡决策与控制:MCU根据采集到的电压差、电池温度和系统工作状态,决定启动均衡的方向、电流大小和持续时间,然后通过GPIO向MP2642GR-Z发送控制信号,比如设定参考电流、使能输出。整个决策周期控制在100ms以内。
- 系统状态监控:除了电压,还有温度传感器(NTC热敏电阻)监测电芯和均衡功率级的温升。硬件保护先动作,软件再做二次保护,两者配合。
需要提醒的是,PIC18F97J60是5V供电的单片机,而MP2642GR-Z可能工作在不同电压域,两者之间不能用传统TTL逻辑直连,电平转换这道工序建议别省。我用的是两路MOSFET搭建的双向电平转换电路,速率足够且双向传输,调试时少了很多麻烦。
2.3 关键外围器件选型与参数确认
| 器件 | 选型参数 | 设计说明 |
|---|---|---|
| 分压电阻 | 精度0.1%,温漂25ppm | 两个单体分压比必须严格一致,否则采样误差比均衡误差还大 |
| MOSFET | 30V耐压,20mΩ内阻 | 均衡电流1.2A,导通损耗约30mW,散热压力小 |
| 电感 | 22µH,饱和电流3A | 纹波电流按30%设计,CCM状态稳定 |
| 采样电阻 | 10mΩ,1%精度 | 开尔文走线,避开功率地环路 |
| 温度传感器 | NTC 10kΩ B值3950 | 贴在电芯表面和均衡电感附近 |
| 基准源 | 2.5V,0.1%精度 | 给ADC提供外部参考,避免温漂影响 |
还有一件事容易被忽略:复位电路和看门狗。备用电源系统的特点是常年通电,MCU跑几个月不重启,网络协议栈出bug或者程序跑飞了自动恢复能力很重要。我在硬件上加了独立的看门狗芯片,喂狗时间2秒,比MCU自带的看门狗更可靠,因为MCU自带的看门狗如果代码死循环刚好包含了喂狗指令,就完全失效了。
3. 软件与均衡控制算法实现
3.1 电压采集链路与软件滤波处理
均衡控制算法的基础是电压采集,采集数据不准,后面说什么都是白搭。这个项目的电压采集链路分三块:硬件分压、ADC采样、软件滤波。
硬件分压我在前面说过,重点是两只电芯的分压电阻阻值要选一样精度等级的,我用了0.1%精度、25ppm温漂的精密电阻。这里要展开说一个容易踩的坑:分压电阻的阻值取值不能太大,也不能太小。太大,ADC输入端的漏电流和PCB漏电流会导致明显误差;太小,电阻本身会持续消耗电池能量。我实测过,在普通FR-4板子上,湿度高的时候漏电流能到微安级,如果分压电阻用的是兆欧级,这个漏电流造成的电压误差会超过10mV,严重影响均衡精度。最终取值在采样端等效电阻100kΩ左右,跟ADC输入阻抗匹配后误差可控。
软件滤波方面,ADC采样值我用了两级的处理方式。第一级是移动平均滤波,窗口长度16次,每次采样间隔10ms,滤掉高频噪声。第二级是一阶低通滤波,系数0.2,进一步平滑数据,同时保证100ms的响应时间不会滞后太多。经过两级滤波之后,静止状态下电压读数波动控制在了±2mV以内,这个精度做30mV均衡阈值判断是足够的。
还有一个细节:ADC采样时序要和均衡开关时序错开。均衡变换器300kHz开关,开关沿附近的噪声对模拟采样影响很大。解决方法是软件里做了同步——MCU在关闭均衡PWM的瞬间,或者至少在均衡开关的稳定区间去触发采样。这样做下来,核对时发现采样数据比之前干净了一个数量级。
3.2 均衡判定逻辑与迟滞保护
均衡判定的设计原则是“能不均衡就不均衡,要均衡就一次到位”。过于频繁地启停均衡,既浪费能量,又会让MOSFET反复承受热应力。
判定逻辑分三层:
第一层是静置判定。只有电池组处于充电状态或者静置状态才允许均衡,放电过程中不均衡。因为放电时两只电芯的电压差是动态变化的,此时均衡没有意义,甚至可能把本来就紧张的电量白白搬运一遍。通过检测充放电电流方向来判断状态,用一颗低边电流检测采样通过霍尔传感器或采样电阻完成。
第二层是压差阈值判定。启动均衡的条件是压差大于50mV,并且持续时间超过10秒。加时间条件是为了防止瞬间的负载切换造成误动作。均衡开始后,压差会逐渐收窄,当压差小于20mV时停止均衡。这50mV和20mV之间形成了30mV的死区,也就是迟滞回线,避免均衡在阈值附近反复振荡。
第三层是均衡超时与保护。假设电芯内部的异常导致压差一直无法收敛,均衡会一直跑下去,白白消耗能量还可能让电芯过热。我设置了最长均衡时间,默认是2小时,超时后强制停止,并上报告警。电池温度超过55℃时,不管算法处于什么状态,都要暂停均衡,等温度降到安全范围再恢复。
均衡方向的控制也写在算法里:充电阶段,高电压电芯通过MP2642GR-Z把能量送给低电压电芯,等效于减缓了高电压电芯的上升速度;静置阶段,如果压差大,优先放电侧是高压电芯,让能量向低压侧流动。方向判断的规则简单说就是“高压往低压送”。
3.3 状态机设计与以太网远程上报
为了让整个系统的逻辑清晰,我给软件搭了状态机框架,状态划分如下:
| 状态 | 进入条件 | 动作 | 退出条件 |
|---|---|---|---|
| IDLE | 上电初始化完成 | 监测电压、温度 | 压差超过启动阈值 |
| CHARGING | 检测到充电电流 | 正常充电,判均衡 | 电流消失 |
| EQUALIZING | 压差大于阈值且状态允许 | 使能均衡,调整方向 | 压差收敛、超时或温度过高 |
| FAULT | 任何保护触发 | 关闭均衡,上报 | 故障清除 |
状态机的好处是每一步都有确定性的进入和退出条件,调试时通过打印当前状态可以快速判断系统在干什么。我用了一个串口调试命令读取状态变量,配合逻辑分析仪观察均衡使能信号,这套调试手段在我排查问题时帮了大忙。
以太网上报部分,PIC18F97J60跑了一个轻量级TCP/IP协议栈。考虑到备用电源系统大多部署在无人值守的机房,网络上报的数据要简洁有效。我定义了一个长度84字节的数据帧,包含:设备编号、两个电池单元电压(毫伏精度)、温度、均衡状态、均衡电流、均衡累计时间、故障码。每5秒向服务器上报一次,服务器端做存储和告警展示。如果网络断开,数据缓存在本地Flash里,恢复连接后按时间戳补报,保证数据不丢失。
这里补充一个实用的调试经验:以太网调试时,先用固定IP加网线直连电脑,抓包看报文格式,确认协议栈和MAC地址配置无误后,再接入实际网络。一上来就接交换机,万一IP冲突或网关配置错误,排查问题会很费劲。
4. 调试过程与常见问题排查
4.1 从原型到稳定运行的调试流程
调试过程我按模块分层推进,每一层验证通过再去调下一层,不要指望一次上电就能跑通全系统。我的调试顺序是这样:
第一步,先验证电源和MCU最小系统。给板子上电,测量各路电源电压,确认MCU晶振起振、复位正常,用LED闪烁程序验证固件能正常烧录运行。这一步通常半小时能搞定。
第二步,验证电压采集链路。在电池插座处用可调电源模拟两个单体电压,比如一个3.8V一个4.0V,然后串口打印ADC采样值,核对换算后的电压与万用表读数是否一致。这里能发现分压电阻焊错、基准电压不对、ADC参考电压配置错误等问题。我调试时发现过基准源焊接虚焊导致ADC读数是满幅值的问题,这种问题在电压模拟阶段暴露比在真实电池上暴露容易排查得多。
第三步,验证均衡变换器。先不给MCU软件控制逻辑,用示波器观察MP2642GR-Z的PWM输出,确认频率和占空比范围正常。然后接上电阻负载,验证均衡电流与设定值一致。最后再接入真实电池,使能均衡,观察电芯电压差是否按预期收窄。这里我遇到过一次PWM波形毛刺的问题,排查后确认是功率地和控制地没有单点连接导致的,重新布局后解决。
第四步,联调以太网通信。固定IP直连电脑,确认数据帧接收正常后,再接入实际网络环境,测试断线重连和数据缓存补报逻辑。
4.2 遇到的典型问题与解决思路
调试过程中踩过的坑不少,这里挑几个典型的写出来,这些经验在常规文档里基本找不到。
问题一:电压采样跳变,同一只电芯的采样值在3.90V和3.95V之间来回跳
排查过程:先用万用表实测电池端电压,稳定在3.92V,排除电池本身问题。再用示波器测ADC引脚,发现有一个频率约300kHz的纹波叠加在直流分量上。这就明白了,是均衡变换器的开关噪声串进了采样链路。
解决办法:硬件上把采样走线从功率回路旁边挪开,加一个小型RC滤波器(100Ω加1µF),截止频率约1.6kHz,对10Hz级别的电压变化毫无影响,但对高频开关噪声衰减很明显。软件上做ADC采样与PWM同步,避开开关沿采样。两板斧下来,采样波动降到±1mV。
问题二:均衡启动后电流时有时无,电感发出啸叫声
排查过程:啸叫频率在人耳可听范围,一般是电感在脉动几十到几百赫兹。用示波器抓PWM波形,发现占空比在缓慢漂移,说明控制环不稳定。进一步看,是MP2642GR-Z的补偿网络参数与我的电感、电容组合不匹配,实际电路进入了一种准饱和状态。
解决办法:按照芯片参考设计的计算表格重新算了补偿电阻电容,把环路带宽从原来的120kHz降到30kHz左右,留出足够的相位裕量。参数换完后啸叫消失,均衡电流稳定在设定值。
问题三:以太网通信偶尔断连,重连后要等很久才恢复
排查过程:抓包发现断连时服务器收到了异常长的TCP报文,长度超过缓冲区导致协议栈抛出异常。
解决办法:优化协议栈的缓冲区管理,增加对异常报文的丢弃处理。同时在应用层增加了心跳包重发机制,发现通信异常立即主动断开重建连接,把恢复时间从秒级降到毫秒级。
问题四:均衡2小时后电池没有明显收敛
排查过程:均衡电流只有设定值的一半,用万用表实测电感两端电压,发现输入和输出之间的压差偏大,部分能量消耗在MOSFET导通电阻和线路电阻上。
解决办法:把MOSFET换成导通电阻更低的型号,同时检查焊点虚焊,重新处理均衡功率级的铜箔宽度,减少走线电阻。改进后均衡电流从1.2A提高到了1.5A,均衡速度明显改善。
4.3 排查问题的心得清单
模拟信号地、功率地、数字地要单点汇接,这是噪声问题的第一来源。最初就是因为地没处理好,走了不少弯路。
分压电阻的温漂一致性直接决定均衡精度。两个电芯分压电阻温漂方向不一致,电池温度升高后采样值跟着漂,系统会误判压差。我在最后选型时统一了电阻品牌型号。
均衡变换器的小信号稳定性必须用频率响应分析仪验证,示波器看波形只能确认有没有振荡,无法确认相位裕量。补偿网络参数照搬参考设计不一定适合实际电感电容参数,定量测试才靠谱。
固件里一定要有运行日志。我用了一块8KB的串行Flash存日志,记录每次均衡的启动、停止、异常事件,方便远程故障复现。这个看似不起眼的操作,在客户现场出问题时价值巨大。
备用电源系统的均衡设计还要考虑浮充状态。电池长期浮充时,均衡电流会持续抵消单体自放电差异,逻辑上要允许“涓流均衡”模式,而不是简单用固定阈值控制。我在后期版本里加入了这个模式,均衡启动频率显著降低。
5. 写在最后的体会
这个项目做下来,我最大的体会是:均衡不是一个单纯的“放掉多余电量”的动作,而是一个围绕电池特性、工作状态、安全边界来设计的闭环系统。硬件上MP2642GR-Z把功率变换做得足够可靠,让我能把精力放在上层策略;PIC18F97J60的以太网功能让系统真正具备了无人值守的能力。两个芯片一个管能量,一个管信息,配合好了,整套均衡系统才称得上完整。
另外提一个后续扩展的方向:两个电池单元的均衡只是起点,如果电池组扩展到更多串联节数,MP2642GR-Z可以复用为每相邻两节之间的均衡模块,PIC18F97J60通过SPI总线级联管理多个均衡模块,通信协议延用现有帧结构,就能平滑升级到4S、6S甚至更高电压的储能系统。均衡策略上也可以从电压均衡进一步升级到SOC均衡,结合电流积分估算荷电状态,精准度和实用性都会再上一个台阶。这次先把2S方案做扎实,后续迭代的路已经铺好了。