1. 为什么串联电池组的“木桶效应”必须靠主动均衡来破
两节电芯串在一起给负载供电,最怕的不是容量不够,而是两颗电芯“跑偏”。出厂时标称一致的两颗电芯,经过几十次充放电循环后,内阻、自放电率、实际可用容量都会出现肉眼可见的差异。串联回路里电流是同一个,谁容量小谁先被拉到底,谁内阻大谁先冲到顶。结果就是:容量小的那颗已经过放了,容量大的那颗还没吃饱;充电时反过来,容量小的先到上限被过充,容量大的还差一截。这就是典型的“木桶效应”——整组电池的可用容量由最弱的那颗决定,而不是平均值。
很多做储能和备用电源的同行一开始会想:串两颗电芯而已,加个电阻做被动均衡不就行了?被动均衡说白了就是把电压高的那颗电芯多余的能量,通过电阻以热量形式烧掉。它便宜、简单,但有两个致命问题。第一,能量白白浪费,在备用电源这种讲究能效的场景里,烧掉的每一分能量都是成本。第二,被动均衡只能“削峰”,不能“填谷”,它没法把能量从高电芯搬到低电芯,均衡速度慢,而且在大容量储能电池上发热量相当可观。对于两串电池单元这种小规模但要求高可靠性的场景,主动均衡才是更合理的选择。
我这次要聊的方案,核心就是用MP2642GR-Z这颗双向主动均衡芯片,配合PIC18F86J55这颗带丰富外设的8位单片机,搭一套针对两串电池单元的主动均衡系统。MP2642GR-Z 负责在两颗电芯之间双向搬运能量,PIC18F86J55 负责采样、判断、控制和保护逻辑。整套方案面向的是储能系统和备用电源系统,比如小型UPS、通信基站备电、便携式储能电源这类应用。如果你正在做两串锂电或磷酸铁锂的BMS,或者想搞清楚主动均衡到底怎么落地,这篇内容应该能给你一些可以直接抄作业的东西。
先说清楚适用人群:需要有一定模拟电路和嵌入式基础,至少看得懂MOSFET驱动、ADC采样和I2C通信。完全零基础的朋友建议先补一下电池管理和单片机的基础知识,否则后面讲寄存器配置和采样时序时会有点吃力。但我会尽量把每个“为什么”讲透,让你不只是照抄电路,而是真正理解这套系统是怎么运转的。
2. MP2642GR-Z 与 PIC18F86J55 的分工逻辑与选型理由
2.1 MP2642GR-Z 到底解决了什么问题
MP2642GR-Z 是一颗专门为多串电池主动均衡设计的控制芯片,它的核心能力是在相邻电芯之间实现双向能量转移。注意“双向”这两个字,这是它和被动均衡、甚至和很多单向主动均衡方案的本质区别。单向方案只能从高电压电芯往低电压电芯搬能量,一旦搬过头或者方向判断错了,就得靠额外的逻辑去纠正。而 MP2642GR-Z 内部集成了双向 buck-boost 拓扑的控制逻辑,可以根据两颗电芯的电压差自动决定能量流动方向,把高的那颗的能量搬到低的那颗,直到两者电压差收敛到设定阈值以内。
它内部集成了 MOSFET 驱动、电流采样、电压比较和均衡时序控制。你外部只需要配好电感、电容和功率 MOSFET,它就能自己完成一个完整的均衡周期。这种“芯片级”的集成度,对于两串这种小规模应用来说,省掉了大量分立器件和调试时间。我对比过用分立 buck-boost 搭主动均衡的方案,光是驱动死区时间、电流采样精度和环路补偿就够调好几天的,而 MP2642GR-Z 把这些都封装好了,你只需要配置几个外部电阻就能设定均衡电流和阈值。
选它还有一个重要原因:它的工作电压范围覆盖了常见的两串锂电和磷酸铁锂应用。两串磷酸铁锂满电大概 7.2V 到 7.3V,两串三元锂满电 8.4V,MP2642GR-Z 都能覆盖。而且它支持外部时钟同步,可以和多颗芯片级联,虽然我们这次只做两串,但如果你以后想扩展到四串、六串,它的架构是可以平滑升级的,不用推翻重来。
2.2 PIC18F86J55 为什么适合做这套系统的“大脑”
PIC18F86J55 是 Microchip 旗下 PIC18 系列里外设相当丰富的一颗8位单片机。很多人一听8位机就皱眉,觉得算力不够。但在电池均衡这个场景里,你不需要跑操作系统,不需要复杂算法,你需要的是:足够多的 ADC 通道去采样电压和电流、稳定的定时器去控制均衡周期、可靠的通信接口去上报状态、以及低功耗模式去延长备用电源的待机时间。这几点 PIC18F86J55 全都给得很足。
它自带 12 位 ADC,对于两串电池的电压采样来说精度完全够用。12 位在 5V 参考下分辨率大约是 1.2mV,而锂电池均衡阈值通常设在 10mV 到 30mV 这个量级,所以采样精度是绰绰有余的。它还带多个定时器和 PWM 模块,虽然 MP2642GR-Z 自己管均衡时序,但 PIC18F86J55 可以用定时器做系统级的任务调度,比如每 100ms 采样一次、每 1s 判断一次均衡条件、每 10s 上报一次状态。另外它的 I2C 和 UART 接口可以很方便地接外部 EEPROM 或者上位机通信模块,做数据记录和远程监控。
我选 PIC18F86J55 而不是更便宜的 PIC16 系列,主要是看中它的存储容量和引脚数。做一套完整的 BMS,代码量不小,包括采样滤波、均衡策略、保护逻辑、通信协议,PIC16 的 Flash 和 RAM 经常捉襟见肘。PIC18F86J55 有 64KB Flash 和接近 4KB RAM,写起来从容很多。而且它的引脚数够多,可以同时接电压采样、电流采样、温度采样、均衡控制信号和通信接口,不用外扩多路复用器,简化了硬件设计。
2.3 两颗芯片的协作边界在哪里
这里要划清楚一条线:MP2642GR-Z 是“执行层”,PIC18F86J55 是“决策层”。MP2642GR-Z 不关心整组电池的 SOC 是多少,也不关心温度是否过高,它只负责一件事——把两颗电芯的电压差拉平。而 PIC18F86J55 要站在系统高度做判断:现在该不该均衡?均衡电流设多大?温度超了要不要停?某颗电芯电压异常低是不是该切断负载?
具体来说,PIC18F86J55 通过 ADC 采集两颗电芯的分压电压,计算出电压差。如果电压差超过设定的启动阈值(比如 20mV),并且温度在安全范围内,它就通过 GPIO 给 MP2642GR-Z 发一个使能信号,同时通过配置电阻或数字电位器设定均衡电流档位。MP2642GR-Z 收到使能后开始工作,PIC18F86J55 持续监控电压变化,当电压差收敛到停止阈值(比如 5mV)以下时,拉低使能信号,结束本轮均衡。
这种分工的好处是:决策逻辑可以写得很复杂,比如加入温度补偿、SOC 估算、历史数据分析,而执行层始终保持简单可靠。即使 PIC18F86J55 的固件跑飞了,MP2642GR-Z 也不会自己乱动,因为它需要外部使能信号才会工作。这种“决策与执行分离”的架构,在功能安全要求较高的储能和备电场景里是很实用的设计思路。
3. 硬件链路搭建:从电芯分压采样到双向能量搬运
3.1 两串电芯的电压采样与分压网络设计
两串电池的电压采样看起来简单,但有几个坑必须提前避开。第一颗电芯的负极是系统地,正极接到第二颗电芯的负极,第二颗电芯的正极是整组正极。所以第一颗电芯的电压可以直接对地测量,但第二颗电芯的电压是“浮”在第一颗之上的,不能直接对地测,否则会短路。
正确的做法是用电阻分压网络。对于第二颗电芯,从整组正极到系统地接两个精密电阻,分压比根据 ADC 参考电压来定。假设 ADC 参考是 5V,第二颗电芯最高电压是 4.2V,整组最高 8.4V,那么分压比至少要 8.4/5 = 1.68,取 2 倍分压比较安全,比如用 100k 和 100k 两个电阻,分压后最高 4.2V,在 ADC 量程内。第一颗电芯最高 4.2V,也可以直接测或者同样分压,保持采样通道的一致性。
这里有个经验:分压电阻一定要用 1% 精度的金属膜电阻,而且阻值不要太小。阻值太小会持续消耗电池电量,对于备用电源这种长期待机的场景,哪怕几毫安的漏电流日积月累也会把电池耗干。100k 级别的电阻,两串 8.4V 下漏电流大约 42uA,一年也就 0.37Ah 左右,对几安时以上的电池来说可以接受。如果电池容量很小,比如几百毫安时,那就要用 1M 级别的电阻,但这时 ADC 输入阻抗和采样保持时间就要仔细匹配了,否则采样值会偏低。
另外,每个 ADC 输入脚前面建议加一个 100nF 的滤波电容,和分压电阻构成低通滤波,截止频率大概在 16Hz 左右,可以有效滤掉开关噪声和工频干扰。但电容也不能太大,否则电压变化时 ADC 响应会变慢,均衡过程中电压是动态变化的,响应太慢会导致判断滞后。
3.2 MP2642GR-Z 外围功率级的关键参数计算
MP2642GR-Z 的功率级核心是一个 buck-boost 拓扑,外部需要一颗电感和两颗功率 MOSFET(或者用内部集成的,具体看型号配置)。均衡电流的大小主要由电感值和芯片内部设定的电流阈值决定。假设我们设定均衡电流为 1A,两颗电芯电压差最大 0.5V,那么需要搬运的功率是 0.5W。电感的选择要保证在开关频率下电流纹波不超过额定电流的 30%。
MP2642GR-Z 的开关频率可以通过外部电阻设定,典型值在 300kHz 到 1MHz 之间。频率越高,电感可以越小,但开关损耗越大。对于 1A 级别的均衡电流,我一般选 500kHz 左右,电感值在 4.7uH 到 10uH 之间。以 4.7uH 为例,500kHz 下电流纹波大约是 (Vout × (1-D)) / (L × f),具体计算要看工作占空比。实际调试时,用示波器看电感电流波形,如果纹波太大就加大电感或者提高频率,如果效率偏低就降低频率或者换低 DCR 的电感。
MOSFET 的选型要注意导通电阻和栅极电荷的平衡。导通电阻越小,导通损耗越低,但栅极电荷通常越大,开关损耗越高。对于 1A 级别的电流,导通电阻在 20mΩ 到 50mΩ 之间的 MOSFET 就够用了,栅极电荷控制在 10nC 以内。另外,MOSFET 的耐压要留足余量,两串电池最高 8.4V,选 20V 或 30V 耐压的管子比较稳妥。
3.3 使能、状态与保护信号的连接方式
PIC18F86J55 和 MP2642GR-Z 之间的信号连接主要有三根线:使能信号、故障指示和电流设定。使能信号最简单,PIC18F86J55 的一个 GPIO 输出高电平,MP2642GR-Z 开始工作;输出低电平,停止工作。这里要注意电平匹配,PIC18F86J55 是 5V 供电,MP2642GR-Z 的逻辑电平可能是 3.3V 或 5V,具体看数据手册。如果不匹配,中间要加电平转换电路,否则可能识别不了或者损坏芯片。
故障指示是 MP2642GR-Z 输出给 PIC18F86J55 的,当芯片检测到过流、过温或者外部 MOSFET 异常时,会拉低这个信号。PIC18F86J55 可以用外部中断或者轮询的方式检测这个信号,一旦触发就立即停止均衡并进入保护状态。这个信号建议加上拉电阻,因为 MP2642GR-Z 的故障输出通常是开漏结构。
电流设定可以通过外部电阻分压或者数字电位器实现。如果均衡电流不需要动态调整,用两个电阻分压设定一个固定值就行,简单可靠。如果需要根据温度或 SOC 动态调整均衡电流,那就用数字电位器,PIC18F86J55 通过 I2C 或 SPI 控制电位器阻值。我个人的经验是,对于两串这种小规模应用,固定电流设定就够了,动态调整带来的复杂度提升和收益不成正比。把均衡电流设在 0.5A 到 1A 之间,既能保证均衡速度,又不会让芯片和电感发热太严重。
4. 固件里的均衡策略:从电压差判断到状态机落地
4.1 采样滤波与电压差计算的工程细节
PIC18F86J55 的 ADC 采样不能采一次就用,电池电压上有开关噪声、负载波动和工频干扰,单次采样值可能跳动几十毫伏。我的做法是连续采 16 次,去掉最大值和最小值,剩下的取平均。这样算出来的电压值比较稳定,而且计算量不大,8位机完全扛得住。16 次采样在 10 位 ADC 下大概耗时几百微秒,对系统实时性没有影响。
电压差的计算要注意单位统一。ADC 读回来的是 0 到 1023 的整数,要转换成毫伏。假设参考电压是 5V,12 位 ADC 的话是 0 到 4095,每个 LSB 对应 1.22mV。如果用了 2 倍分压,实际电压还要乘以 2。这些换算最好在代码里用宏定义或者常量表实现,避免每次计算都做浮点运算,8位机做浮点很慢。我一般把 ADC 值直接映射成毫伏的整数,比如voltage_mv = adc_value * 5000 / 4095 * divider_ratio,用整数运算,最后结果误差在几毫伏以内,对均衡判断来说足够了。
还有一个细节:采样时机要避开均衡工作期间。MP2642GR-Z 在搬运能量时,电芯电压会有瞬态波动,这时候采样的值不能反映真实的开路电压。正确的做法是在均衡停止后等待一段时间(比如 100ms 到 500ms),让电池电压恢复稳定后再采样。这个等待时间取决于电池的极化特性,磷酸铁锂的恢复时间比三元锂长一些,可以适当延长。
4.2 均衡启动与停止阈值的设定逻辑
阈值设定是均衡策略的核心。设得太小,均衡频繁启动,能量在搬运过程中损耗,整体效率反而下降;设得太大,电芯长期处于不均衡状态,可用容量受损。对于两串锂电,我一般把启动阈值设在 20mV 到 30mV,停止阈值设在 5mV 到 10mV。这个区间是经过实测的:20mV 以下的电压差对可用容量的影响很小,不值得频繁均衡;而 5mV 以下已经接近采样精度极限,再均衡就是浪费。
但阈值不能写死,要根据电池类型和温度调整。磷酸铁锂的电压平台很平,电压差在 10mV 以内可能对应很大的 SOC 差异,所以磷酸铁锂的启动阈值要设小一些,比如 10mV 到 15mV。三元锂的电压曲线斜率大,同样的电压差对应的 SOC 差异小,阈值可以设大一点。温度低的时候,电池内阻增大,电压差会被放大,这时候如果还按常温阈值判断,可能会误触发均衡。我的做法是加一个温度补偿系数,温度每降低 10℃,启动阈值增加 5mV 左右。
停止阈值也不能设得太小,否则均衡会一直工作到电压差接近零,但采样精度和电池自放电会导致电压差在零附近反复跳动,均衡器频繁启停。设一个 5mV 到 10mV 的停止阈值,让电压差收敛到这个范围就停,既保证了均衡效果,又避免了震荡。
4.3 一个可复用的均衡状态机实现
固件里最核心的部分是均衡状态机。我把它分成五个状态:空闲、采样、判断、均衡、冷却。上电后进入空闲状态,定时器每 100ms 触发一次采样。采样状态连续采 16 次电压,计算平均值和电压差。判断状态根据电压差、温度和保护标志决定是否进入均衡。如果条件满足,进入均衡状态,拉高使能信号,启动 MP2642GR-Z。均衡过程中持续监控电压差和故障信号,如果电压差收敛到停止阈值以下,或者故障信号触发,或者均衡时间超过上限(比如 30 分钟),就退出均衡,进入冷却状态。冷却状态等待 500ms 让电压稳定,然后回到空闲状态,开始下一轮采样。
这个状态机的好处是逻辑清晰,每个状态只做一件事,调试起来很方便。你可以在每个状态里加一个计数器,记录进入次数和停留时间,通过 UART 输出到上位机,就能看到均衡器的工作轨迹。我调试的时候就是靠这个轨迹发现了一个问题:冷却时间设得太短,电压还没恢复稳定就开始采样,导致电压差被低估,均衡提前停止。后来把冷却时间从 200ms 加到 500ms,问题就解决了。
状态机的代码可以用 switch-case 实现,每个状态一个 case,用静态变量记录当前状态。定时器中断里只做标志位设置,主循环里执行状态机,这样中断响应快,状态机逻辑也不会被中断打断。PIC18F86J55 的主频一般跑在 16MHz 或 32MHz,主循环执行一圈大概几十微秒,对 100ms 的采样周期来说绰绰有余。
5. 实测中暴露的四个典型问题与排查过程
5.1 均衡电流上不去,电感发热严重
第一版硬件调通后,发现均衡电流只能到 300mA 左右,再往上调,电感就开始烫手,效率明显下降。用示波器看电感电流波形,发现纹波非常大,峰值电流到了 1.5A,但平均值只有 300mA。这说明电感值偏小,或者开关频率设得太低,导致电流纹波过大,芯片的电流限制提前触发了。
排查过程是这样的:先确认开关频率设置电阻是否正确,算了一下实际频率只有 200kHz 左右,比设计的 500kHz 低了不少。检查电阻值,发现用错了一个数量级。换回正确电阻后,频率到了 500kHz,但电流还是上不去。再查电感,标称 4.7uH,实际测量只有 3.2uH,而且 DCR 高达 200mΩ。换了一颗 4.7uH、DCR 50mΩ 的电感后,均衡电流顺利到了 1A,电感温度也降下来了。
这个坑给我的教训是:电感的标称值和实际值可能有很大偏差,尤其是便宜的电感。选型时一定要看 DCR 和饱和电流,饱和电流至少要是均衡电流的 1.5 倍。另外,开关频率设置电阻要用 1% 精度的,否则频率偏差会导致纹波和效率不达标。
5.2 电压采样在均衡时跳变,导致误判
第二个问题是均衡过程中电压采样值剧烈跳动,有时候电压差明明在缩小,采样值却显示在扩大,导致状态机误判,提前停止均衡。一开始怀疑是 ADC 参考电压不稳,换了基准源后问题依旧。后来用示波器同时看电芯电压和 ADC 输入脚,发现均衡工作时,电芯电压上有几十毫伏的开关纹波,频率和 MP2642GR-Z 的开关频率一致。
原因是采样时机不对。原来的代码是在均衡过程中也持续采样,而均衡时的电压纹波干扰了 ADC。解决办法很简单:均衡过程中不采样,只在均衡停止后的冷却状态采样。这样采到的才是接近开路电压的真实值。另外,在 ADC 输入脚加了 100nF 电容后,纹波进一步被滤除,采样稳定性明显提升。
这个问题的本质是:电池电压在充放电和均衡过程中是动态变化的,你不能把动态电压当成静态电压来测。必须给电池足够的恢复时间,等电压稳定后再采样。这个恢复时间在数据手册里通常不会写,只能靠实测确定。我的经验是,磷酸铁锂至少等 500ms,三元锂等 300ms 左右。
5.3 故障信号误触发导致均衡中断
第三个问题是 MP2642GR-Z 的故障信号偶尔会误触发,导致均衡中断。查了数据手册,故障信号触发条件包括过流、过温和外部 MOSFET 异常。用热成像仪看,芯片温度正常,电流也没超过设定值。后来发现是故障信号线太长,没有加滤波电容,附近的开关噪声耦合到了故障信号线上,导致误触发。
解决办法是在故障信号线上加一个 10k 上拉电阻和一个 1nF 到 10nF 的滤波电容,靠近 PIC18F86J55 的引脚放置。这样高频噪声被滤掉,故障信号只在真正异常时才触发。另外,固件里也加了去抖逻辑,连续检测到三次故障信号才确认,进一步降低了误触发概率。
这个坑提醒我:数字信号线在开关电源附近走线时,一定要考虑噪声耦合。尤其是故障信号这种关键的保护信号,宁可多加一个滤波电容,也不要省这点成本。走线尽量短,远离电感和 MOSFET 的漏极节点。
5.4 长期待机时均衡器偷跑电量
第四个问题是在备用电源场景下发现的。系统待机一个月后,电池电量明显下降,比预期的自放电率高很多。排查后发现,均衡器在待机时偶尔会启动,虽然每次时间不长,但日积月累消耗了不少电量。原因是待机时电池电压缓慢下降,两颗电芯的自放电率不同,电压差慢慢扩大,超过了启动阈值,触发了均衡。
这个问题要从策略上解决。对于长期待机的备用电源,均衡阈值不能设得太小,否则自放电差异就会触发均衡。我把启动阈值从 20mV 提高到 30mV,并且加了一个条件:只有在充电过程中或者充电结束后 1 小时内才允许均衡。待机状态下,即使电压差超过阈值,也不启动均衡,只记录状态,等下次充电时再处理。这样既避免了待机耗电,又保证了充电时电芯能被均衡到一致状态。
另外,MP2642GR-Z 在使能信号为低时,静态电流很小,但并不是零。如果对静态功耗要求极高,可以在使能信号为低时,用一个小型 MOSFET 切断 MP2642GR-Z 的供电,彻底消除漏电流。这个做法在便携式储能产品里很常见,代价是增加一点电路复杂度。
6. 从两串到多串:这套架构的扩展思路与边界
两串主动均衡跑通之后,很自然会想扩展到四串、六串甚至更多。MP2642GR-Z 本身支持级联,多颗芯片可以共享一个时钟源,各自负责相邻电芯之间的均衡。PIC18F86J55 的 GPIO 和 ADC 通道数有限,扩展到多串时,需要外扩多路复用器来采样更多电芯的电压,或者换用更多引脚的型号。
但扩展不是简单的复制粘贴。多串系统里,均衡的优先级和策略会更复杂。比如四串电池,电压差可能出现在任意两颗之间,你需要决定先均衡哪一对,均衡电流怎么分配,总均衡时间怎么控制。我的建议是采用“相邻均衡”策略,只均衡相邻电芯之间的电压差,通过多轮迭代让整组电压逐渐收敛。这种策略不需要复杂的全局优化算法,8位机也能跑得动。
另一个扩展方向是加入 SOC 估算。两串系统里,电压差基本能反映 SOC 差异,但多串系统里,由于电压平台和温度的影响,电压差和 SOC 差异不是线性关系。这时候就需要引入库仑计数或者开路电压法来估算 SOC,用 SOC 差而不是电压差来决定均衡策略。PIC18F86J55 的算力做简单的库仑计数没问题,但更复杂的算法可能需要换用 16 位或 32 位单片机。
最后说一个边界:这套方案适合的是中小容量、对成本敏感的储能和备电应用。如果你的系统是电动汽车或者大型储能电站,均衡电流需要几安甚至十几安,那 MP2642GR-Z 的驱动能力就不够了,需要外置更大的 MOSFET 和电感,或者选用专门的大电流均衡芯片。选型时一定要先算清楚均衡电流和热耗,不要盲目照搬。
我在实际使用中的体会是,主动均衡的价值不在于把电压差做到零,而在于让电芯在长期循环中保持一致性,延缓整组容量衰减。两串系统里,只要把电压差控制在 10mV 以内,电芯的循环寿命就能明显改善。这套 MP2642GR-Z 加 PIC18F86J55 的组合,成本不高,外围电路也不复杂,对于中小功率的储能和备电产品来说,是一个值得认真考虑的方案。