☰
基于MP2642GR-Z与PIC18F97J60的2S磷酸铁锂被动均衡BMS设计
2026/10/15 4:43:09 网站建设 项目流程

前阵子做一款可用作备用电源的储能模块,电池侧是两串磷酸铁锂电芯,目标很明确:长期浮充、循环充放后不能出现某一节被过充或被过放。最初原型板只靠充电管理芯片自身的过压保护来兜底,结果跑了不到两个月,两节电芯的压差从十几毫伏漂到一百多毫伏,保护逻辑频繁触发,容量也在肉眼可见地往下掉。后来我把均衡功能单独拉出来做,用MP2642GR-Z负责均衡通道的开关与采样,用PIC18F97J60做主控和以太网通信,才把这个短板补上。这篇文章就把这套方案的完整思路、硬件设计、均衡算法、实测数据和量产前踩过的坑都写出来,给正在做储能BMS、备用电源均衡或2S电池组管理的朋友做个参考。

这套组合最有价值的地方,在于PIC18F97J60天生自带以太网MAC和PHY,省掉了外挂网络控制器,均衡状态、单体电压、温度这些数据可以直接通过网络上报;而MP2642GR-Z这类均衡控制IC负责把“均衡动作”落地,主控只管逻辑和通信。等于一颗MCU同时干了电池管理和远程监控两件事。下面从为什么需要均衡讲起,一步步拆开整套设计。

1. 两串电池为什么必须均衡:失衡机理与策略取舍

1.1 失衡是怎么一步步累积出来的

很多人以为两节电芯出厂电压一致、内阻一致,串联使用就不会有问题。实际上只要循环次数一多,电芯的一致性必然被打破。根源有三个:

第一是容量差异。同一批电芯也有离散性,容量大的电芯在放电时电压掉得慢,容量小的掉得快。串联回路电流相同,容量小的先到放电截止电压,系统为了保护它只能提前停机,这时容量大的还没放完,白白浪费。

第二是自放电率差异。电芯内部微短路程度不同,静置时自放电速度不同。备用电源经常处于浮充状态,自放电快的那节长期会偏低。

第三是温度梯度。电池包内电芯位置不同,散热条件不同,内阻随温度变化也不同,导致充电时电流分配在电芯内部并不完全均匀。

更麻烦的是,这个失衡是会自我放大的。高电压的电池在浮充时更容易被充得更满,析锂和容量衰减速度加快,容量越小就越容易过充,形成恶性循环。所以“两串电池不用均衡”这种想法,只适合寿命要求低、功率小的玩具级设备,储能和备用电源绝对不行。

1.2 被动均衡和主动均衡,我为什么先做被动方案

均衡按能量处理方式分成两类。被动均衡也叫耗散均衡,原理是把电压较高的电芯通过电阻放电,把多余能量以热量形式消耗掉。主动均衡则用电感、电容或变压器把高电压单元的能量搬到低电压单元,能量不浪费但电路复杂。

两串电池的被动均衡实现起来非常直接:哪节电压高,就闭合哪节的放电MOS,把它的端电压拉下来。成本低,BOM面积小,控制逻辑简单,对主控的算力要求也低。缺点同样明显,均衡电流通常只能做到几十毫安到一百毫安,否则板子和电阻扛不住发热;而且均衡时机偏重“充电后期”和“浮充阶段”,因为只有在有充电电流补充时,放电才不会让电池包总电压明显下降。

主动均衡看着美好,但两串场景下收益有限。两节电芯之间做能量搬移,需要至少一个开关管、一个电感或变压器、一套同步整流控制逻辑,PCB面积翻倍,调试难度也上一个台阶。对于备用电源这种大部分时间处于浮充状态的系统,被动均衡已经足够维持电芯一致性。我的结论是:先做被动均衡把系统稳定下来,如果后续产品对充电时间敏感、需要大均衡电流,再升级主动均衡拓扑,这时候主控逻辑和采样网络都不用推翻重做。

1.3 芯片组合的分工依据

选MP2642GR-Z搭配PIC18F97J60,不是拍脑袋定的。均衡系统本质上分三块:感知、决策、执行。

感知靠电压、温度采样。PIC18F97J60内部有10位ADC,但直接用单端ADC去测两节串联电池中每一节的电压并不现实,因为第二节电池的负极悬浮在第一节电池的正极上,需要差分采样的前端电路,这部分可以用仪表放大器配合MP2642GR-Z内部的采样通道来做。

决策靠主控。PIC18F97J60虽然是一款8位MCU,但跑均衡状态机、阈值判断、以太网协议栈绰绰有余,而且它自带以太网MAC和PHY,做远程监控不需要再加网络芯片。

执行靠MP2642GR-Z。均衡动作的本质是“受控放电”,主控说开,均衡通道才开;主控说关,立刻关。MP2642GR-Z在这套方案里相当于主控的“手”:负责驱动外部放电MOS、采集充放电路径的电流信号、提供过流和过温保护信号。主控只通过I2C这类总线发送配置和读取状态,均衡功率路径不经过MCU,安全隔离也更清晰。

2. MP2642GR-Z 均衡通道的硬件设计:从采样到放电回路

2.1 电压采样网络:差分放大才是关键

两串电池的中间节点是浮动节点,不是系统地。如果直接用PIC的ADC引脚去测第二节电池电压,ADC输入范围很可能超限,而且共模电压会把采样结果彻底带偏。这里必须用差分方式:第一节电池的正极接仪表放大器的同相输入,负接它的反相输入;第二节电池的测量则要参考第一节正极,而不是系统GND。

实际电路上,我在每一节电池两端都并了一个高阻值分压网络,分压后送入仪表放大器,放大倍数按ADC量程来算。PIC18F97J60工作在3.3V,ADC满量程就是3.3V,而磷酸铁锂单节电压通常在2.0V到3.65V之间,放大倍数取1到2倍就够。关键是绝对电压不用特别准,均衡看的是“两节之间的差值”,所以通道的共模抑制比和温漂比绝对精度更重要。选仪表放大器时,优先看共模抑制比,至少80dB以上,否则采集出来的差压信号会掺杂共模噪声,导致误均衡。

有一点必须提醒:不要为了省成本,直接用两个电阻分压做单端采样然后软件做差。我最初就想这么干,结果低端电芯的采样精度非常差,因为芯片内部ADC的参考地是GND,而低端电芯的正极已经在GND之上,分压后的“地”实际上是浮的,软件算出来的差值噪声大得根本没法用。后面换成仪表放大器方案,压差读数立刻稳定下来。

2.2 均衡放电回路参数计算

被动均衡的放电回路很简单:电池正极经过放电MOS、限流电阻回到电池负极,开关由MP2642GR-Z的输出引脚控制。回路的参数主要是均衡电流和电阻功率,这两个值是设计核心。

我按均衡电流80mA来设计。单体电压取磷酸铁锂常见平台电压3.2V,均衡电阻上的压降约等于电池电压减去MOS导通压降和线阻压降,按3.1V估算,电阻值就是:

R = 3.1V / 0.08A ≈ 38.75Ω

取标准电阻39Ω。电阻实际耗散功率:

P = 0.08² × 39 ≈ 0.25W

考虑到均衡可能连续开几个小时,电阻不能卡着0.25W选,我用了1W规格,留出4倍余量。实测表面温度最多温温的,不会烫手。

均衡电流并不是越大越好。电流大了,电阻发热量线性上升,PCB局部温升会拉高旁边采样电阻的温度,进而影响电压读数精度,形成“热漂移-误均衡-继续发热”的恶性循环。80mA对于2S备用电源系统是足够用的,因为电芯压差一般也就几十毫伏,用80mA放电几个小时就能把压差压回阈值内。

2.3 保护逻辑与供电设计

均衡系统再怎么强调安全都不过分。MP2642GR-Z的硬件保护我只保留了两种:一是均衡电流的过流保护,通过采样电阻上的压降触发硬件关断;二是NTC温度保护,热敏电阻贴在电芯表面,温度超过45℃就禁止均衡。软件保护放PIC里做,包括均衡超时保护、压差突变保护和通信超时保护,一旦发现数据异常立即封锁均衡输出。

供电方面,PIC18F97J60的以太网PHY需要3.3V,所以系统电压先从外部母线降到5V,再用LDO降到3.3V给主控。MP2642GR-Z的驱动电源我直接从电池组的最高节点取,经过稳压后供内部逻辑和栅极驱动,这样能保证放电MOS的栅极驱动电压够高。要特别注意的是,均衡放电MOS放在低端还是高端,决定了驱动电路复杂度。我的方案是把放电MOS放在电池负极一侧,也就是低端驱动,源极接近浮空系统的参考点,栅极驱动电路大幅简化。

3. PIC18F97J60 的均衡状态机与以太网上报

3.1 均衡状态机的状态定义

主控逻辑不能是“压差大于阈值就开放电”这种单条if语句,否则系统会很不稳定。我把它拆成状态机,总共五个状态:空闲、检测、均衡、完成、故障。

空闲状态下,均衡输出全部关闭,主控周期性做电压采集和自检。检测状态下,主控判断压差是否超过启动阈值,以及温度、电流是否满足均衡条件。均衡状态下,高电压电芯对应的放电通道开启,按固定周期刷新电压值。完成状态表示压差已经收敛到停止阈值以下,这时需要锁存一小段时间再回到空闲,防止刚停就重新触发。故障状态下,均衡被硬件和软件同时封锁,必须通过上位机清零或断电重启才能恢复。

这套状态机的核心思想是“每次只允许一个动作发生”。两节电池中只有较高的一节能放电,绝不能出现两路同时开启的情况,那样等于人为制造短路。MP2642GR-Z的通道使能位在主控端做互斥,硬件上也用输出引脚直接控制两路MOS,软件和硬件双重保险。

3.2 均衡判定算法与防抖处理

均衡阈值的设计直接影响电池寿命。我用的启动阈值是30mV,停止阈值是10mV,中间加了一个20mV左右的迟滞带。为什么不把启动阈值设到5mV?因为采样系统本身有噪声,太小的阈值会导致均衡频繁启停,放电MOS和电阻的热循环应力会显著增加。

判定流程可以用下面这段伪代码表示:

每500ms读取两节电池电压v1, v2 if (状态 == 空闲) { if (|v1 - v2| >= 30mV && 温度在10~45℃) { 进入检测状态,连续确认3次 } } if (状态 == 检测) { if (连续3次|v1 - v2| >= 30mV) 进入均衡状态 else 回到空闲 } if (状态 == 均衡) { if (v1 > v2) 开启通道1 else if (v2 > v1) 开启通道2 else 两路全关 if (|v1 - v2| <= 10mV) { 连续保持5分钟,进入完成状态 } }

这里有三处防抖:进入均衡前连续确认3次;均衡结束后连续保持5分钟;整个均衡过程超过8小时仍未收敛,直接进故障状态。8小时这个上限是拍脑袋定的吗?不是。按80mA均衡电流,假设电芯容量差为1%,也就是3Ah电芯差30mAh,把这30mAh通过80mA放掉需要大约22分钟。8小时足够处理3%以上的容量差,如果还收敛不了,说明是电芯本身出了问题,继续均衡只会浪费能量甚至加速劣化。

3.3 远程监控数据帧设计

PIC18F97J60的价值在这里体现。备用电源设备经常放在机柜、地下室甚至户外,人不可能频繁到现场用万用表测压差,远程监控是硬需求。我用的协议栈是芯片原厂提供的开源TCP/IP栈,跑在PIC上,内存占用要精打细算。实测下来,TCP连接开个两三条没问题,但如果有大量并发请求,响应会很吃力。所以我默认推荐UDP或者Modbus TCP里的少量周期请求模式。

上报数据帧我按最小化设计,结构如表格所示:

字段长度说明
帧头2字节0xAA 0x55,用于帧同步
设备地址1字节电池模块编号
命令字1字节0x01查询、0x02控制、0x03配置
状态位1字节均衡通道开关状态、故障标志
电压数据4字节两节电池电压,各占2字节,单位mV
温度数据2字节NTC采样值换算的温度,单位0.1℃
均衡时间2字节本次均衡累计时间,单位分钟
CRC162字节从帧头到均衡时间的循环冗余校验

设备端每10秒主动上报一次完整状态,上位机也可以随时下发查询命令。故障状态下上报频率提到每秒一次,方便运维端第一时间弹出告警。整个过程PIC都能扛得住,因为8位MCU跑轻量协议栈时,瓶颈主要在RAM而不在CPU,数据帧短加上发送频率低,完全在能力范围内。

4. 实测数据与标定:压差收敛过程复盘

4.1 测试台架与初始条件

实验室里我搭了一套台架:两节磷酸铁锂电芯,标称容量3Ah,通过人工预循环让其中一节容量偏低,静置两小时后两节电压差稳定在108mV。环境温度25℃。电池包接上均衡板,PIC18F97J60通过以太网口把数据实时打印到调试主机上。

这里要特别说清楚一点:均衡动作最好在充电态或浮充态下做。如果电池包处于带载放电状态,内部极化会导致端电压波动很大,均衡判断容易失真。我测试时给电池包挂了一个很小的浮充电源,维持总电压不变,这样均衡放电的能量由外部电源补充,不会把整包电压拉低。

4.2 均衡过程数据

从开启均衡开始记录,每隔一段时间取一次读数,数据如下:

时间(min)电芯1电压(mV)电芯2电压(mV)压差(mV)均衡通道
033523244108通道1开启
203348325098通道1开启
603339326574通道1开启
1203327328245通道1开启
1803318329721通道1开启
2203312330210通道1开启
280330833062通道1关闭,进入完成状态

曲线整体符合预期,前120分钟均衡速度快,后面越来越慢。这是因为被放电的电芯电压下降后,均衡电阻两端压降变小,放电电流随之减小,是一个自然衰减过程。108mV压差在不到4小时内收敛到10mV以内,对于备用电源来说完全够用。

但我也观察到一个问题:均衡过程中读到的电压并不是平滑下降的,中间有几处突然跳变几毫伏。后来查明原因是放电MOS开关瞬间引起的采样扰动,跟电池内阻有关,不是采样链路坏了。处理方式是在软件里做了50ms采样延时,跳过开关动作瞬间的暂态,数值立刻稳定。

4.3 标定与干扰排查

电压采样的标定是这类型项目里最容易被低估的工作。PIC18F97J60的ADC虽然自带10位分辨率,但单独用ADC原始值算电压,误差可能到正负20mV,这对10mV停止阈值来说是致命的。我在生产测试阶段加入了一个校准工序:用高精度万用表测每节电池电压,同时读取ADC值,在掉电时把校准系数写进EEPROM,每次开机加载。

还有一类干扰来自于以太网瞬态电流。PIC18F97J60在发送网络数据包时,内核电流会有一个明显的脉冲,如果模拟电源和数字电源没有做好隔离,ADC读数会被拉偏。我后来在给PIC供电的LDO输出侧加了一个RC滤波,模拟参考电压单独走星形接地,数据包发送期间暂停电压采样,三管齐下才把波动压到2mV以内。这也是为什么我坚持每500ms只做一次采样,而不是连续高速采样,稳定比频率重要。

5. 量产前我踩过的几个坑

5.1 PCB布局:采样地与功率地必须分离

原理图上看着没问题,打样回来一测,压差读数在均衡启动前后会跳10mV以上,原因就是PCB铺铜时功率地和采样地混在了一起。均衡放电电流虽然只有80mA,但MOS开关瞬间的di/dt会在功率地上砸出尖峰,采样地只要蹭到一点,差分放大器输入端就会引入噪声。

后来我把整个PCB的地分成三个区域:功率地(均衡放电回路)、模拟地(仪表放大器、NTC分压)、数字地(MCU和以太网)。三块地在电源入口处单点汇合,采样线从电池端子直接拉到仪表放大器输入端,不走长距离,并且包地处理。修改后均衡开启瞬间的读数跳变从10mV降到1mV以内。这个教训很直观:均衡板的核心指标不是“能不能放电”,而是“放电时采样还准不准”。

5.2 浮充工况下均衡策略要单独调整

备用电源大部分时间挂在母线浮充,电池电压被外部电源死死抬着,这时候压差可能看起来很小,但拔掉市电进入备电模式后,压差立刻放大。我最初用同一个阈值跑循环模式,结果浮充时均衡不开启,备电时又来不及均衡。后来加了一个模式识别:根据充放电电流方向和母线状态判断当前是浮充还是循环,浮充模式下只要压差超过15mV就启动均衡,循环模式下才用30mV阈值。这个修改非常有效,浮充期间慢慢把压差磨平,到了真正备电时电芯就是整齐的。

5.3 远程升级和数据持久化

PIC18F97J60支持通过以太网做固件升级,这是产品交付后省心的重要功能。但8位MCU做在线升级有个风险:升级过程中断电,设备就变砖了。我的做法是Flash分成两个区,一个放引导程序,一个放应用,升级包先写入备份区并做完整的CRC校验,确认无误后再切换启动入口。升级过程中均衡输出强制关闭,杜绝“老固件逻辑配新固件数据”的混乱状态。

另一个容易被忽略的是校准系数存储。每个板子的采样通道都有微小差异,出厂校准后的系数如果只存在RAM里,掉电就丢了,下一次开机又得重新校准。我放在EEPROM里,同时存两份并带校验位,读出来不一致就报警提示重新标定。这样长期使用后即使个别板子EEPROM异常,也不会带着错误参数继续运行。

最后想提醒一句:均衡不是独立功能,它嵌在整个电池管理逻辑里面,选型再好的均衡IC,采样不稳、策略不当、布局不合理,一样白搭。我给所有想做2S均衡方案的人同一个建议:先搭一个最小原型,用示波器盯住均衡开启瞬间的采样波形,把所有噪声源头解决干净,再谈算法和优化。这套方案改完测试了几个月,压差始终稳定在10mV以内,已经被我搬到了后续的更大容量储能设计中。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询