基于MP2642GR-Z与PIC18F4682的两串电芯被动均衡BMS设计 1. 从两个串联电芯的电压差说起为什么被动均衡依然是储能BMS的务实选择储能和备用电源系统里两串电芯的电压不一致是个绕不开的问题。我接触过不少小型储能项目从户外便携电源到通信基站的后备电池组只要涉及两节锂电芯串联用一段时间后几乎都会出现一个现象一节电压偏高另一节偏低。容量衰减速度不一样、自放电率有差异、温度分布不均匀这些因素叠加起来电压差会越来越大。如果不处理充电时高压那节先到截止电压整个串联组就停止充电低压那节永远吃不饱放电时低压那节先到保护点整组又提前切断高压那节还剩一堆电量放不出来。时间一长整组可用容量被最弱的那节电芯拖死。解决这个问题的手段就是均衡。均衡分两条路线被动均衡和主动均衡。主动均衡用变压器、电感或者电容做能量搬运效率高、发热小但电路复杂、成本高、控制逻辑也麻烦。被动均衡说白了就是给电压高的那节电芯并联一个电阻让它通过电阻放电把多出来的能量以热量形式消耗掉等两节电压拉平了再继续充电。听起来很“笨”但在两串小容量储能和备用电源场景里被动均衡的性价比非常高。电路简单意味着故障点少控制逻辑简单意味着固件不容易出bug成本低意味着整机BOM可控。我这次要聊的方案核心器件是MP2642GR-Z和PIC18F4682。MP2642GR-Z是一颗带均衡功能的电池管理前端芯片PIC18F4682是Microchip的一款8位单片机自带CAN控制器和丰富的外设。两者配合可以在两串电芯的储能系统里实现一套稳定、可配置的被动均衡方案。这套方案适合谁适合做中小功率储能BMS的硬件工程师、做备用电源管理的嵌入式开发者以及想从零理解均衡电路怎么落地的人。下面我会从芯片选型逻辑、硬件电路设计、均衡策略实现、实测踩坑几个维度把整个方案拆开讲清楚。2. MP2642GR-Z与PIC18F4682的选型逻辑为什么是这两颗芯片2.1 MP2642GR-Z在均衡场景里到底扮演什么角色MP2642GR-Z是一颗面向两串电池组的模拟前端内部集成了电压采集、电流采集、均衡驱动和保护逻辑。它最核心的能力是能独立测量每节电芯的电压并且内置了均衡MOSFET的驱动通路。也就是说你不需要在外围再搭一套复杂的运放差分采样电路也不需要单独设计均衡开关的驱动级。芯片通过内部的多路复用和ADC把每节电芯的电压读出来然后通过I2C或者SPI接口把数据送给主控单片机。这里有个细节值得展开MP2642GR-Z的均衡驱动是开漏输出还是推挽输出直接决定了你外围均衡电阻和MOSFET怎么选。根据我实际用下来的经验它的均衡引脚在激活时会拉低适合驱动P沟道MOSFET或者直接驱动N沟道MOSFET的低边开关。如果你用P沟道方案均衡电阻接在电芯正极和MOSFET源极之间MOSFET漏极接地栅极由芯片的均衡引脚控制。这种接法的好处是均衡电流路径清晰电阻上的功耗容易计算。假设你选100Ω的均衡电阻电芯电压4.2V均衡电流就是42mA电阻功耗约0.176W选0603封装勉强够用但长期跑建议上0805或者1206。MP2642GR-Z还有一个容易被忽略的功能它内部有均衡定时器。你可以通过寄存器设置均衡开启的延时和单次均衡的持续时间。这个功能在固件层面能省不少事因为你可以让芯片自己控制均衡节奏单片机只需要定期读电压、判断是否需要均衡、然后写配置寄存器就行。不需要在单片机里跑一个高精度的软件定时器来掐均衡时间。2.2 PIC18F4682为什么适合做这套系统的主控PIC18F4682是一颗8位单片机主频最高40MHz自带32KB Flash、1536字节RAM、1KB EEPROM。放到现在看这些资源不算多但在两串BMS场景里绰绰有余。它最大的优势是集成了ECAN模块也就是增强型CAN控制器。储能和备用电源系统里BMS通常需要和上位机或者PCS通信CAN总线是工业场景里最稳的现场总线之一。你不需要外挂一颗CAN控制器直接差分收发器接上就能用。另一个优势是它的外设组合很实用多路10位ADC、两个比较器、多个定时器、PWM模块、USART、SPI、I2C。MP2642GR-Z如果走I2C接口PIC18F4682的MSSP模块可以直接配置成I2C主机模式硬件层面就搞定了通信。如果走SPI它的SPI模块也支持主从模式。我个人的偏好是用I2C因为MP2642GR-Z的寄存器访问模式更适合I2C的读写时序而且I2C只需要两根线PCB布线简单。还有一点PIC18F4682的工作电压范围是2.0V到5.5V可以直接由电池组经过LDO降压后供电不需要额外的复杂电源树。它的低功耗模式也够用休眠电流在微安级别对于备用电源系统来说待机功耗是个硬指标这颗片子在这方面的表现中规中矩但配合合理的固件调度整机待机功耗可以压到毫安级以下。2.3 两颗芯片的分工边界在哪里很多人会问MP2642GR-Z已经能测电压、能驱动均衡了为什么还要加一颗PIC18F4682直接用MP2642GR-Z的硬件保护逻辑不就行了吗这里的关键在于“策略”和“通信”。MP2642GR-Z负责的是底层模拟量的采集和硬件级的保护动作比如过压、欠压、过流时快速切断充放电回路。但它不具备复杂的策略运算能力也没法直接跑CAN协议栈和上位机通信。PIC18F4682的角色是“大脑”它定期读取MP2642GR-Z的电压数据判断两节电芯的压差是否超过阈值决定是否开启均衡、开启哪一路均衡、均衡多久。同时它还要把电池状态、均衡状态、故障信息打包成CAN报文发给系统其他节点。这个分工的好处是安全相关的保护逻辑放在模拟前端里响应速度快不受单片机固件跑飞的影响策略相关的均衡控制和通信放在单片机里灵活可配置方便后期升级。两者通过I2C或者SPI通信单片机可以定期查询前端的状态寄存器也可以在必要时复位前端。3. 两串电芯被动均衡的硬件设计细节从原理图到PCB布局3.1 均衡电阻和MOSFET的选型计算被动均衡的核心功耗器件就是均衡电阻。选型的第一步是确定均衡电流。均衡电流越大均衡速度越快但发热也越严重。对于两串小容量电芯比如18650或者小容量磷酸铁锂我一般把均衡电流控制在30mA到80mA之间。假设电芯容量是2000mAh两节电芯的容量差是5%也就是100mAh。如果均衡电流是50mA理论上需要2小时才能把100mAh的多余电量放掉。实际使用中均衡通常是在充电过程中或者充电后进行的不会要求一次性放完所以50mA左右的均衡电流是合理的。均衡电阻的计算很简单R V_cell / I_balance。电芯满电电压按4.2V算均衡电流50mAR 4.2 / 0.05 84Ω。取标准值82Ω或者100Ω。如果取82Ω实际均衡电流约51mA电阻功耗P I²R 0.051² × 82 ≈ 0.213W。这个功耗下0603封装电阻的额定功率通常是0.1W不够0805是0.125W还是不够1206是0.25W刚好够但余量不大。我建议用两颗1206电阻并联或者直接用2512封装的电阻留足降额余量。电阻的温漂也要考虑普通厚膜电阻的温漂在100ppm/℃左右均衡时电阻自身发热会导致阻值变化进而影响均衡电流的精度。如果对均衡精度要求高可以选合金电阻或者低温漂的薄膜电阻。MOSFET的选型主要看导通电阻和栅极阈值电压。均衡电流50mAMOSFET的导通电阻即使有1Ω压降也才50mV功耗0.0025W几乎可以忽略。所以不需要选低导通电阻的大电流MOSFET重点看栅极阈值电压是否和MP2642GR-Z的均衡驱动电平匹配。如果MP2642GR-Z的均衡引脚输出低电平是0.4V高电平是3.3V那你选的N沟道MOSFET的Vgs(th)要低于3.3V确保能被完全导通。我常用的是2N7002或者AO3400这类小信号MOSFETVgs(th)在1V到2.5V之间3.3V驱动完全没问题。3.2 电压采集走线的开尔文接法MP2642GR-Z的电压采集引脚必须接到电芯的正负极上但接的位置很有讲究。如果你直接把采集线接到电芯的极耳上而均衡电流路径也经过同一段走线那么均衡电流在走线电阻上产生的压降会叠加到采集电压上导致电压读数偏高或偏低。这个误差在均衡电流50mA、走线电阻50mΩ的情况下是2.5mV看起来不大但如果你把均衡阈值设得很窄比如10mV这个误差就足以导致误判。正确的做法是采用开尔文接法电压采集走线和均衡电流走线从电芯极耳处分开各自走独立的路径。采集走线尽量细因为采集引脚输入阻抗很高几乎不走电流细线不会产生压降。均衡走线要粗因为要走50mA电流线宽不够会导致发热和压降。在PCB布局时采集走线要从电芯连接器的引脚根部直接引出不要和均衡走线共用过孔或者走同一段铜皮。还有一个细节MP2642GR-Z的每个电压采集引脚前面通常需要加RC滤波。电阻取100Ω到1kΩ电容取0.1μF到1μF。这个RC网络的作用是滤掉电芯连接线上的高频噪声同时也能在一定程度上隔离均衡电流的干扰。但RC的时间常数不能太大否则电压响应会变慢。我一般用1kΩ加0.1μF时间常数100μs对于BMS的采样速率来说完全够用。3.3 均衡回路的PCB热设计均衡电阻在PCB上是个持续发热的元件。如果两路均衡同时开启总功耗可能超过0.4W。在密闭的备用电源外壳里这个热量如果不散出去电阻周围的温度会升得很高长期运行会影响电阻寿命和周边器件的可靠性。我的做法是均衡电阻下方铺铜并通过多个过孔把热量传导到PCB背面或者内层的地平面。如果PCB是四层板可以在电阻正下方的内层地平面开窗让热量直接传到地铜皮上。如果是两层板就在电阻周围留出足够的铜面积不要被其他走线切断。另外均衡电阻的布局要远离温度敏感器件比如MP2642GR-Z本身、晶振、以及电芯的NTC测温电阻。我见过一个设计均衡电阻离NTC只有5mm均衡一开NTC读数直接偏高8℃导致温度保护误触发。后来把均衡电阻挪到板子另一侧问题就解决了。所以布局阶段就要把热源和热敏器件分开。4. 均衡策略的固件实现从电压读取到均衡决策的完整链路4.1 MP2642GR-Z的寄存器配置与电压读取流程MP2642GR-Z上电后PIC18F4682需要通过I2C对它进行初始化。初始化的第一步是配置均衡相关的寄存器设置均衡开启的电压阈值、均衡关闭的电压阈值、均衡定时器的周期、以及过压欠压保护点。这些参数根据你用的电芯类型来定。以磷酸铁锂为例满电3.65V过压保护点设3.75V欠压保护点设2.0V。均衡开启阈值可以设30mV关闭阈值设10mV这样有一定的回差避免均衡在阈值附近反复开关。初始化完成后PIC18F4682进入主循环。主循环里每隔100ms读一次MP2642GR-Z的电压寄存器。读取的方式是先发I2C起始条件写设备地址和寄存器地址然后重复起始条件读两个字节的数据。MP2642GR-Z的电压数据通常是12位或者14位精度高字节在前低字节在后。读回来之后要做一个移位和拼接再乘以LSB对应的电压值才能得到实际的电芯电压。这里有个坑MP2642GR-Z的电压寄存器在更新时可能会有短暂的不一致状态也就是高字节已经更新了低字节还是旧值。如果你正好在这个时刻读取拼出来的电压就是错的。解决办法是连续读两次如果两次结果一致就采用不一致就丢弃重读。或者读完之后检查状态寄存器里的“数据就绪”标志位确保读到的是完整的新数据。4.2 压差计算与均衡开启的判定逻辑拿到两节电芯的电压V1和V2之后计算压差ΔV |V1 - V2|。如果ΔV大于均衡开启阈值并且当前不在充电状态或者处于充电后期就开启均衡。为什么不在充电初期开启因为充电初期电芯电压上升很快压差可能是暂时性的这时候开启均衡会浪费能量。我一般是在充电电流降到C/10以下或者充电结束后才开始均衡。这样均衡的是真正多出来的容量而不是充电过程中的动态压差。判定哪一路均衡开启的逻辑很简单如果V1 V2开启第一节电芯的均衡如果V2 V1开启第二节电芯的均衡。但这里要注意不能两路同时开启否则两节电芯同时放电压差不会缩小反而整体电压下降。MP2642GR-Z的寄存器里通常有互锁机制但固件层面也要做判断确保同一时刻只有一路均衡是开的。均衡开启后PIC18F4682要持续监控压差。当ΔV降到关闭阈值以下时关闭均衡。如果均衡开启时间超过了设定的最大均衡时间比如30分钟也要强制关闭防止因为电压采集异常导致均衡一直开着。这个最大均衡时间是个保护机制我在实际项目里遇到过因为采集线接触不良导致电压读数乱跳均衡反复开关的情况加了最大时间限制之后至少不会把电芯放亏。4.3 用状态机组织均衡控制逻辑固件里用状态机来管理均衡是最清晰的。我一般定义四个状态IDLE空闲、BALANCING_HIGH均衡第一节、BALANCING_LOW均衡第二节、COOLDOWN冷却。状态转移的条件就是压差和定时器。IDLE状态下如果ΔV 开启阈值根据哪节电压高转移到对应的均衡状态同时启动均衡定时器。BALANCING状态下如果ΔV 关闭阈值或者均衡定时器超时转移到COOLDOWN。COOLDOWN状态下等待一段时间比如5分钟让电芯电压稳定下来再回到IDLE重新判断。这个冷却时间很有必要因为均衡刚结束时电芯电压会有短暂的恢复效应立即重新判断可能会导致误触发。状态机的代码用switch-case实现就行每个状态里做对应的事情。PIC18F4682的RAM有限状态变量用unsigned char就够了。均衡定时器可以用Timer1或者Timer3配置成1秒中断一次在中断里递减计数器。主循环里只做状态判断和I2C通信中断里做计时这样实时性有保障。5. 实测中暴露的问题与排查过程从误报到通信失败5.1 均衡开启后电压读数反而变大的怪现象第一次调试这套方案时我遇到一个很诡异的现象开启第一节电芯的均衡后读回来的V1不但没有下降反而比均衡前高了十几毫伏。均衡电阻明明在放电电压应该降才对。排查了半天最后发现是采集走线和均衡走线共用了一段铜皮。均衡电流在这段铜皮上产生的压降正好叠加在采集路径上导致采集到的电压偏高。把采集走线从电芯连接器根部单独引出之后问题消失。这个问题的根因是均衡电流路径上的寄生电阻和采集路径的寄生电阻发生了耦合。在PCB上铜皮的电阻虽然只有毫欧级别但均衡电流有几十毫安产生的压降在毫伏级别而电芯的压差判定阈值可能只有几十毫伏这个误差就足以影响判断。所以我在第3.2节里强调开尔文接法这不是理论上的讲究是实际踩坑之后总结出来的硬经验。5.2 I2C通信在均衡开启时出现偶发NACK另一个问题是均衡开启的瞬间I2C通信偶尔会出现NACK导致电压读取失败。用示波器抓波形发现均衡开启时电源线上有一个几十毫伏的跌落持续时间大概几微秒。这个跌落是因为均衡电阻突然接入瞬间电流增大在电源走线的电感上产生了感应电动势。MP2642GR-Z的供电电压如果低于它的最低工作电压内部逻辑就会复位I2C从机地址暂时不响应主机就会收到NACK。解决办法有两个一是在MP2642GR-Z的电源引脚旁边加一颗10μF的陶瓷电容再并联一颗0.1μF的高频电容提供瞬态电流补偿二是在固件里加I2C重试机制如果收到NACK等待10ms后重试最多重试3次。两个措施同时上问题彻底解决。后来我在其他项目里也养成了习惯凡是带均衡功能的BMS电源引脚旁边必须有大电容兜底不能只靠LDO的输出电容。5.3 均衡电阻发热导致温度保护误触发第三个坑是温度保护误触发。备用电源系统里通常有NTC测温电阻贴在电芯表面用来监控电芯温度。我把均衡电阻布局在NTC附近结果均衡一开NTC读数在几分钟内上升了8℃触发了过温保护系统停止充电。实际上电芯温度并没有升高是均衡电阻的热量通过PCB铜皮传导到了NTC。解决方法是把均衡电阻移到PCB的另一侧并且在NTC和均衡电阻之间切断铜皮减少热传导路径。如果PCB空间实在紧张可以在NTC下方开一个槽增加热阻。另外固件里也可以对NTC读数做滤波和斜率限制如果温度上升速率超过某个阈值比如1℃/分钟就判断为异常不立即触发保护而是先降额运行。这个策略在多个项目里验证过能有效避免误触发。6. 均衡阈值和定时参数的调优经验没有万能值只有适合场景的值6.1 均衡开启阈值设多少合适均衡开启阈值设得太小均衡会频繁开启浪费能量而且均衡电阻反复开关寿命受影响。设得太大压差已经很明显了才均衡整组容量已经被拖累了。我的经验是对于新电芯初始压差很小阈值可以设20mV到30mV对于使用过一段时间的电芯压差可能天然就在50mV以上这时候阈值要设到80mV甚至100mV否则均衡会一直开着。还有一个因素电芯的电压平台。磷酸铁锂的电压平台很平3.2V到3.3V之间电压变化很小压差在这个区间内可能只有几毫伏但容量差异可能很大。所以对于磷酸铁锂不能只看电压差还要结合充电末期的电压差来判断。三元锂的电压平台斜率大一些电压差和容量差的对应关系更直接阈值可以设得小一点。6.2 均衡电流和均衡时间的权衡均衡电流越大均衡越快但发热越严重对PCB布局和散热的要求越高。在小体积的备用电源里我一般把均衡电流控制在30mA到50mA。如果外壳是密封的散热条件差就取30mA如果外壳有散热孔或者金属外壳可以取到80mA。均衡时间方面我一般设置单次均衡最长30分钟然后冷却5分钟再判断。这样即使压差很大也不会让电阻持续满负荷工作。实测数据两节2000mAh电芯初始压差80mV均衡电流50mA大约需要40分钟把压差降到10mV以内。如果均衡电流降到30mA时间会拉长到70分钟左右。这个时间在充电过程中是可以接受的因为充电本身也要一两个小时。但如果你的系统要求快速均衡那就得加大均衡电流同时做好散热。6.3 温度对均衡策略的影响温度会影响电芯的电压读数也会影响均衡电阻的阻值。低温下电芯内阻增大充电时电压上升快压差可能被放大。高温下电芯自放电率增加静置时压差也会变化。所以均衡策略最好能根据温度做调整。我的做法是在NTC读数低于10℃或者高于45℃时暂停均衡等温度回到正常区间再继续。这样避免在极端温度下因为电压读数失真而做出错误的均衡决策。另外均衡电阻的温漂虽然不大但在高温环境下电阻值可能变化几个百分点均衡电流也会相应变化。如果对均衡精度要求高可以在固件里根据温度对均衡电流做补偿或者直接选用低温漂电阻。不过对于大多数储能和备用电源场景这个误差可以忽略没必要增加成本。7. 这套方案还能怎么扩展从两串到多串的思路两串均衡是最基础的场景但实际项目里经常会遇到三串、四串甚至更多串的应用。MP2642GR-Z本身是两串前端如果要扩展到四串可以用两颗MP2642GR-Z级联或者换用支持更多串数的前端芯片。级联的时候PIC18F4682的I2C总线可以挂多颗前端通过不同的设备地址来区分。但要注意多颗前端的电压采集参考点不同高串前端的“地”是低串前端的“正极”通信隔离要做好否则I2C电平不匹配。如果串数更多PIC18F4682的RAM和Flash可能就不够用了这时候可以考虑升级到PIC18F4685或者直接上32位单片机。但那是另一个话题了。对于两串储能和备用电源来说MP2642GR-Z加PIC18F4682的组合在成本、复杂度、可靠性之间找到了一个很好的平衡点。我在几个量产项目里用过这套方案现场运行两年多均衡功能一直稳定没有出现过因为均衡导致的故障。最后分享一个小技巧在固件里加一个均衡次数统计存在EEPROM里。如果发现某节电芯的均衡次数异常偏高说明这节电芯的一致性在变差可以提前预警提醒用户检查或更换电芯。这个功能不需要额外硬件只需要在均衡状态机里加一个计数器定期写入EEPROM就行。对于备用电源这种长期无人值守的场景这个预警信息通过CAN总线上报给监控系统能省不少维护成本。