1. 从电池失配到均衡方案这个项目到底在解决什么问题做储能或备用电源的朋友应该都有过这种体验两节全新的同品牌电池串联装进机柜头几次充放电还看不出来跑上二三十个循环之后压差就开始冒头了。一节充到保护电压先停另一节还差一截放电时一节先到欠压点整个系统跟着提前停机。这就是串联电池组里最经典的“木桶效应”——整组电池的可用容量被最弱的那节电芯卡死。我这次做的项目就是在模拟项目X的储能变流器前级和某备用电源机柜的电池管理板上处理一个 2S两节串联电池组的均衡问题。选型一度让我纠结了一阵子被动均衡方案便宜、简单但能量全变成热量散掉主动均衡方案贵一些但能把高压电池的能量搬给低压电池。最终我确定用 MP2642GR-Z 这颗电源管理芯片来搭功率级再用 PIC18F87K22 单片机来做采集、判定和控制实现了两节串联电池单元之间的能量转移式均衡。可能有人会问2S 才两节电池有必要这么折腾吗说实话如果只做消费级两节电池的充电器确实可以靠充电管理芯片自带的简单均衡凑合。但储能和备用电源的工况不一样系统可能长时间浮充或长期待机也可能每天循环充放电池失配会被十倍放大。而且机柜内部通常散热条件有限被动均衡那股热轻则加速电池老化重则带来安全隐患。所以在这类场景里主动均衡不是“锦上添花”而是切切实实的刚需。这篇文章就把这套方案的完整设计思路、硬件电路细节、软件判定逻辑、实测数据和踩坑过程都摊开来写。适合正在做 BMS、电池化成设备、便携储能、UPS 备用电源的工程师参考也适合想入门主动均衡的爱好者照着重现一遍。2. 系统设计PIC18F87K22 当大脑MP2642GR-Z 当执行机构2.1 芯片角色定位与选型逻辑先说职责划分。PIC18F87K22 是整套系统的主控者负责三件事第一通过内部 ADC 采集两节电池的端电压和温度第二根据压差大小和方向决定要不要均衡、往哪个方向均衡、均衡多大电流第三执行欠压、过压、过温、均衡超时等保护逻辑并通过 UART 把状态上报给上位机。MP2642GR-Z 则负责实际能量的搬移。它是一颗集成度比较高的开关电源功率级芯片内部有功率开关和同步整流结构外部配一颗功率电感和少量电容就能工作。在均衡场景里我把它接成升降压拓扑。为什么必须是升降压因为两节电池电压本身就相当接近能量从高电压电芯转移到低电压电芯时如果高压侧只有 3.9V、低压侧只有 3.6V那就需要降压比刚大于 1 的变换器如果反过来甚至可能是从 3.6V 升到 3.9V也就是升压。只有升降压结构才能在任意压差方向和工作点下都保持稳定的能量流动。选 PIC18F87K22 的理由也直接它的 ADC 通道数够多引脚够多可以在同一颗 MCU 上同时完成电压采样、温度采样、控制 IO 扩展、UART 通信这些任务。而且它工作在 3.3V 或 5V 下都很常见我板子上用了 3.3V 供电ADC 参考电压直接用内部带隙基准省掉一颗外部基准芯片。对一颗做 2S 均衡控制器的 MCU 来说性能和资源都绰绰有余。2.2 能量转移路径与均衡方向控制两节电芯串联命名成 Cell1 和 Cell2。Cell1 的低端是系统地Cell1 高端和 Cell2 低端是串联中点Cell2 高端就是整组电池的正极。均衡的本质就是把能量从电压高的那节电芯抽出灌进电压低的那节直到两者电压差进入死区。具体怎么接MP2642GR-Z 在方案里不直接固定连到某一节电池上而是通过两组外部功率开关管把变换器的输入端口和输出端口分别接到 Cell1 和 Cell2 上。PIC18F87K22 通过两路方向控制信号DIR_A、DIR_B决定哪一组开关导通当 Cell2 电压高于 Cell1PIC 让 DIR_A 有效MP2642 的输入端接 Cell2输出端接 Cell1能量从 Cell2 流向 Cell1当 Cell1 电压高于 Cell2PIC 让 DIR_B 有效MP2642 的输入端接 Cell1输出端接 Cell2能量从 Cell1 流向 Cell2。这样设计的好处是MP2642GR-Z 本身只需要工作在变换电压的方向上无论哪节电池是源、哪节是负载功率级电路的工作状态始终是输出接低压侧、输入接高压侧控制逻辑非常干净。切换方向的瞬间PIC 会先关闭 MP2642 的使能等 200ms 左右的死区时间让变换器完全放电后再切换功率开关避免拉弧和浪涌。3. 硬件电路采样、均衡功率级和单片机接口的搭建细节3.1 电压采样电路共模电压与前级滤波2S 电池组的采样有个容易忽略的坑Cell2 的电压是“悬浮”的它对地最高能到 8.4V 左右两节 4.2V 满充串联而 MCU 的 ADC 输入范围是 0~3.3V。所以不能直接把 Cell2 两端接到 ADC 引脚上必须用分压电阻先把电压缩到 ADC 量程以内。我用的方案是高精度低温漂电阻分压比例约为 4:1也就是把 0~8.4V 映射成 0~2.1V 左右留出一定裕量。每路采样都在分压后加了一级 RC 低通滤波电阻 10kΩ、电容 100nF截止频率大约 160Hz。为什么要加这个滤波因为后级均衡功率级一旦开始开关工作会在电池端子上叠加高频纹波如果不滤波ADC 采到的电压可能跳动十几毫伏直接影响均衡判定。还要注意运放和 ADC 输入漏电流问题。PIC18F87K22 的 ADC 输入引脚有采样电容在采样瞬间会抽取少量电荷。如果分压电阻阻值太大采样电容充电时间不够就会导致读数偏低。我实测下来分压网络总阻值控制在 200kΩ 以内、ADC 采样时间配置成 2μs 以上读数才稳定。3.2 MP2642GR-Z 外围配置电感、电容、反馈和软启动功率级这一块电感是整个均衡效率的核心。我用了 10μH 的功率电感饱和电流选 3A直流内阻尽量压到 50mΩ 以下。电感太大动态响应慢、均衡启动瞬间电流爬升太慢电感太小纹波电流增大会增加磁芯损耗和输出纹波。综合开关频率和均衡电流 0.5A 的设计目标10μH 是均衡效果和损耗都比较均衡的值。输入输出电容我选了两种靠近芯片引脚的位置各放一颗 22μF/25V 的 X7R 陶瓷电容吸收高频开关纹波再各放一颗 470μF/25V 的电解电容对应低频能量缓冲。陶瓷电容负责高频去耦电解电容负责平滑能量脉动两者缺一不可。只放陶瓷电容会导致低频纹波偏高只放电解电容则高频纹波压不住开关噪声会一路窜到采样电路。反馈电路上MP2642GR-Z 通过 FB 引脚设定输出电压但均衡场景下我们不需要固定输出一个电压而是希望输出一个稳定的电流。所以我在输出端串了一个 20mΩ 的检流电阻把电流信号放大后引入 FB 节点构成闭环恒流。具体做法是用一颗简单的运放把检流电阻两端压差放大后叠加到 FB 引脚通过设定参考电压来控制均衡电流的幅值。PIC18F87K22 可以利用 PWM 输出经过二阶 RC 滤波生成一个 0~2V 的模拟参考电平接到运放参考端这样软件就能实时改变均衡电流大小。软启动也是必须处理的。刚开始调板的时候我直接给使能脚拉高结果是均衡启动的瞬间电流尖峰很大对电池冲击明显。后来在 MP2642 的 SS 引脚加了一颗 100nF 电容把启动时间拉长到大约 10ms电流从零开始平滑爬升冲击问题就消失了。3.3 PIC18F87K22 与功率级的接口设计PIC18F87K22 和 MP2642GR-Z 之间实际上只用了 5 根线EN使能、DIR_A、DIR_B、I_SET均衡电流设定 PWM、FAULT故障反馈。EN 和 DIR 都是普通 GPIO逻辑电平 3.3VMP2642GR-Z 的 EN 阈值兼容 3.3V可以直接驱动。I_SET 走的是一路 EC 模块的 PWM 信号经过二阶低通滤波后变成直流电平再送给运放参考端。这样安排的好处是均衡电流可以根据电池状态实时调整压差大的时候可以跑到 0.8A压差小的时候降到 0.3A既不伤电池又能让收敛速度快一些。FAULT 引脚接成低电平有效当 MP2642 检测到过流、过温或输出短路时会主动拉低PIC 这边配置成上升沿触发的外部中断一旦收到故障信号立即关闭 EN 并进入故障状态等待上位机复位或手动恢复。整板供电我这里多提一句PIC18F87K22 的 3.3V 电源不能直接从 Cell2 的高端取否则均衡切换方向的瞬间会把 MCU 供电拉出毛刺。我单独用了一颗小功率 LDO从整组电池正极取电输出 3.3V 给 MCU 和运放供电地线单独走一条星形接地最后只在一点与电池负极汇合。4. 均衡控制软件状态机、判定阈值和调试要点4.1 电压采集与换算从ADC原始值到毫伏级数据软件里最基础但也最容易出错的地方是把 ADC 原始值准确换算成电池电压。PIC18F87K22 的 ADC 是 10 位参考电压我用内部基准标称 3.3V。每次采样前我会连续采集 16 次去掉最大和最小值然后取平均这样能把大部分高频随机噪声消掉。换算公式也很直白V_bat ADC_value × V_ref / 1023 × 分压比。但因为内部基准实际会有 ±2% 左右的偏差直接套公式可能测出偏差 50mV 以上。我的办法是在调试阶段用两块高精度万用表实测电池电压和 ADC 读数做两个点的两点校准把每路的增益和偏移系数存在 Flash 里。校准之后整套系统的采样误差控制在 ±5mV 以内对均衡判定来说完全够用。均衡开启期间还有一点必须注意MP2642 在工作时会在电池端子上产生周期性纹波即使有前级 RC 滤波采样数据依然可能周期性浮动。我的处理方式是在软件里做了一个“均衡窗口”标记只要均衡功率级正在工作ADC 就只在开关纹波的低谷时刻开始采样并在每轮采样完成后短暂关闭均衡 2ms 再采一组“静态电压”以这个静态值为准做均衡判定。4.2 均衡判定逻辑与滞回控制均衡不能只看瞬时压差否则功率级会频繁启停既伤电池又伤芯片。我用的是一套带滞回的判定逻辑启动条件压差绝对值大于 30mV且持续 5 秒以上停止条件压差绝对值小于 10mV或持续均衡 60 分钟后压差不再明显下降方向选择电压高的一侧作为能量源电压低的一侧作为能量吸收侧。30mV 的启动阈值看起来不大但考虑到采样误差 5mV真实压差至少还有 25mV不会误触发。10mV 的停止阈值则刚好在采样精度范围内再往小里压已经没有实际意义毕竟电池开路电压本身就有一定的恢复浮动。另外压差小的时候均衡效率其实很低。根据经验当两节电芯压差小于 15mV能量转移带来的收益已经赶不上变换器本身的损耗和电池极化效应。所以我还加了一个最低均衡电流限制压差在 10~20mV 之间时I_SET 设成 0.2A 的低电流压差大于 20mV 后才升到 0.5A。4.3 保护逻辑与故障状态均衡电路本身也是电源必须有保护。我在软件状态机里定义了四个状态IDLE、BALANCE_RUN、FAULT、RECOVERY。IDLE 状态下所有 GPIO 输出关闭EN 拉低采样持续进行等待均衡条件满足。进入 BALANCE_RUN 后先按方向闭合对应功率开关延时 200ms再使能 MP2642并把 I_SET 渐进抬升到目标值避免电流突变。FAULT 由三类事件触发MP2642 的 FAULT 引脚拉低、Cell1 或 Cell2 电压超出安全窗口比如低于 2.5V 或高于 4.25V、温度超过 55℃。进入 FAULT 后立即断开所有输出同时把故障原因码通过 UART 上报。只有在排除故障后通过上位机发送复位命令系统才会回到 IDLE。RECOVERY 是一个防抖状态如果在 BALANCE_RUN 中检测到压差突然反向软件不会立即切方向而是先退出均衡、等待 500ms、重新采样确认反向信号持续存在后才切换方向。这个机制是实测中最有用的改进之一因为电池在均衡过程中会有极化电压回弹瞬时反向很常见如果没有防抖方向切换会变得非常频繁。5. 实测数据、效果评估和踩坑记录5.1 均衡收敛过程与效率数据整个方案在模拟项目X的 2S 磷酸铁锂电池组上跑了完整测试。初始时 Cell1 电压 3.21V、Cell2 电压 3.33V压差 120mV。均衡电流设定 0.5A压差收敛过程相当干净前 10 分钟压差从 120mV 快速降到 60mV随后进入平台期大概在 30 分钟左右压差降到 18mV此时程序自动切换成 0.2A 的小电流维持状态再过了约 10 分钟压差稳定在 10mV 以内均衡退出。从能量角度看0.5A 均衡电流下功率级的输入功率约 1.65W输出功率约 1.48W额外给 MCU、运放和方向切换逻辑供电约 0.3W 后整机效率约 80%。如果只算 MP2642GR-Z 自身的功率变换效率则大约在 87%余下主要是电感和 PCB 走线的损耗。整机温升方面芯片表面最高到 52℃室温 25℃电感表面 46℃都在可接受范围内。均衡过程中的副作用也值得注意MP2642 启动后会在整组电池的对地端产生高频噪声实测在 30cm 线束上测得约 100mV 的开关噪声。这个噪声虽然不影响均衡效果但如果不做好滤波和屏蔽容易干扰同一块板上的通信电路。我的处理是把 UART 走线改为差分方式并远离功率电感。5.2 两个真实踩过的坑采样干扰和低频振荡第一个坑均衡启动后 Cell1 电压读数一下子跳低 50mV。查了半天发现问题出在地线上。MP2642 的功率地电流回流路径和 ADC 采样参考地走了同一条长走线功率电流一流动参考地电位就被抬高了。解决办法是单独铺一块功率地在电池负极一点处与信号地汇合ADC 采样部分远离功率地。改完 PCB 之后启动前后的采样偏差降到 2mV 以内。第二个坑更隐蔽压差小于 20mV 时恒流环路出现低频振荡均衡电流在 0.1A 到 0.6A 之间来回摆动甚至导致 FAULT 误触发。根因是低压差下变换器占空比接近 1:1此时电流环路的相位裕度变差。我先是把 COMP 引脚的补偿电容从 4.7nF 加到 22nF把带宽压下来振荡变成轻微过冲然后又在软件里把低电流死区的判定条件加强压差小于 15mV 时强制将 I_SET 设为 0彻底避开不稳定区。两招并用后振荡问题没再出现过。5.3 后续扩展建议这套 2S 均衡方案虽然只覆盖两节电池但思路完全可以迁移到更多串联节数的电池组。比如 4S 电池组可以用两套相同的均衡功率级分别覆盖 Cell1-Cell2 和 Cell3-Cell4再由 PIC18F87K22 统一协调甚至可以做相邻电芯之间的级联均衡让能量在 Cell1→Cell2→Cell3 之间逐级流动避免高压侧到低压侧一次转移距离过长导致效率下降。另一个可以扩展的方向是结合 SOC 估算做均衡策略。目前方案只看端电压差判定但两节电芯如果开路容量不一致端电压一致时不代表 SOC 一致。后续可以在 MCU 里加入库仑计数据或者利用 PIC18F87K22 的定时器做开路电压静置归零后的 SOC 修正从而在容量层面进行更精准的均衡。当然这会显著增加算法复杂度适合有精度要求的储能场景。最后说一个小技巧如果你也想在现有板子上快速验证均衡策略不必急着画 PCB。可以先拿两节电池加一块现成的升降压模块用 PIC 开发板飞线控制使能和方向把算法跑通再去做正式板。我当初就是先用这种方法把状态机和保护逻辑调稳定再投板整板调试周期直接缩短了一半。