基于MP2642GR-Z与PIC18F55K42的两串电池主动均衡方案解析 做储能和备用电源系统的人迟早会被电池均衡这件事拉住。两个电芯串联成组生产公差、自放电率、温度场稍微不一样循环几十次之后电压差就会从几十毫伏滚到几百毫伏。我这里想完整记录的是一套用 MP2642GR-Z 加 PIC18F55K42 做的两串主动均衡方案。它解决的问题非常具体在两个串联电池单元之间把能量从高电压侧搬到低电压侧而不是像被动均衡那样把多余能量烧掉。适合正在做 BMS、便携储能、或者备用电源开发的工程师参考。1. 两串电池为什么需要主动均衡方案定位1.1 失配是怎么产生的量级有多大两串电池在储能里属于最基础也最容易被低估的组合。电芯出厂的一致性通常很好同一批能做到容量差 1% 以内但经过几十次充放循环之后负极界面膜生长速度、电解液分解、正极材料结构变化都会把差距慢慢拉开。更麻烦的是自放电率不同系统闲置半个月之后一颗 3.60V、另一颗 3.42V 的情况非常常见。串联回路里电流处处相同所以充电时两颗电芯必须同时到达上限可容量小的那颗先到放电时同理容量小的那颗先到下限。整组电池最终能用的容量不是两颗电芯容量的平均值而是被比较差的那颗卡住这个损失在备用电源里会直接表现为后备时间缩短。你花大价钱买的高容量电芯因为旁边有一颗落后电芯实际发挥不出来这是大部分均衡项目要解决的核心矛盾。我在前期测试里专门做过一轮加速老化模拟把两颗标称 50Ah 的电芯放在不同温度环境下浮充三个月充电电压一致结果静置电压差最高到 180mV按铁锂的开路电压曲线换算SOC 差已经接近 15%。如果不做均衡这个差距只会越来越大保护板即使有单体过压和欠压保护也只能在到达极限时切断系统不能解决容量利用率的问题。1.2 被动均衡的极限在哪里很多低成本保护板都带被动均衡原理很简单检测到哪颗电芯电压高就通过并联的电阻把多余电荷放掉直到电压回落。一颗均衡电阻几十欧按 3.3V 电芯算单路电流通常只有 100mA 左右。对几安时的小电池包够用但对储能级几十安时到上百安时的电芯来说这个速度太慢了。被动均衡还有一个绕不开的问题热量。假如两颗电芯差了 5% 的 SOC用 0.1A 去放掉这部分能量需要连续放电几个小时能量全部变成电阻上的热。在密闭的储能柜里局部温升会进一步恶化电芯一致性形成恶性循环。主动均衡则不同它通过 DC-DC 把高电池的能量转移到低电池效率做到 80% 以上电流可以到 0.5A 甚至更高而且不产生明显的局部热点。这是我选择主动方案的最直接原因。1.3 系统构成与芯片分工这套方案里MP2642GR-Z 是功率执行部分PIC18F55K42 是策略与保护核心。MP2642GR-Z 是一颗同步 Buck 拓扑的功率级内部集成高低边开关管外围只要电感、电容和反馈网络就能工作。用它做均衡的关键不是让它按普通 Buck 那样固定输出一个电压而是把它改造成一个能双向搬移能量的环节。PIC18F55K42 负责采集两颗电芯的电压、判断均衡方向、调整功率级目标电压同时通过片上比较器和 ADC 做硬件级保护。这颗 MCU 的优势在于带有 12 位 ADC、DAC、CLC 这类外设很多信号调理可以在片内完成不需要额外堆一大堆模拟电路。对于两串均衡这种规模刚好合适用一块很小的板子就能把控制逻辑全部塞进去。芯片/模块承担角色关键点MP2642GR-Z同步 Buck 功率级强制 PWM 模式支持能量反向PIC18F55K42电压采样/状态机/保护12 位 ADCDAC 调节反馈CLC 辅助采样电阻与差分放大均衡电流检测判断电流方向和幅值分压电阻/运放B1/B2 电压采集共模范围与精度2. 硬件链路把 MP2642GR-Z 改成可双向搬移能量的均衡级2.1 电路结构同步 Buck 芯片怎么用来均衡先定义一下电池节点B1 是下面那颗电芯B1 正极称为 M 点B1 负极为系统地 GNDB2 是上面那颗电芯B2 正极为 BATB2 负极就是 M 点。两个电芯串联后的整组电压就是 BAT 对 GND 的电压。电路接法并不复杂。MP2642GR-Z 的输入正极接 BAT输入地接 GNDSW 脚通过一颗电感接到 M 点。反馈分压电阻从 M 点取样让默认输出目标落在 B1 的静置电压附近。这样看上去就是一个普通的降压电路只不过输出负载不是电阻而是一颗电池。但电池本身是很大的电容输出会被它钳位。所以当 MCU 把反馈目标电压调得比 B1 当前电压高一点时芯片每个周期都在从整组电池取电向 M 点灌电流等效于给 B1 充电。因为输入电流是从整组电池抽的而 B2 在这条通路上承担了大部分能量来源所以整体效果是 B2 放电、B1 充电。反过来如果 MCU 把反馈目标电压调得比 B1 当前电压低同步 Buck 的电感电流会反向流动。此时芯片不再向 M 点灌电流而是把 M 点的电荷抽回输入端等效于把 B1 的能量搬回整组电池而 B1 放出的能量会被 B2 吸收。于是同一套功率级就完成了两个方向上的能量转移。注意这里必须让芯片工作在强制 PWM 模式不能自动进入轻载 PFM。很多同步 Buck 芯片在轻载时会关掉低边管或者跳周期一旦反向电流被切断能量回流的路径就断了均衡会变成单向甚至出现电流断续带来的噪声和失控。2.2 电感、电容和电流采样参数怎么定电感是整个均衡链路的核心。按普通 Buck 的 CCM 电流纹波公式算即可ΔI_L (Vin - Vout) × D / (fsw × L)其中 D Vout / Vin。以两颗铁锂电芯为例整组电压约 6.8VB1 目标电压约 3.4VD 就是 0.5。如果开关频率取 500kHz希望电感纹波电流控制在 0.3A 左右那么 L 大约需要 11µH实际取 10µH 或 15µH 都行。电感的饱和电流要留出余量至少按最大均衡电流的 1.5 倍以上选。我测试时把最大均衡电流限制在 0.5A电感饱和电流取 3A波纹不大磁芯也不热。输出端电容在这个电路里可以很小因为电池本身就是巨大的容性负载。但 SW 节点到 M 点之间还是建议放一颗 1µF 的高频陶瓷电容吸收开关噪声改善 ADC 采样附近的干扰。输入侧按数据手册推荐放一颗 10µF 陶瓷电容和一颗电解电容因为输入是从整组电池取电电池内阻很低电容主要是给高频开关电流就近提供回路。电流采样我用了一个 5mΩ 的合金电阻串在输入地回路里再用一个差分放大器把压降送到 PIC18F55K42 的 ADC。5mΩ 在 0.5A 电流下只有 2.5mV 压降必须用仪表类运放才能获得可用精度。如果板子上有条件也可以用电感 DCR 采样少一个功率电阻但需要做温度补偿原型调试阶段我用采样电阻更直接。PIC18F55K42 的比较器可以直接拿采样电压和 DAC 设定的阈值比较一旦电流超过设定值硬件输出立刻关断或削波不需要等 CPU 进中断。这个细节在保护场景里很重要软件中断的延迟在 10MHz 主频下虽然只有微秒级但功率回路故障往往是微秒级就能炸管的能硬件处理就不要依赖软件。2.3 PIC18F55K42 的采样通道和保护输入B1 的电压测量最简单从 M 点串联一个高阻分压电阻到 GND中间接一个 RC 滤波电容。ADC 的参考电压建议用 3.3V 外部基准这样才能保证长时间运行时电压测量不会跟着温度漂移。B2 的电压测量不能直接把 BAT 分压到 MCU 的 ADC 引脚因为 B2 负端是 M 点不是 GND直接用两个单端采样相减会引入共模误差。我在板上用了一个差分运放输入分别接 BAT 和 M 点输出单端到 ADC增益按 3.65V 满量程折算。采样滤波也不能省。电池电压在充电瞬间会有极化现象负载切换时也有毛刺。我在两路 ADC 输入前都放了 10kΩ 0.1µF 的滤波截止频率大约 159Hz主要滤掉开关噪声和高频干扰。PIC18F55K42 的 ADC 支持硬件平均和相关触发可以让 ADC 在 PWM 死区时间内自动采样避开功率开关切换的尖峰时刻。这样读出来的电压稳定性会好很多不用在软件里做大量滤波。保护输入方面我在板上留了电池正极温度 NTC、功率级过温 NTC以及一个复位按键。NTC 信号进 ADC由 MCU 状态机做温度降额温度超过 60°C 时把均衡电流减半超过 75°C 时直接停止均衡并报故障。这两挡在备用电源柜里非常实用因为均衡电流虽然不大但柜内散热条件差长时间运行的时候温度累计效应不可忽视。3. 均衡策略与软件状态机3.1 电压判断的坑平台电压、极化与采样噪声很多工程师拿到板子以后第一反应是只要 B2 电压比 B1 高就启动均衡把 B2 往 B1 搬。实际跑起来会发现电压方向会频繁翻转均衡器像个二傻子一样来回切换。原因是电池电压不等于 SOC。铁锂平台非常平坦在 SOC 20% 到 80% 之间开路电压可能只变化几十毫伏。稍微有点负载电流或者测量噪声电压差就能盖过真实的 SOC 差。更麻烦的是极化电池在刚充完电或刚放完电时内部浓差极化会让电压偏离真实开路电压静置几分钟之后又会回弹。这个时候按实时电压判断很容易把一颗只是极化偏高的电池当成“真实偏高”。所以我在设计均衡策略时加了一个原则只在静置状态或者浮充稳定状态下启动均衡负载突变期间不启动已经启动的如果检测到负载电流超过某个阈值先把均衡电流降下来等系统稳定再恢复。对于备用电源来说这个条件通常容易满足因为大部分时间里系统就是浮充或空载。3.2 阈值、死区与滞回设计均衡不能一看到压差就开也不能等压差完全归零才关。我实际用的启动条件是压差大于 30mV停止条件是压差小于 5mV中间用滞回避免临界点抖动。如果压差刚好在 20mV 上下振荡状态机会一直保持当前状态不会反复开关只有真正跨过停止阈值才会退出。30mV 这个数值不是拍脑袋定的。铁锂在静置状态下30mV 大致对应好几个百分点的 SOC 差再小就容易淹没在测量误差和极化噪声里。对于三元锂开路电压曲线更陡阈值可以稍微降到 15mV对于铅酸则要更大一些。我建议把阈值做成配置项通过一根 UART 命令或者一个配置文件来改不要写死在代码里。均衡电流也需要做降额处理。早期设定 1A 电流两块电芯压差大时没觉得有问题但压差慢慢变小之后过大的电流会把低电池电压抬得很高甚至出现电压倒灌。我在软件里做了一档电流表压差大于 100mV 时用 0.5A压差在 30mV 到 100mV 之间时用 0.3A压差小于 30mV 时不启动。这样既保证大失配时能快速收敛又避免小失配时过冲。3.3 状态机与代码骨架软件状态机不复杂但状态切换的时机要卡得很准。我用四个状态IDLE、BAL_FWD、BAL_REV、FAULT。BAL_FWD 表示 B2 电压高能量从 B2 向 B1 搬BAL_REV 表示 B1 电压高能量从 B1 向 B2 搬。代码骨架如下typedef enum { IDLE 0, BAL_FWD, BAL_REV, FAULT } bal_state_t; static int16_t v1_mv, v2_mv; static bal_state_t bal_state IDLE; void bal_control(void) { int16_t diff v2_mv - v1_mv; // 正数表示 B2 高 switch (bal_state) { case IDLE: if (diff 30) bal_state BAL_FWD; // B2 - B1 else if (diff -30) bal_state BAL_REV; // B1 - B2 break; case BAL_FWD: if (diff 5) bal_state IDLE; // 压差收敛 break; case BAL_REV: if (diff -5) bal_state IDLE; break; default: bal_state FAULT; break; } if (v1_mv 3650 || v2_mv 3650) bal_state FAULT; set_balance_output(bal_state, target_voltage_mv()); }真正的工程代码里还要有一个 ZERO_WAIT 中间态状态切换前先把输出目标调到接近电池电压让电感电流归零延时 5~10ms 再反方向启动。直接从一个方向切换到另一个方向电感电流会瞬变轻则造成电流过冲重则触发过流保护甚至损坏开关管。PIC18F55K42 的 DAC 在这里很有用。我通过 DAC 输出一个电压经过 RC 滤波后叠加到 MP2642GR-Z 的反馈引脚上从而微调目标输出电压。DAC 更新时不要一步到位而是按斜坡方式每 10ms 加一小步让功率级平稳过渡。这也是我踩过坑之后改的最初直接跳变目标电压电感电流瞬间变化很大示波器上能看到明显的振铃。4. 调试实录常见问题、波形与排查方法4.1 四种典型异常及处理我在调试这套均衡板的过程中遇到过几个比较典型的问题整理成一张表方便对照。异常现象可能原因处理方式均衡电流很小达不到设定值反馈目标电压太接近电池电压被反电动势顶住把目标电压偏移加大到 50~100mV或者改用电流环控制均衡方向频繁来回切换极化回弹、电压采样噪声、阈值太小强制静置启动增大滞回加 30s 确认延时压差还没到 5mV均衡就自动退出芯片进入 PFM 轻载模式电流断续强制 PWM/FPWM禁止轻载自动跳频板子温度偏高均衡电流又上不去电感饱和导致损耗增大换低 DCR、饱和电流更大的电感检查电流波形第一个问题最隐蔽。你设置了目标电压 3.45VB1 当前电压也是 3.45V芯片理论上因为目标等于当前电压不会持续输出电流。电池是电压源不是电阻负载要让它真正灌入电流目标电压必须比当前电压高出一截。我后来把“均衡目标电压”和“电池当前电压”之间的差值作为一个可配置参数默认 50mV效果立刻正常了。第二个问题在备用电源浮充状态下特别明显。浮充时 B1 和 B2 电压差可能只有 10mV 左右但一会儿 B2 高、一会儿 B1 高其实都是测量噪声加极化现象。我加了一个简单的“启动确认”逻辑连续 30 次采样也就是大约 1 秒内压差都大于启动阈值才真的启动均衡此后只要压差还在 30mV 以上就持续工作。启动后即便瞬时跳变也不退出除非压差连续低于 5mV 达 1 秒。4.2 示波器怎么看均衡方向调试时不要只依赖万用表看电压示波器是必需的。重点看两个点SW 节点的开关波形和电感电流波形。SW 波形能看出占空比是否合理一个正常工作的同步 Buck高电平接近 BAT低电平接近 GND平均值大致等于目标输出电压。电感电流波形能非常直观地看出能量流向。电流探头夹在电感回路里如果电流在一个开关周期内整体为正向说明正在从输入端向 M 点灌电流也就是 B2 向 B1 搬能量如果电流整体为负向说明正在从 M 点抽电流回灌输入端也就是 B1 向 B2 搬能量。这个判断比任何软件打印都可靠。我第一次调通反向模式时发现负向电流波形很乱后来意识到是芯片自动进入了轻载模式。在数据手册里找到强制 PWM 选项把模式引脚拉到固定电平之后反向电流才成为连续的三角波。如果你选的芯片没有 FPWM 引脚建议看看是否有寄存器可以禁止 PFM或者直接换一颗支持强制 PWM 的同步 Buck否则双向均衡很难做得干净。4.3 个人经验先跑通两串再向多串扩展最后分享一点实际体会。两串均衡看似简单但它是多串主动均衡的基石。你把两串之间的能量搬移逻辑、电流方向切换、阈值滞回和故障保护都调顺了后面扩展成四串、六串时只需要在相邻单元之间复制同样的功率级和策略。PIC18F55K42 的 ADC 通道和 PWM 资源也足够支撑多用几个均衡通道但软件上最好从“后台循环查询”改成“事件驱动”让 ADC 硬件结果直接触发策略更新减少 CPU 占用。我在 50Ah 铁锂电池组上把均衡电流设在 0.5A长期浮充造成的 180mV 失配大约两个半小时内被压回 10mV 以内。整个过程里电池温度只上升了不到 2°C和被动均衡那种局部发热完全是两个状态。如果你的储能或备用电源系统也面临相似的两串失配问题这套方案的方向是值得试的。先拿两节旧电芯搭个实验板把示波器接好再逐步加策略比直接在成品系统上验证要稳妥得多。