
两节串联锂电池用着用着电压就分道扬镳这是所有便携储能设备都躲不开的坑。我最近用 MP2642GR-Z 加 PIC18F45K80 做了一套针对两节串联电池单元的主动均衡器装在一台模拟某离线式不间断电源的主板上跑了一段时间效果挺稳。如果你正在做 2S 电池包、后备电源或者小型储能系统这个方案的代表性和移植性都很好值得拆开讲讲。先说清楚这套系统要解决的不是“充电管理”而是“串联电池电压一致性”问题。两节电池天生就不可能一模一样随着循环次数增加差异只会越来越大。如果不做均衡容量小的那节会先被充满也先被放空时间一长直接报废还会拖累整组电池的可用容量。与其换整组电池不如让两节电池保持在同一水位上这就是均衡器存在的意义。1. 两个串联电芯为什么偏要“动刀”处理1.1 出厂时不一样用了以后更不一样锂电池生产厂家即使管控再严格同一批电芯的内部阻抗、容量、自放电率也存在离散性。串联状态下充电电流和放电电流是完全相同的但每节电池实际到达的电压却由自身内阻和容量决定。内阻偏高或容量偏小的那节在充电时会更快抬压在放电时会更快跌压。温度差异还会放大这个现象。电池包内部通常存在热梯度靠近电芯中心的位置散热更差高温会加剧自放电低温会增加内阻。后备电源系统更是常年处于浮充状态微小差异经过长期累积最后会变成明显的电压差。当两节电池的压差超过一定阈值高压侧先触发过充保护低压侧还远没有充满整个系统的容量立刻缩水。1.2 被动均衡只管“烧”主动均衡讲究“搬”市面上常见的就是被动均衡也叫耗散式均衡。原理很简单检测到哪节电压高了就通过并联在它上面的电阻把多余的能量以发热形式消耗掉。成本低电路也简单但问题很明显——能量被浪费还会产生热量均衡电流不能开大否则局部温度过高。在 2S 这种电池数量很少的系统里被动均衡勉强能用可储能和备用电源场景对效率和长期稳定性要求更高我不太想用这个思路。主动均衡的思路是让能量在电芯之间转移。高压电池多余的能量不是烧掉而是搬到低压电池里。这样一来不但省电均衡电流还能做得更大热管理压力也小。我选的就是基于 DC-DC 变换器的主动均衡这也是标题里 MP2642GR-Z 负责干的事。1.3 这个项目的边界与目标参数我的目标很简单对两节电压范围在 3.0V 到 4.2V 的磷酸铁锂或三元锂电池做均衡。工作场景是 24V 以下的小型储能模组均衡策略由单片机控制均衡电流目标是 1A 左右静态功耗要低系统在长期浮充状态下不能自身成为负担。另外还要考虑一个问题很多备用电源系统不是满负载运行均衡器往往要长时间闲置它的自身功耗和待机稳定性同样关键。所以我选择用 PIC18F45K80 做控制核心因为它外设配置灵活、睡眠功耗可控配合 MP2642GR-Z 的轻载效率和关断功能可以实现待机时基本不耗电。2. PIC18F45K80 和 MP2642GR-Z各自负责哪一摊2.1 PIC18F45K80 作为大脑不是只读电压第一次看到 PIC18F45K80 的人可能会觉得它是一款普通 8 位单片机但用于电池均衡其实非常合适。它集成了 12 位 ADC这对于测量锂电池电压非常关键。常见的低端 MCU 只有 10 位 ADC分辨率为 4.8mV 左右而 12 位 ADC 在 4.2V 满量程下分辨率能达到 1mV 上下能更灵敏地捕捉到两节电池之间几毫伏的电压差。它还带多个定时器、PWM 输出和丰富的 GPIO。我可以用 CCP 模块产生 PWM 去控制功率级也可以用定时器做均衡时间管理。更重要的是它内部有 EEPROM不需要外挂存储芯片就能把校准系数、均衡记录、故障标志存下来。备用电源系统往往需要记录曾经发生过多少次不均衡事件这些数据对现场运维有参考价值。2.2 MP2642GR-Z同步降压转换器客串能量搬运工MP2642GR-Z 是一颗同步降压转换器大部分人对它的印象是给 MCU 供电或者做系统主电源。但在均衡电路里它可以反着用将电压偏高的电池降压给电压偏低的电池充电形成一个受控的能量转移通道。做法是围绕 MP2642 搭一个单向 DCDC输入接高压侧的电池输出接低压侧的电池。当单片机判断出高侧电芯电压偏高时就开启 DCDC使能量从高压电芯流向低压电芯。由于是同步整流结构效率能做到 90% 以上均衡电流也不容易被发热拖住后腿。而且 MP2642 本身具备电流限制和热关断保护降低了整个功率通道的设计难度。为了避免来回搬家的效率损耗我在 DCDC 后面加了一级低导通电阻的 P-MOS 开关由 PIC 控制输出路径。这样只有在某一侧需要均衡时功率通道才真正导通其他时间 DCDC 可以处于关闭状态进一步降低损耗。2.3 为什么不用现成的专用均衡芯片市场上确实有一体化的主动均衡专用芯片比如带飞渡电容的或者多相同步的它们集成度更高代码量也更少。但选择 MP2642GR-Z 加单片机的组合主要考虑了三件事。一是灵活性。我的目标只是两节串联但以后很容易扩展到四节、六节用单片机做逻辑只需要调整硬件阵列和控制策略不用更换核心平台。二是可维护性。现场出现问题我能通过 UART 把实时电压、均衡状态、故障码读出来专用芯片就难做到这一点。三是供应链和成本。MP2642 和 PIC 都是大路货采购容易降本空间也更大。3. 硬件设计里容易踩坑的地方3.1 电压采样不是简单分压就行两节电池串联时高压侧电芯的电压是包含低压侧电芯电压的。如果只做一个总电压分压然后靠 MCU 做减法误差会被放大一截。最靠谱的做法是分别测量低压侧电池电压和总电压再用软件算出高压侧电压。实际电路里我用低温度系数的精密电阻做分压每个采样点加一个 100nF 滤波电容然后再进到单片机 ADC 的输入引脚。ADC 的参考源也不能乱选。PIC18F45K80 的 ADC 参考电压建议使用内部基准因为它是经过校准的温漂比直接用 VDD 好得多。我用外部基准源的话成本稍高但稳定性更好。如果你不想外接基准至少要在软件里做一次两点校准并将校准系数存到 EEPROM。3.2 MP2642 外围参数的计算思路MP2642 的输入电压范围比较宽这给均衡电路提供了余量。在计算电感量时我不照搬厂家手册里的“典型应用”而是把均衡工况单独拉出来算。均衡电流 1A输入电压可能是 4.2V输出电压可能只有 3.2V此时占空比大约等于 0.76开关频率设成 500kHz 左右。电感纹波电流一般取输出电流的 30% 到 40%也就是 300mA 到 400mA。电感量粗略按 L (Vin - Vout) * D / (f * ΔI) 估算把数值代进去大约在 4.7μH 到 6.8μH 之间。这个结果可以看出均衡电路和普通电源电路的电感选择并没有本质区别难点在于要确保电感饱和电流大于设计峰值电流否则均衡过程会突然出现电流毛刺干扰采样。输出电容主要是为了稳定环路我用了两棵 22μF 的 MLCC。输入电容靠近芯片的 IN 脚用来吸收输入纹波容值和输出侧差不多。如果布局空间紧张很多工程师会偷懒合并成一颗大的但我建议输入输出各放一两个小容值并联高频特性更好。3.3 功率通道保护必须考虑进去均衡系统直接挂在电池两端通常不会受到很好的“供电规划”因此保护要特别周详。首先是防反接可在总输入路径上加一个串行 PMOS 作为理想二极管其次是过流保护MP2642 自带限流但我会在软件里加一个电流检测点避免异常情况下的极限均衡电流持续太久。还有一个容易被忽视的点是均衡开启瞬间的冲击。电池内阻很低均衡启动时 DCDC 输入侧会抽动较大的瞬时电流导致电压瞬间跌落。这个跌落如果不加处理单片机可能误以为低压侧电压过低从而异常开通关。软件上要做软启动MP2642 的软启动时间也建议调到 2ms 以上。3.4 这块 PCB 布局我只讲三件事第一功率地和小信号地必须单点汇合。均衡电路里既有 1A 级别的功率电流又有毫伏级的采样信号如果把采样地线走在功率电流回路上ADC 数值会跟着均衡电流抖动。第二MP2642 的开关节点需要尽量短粗减少寄生电感和开关振铃MP2642 是同步降压开关节点上的振铃会带来额外损耗和电磁干扰。第三PIC 的晶振或内部振荡器要远离功率电感和开关节点否则会引起采样时序抖动。如果是两层板功率回路放在顶层底层做完整地平面采样信号从侧面走不要跨分割。如果是四层板那就更宽裕了。我在打样初期用过两层板锁相效果也不算差但采样纹波确实比四层板明显后来调整了采样电容位置后好转。4. 软件逻辑跟不上的话硬件再好也白搭4.1 滤波要有效但不能把信号滤“钝”电池电压采样最怕的是噪声和纹波。ADC 是 12 位理论上灵敏度很高可实际电路里总有来自均衡电流的开关噪声。我最初只做了单次采样发现电压跳动能到 ±30mV 左右这会导致均衡状态机反复翻转电感和开关频率都在乱动。后来我用了滑动平均加中值滤波的组合。先连续采 5 次去掉最大最小再取剩下三个的平均。同时每次均衡开启后等待 50ms 等电压稳定再去采样。这样既能把噪声压住又不会迟钝到错过真实的电压变化。需要注意的是滤波窗口太长的话均衡状态变化会明显滞后容易造成过冲所以窗口大小要按实际开关周期来折中我最终定了 20ms。4.2 迟滞控制防止均衡器变成振荡器均衡算法不能做成“电压差超过阈值就开低于阈值就关”这种乒乓控制会让继电器和功率管不停切换。正确做法是引入迟滞。比如设定压差阈值 50mV当压差超过 50mV 时开启均衡当压差低于 20mV 时关断均衡。中间这 30mV 就是迟滞带保证均衡器不会因为几十毫伏的电压抖动而反复动作。具体到高压侧和低压侧的判断逻辑是如果 V1 V2 50mV就让能量从电池 1 流向电池 2如果 V2 V1 50mV就让能量从电池 2 流向电池 1。两种方向的切换需要避免同一时刻两个方向都导通状态机里我会强制进入一个死区延时通常是 100ms确保功率路径完全关断后再切另一侧。4.3 代码并不复杂但状态要清晰下面是一个简化的状态机骨架用 C 语言和伪代码混合描述实际工程中需要扩展成更完整的模块typedef enum { BALANCE_IDLE, BALANCE_1_TO_2, BALANCE_2_TO_1, BALANCE_FAULT } balance_state_t; void balance_task(void) { static balance_state_t state BALANCE_IDLE; int16_t diff voltage_cell1 - voltage_cell2; switch (state) { case BALANCE_IDLE: if (diff BALANCE_ON_THRESHOLD) { start_dcdc(1); // 1 - 2 state BALANCE_1_TO_2; } else if (-diff BALANCE_ON_THRESHOLD) { start_dcdc(2); // 2 - 1 state BALANCE_2_TO_1; } break; case BALANCE_1_TO_2: if (diff BALANCE_OFF_THRESHOLD) { stop_dcdc(); state BALANCE_IDLE; } if (fault_check(fault_flags)) { stop_dcdc(); state BALANCE_FAULT; } break; case BALANCE_2_TO_1: if (-diff BALANCE_OFF_THRESHOLD) { stop_dcdc(); state BALANCE_IDLE; } if (fault_check(fault_flags)) { stop_dcdc(); state BALANCE_FAULT; } break; case BALANCE_FAULT: // 必须等待外部复位或故障恢复 break; } }代码的重点不是语法而是状态机的边界条件什么时候启动、什么时候停止、遇到异常怎么办。很多初次做均衡的人只盯着“开和关”忽略了对 PWM 启动时序的控制。建议在 start_dcdc 函数里先拉高使能脚等待软启动完成再缓慢增加 PWM 占空比或目标电流避免瞬间冲击。4.4 异常保护要写在主循环里而不是中断里均衡系统的异常诊断必须周期执行一般放在 100ms 周期的主循环任务里。包括总压过高、单体过高、单体过低、温度过高、通信丢失。每个保护条件都对应一个故障码并且要锁存防止故障状态下反复重启导致开关管过热。关于故障恢复我建议手动解锁而不是自动恢复因为如果在没有排除故障的情况下反复尝试可能造成电池组损坏。可以把故障状态写入 EEPROM下次上电时检查强制设备进入待机模式等维护人员确认后才能解除。5. 实测调优与问题排查5.1 得到的压差收敛过程能说明问题我拿两组标称 3.3V 的磷酸铁锂电池做了测试。初始压差大约是 120mV这在放置较久的电池组里很常见。系统启动后均衡电流约 0.8A 到 1A压差随时间变化大概是10 分钟后降到 80mV30 分钟后降到 40mV1 小时后降到 25mV 以下最终在迟滞带内稳定。这个收敛速度对于备用电源来说完全够用因为备用电源平时并不需要频繁大幅均衡只要能在待机期间慢慢修正差异就行。测试中还观察到一个现象均衡后期压差下降变慢是正常的因为随着压差变小DCDC 的输出电流也会变小本质上是能量转移效率的下降。不要试图用更大的均衡电流去“硬掰”最后那几十毫伏收益很低还会增加发热。5.2 均衡完成后电压还会反弹误判过充怎么办这是最容易踩的坑。均衡器把两节电压调平后如果立刻断开均衡低压侧电池的电压会有一个“回弹”因为充进去的电荷还没来得及均匀扩散到整个电极。反弹幅度可能达到十几毫伏这会让状态机认为自己还没有完成均衡重新开启造成反复开工。解决办法是引入均衡结束延时比如压差达到阈值后保持均衡状态再跑一段时间然后强制进入 IDLE 状态并锁定一分钟不重新启动。或者对压差做“平滑停止”处理调整迟滞带。我实际上是把迟滞的低阈值设得比较低并且加了一个均衡持续时间的统计达到最大时间后强制休息效果就好了。5.3 电感吱吱叫问题多半不在电感有次我把均衡电流调到 1.5A电感就发出了高频啸叫。刚开始怀疑是电感饱和换了大电流电感还是一样。后来用示波器看 MP2642 的开关波形发现开关频率发生了抖动原因是负载电流变化时环路补偿没跟上产生了间歇性振动。把反馈补偿网络的电容和电阻调整后啸叫消失了。这里给个经验MP2642 这类同步降压芯片环路补偿非常依赖输出电容的等效阻抗。如果你用的 MLCC 温度特性不好在温度升高时容值会下降可能导致环路不稳定。建议输出电容选用 X7R 材质并在板上留出补偿元件位置调试时方便微调。5.4 现场问题排查速查表现象可能原因处理思路均衡电流为 0DCDC 使能未拉高或功率开关未导通检查 PWM/GPIO 电平测输入电压电流小雨设定值电感饱和、输入电容不足或环路补偿过缓换更大饱和电流电感增加输入电容电压读数跳动大采样回路受功率地干扰单点接地加大采样滤波电容压差来回反弹迟滞带过窄或滤波窗口过长增加迟滞缩短滤波窗口故障锁存后无法恢复故障码仍存在EEPROM 中未清除手动指令清除故障码并复位待机功耗偏高DCDC 未完全关断或运放基准工作用 MOSFET 切断功率通道进入睡眠最后再留几个实际经验这套系统我前后调了两周最深的感受是主动均衡的硬件电路并不比一个普通 DC-DC 复杂多少真正决定成败的是采样稳定性和控制策略。把 MP2642GR-Z 的能量转移能力用好配合 PIC18F45K80 的丰富外设其实可以做得既省电又可靠。如果你打算照这个思路做产品建议第一版就预留出均衡电流检测点和温度检测点调试阶段会省很多事。另外不要把均衡目标定得过死两节电芯压差收敛到 20mV 以内就已经足够满足储能和备用电源的长期工作需求了。追求极低的偏差只会让均衡器频繁启动反而影响电芯循环寿命。最后分享一个小技巧调试均衡方向切换时不要直接看电压差值而是看均衡电流的波形和方向。把一组采样电阻并联在 DCDC 输出路径上用示波器看电流方向是否与预期一致比看电压变化直观得多。这套方法我后续用在了其他电池管理系统上也屡试不爽。