1. 从两个串联电芯的电压差说起:为什么被动均衡在储能场景里依然能打
储能和备用电源系统里,电池组的寿命往往不取决于最强的那颗电芯,而是被最弱的那颗拖垮。两串电芯的架构在中小功率备用电源、便携储能、UPS 电池包中非常常见——电压不高,成本敏感,但一致性要求一点不低。刚出厂时两颗电芯的容量、内阻、自放电率看着都差不多,可经过几十上百次充放电循环之后,差异就会被放大:充电时电压高的那颗先到截止电压,放电时电压低的那颗先到欠压保护点,整组可用容量被硬生生砍掉一截。
均衡要解决的就是这件事。主动均衡靠电感、电容或变压器把能量从高电压电芯搬到低电压电芯,效率高但电路复杂、成本高、EMI 难搞;被动均衡则是把高电压电芯的多余能量通过电阻或功率器件消耗掉,简单、可靠、便宜。很多人一听“消耗能量”就觉得落后,但在两串小容量电池的备用电源场景里,被动均衡的性价比往往是最优解——电路简单意味着故障点少,备用电源最怕的就是均衡电路自己先坏掉。
这次要聊的方案,是用MP2642GR-Z这颗电池管理前端配合PIC18F87J50单片机,对两个串联电芯做均衡控制。MP2642GR-Z 负责电芯电压采集和均衡开关的驱动,PIC18F87J50 负责逻辑判断、状态机和与上位机的通信。整套方案的核心思路是:用专用模拟前端保证采样精度和均衡驱动的可靠性,用一颗资源充裕的 8 位 MCU 做控制大脑,两者通过 I2C 或 SPI 交互,实现“谁电压高就放谁的电”的被动均衡策略。
适合读这篇内容的人有三类:一是正在做两串电池包 BMS 的硬件工程师,想找一个经过验证的器件组合;二是嵌入式软件工程师,需要理解均衡状态机怎么写才不会误动作;三是储能产品的系统设计者,想搞清楚被动均衡的边界在哪里、什么时候该换主动方案。下面我会从器件选型逻辑、硬件连接细节、均衡算法实现、实测踩坑四个维度展开,把每个决策背后的“为什么”讲透。
2. MP2642GR-Z 与 PIC18F87J50 的分工逻辑:为什么不是一颗芯片全包
2.1 MP2642GR-Z 在均衡回路里到底管什么
MP2642GR-Z 是一颗面向多串电池管理的模拟前端,核心能力包括电芯电压采集、均衡开关驱动、过压欠压保护以及温度监测接口。在两串应用里,它最值钱的地方是电芯电压的采集精度和均衡 MOS 管的驱动能力。被动均衡的本质是给高电压电芯并联一个泄放电阻,让它在充电或静置阶段缓慢放电,直到两颗电芯电压拉平。这个泄放回路的开关如果由 MCU 的 GPIO 直接驱动,会遇到两个问题:一是 MCU 的驱动电流有限,大电流泄放时 MOS 管可能工作在放大区而不是开关区,发热严重;二是 MCU 的 GPIO 在系统掉电时状态不确定,可能导致均衡回路意外导通,把电芯放亏。
MP2642GR-Z 把均衡开关的驱动集成在芯片内部,由它来控制外部泄放 MOS 管的栅极。芯片内部有专门的均衡定时器和状态机,MCU 只需要通过寄存器告诉它“对哪颗电芯开启均衡、持续多久”,剩下的时序和驱动由前端芯片自己完成。这样做的好处是均衡动作的实时性和安全性由硬件保证,即使 MCU 跑飞或者通信中断,前端芯片也能在超时后自动关闭均衡,不会把电芯放空。
另外,MP2642GR-Z 的电压采集通道是差分输入,对两串电芯的共模电压有很好的抑制。两串电芯串联后,第二颗电芯的正极对地电压是第一颗的两倍,如果直接用 MCU 的 ADC 分压采样,电阻的温漂和分压比误差会直接吃掉精度。专用前端的内部基准和校准机制能把单颗电芯的采样误差控制在毫伏级,这是被动均衡能准确判断“谁高谁低”的前提。
2.2 PIC18F87J50 为什么适合做这个控制大脑
PIC18F87J50 是一颗 8 位单片机,主频可以跑到 48MHz,自带 USB 控制器、I2C、SPI、多个定时器和比较器。选它来做两串电池的均衡控制,主要看中三点:通信接口丰富、低功耗模式灵活、开发工具成熟。
通信接口方面,MP2642GR-Z 通常通过 I2C 或 SPI 与主控交互。PIC18F87J50 的 MSSP 模块可以配置成 I2C 主机或 SPI 主机,直接和前端芯片对接,不需要额外的桥接芯片。如果备用电源系统需要把电池状态上报给上位机,PIC18F87J50 自带的 USB 模块可以模拟成一个 HID 设备或者 CDC 串口,插上电脑就能看到电压、电流、均衡状态,调试阶段非常省事。
低功耗方面,备用电源系统很多时候处于待机状态,MCU 不能一直全速跑。PIC18F87J50 有 idle 和 sleep 模式,在待机时可以关掉大部分外设,只留一个定时器周期性唤醒去读前端芯片的状态。均衡判断不需要毫秒级的实时性,秒级的轮询完全够用,这样整机的静态功耗可以压得很低。
开发工具方面,PIC 系列的编译器、调试器、代码示例在工程师圈子里积累了很多年,遇到问题容易找到参考。对于两串电池这种量级的产品,用一颗资源够用、生态成熟的 8 位 MCU,比强行上 32 位 ARM 更划算——BOM 成本低,代码量小,认证也简单。
2.3 两颗芯片之间的通信协议怎么定
MP2642GR-Z 和 PIC18F87J50 之间的通信,我建议用 I2C,速率设在 100kHz 或 400kHz。I2C 只需要两根线,占用引脚少,而且总线上可以挂多个器件,以后如果要扩展温度传感器或者电流计,直接并联上去就行。SPI 虽然速率高,但片选线多一根,对于两串电池这种低速控制场景,I2C 的速率完全够用。
通信内容主要分三类:配置寄存器、状态寄存器、均衡控制寄存器。配置寄存器用来设定过压阈值、欠压阈值、均衡开启的电压差门限;状态寄存器用来读当前每颗电芯的电压、温度、故障标志;均衡控制寄存器用来告诉前端芯片对哪颗电芯开启均衡、均衡占空比是多少。
协议设计上有一个细节要注意:读写寄存器时要加超时和重试。I2C 总线在电池包这种有强电磁干扰的环境里,偶尔会出现时钟拉低或者数据错位。PIC18F87J50 的 I2C 模块有超时检测,但软件层也要做重试,连续三次读失败就报通信故障,进入安全状态——关闭所有均衡开关,等待下一次复位。
3. 硬件连接与均衡回路设计:从原理图到 PCB 的实操细节
3.1 两串电芯与 MP2642GR-Z 的接线方式
两串电芯的接线看起来简单,但顺序和参考点很容易搞错。假设两颗电芯分别为 Cell1 和 Cell2,串联后 Cell1 的负极是系统地,Cell1 的正极接 Cell2 的负极,Cell2 的正极是电池组正极。MP2642GR-Z 的电压采集引脚要分别接到 Cell1 正极、Cell2 正极和系统地,注意每个采集引脚前面要加 RC 滤波,电阻用 100Ω,电容用 0.1μF,截止频率大概在 16kHz 左右,能滤掉开关噪声又不影响直流精度。
均衡泄放回路的设计是重点。每颗电芯需要一个泄放电阻和一个 N 沟道 MOS 管。泄放电阻的阻值决定了均衡电流,计算公式是:
I_balance = V_cell / R_bleed
假设单颗电芯电压 3.7V,想要的均衡电流是 50mA,那么 R_bleed = 3.7V / 0.05A = 74Ω,取标准值 75Ω。泄放电阻的功率也要算:P = V_cell² / R_bleed = 3.7² / 75 ≈ 0.18W,所以至少要选 0.25W 的封装,留一点余量用 0.5W 更稳妥。
MOS 管选 N 沟道逻辑电平型号,导通电阻要小,栅极阈值电压要低于 MP2642GR-Z 的均衡驱动输出电压。如果前端芯片的驱动电压是 5V,选 Vgs(th) 在 1V 到 2V 之间的 MOS 管就能可靠导通。MOS 管的漏极接泄放电阻,泄放电阻另一端接电芯正极,源极接电芯负极,栅极接前端芯片的均衡驱动引脚。这样当前端芯片输出高电平时,MOS 管导通,泄放电阻并联到电芯两端,电芯开始放电。
3.2 均衡回路的 PCB 布局要点
被动均衡的泄放电流虽然不大,但布局不好照样出问题。第一个要点是泄放回路的环路面积要小。泄放电阻、MOS 管、电芯接线端子构成的环路要尽量紧凑,减少对外辐射。第二个要点是采样线和泄放线要分开走。电压采集线是敏感信号,泄放线是功率路径,如果两者平行走线太长,泄放电流在采样线上感应出的压降会直接叠加到采样结果上,导致电压读数偏高,均衡判断失准。
我的做法是:采样线从电芯端子直接引到前端芯片的采集引脚,中间不经过任何功率器件;泄放回路单独走一条粗线,从电芯端子到泄放电阻再到 MOS 管,最后回到电芯负极。两条路径在空间上尽量垂直交叉,如果必须平行,中间用地线隔开。
第三个要点是散热。两颗电芯同时均衡时,两个泄放电阻的功耗加起来接近 0.4W,如果 PCB 铜皮面积不够,电阻表面温度会很高。泄放电阻下面铺铜,并通过过孔连接到内层地平面,利用整板散热。实测中,75Ω/0.5W 的电阻在 50mA 均衡电流下,表面温升大概在 20℃ 到 30℃,如果环境温度本来就高,要留更多余量。
3.3 PIC18F87J50 的外围电路与电源设计
PIC18F87J50 的供电来自电池组正极经过 LDO 降压后的 3.3V 或 5V。LDO 的选型要注意静态电流,备用电源系统待机时,LDO 自身的功耗不能太大。如果整机待机电流目标是 100μA 级别,LDO 的静态电流要选在 10μA 以下的型号。
MCU 的复位引脚要接一个 10kΩ 上拉电阻和 0.1μF 电容,保证上电复位可靠。晶振根据通信速率和定时需求选择,如果 I2C 速率是 400kHz,MCU 主频至少要在 4MHz 以上,用内部振荡器也能跑,但如果有 USB 通信需求,必须用外部晶振保证 USB 时钟精度。
I2C 总线的上拉电阻不能省,典型值是 4.7kΩ。如果总线电容较大或者走线较长,可以降到 2.2kΩ,但要注意功耗。上拉电阻太小会增加总线静态电流,备用电源系统里每一微安都要计较,所以要在通信可靠性和功耗之间折中。我的经验是:总线长度小于 10cm 时用 4.7kΩ,大于 10cm 时用 2.2kΩ,同时把 I2C 速率降到 100kHz。
4. 均衡策略的软件实现:状态机、门限与防抖
4.1 均衡开启和关闭的电压门限怎么定
被动均衡的触发条件不能只看“两颗电芯电压不相等”,因为采样噪声和负载波动会导致电压瞬间跳动,如果一有压差就开启均衡,均衡开关会频繁动作,既浪费能量又缩短 MOS 管寿命。合理的做法是设定一个开启门限和一个关闭门限,两者之间留一个迟滞区间。
举个例子:开启门限设为 30mV,关闭门限设为 10mV。当两颗电芯压差超过 30mV 时,开启高电压电芯的均衡;当压差降到 10mV 以下时,关闭均衡。中间的 20mV 就是迟滞区间,防止压差在门限附近来回抖动导致均衡反复开关。
门限的具体数值要根据电芯特性和采样精度来定。磷酸铁锂电芯的电压平台很平,压差 30mV 可能对应很大的容量差异;三元电芯的电压曲线斜率大,同样的压差对应的容量差异小一些。如果前端芯片的采样误差是 ±5mV,门限至少要设在 15mV 以上,否则噪声就能触发均衡。
还有一个细节:充电和放电阶段的均衡策略要分开。充电时,高电压电芯会先到截止电压,这时候开启均衡可以把高电压电芯压住,让低电压电芯继续充电,提升整组容量。放电时,低电压电芯会先到欠压保护点,这时候均衡高电压电芯没有意义,反而会加速整组放电。所以我的做法是:充电阶段允许均衡,放电阶段禁止均衡,静置阶段根据压差决定是否均衡。
4.2 基于 PIC18F87J50 的均衡状态机设计
状态机是均衡逻辑的核心。我一般把它分成五个状态:空闲、检测、均衡中、冷却、故障。
空闲状态下,MCU 处于低功耗模式,定时器每隔 1 秒唤醒一次,读取前端芯片的电芯电压。如果压差超过开启门限,进入检测状态。
检测状态下,连续读取 5 次电压,每次间隔 100ms,如果 5 次结果都显示压差超过门限,才确认需要均衡。这一步是为了滤掉偶发的采样噪声。确认后,进入均衡中状态。
均衡中状态下,MCU 通过 I2C 向前端芯片写入均衡控制命令,开启高电压电芯的泄放回路。同时启动一个均衡定时器,单次均衡时间不超过 30 分钟。如果 30 分钟内压差降到关闭门限以下,提前结束均衡,进入冷却状态;如果 30 分钟到了压差还没降下来,也强制结束,进入冷却状态,防止泄放电阻过热。
冷却状态下,关闭所有均衡开关,等待 10 秒,让电芯电压恢复稳定,然后重新进入检测状态。如果连续三次均衡都没能把压差降到关闭门限以下,说明两颗电芯的容量差异已经很大,被动均衡解决不了,进入故障状态,上报“电芯不一致”告警。
故障状态下,关闭所有均衡开关,保持通信,等待上位机或者维护人员处理。
这个状态机的关键点是单次均衡时间限制和冷却时间。没有这两个限制,泄放电阻会一直发热,MOS 管也可能因为长时间导通而加速老化。
4.3 电压采样的滤波与校准
MP2642GR-Z 输出的电压数据是数字量,但数字量不代表没有噪声。电源开关、电机启停、外部充电器插拔都会在电芯电压上叠加干扰。软件层要做两件事:滑动平均滤波和开路电压校准。
滑动平均滤波的做法是:维护一个长度为 8 的环形缓冲区,每次读到新的电压值就存入缓冲区,然后取平均值作为当前电压。这样可以把随机的采样噪声压下去,代价是响应速度变慢。对于均衡判断这种秒级应用,8 点滑动平均完全够用。
开路电压校准是为了消除系统误差。在电池静置且没有均衡动作时,用高精度万用表测量每颗电芯的实际电压,然后和前端芯片的读数对比,算出一个偏移量,写入 MCU 的 Flash 或者前端芯片的校准寄存器。这个校准一次就够了,但如果你换了电芯或者改了采样电路,要重新校准。
还有一个容易忽略的点:采样时刻要避开均衡开关动作的瞬间。均衡开关导通和关断时,泄放电流的突变会在采样线上感应出尖峰。我的做法是在均衡状态切换后延时 50ms 再采样,等电压稳定下来再读。
5. 实测中踩过的坑:从误触发到通信死锁
5.1 均衡误触发:采样线上的共模干扰
第一批板子调试时遇到一个怪现象:两颗电芯明明压差只有 5mV,均衡却偶尔自动开启。用示波器抓采样线,发现每当附近的大电流负载启动时,采样线上会出现几十毫伏的尖峰。前端芯片的采样保持电路在尖峰期间采到了错误的值,MCU 读到压差超过门限,就误开启了均衡。
排查过程是这样的:先怀疑是前端芯片的配置问题,把采样速率降到最低,误触发概率下降但没有消失。然后怀疑是电源噪声,在 LDO 输出端加了 100μF 电解电容和 0.1μF 陶瓷电容,改善有限。最后用示波器逐点测量,才定位到采样线上的共模干扰。
解决方案分两层:硬件上在采样引脚前面加 RC 滤波,电阻从 100Ω 增加到 1kΩ,电容保持 0.1μF,截止频率降到 1.6kHz,对直流电压没有影响,但能把尖峰滤掉大半;软件上把检测状态的连续采样次数从 5 次增加到 10 次,并且要求这 10 次采样的最大值和最小值之差小于 10mV 才认为数据有效。两层措施加上去之后,误触发彻底消失。
这个坑给我的教训是:被动均衡的采样精度不仅取决于前端芯片,还取决于采样路径的抗干扰设计。专用前端芯片的差分输入抑制的是低频共模,高频尖峰还是要靠 RC 滤波和软件滤波一起解决。
5.2 I2C 通信死锁:时钟被从机拉低
调试过程中还遇到过一次 I2C 死锁:MCU 正常发送读取命令,突然总线卡住,SCL 被前端芯片拉低,MCU 发时钟也拉不动。断电重启后恢复正常,但运行几个小时又会出现。
I2C 死锁的经典原因是:主机在从机准备数据时复位或者中断,从机还在等待时钟沿,导致 SCL 被从机持续拉低。MP2642GR-Z 在均衡动作期间会占用内部状态机,如果这时候 MCU 发起 I2C 读取,前端芯片可能来不及响应,把 SCL 拉低等待。
解决办法有两个:一是避免在均衡动作期间读取电压,MCU 在开启均衡后延时 100ms 再发起 I2C 通信;二是在 I2C 驱动里加总线恢复逻辑,如果检测到 SCL 被拉低超过 10ms,就把 SCL 配置成 GPIO,手动发送 9 个时钟脉冲,让从机释放总线,然后重新初始化 I2C 模块。
总线恢复逻辑我写成了一个函数,每次 I2C 读写超时后调用。实测下来,加上这个逻辑之后,即使偶尔出现死锁,系统也能在几百毫秒内自动恢复,不需要人工断电。
5.3 均衡电流的实际值与理论值偏差
设计时按 75Ω 泄放电阻算,均衡电流应该是 50mA。但实测用电流表串在泄放回路里,读数只有 42mA。检查了一圈,发现两个原因:一是 MOS 管的导通电阻不是零,几毫欧到几十毫欧的导通电阻在 50mA 下产生几毫伏的压降,导致实际加在泄放电阻上的电压略低于电芯电压;二是泄放电阻本身有 1% 的容差,实际阻值可能偏大。
42mA 和 50mA 的差异对均衡效果影响不大,但如果你对均衡时间有严格要求,就要把这两个因素算进去。我的做法是在软件里根据实测电流反推一个修正系数,用来估算均衡所需时间。比如理论计算需要 2 小时,实测电流偏小 16%,就把预估时间乘以 1.2,避免过早结束均衡。
另外,泄放电阻的温漂也要注意。普通厚膜电阻的温度系数是 100ppm/℃,温度升高 50℃ 时阻值变化 0.5%,对均衡电流的影响可以忽略。但如果用精密电阻,成本上去了,收益并不明显,两串电池的被动均衡没必要用太高精度的电阻。
5.4 低功耗模式下的唤醒异常
备用电源系统要求待机功耗低,MCU 在空闲时进入 sleep 模式,靠定时器唤醒。调试时发现,有时候 MCU 进入 sleep 后不再唤醒,整机死机。查了数据手册,发现是在 I2C 通信过程中进入 sleep 导致的。I2C 模块在通信未完成时进入 sleep,会产生总线错误,MCU 卡在错误状态里出不来。
解决方法是:在进入 sleep 之前,确保 I2C 总线空闲,并且关闭 I2C 模块的时钟。唤醒后重新初始化 I2C 模块,再开始通信。另外,定时器唤醒中断的优先级要设成最高,保证 MCU 能及时响应。
还有一个细节:PIC18F87J50 的 sleep 模式下,如果 I/O 引脚上有悬空输入,会导致漏电流增加。所有未使用的引脚要配置成输出低电平或者输入带上拉,不能悬空。这个细节在数据手册里有提,但很容易被忽略,实测中悬空引脚能让待机电流从 50μA 涨到 200μA。
6. 被动均衡的边界与两串架构的扩展思路
两串电池的被动均衡,说到底是在成本、复杂度和效果之间找一个平衡点。MP2642GR-Z 加 PIC18F87J50 的组合,把模拟采集和数字控制分开,硬件负责安全和精度,软件负责策略和通信,分工清晰,调试起来也容易定位问题。这套方案适合 10Ah 以下的备用电源系统,均衡电流在 50mA 到 100mA 之间,均衡时间在小时级,对大多数中小功率应用来说够用了。
但如果你的电池容量超过 20Ah,或者对均衡速度有要求,被动均衡的短板就暴露了:50mA 的均衡电流相对于 20Ah 的容量,要把 5% 的容量差异拉平需要几十个小时,实际使用中根本等不起。这时候要么加大均衡电流,但泄放电阻的功耗和散热会变成大问题;要么换主动均衡,用 Buck-Boost 或者电感储能的方式把能量搬过去,效率高但电路复杂度和成本会上一个台阶。
两串架构本身也有扩展空间。如果以后要做三串或者四串,MP2642GR-Z 有更高串数的型号,PIC18F87J50 的 I2C 总线可以挂多颗前端芯片,软件上把状态机扩展成多电芯版本就行。但要注意,串联电芯越多,共模电压越高,采样线的绝缘和滤波要求也越高,PCB 布局的难度会明显增加。
我在实际项目里还遇到过一个需求:电池包要在低温环境下工作,-20℃ 时电芯内阻增大,电压跌落明显,均衡判断容易被误触发。后来的做法是在低温时把均衡开启门限从 30mV 提高到 50mV,并且降低均衡电流,减少电芯自身的发热。这个策略写进了温度补偿逻辑里,用前端芯片的温度读数作为判断依据。
最后分享一个调试小技巧:在均衡回路的泄放电阻两端并联一个 LED 和限流电阻,均衡开启时 LED 微亮,肉眼就能看到哪颗电芯在均衡。这个指示灯在调试阶段非常有用,能快速判断是软件没发命令还是硬件没执行。量产时把 LED 去掉就行,不影响电路功能。