资讯动态

基于MP2642GR-Z与PIC18F97J60的2S磷酸铁锂被动均衡BMS设计

发布时间:2026/10/15 4:43:16 来源:尧图企业网站定制
前阵子做一款可用作备用电源的储能模块电池侧是两串磷酸铁锂电芯目标很明确长期浮充、循环充放后不能出现某一节被过充或被过放。最初原型板只靠充电管理芯片自身的过压保护来兜底结果跑了不到两个月两节电芯的压差从十几毫伏漂到一百多毫伏保护逻辑频繁触发容量也在肉眼可见地往下掉。后来我把均衡功能单独拉出来做用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.3VADC满量程就是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以内已经被我搬到了后续的更大容量储能设计中。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑