
1. 从两个串联电芯说起为什么被动均衡在储能场景里依然是主流选择储能系统和备用电源系统里电池组几乎都是多节电芯串联使用。串联带来的问题很直接每节电芯的容量、内阻、自放电率不可能完全一致充放电循环跑上几十上百次之后电芯之间的荷电状态SOC和端电压就会逐渐拉开差距。这个差距如果不处理木桶效应会非常明显——容量最小的那节电芯先到达放电截止电压整组就被迫停止放电充电时电压最高的那节先触碰到过充保护点整组又被迫停止充电。整组可用容量被最弱的那节电芯死死卡住循环寿命也跟着缩短。解决这个问题的思路分两大流派被动均衡和主动均衡。主动均衡用变压器、电感或电容做能量搬运把高电压电芯的能量转移到低电压电芯效率高、发热小但电路复杂、成本高、占板面积大。被动均衡则是给每节电芯并联一个可控的放电电阻谁电压高就让谁多放一点电把能量以热的形式消耗掉。听起来很“笨”但在储能和备用电源这类对成本敏感、对可靠性要求高、均衡电流需求不大的场景里被动均衡反而是最务实的选择。我这次做的项目就是针对两节串联电芯的被动均衡方案核心器件选用了MP2642GR-Z这颗电池管理前端芯片配合MKV42F64VLH16这颗微控制器来完成均衡策略的控制与执行。两节电芯的串联结构在备用电源比如小型UPS、通信基站后备电池、便携式储能电源里非常常见结构简单、成本可控但均衡逻辑一点都不能马虎。这篇文章我会把整个方案的来龙去脉讲清楚为什么选这两颗器件、均衡电路怎么设计、控制逻辑怎么写、实测中遇到了哪些坑、怎么排查和解决。如果你正在做两串电芯的BMS方案或者想理解被动均衡的工程实现细节这篇内容应该能帮你少走不少弯路。2. MP2642GR-Z 与 MKV42F64VLH16 的选型逻辑与角色分工2.1 MP2642GR-Z 在均衡链路里到底承担什么MP2642GR-Z 是一颗面向多节串联电池组的电池管理前端器件支持电压采集、过压/欠压保护、温度监测以及被动均衡驱动。它的核心价值在于把多节电芯的电压采集和均衡开关驱动集成在一颗芯片里MCU 不需要自己去逐个搭建分压采集网络和MOS驱动电路大大简化了外围设计。在两串电芯的应用里MP2642GR-Z 负责三件事电芯电压采集通过内部的多路采样网络把每节电芯的端电压转换成数字量供 MCU 读取。采集精度直接决定了均衡触发的准确性如果采集偏差大均衡就会误触发或者该触发时不触发。被动均衡开关驱动芯片内部集成了均衡MOS的驱动电路MCU 只需要通过寄存器配置告诉它“对哪节电芯开启均衡”芯片就会把对应的外部均衡电阻接入电芯两端。保护逻辑过压、欠压、过温等保护阈值可以在芯片内部配置一旦触发芯片会通过中断引脚通知 MCU同时可以自主切断充放电回路。选 MP2642GR-Z 而不是分立方案主要考虑的是集成度和一致性。分立方案需要自己搭精密分压电阻网络、自己选均衡MOS、自己设计驱动每一处都可能引入误差。集成芯片出厂时采集通道已经校准过均衡驱动的时序也由内部逻辑保证对于两串这种小规模应用性价比很高。2.2 MKV42F64VLH16 为什么适合做均衡策略的主控MKV42F64VLH16 是一颗基于 ARM Cortex-M 内核的微控制器具备足够的 Flash 和 RAM 资源外设方面有多个通信接口SPI、I2C、UART和丰富的 GPIO。在这个方案里它的角色是“大脑”通过通信接口周期性读取 MP2642GR-Z 采集到的各节电芯电压根据预设的均衡策略判断是否需要开启均衡、对哪节电芯开启控制均衡的启停时序避免在充电/放电过程中产生干扰处理 MP2642GR-Z 上报的保护中断执行相应的系统级动作比如切断继电器、上报告警如果系统有上位机或显示屏还要负责数据上报和状态显示。选 MKV42F64VLH16 的理由是它的资源对于两串BMS来说绰绰有余同时低功耗特性适合备用电源系统长期待机的场景。备用电源系统很多时候市电正常时电池处于浮充状态MCU 需要长时间低功耗运行偶尔唤醒做一次电压采集和均衡判断。MKV42F64VLH16 的低功耗模式和快速唤醒能力在这个场景下很实用。2.3 两颗器件的配合关系与通信方式MP2642GR-Z 和 MKV42F64VLH16 之间通过 SPI 或 I2C 通信具体取决于硬件设计时的接口选择。我这次用的是 SPI原因是 SPI 速率更高在需要快速轮询多节电芯电压时更有优势。通信链路的关键点片选和中断线SPI 的 CS 引脚由 MCU 的 GPIO 控制MP2642GR-Z 的中断输出接到 MCU 的外部中断引脚保护事件可以第一时间响应。电源域隔离MP2642GR-Z 由电池组直接供电MKV42F64VLH16 可能由电池组经过 LDO 降压后供电两者之间的通信线需要注意电平匹配。上电时序电池插入后MP2642GR-Z 先上电并完成内部初始化MCU 随后上电MCU 在初始化阶段需要等待 MP2642GR-Z 就绪后再发起通信。注意MP2642GR-Z 的通信接口电平通常与电池组正极相关MCU 侧如果是 3.3V 逻辑中间可能需要电平转换。这一点在原理图设计阶段就要确认清楚否则通信会不稳定。3. 两串电芯被动均衡的硬件设计细节3.1 均衡电阻的选型与功耗计算被动均衡的本质是把高电压电芯的多余能量通过电阻消耗掉。均衡电阻的阻值决定了均衡电流的大小而均衡电流又直接影响均衡速度和发热量。这个取舍需要根据具体应用来定。假设单节电芯电压为 3.7V标称我们希望均衡电流在 50mA 左右。那么均衡电阻的阻值计算R V / I 3.7V / 0.05A 74Ω实际选用标准阻值 75Ω。此时均衡电流约为 49.3mA电阻上的功耗P V² / R 3.7² / 75 0.182W所以均衡电阻的额定功率至少要选 0.25W 以上留出余量。如果选 0.5W 的封装会更稳妥因为电芯电压可能高于标称值充满时可达 4.2V此时功耗会上升到 0.235W。如果希望均衡更快可以把电流提到 100mA电阻选 37.5Ω标准值 36Ω 或 39Ω但功耗会翻倍到约 0.4W电阻封装要相应加大PCB 上的散热铜箔也要加宽。对于两串备用电源这种场景50mA 左右的均衡电流通常够用因为电芯容量一般不大而且均衡是长期慢过程不需要追求速度。均衡电流目标电阻阻值电阻功耗3.7V电阻功耗4.2V建议封装30mA120Ω0.114W0.147W080550mA75Ω0.182W0.235W120680mA47Ω0.291W0.375W1210100mA36Ω0.380W0.490W20103.2 均衡MOS的选择与驱动注意事项MP2642GR-Z 内部集成了均衡开关的驱动电路但外部的均衡MOS需要自己选。MOS 的选型要点耐压两串电芯最高电压约 8.4VMOS 的 VDS 耐压选 20V 或 30V 就足够留出充足余量。导通电阻 RDS(on)越小越好减少 MOS 自身的功耗。在 50mA 电流下即使 RDS(on) 有 1Ω功耗也只有 2.5mW可以忽略。但为了减少压降对均衡电流的影响建议选 RDS(on) 在 100mΩ 以下的型号。栅极阈值电压 VGS(th)MP2642GR-Z 的均衡驱动输出电压需要确认确保能完全导通所选 MOS。如果驱动电压是 3.3V要选逻辑电平 MOS。封装SOT-23 或 DFN 封装都可以根据板子空间来定。实际连接时均衡电阻和 MOS 串联后并联在电芯两端。MOS 的栅极接到 MP2642GR-Z 的均衡驱动引脚源极接电芯负极漏极通过均衡电阻接电芯正极。这个拓扑确保 MOS 导通时均衡电阻接入电芯两端形成放电回路。提示均衡电阻和 MOS 的走线要尽量短而粗减少寄生电感和电阻。均衡电流虽然不大但走线太细会导致压降影响均衡电流的精度。3.3 电压采集通道的滤波与校准MP2642GR-Z 的电压采集通道前端需要加 RC 滤波抑制开关噪声和瞬态干扰。典型做法是在每节电芯的采集输入引脚前加一个 100Ω 电阻和 0.1μF 电容组成的低通滤波器截止频率约 16kHz可以有效滤除高频噪声同时不影响直流电压采集的响应速度。校准方面MP2642GR-Z 出厂时已经做过内部校准但实际使用中由于外围电阻的精度建议用 1% 或更高精度的电阻和 PCB 布局的影响采集值可能仍有几个毫伏的偏差。可以在 MCU 固件里做一次单点校准用高精度万用表测量实际电芯电压与芯片读数对比计算偏差后在固件里做补偿。这个校准步骤在生产测试环节做一次即可不需要每次上电都做。4. 均衡策略的固件实现从电压采集到均衡启停4.1 电压采集的时序与滤波处理MCU 通过 SPI 读取 MP2642GR-Z 的电压寄存器读取周期通常设为 100ms 到 1s 之间。周期太短会增加功耗周期太长则响应不及时。对于备用电源系统1s 的采集周期足够因为电芯电压变化本身就很慢。读取到的原始数据需要做软件滤波。我常用的是滑动平均滤波连续采集 8 次去掉最大值和最小值剩下的取平均。这样可以有效抑制偶发的采集噪声避免因为一次异常读数就触发均衡。#define SAMPLE_COUNT 8 float get_cell_voltage(uint8_t cell_index) { float samples[SAMPLE_COUNT]; float sum 0, min, max; for (int i 0; i SAMPLE_COUNT; i) { samples[i] read_cell_voltage_raw(cell_index); } min samples[0]; max samples[0]; for (int i 0; i SAMPLE_COUNT; i) { if (samples[i] min) min samples[i]; if (samples[i] max) max samples[i]; sum samples[i]; } sum sum - min - max; return sum / (SAMPLE_COUNT - 2); }4.2 均衡触发条件的设定压差阈值与静置判断均衡不是随时都能开的。充电过程中电芯电压在上升这时候的压差不能真实反映 SOC 差异放电过程中电压在下降同样不适合作为均衡依据。最理想的均衡时机是电池静置时这时候电芯电压接近开路电压OCV能比较真实地反映 SOC 差异。我的策略是这样的静置判断如果电流采集显示充放电电流小于某个阈值比如 50mA并且持续超过 30 秒就认为电池处于静置状态。压差阈值静置状态下如果两节电芯的压差超过 30mV就启动均衡。30mV 这个阈值是经验值太小会导致频繁均衡太大则均衡效果不明显。对于磷酸铁锂电芯由于平台电压很平压差阈值可以适当放宽到 50mV。均衡目标对电压高的那节电芯开启均衡直到压差降到 10mV 以内或者均衡时间超过预设上限比如 2 小时后强制停止防止过度均衡。#define VOLTAGE_DIFF_THRESHOLD 0.030f // 30mV #define VOLTAGE_DIFF_HYSTERESIS 0.010f // 10mV #define BALANCE_TIMEOUT_MS (2 * 60 * 60 * 1000) // 2小时 void balance_task(void) { float v1 get_cell_voltage(0); float v2 get_cell_voltage(1); float diff fabsf(v1 - v2); if (!is_standby()) { stop_balancing(); return; } if (diff VOLTAGE_DIFF_THRESHOLD) { if (v1 v2) { start_balancing(0); // 均衡电芯1 } else { start_balancing(1); // 均衡电芯2 } } else if (diff VOLTAGE_DIFF_HYSTERESIS) { stop_balancing(); } if (get_balance_duration() BALANCE_TIMEOUT_MS) { stop_balancing(); } }4.3 均衡启停的时序控制与保护联动均衡启停不是简单地把 MOS 打开关掉需要考虑几个时序问题启动前确认在开启均衡之前先确认当前没有过温、过压等保护事件否则均衡可能加剧问题。渐进式启动如果 MP2642GR-Z 支持 PWM 驱动均衡 MOS可以用占空比逐渐增加的方式启动减少对电池的电流冲击。如果不支持直接开关也可以但要在固件里加一个小延时确保 MOS 完全导通后再进行下一次电压采集。保护联动一旦 MP2642GR-Z 上报过压或过温中断MCU 要立即停止均衡并根据严重程度决定是否切断充放电回路。均衡本身会产生热量如果在高温环境下继续均衡可能触发温度保护。注意均衡过程中采集到的电压会略低于实际开路电压因为均衡电流在电芯内阻上产生了压降。所以在均衡过程中判断是否达到均衡目标时要么暂停均衡等电压恢复后再判断要么在固件里对均衡电流引起的压降做补偿。5. 实测中踩过的坑与排查过程5.1 均衡开启后电压采集跳变的问题定位第一次联调的时候我发现一个奇怪的现象只要均衡一开启被均衡的那节电芯电压读数就会突然下降 50mV 左右导致固件误以为压差已经缩小提前停止了均衡。等均衡一停电压又弹回去压差依然存在。结果就是均衡断断续续效率极低。排查过程先用示波器同时抓电芯实际电压和 MP2642GR-Z 的采集输入引脚电压。发现均衡开启瞬间采集引脚上的电压确实有一个台阶式下降。检查原理图发现采集走线和均衡走线在 PCB 上有一段并行走线而且距离很近。均衡电流在均衡走线上产生的压降通过寄生电容耦合到了采集走线上。进一步测量发现采集输入端的 RC 滤波电容位置离芯片引脚太远滤波效果被走线电感削弱了。解决方案重新布局 PCB把采集走线和均衡走线分开避免并行走线。如果无法完全分开中间加地线隔离。把 RC 滤波电容尽量靠近 MP2642GR-Z 的采集引脚放置减少走线电感的影响。在固件里增加逻辑均衡开启后延迟 200ms 再采集电压避开开关瞬间的扰动。改完之后均衡开启时的电压读数跳变从 50mV 降到了 5mV 以内均衡逻辑恢复正常。5.2 SPI 通信偶发丢包的根因分析调试过程中还遇到 SPI 通信偶尔丢包的问题表现是 MCU 读到的电压值偶尔为 0 或者明显异常。丢包率不高大概几百次里有一次但足以导致均衡误判。排查思路先用逻辑分析仪抓 SPI 波形发现丢包时 CS 信号和时钟信号都正常但 MISO 上的数据确实不对。检查电源发现 MP2642GR-Z 的供电引脚上的纹波在均衡开启时明显增大。均衡电流突变导致电池组端电压波动进而影响了 MP2642GR-Z 的内部基准。在 MP2642GR-Z 的电源引脚旁边加了一个 10μF 的陶瓷电容和一个 100nF 的高频电容纹波明显减小。另外把 SPI 时钟速率从 1MHz 降到 500kHz给信号建立留出更多时间。两个措施一起上丢包问题基本消失。后来我养成了一个习惯每次均衡开启前后都读一次电压如果发现读数异常就丢弃这次数据等下一个周期再读。5.3 均衡电阻发热导致温漂的应对板子跑了一段时间后我用手摸了一下均衡电阻发现温度比预期高不少。用热成像仪一看电阻表面温度到了 70°C 左右而环境温度只有 25°C。虽然电阻额定功率是 0.25W实际功耗只有 0.18W但 PCB 上的散热铜箔面积不够热量散不出去。这个问题的影响是电阻阻值随温度漂移均衡电流会变化更严重的是电阻的热量会通过 PCB 传导到旁边的 MP2642GR-Z影响芯片内部的温度传感器读数可能导致误触发过温保护。应对措施把均衡电阻的封装从 0805 换成 1206增大散热面积。在电阻下方的 PCB 上增加散热过孔把热量传导到背面铜层。在固件里对均衡时间做限制连续均衡 10 分钟后强制休息 2 分钟让电阻冷却。如果空间允许把均衡电阻布置在远离 MP2642GR-Z 的位置减少热耦合。改完之后电阻表面温度降到了 50°C 左右温漂问题明显改善。6. 这套两串均衡方案的适用边界与扩展思路6.1 什么场景适合用这套方案这套基于 MP2642GR-Z 和 MKV42F64VLH16 的两串被动均衡方案最适合以下场景小型备用电源比如通信基站的后备电池、安防系统的备用电池容量不大均衡电流需求在 50mA 左右。便携式储能电源两串电芯结构简单成本敏感被动均衡的性价比很高。电动工具电池包两串或三串结构常见对均衡速度要求不高更看重可靠性和成本。太阳能储能小系统充放电电流不大电芯数量少被动均衡足够应对。不适合的场景也很明确大容量储能电站均衡电流需求大被动均衡效率太低、对均衡速度要求高的场景比如频繁充放电的电动车辆、电芯一致性极差的场景被动均衡只能“削峰”不能“填谷”差异太大时无能为力。6.2 从两串扩展到多串需要注意什么如果后续要把方案扩展到三串或四串硬件上需要换用支持更多节电芯的前端芯片或者级联多颗 MP2642GR-Z。固件上的改动更大均衡策略从“两两比较”变成“找最高和最低”逻辑更复杂。电压采集的通道数增加采集周期需要重新评估。均衡电阻和 MOS 的数量增加PCB 布局和散热设计难度上升。保护逻辑需要覆盖更多电芯任何一节出现异常都要能正确处理。我的建议是如果确定后续要扩展一开始就选支持多串的前端芯片避免后期重新设计硬件。固件方面把均衡策略写成可配置的模块电芯数量作为参数传入方便扩展。6.3 被动均衡的局限性与主动均衡的取舍被动均衡最大的局限性是能量浪费。均衡电流通过电阻变成热量散掉这部分能量白白损失了。对于小容量电池这点能量损失可以忽略但对于大容量电池长期累积下来也是不小的浪费。另一个局限是均衡速度慢。50mA 的均衡电流要平衡 1Ah 的容量差异理论上需要 20 小时。实际中由于均衡只在静置时进行可能需要好几天才能完成一次完整的均衡。主动均衡可以解决这两个问题但代价是电路复杂度大幅上升。电感式主动均衡需要设计变压器或电感、控制开关时序、处理能量转移过程中的损耗和EMI问题。对于两串电芯这种小规模应用主动均衡的收益往往抵不过成本增加。我的经验是两串电芯、容量在 10Ah 以下、对成本敏感的场景被动均衡是首选。如果容量超过 20Ah或者对均衡速度有明确要求再考虑主动均衡方案。6.4 固件升级与参数在线调整的实用技巧最后分享一个在实际部署中很有用的技巧把均衡阈值、均衡超时时间、采集周期这些参数做成可配置的存储在 MCU 的 Flash 或 EEPROM 里。这样在不同项目现场如果发现均衡效果不理想可以通过上位机或调试接口在线调整参数不需要重新烧录固件。实现方式很简单在固件里定义一组参数结构体上电时从 Flash 读取如果读取失败则使用默认值。通过 UART 或 CAN 接收上位机的参数更新命令校验后写入 Flash 并立即生效。typedef struct { float voltage_diff_threshold; float voltage_diff_hysteresis; uint32_t balance_timeout_ms; uint32_t sample_period_ms; uint32_t standby_current_threshold_ma; } balance_config_t; balance_config_t g_balance_config; void load_balance_config(void) { if (flash_read(CONFIG_ADDR, g_balance_config, sizeof(g_balance_config)) ! OK) { g_balance_config.voltage_diff_threshold 0.030f; g_balance_config.voltage_diff_hysteresis 0.010f; g_balance_config.balance_timeout_ms 2 * 60 * 60 * 1000; g_balance_config.sample_period_ms 1000; g_balance_config.standby_current_threshold_ma 50; } }这个做法在批量部署时特别省事。不同批次的电芯一致性可能有差异现场调试时只需要调整参数不用拆机重烧固件。我在几个项目里都用了这个方案现场调试效率提升很明显。提示参数写入 Flash 时要注意擦写寿命不要频繁写入。可以加一个“参数变更标志”只有参数确实变化时才执行擦写操作。另外建议保留一份出厂默认参数区如果用户配置出错可以一键恢复默认值。