做储能和备用电源的项目时最容易被忽视但又最致命的问题就是串联电池的不均衡。我之前做过一套基于 2S 电池组的后备电源控制器两个串联电池单元标称电压一样用着用着电压差越来越大一年不到就有单体过放报废的。后来重新设计均衡方案选了 MP2642GR-Z 降压转换器和 PIC18F86K90 做主控把均衡从被动电阻放电改成了主动能量搬移整个系统才算真正稳定下来。这篇就把这套方案从拓扑选型、参数计算、固件逻辑到实测踩坑完整记录下来给同样在做储能、备用电源或者便携电池包的同行作个参考。1. 这个项目要解决的本质问题电池不均衡1.1 串联电池为什么会“跑偏”两个电池串联在一起电流路径上是同一股电流理论上充放电量应该完全一致但实际根本做不到。电芯内阻不一致、每节电芯的容量衰减速度不一样、温度场分布不均匀甚至出厂时 SOC荷电状态的初始差异都会让两个电池单元在多次循环后逐渐拉开差距。拿我当时的实际场景来说备用电源平时浮充偶尔深放电。两节磷酸铁锂电芯串联其中靠近发热器件的那节电芯温度高两三度内阻变化就比另外一节快。循环一段时间后放电末端一节电压已经掉到 2.9V另一节还有 3.2V。如果继续放电低电压那节就会被过放损坏整组电池的可用容量就这样被“短板效应”拖垮了。不均衡的危害还体现在充电端串联充电时充电电流是相同的电压高的那节会先到达充电截止电压为了避免过充系统只能提前停止充电结果另外一节永远充不满。备用电源最怕这个容量看起来还写着 100%实际能放出来的能量可能只有 70%。1.2 被动均衡 vs 主动均衡方案取舍传统低成本方案是被动均衡也就是在每节电池上并联一个放电电阻和一个开关管哪节电压高了就把多余的能量通过电阻发热放掉。优点是电路简单、控制容易缺点是能量被白白浪费而且均衡电流很小通常 50-100mA对大容量储能电池来说基本是杯水车薪。我最早的那版就是被动均衡能力太弱温差导致的电压差根本拉不回来。主动均衡则完全不同它的核心思路是把能量从电压高的电池单元搬到电压低的单元而不是烧掉。常见实现有电感式、电容式、变压器式其中电感式降压变换器式在 2S 系统中结构最简洁效率高、元件少还不需要复杂的磁芯设计。我给这两节电池选的就是主动均衡里的降压变换器方案用一个同步 Buck 变换器把能量从高电压单元或者整组电池转移到低电压单元。MP2642GR-Z 恰好就是一个集成度很高的同步降压转换器外围元件少效率能到 90% 以上很适合做这个能量转移的核心。1.3 关键器件选型逻辑主功率器件选 MP2642GR-Z我当时的考量非常直接它内部集成了高侧和低侧 MOSFET同步整流不需要外挂续流二极管这就省掉了两个功率管的驱动电路和散热问题开关频率做到 500kHz 级别电感可以用比较小的值整个均衡模块能压缩到一颗火柴盒大小输入耐压覆盖 2S 电池组的满电电压完全没有压力。控制核心选 PIC18F86K90 也不是随手抓的。它有几个点恰好命中这个场景自带 12 位 ADC采样电池电压分辨率够用内置 LCD 驱动可以直接挂段码屏显示电池电量和均衡状态nanoWatt XLP 技术待机电流非常低符合备用电源长期待机、偶尔工作的运行模式再加上 I/O 引脚多控制几个开关管绰绰有余。整个系统不需要再额外加一片显示驱动芯片成本和面积都省下来了。2. 系统方案与主功率电路设计2.1 系统架构和能量流转路径先说清楚整体拓扑。两节电池串联构成电池组从总正和总负引出主功率路径中间点是两个电池单元的串联节点。MP2642GR-Z 构成的 Buck 变换器输入接在整组电池两端输出接在均衡目标电池单元的端口上通过一组 MOSFET 开关矩阵来选择输出连接哪一节电池。工作逻辑是这样的PIC18F86K90 通过分压电阻采样两节电池的电压算出电压差。如果 Battery 1 电压高于 Battery 2 且差值超过阈值就闭合输出到 Battery 2 的开关启动 Buck 变换器从整组电池取能量降压后给 Battery 2 充电反之则把输出切换到 Battery 1。直到两节电压差收敛到设定的滞回区间关闭变换器开关断开均衡结束。这里有个设计窍门能量是从整组电池取出的所以 Buck 变换器的输入电压是两节串联的总电压约 5.5V 到 8.4V磷酸铁锂 2S 是 6.4V 到 7.3V而输出电压只需要 3V 到 4.2V降压比大概在 0.5 左右Buck 变换器工作在一个非常舒服的占空比区间效率反而比那种极端降压比的应用要好看。2.2 基于 MP2642GR-Z 的降压变换电路参数计算功率电路的核心参数就是输出电感、输出电容、输入电容以及反馈分压电阻。我按均衡电流 1A 来设计兼顾了均衡速度和发热控制。开关频率按 MP2642GR-Z 常见配置取 500kHz。输出目标电压设为 4.2V兼容锂离子和磷酸铁锂高电压段实际均衡时如果需要更低电压可以通过 PWM 或者反馈分压微调。电感值的计算公式是L (Vin_max - Vout) × D / (f_sw × ΔI_L)其中占空比 D Vout / Vin。取 Vin_max 8.4VVout 4.2VD 0.5纹波电流 ΔI_L 取输出电流的 30%也就是 0.3AL (8.4 - 4.2) × 0.5 / (500000 × 0.3) 2.1 / 150000 ≈ 14μH我实际选了 15μH 的贴片功率电感饱和电流留到 2A 以上避免在均衡电流峰值时电感量跌落太多。输出电容主要承担输出电压纹波的抑制Buck 变换器输出纹波主要由电感纹波电流和电容 ESR 决定。我用了两颗 22μF/10V 的 X7R 陶瓷电容并联ESR 很低输出纹波实测在 30mV 以内对电池充电来说完全可以接受。输入电容也不能省。因为输入端是整组电池电池本身内阻很低但如果连接线比较长寄生电感会和输入电容形成谐振。我按惯例在 MP2642GR-Z 的 VIN 引脚边上放了 10μF 陶瓷电容加一颗 0.1μF 高频去耦电容采用 0805 封装紧贴芯片放置把高频噪声路径缩到最短。这个细节我遇到过教训之前有一版输入电容距离芯片远了 5mm空载波形正常一加负载就出现高频振铃后来把电容挪到芯片脚边才解决。反馈分压电阻决定 Buck 变换器的输出电压。MP2642GR-Z 内部参考电压通常在 0.6V 到 0.8V 区间我按下述公式计算Vout Vref × (1 R_upper / R_lower)假设 Vref 0.6V目标是 Vout 4.2V取 R_lower 10kΩ则 R_upper (4.2 / 0.6 - 1) × 10k 60kΩ。为了给均衡电压留调节余地我把 R_upper 拆成 47kΩ 固定电阻加 20kΩ 精密可调电阻调试时先用可调电阻找到精确电压点再换成接近的固定电阻组。注意均衡输出电压最好略高于目标电池的当前电压但不能超过电池的绝对最高充电电压。设置反馈电阻时先把输出空载电压调到目标值再接电池确认没有过充风险。2.3 开关矩阵与采样隔离设计输出电压要能切换给 Battery 1 或者 Battery 2我用了四个 MOSFET 构成 T 型开关网络由 PIC18F86K90 的 GPIO 控制。开关管选择上要注意几点耐压必须高于电池组最高电压我选了 30V 耐压的 N-MOSFET 和 P-MOSFET 组合导通电阻要低均衡电流 1A 时导通压降不能造成明显损耗栅极驱动电压要够用PIC18 的 GPIO 高电平接近电源电压需要给 P-MOSFET 做电平转换或者干脆用 N-MOSFET 加电荷泵方案。实际布线时有一件很关键的事输出开关矩阵绝对不能出现同时导通的情况否则 Battery 1 和 Battery 2 会被直接并联短路。我在固件里加了死区延时每次切换开关状态时先断开原有开关等待 100μs再闭合目标开关。硬件上也加了简单的 RC 延时电路做双保险就算固件跑飞也不会把两个开关同时拉高。电压采样电路我用的是分压电阻加 RC 滤波。Battery 1 电压是电池组总正对地的电压范围最高到 8.4V分压到 PIC18F86K90 的 ADC 输入范围内部参考选 3.3V 或者 VDD。分压比取 1/3 左右8.4V 对应 2.8V留有余量。采样电阻我选了 100kΩ 和 49.9kΩ总阻值 150kΩ 级别对电池的静态电流消耗可以忽略。每个采样通道并联 100nF 电容和 1kΩ 串联电阻构成一阶低通滤波截止频率大约 1.6kHz能有效滤掉开关噪声。3. 以 PIC18F86K90 为核心的固件实现3.1 电池电压采样与滤波PIC18F86K90 的 12 位 ADC 对这个项目来说很够用。参考电压用内部基准设置为 3.3V采样分辨率是 3.3V / 4096 ≈ 0.8mV。考虑到分压电阻的误差和电池噪声实际测量精度大约在 ±5mV 以内对均衡控制完全够。固件里我只做了一件事非常值得强调采样时序。绝不能直接读一次 ADC 就拿来做均衡判断。电池在均衡时电压会叠加 Buck 变换器的纹波和动态响应我每次采样前先开启 ADC 通道等 2μs 采样电容稳定然后连续采 16 次去掉最大最小各 4 个用中间 8 次的平均作为本次采样值。这样一组处理下来纹波影响基本被抹平了。另外要区分两个电压电池的开路电压OCV和带均衡负载时的端电压。均衡充电时电池端电压会高于开路电压直接用这个值做均衡判断会误判。我在固件里设计了一个状态均衡启动前采样记录一次电压作为均衡基准均衡进行中每 2 秒做一次短时中断采样断开均衡 5ms采样电压恢复后的值用于实时监控均衡结束条件用得是中断采样值。3.2 均衡状态机与 PWM 控制逻辑均衡控制核心是一个五状态的状态机IDLE空闲、MEASURE采样评估、BALANCE_1给 Battery 1 充电、BALANCE_2给 Battery 2 充电、FAULT故障锁存。状态迁移逻辑如下开头进入 IDLE每 10 秒唤醒一次进入 MEASURE采样两节电池电压计算差值 ΔV |V1 - V2|。如果 ΔV 20mV回到 IDLE——这就是均衡的死区避免继电器/开关频繁动作。如果 ΔV ≥ 20mV判定哪节电池偏低进入对应的 BALANCE 状态。均衡过程中PIC18F86K90 输出一个 PWM 信号去控制 MP2642GR-Z 的使能端或者反馈参考。我实际用了更简单直接的方法Buck 变换器启动后输出电压就是设定的 4.2V 恒压值给低电压电池充电电流由变换器限流。固件只负责监控均衡电流和电压变化不需要做闭环调压。不过如果需要做电流限制可以在反馈分压网络中并一个由 DAC 或者 PWM 控制的微调电阻动态调整输出电压间接控制均衡电流。我的 PWM 控制逻辑是用固定频率 10kHz、占空比可调的 PWM经 RC 积分得到一个 0 到 3.3V 的模拟电平再通过一个运放叠加到反馈分压网络。这样固件就能微调输出电压到目标电池当前电压的 1.05 倍左右避免过大的压差导致充电电流过冲。手动“限流”的公式参考Buck 变换器输出电流 Iout ≈ (Vout_set - Vbat) / R_path其中 R_path 是输出开关管 线路 电池内阻的总和。我实测大概在 150mΩ如果 Vout_set 比电池电压高 0.2V初始充电电流就约 1.3A可以接受但如果初始压差到了 0.5V电流就会超过 3A必须限制。所以把 Vout_set 控制在高于电池当前电压 0.1V 到 0.2V 是很关键的既保证均衡速度又不至于电流失控。// 均衡状态机核心循环伪代码 while (1) { switch (state) { case IDLE: if (system_wakeup_10s) { v1 get_batt_voltage(CH_V1); v2 get_batt_voltage(CH_V2); delta abs(v1 - v2); if (delta 20) { state IDLE; } else if (v1 v2) { state BALANCE_1; // 给电池2充电 } else { state BALANCE_2; // 给电池1充电 } } break; case BALANCE_1: open_switch(SW_TO_BAT1); close_switch(SW_TO_BAT2); // 经过死区延时 buck_enable(1); set_vout_target(battery2_voltage 0.15); // 限流 if (check_delta()) state IDLE; break; case BALANCE_2: open_switch(SW_TO_BAT2); close_switch(SW_TO_BAT1); buck_enable(1); set_vout_target(battery1_voltage 0.15); if (check_delta()) state IDLE; break; } }check_delta() 函数做的事情是均衡 5 秒后关闭 Buck 变换器等待 200ms 让电压回落再采样两节电池电压。如果 ΔV 20mV判定均衡完成如果发现目标电池电压异常偏高超过 4.25V立刻进入 FAULT 并断开一切开关。这样安全逻辑就在状态机里闭环了不会出现电压过高还一直充的情况。3.3 保护和异常处理设计保护逻辑我分了三个层次。第一层是硬件保护MP2642GR-Z 自带过流保护和热关断短路时芯片自己会限制输出第二层是单片机软件保护包括过压保护任何一节电池超过 4.25V 立即停止均衡并锁存、过流保护通过采样电流超过设定值 1.5A 连续 3 次后停止均衡、超时保护连续均衡 24 小时电压差没收敛强制退出并置故障标志第三层是系统级保护PIC18 监控整组电池电压如果总压低于放电下限直接通知主控切断负载。FAULT 状态设计成锁存模式也就是说一旦进入必须通过外部命令或者拔电重启才能复位。这样做的好处是故障不会被自动循环掩盖我在整机测试时就发现电池轻微过压会自动恢复导致故障被吞掉反复几次后电池才彻底坏掉从那以后所有保护都用锁存。软件里还有个细节值得写PIC18F86K90 的 EEPROM 或者 Flash 数据区可以用来保存上次均衡结束时两节电池的电压值。下次上电后如果发现两节电池电压差超过 150mV就不用慢慢等 10 秒才启动均衡直接立刻进入均衡流程这个“记忆启动”功能在备用电源场景非常实用因为电池放了一晚上之后自放电差异会拉开电压快速启动均衡能防止第二天突然需要放电时电量不足。4. 实测波形与常见问题排查实录4.1 几个关键调试点与波形验证均衡电路调试最痛苦也最值得的阶段就是把 Buck 变换器调稳定。我调试时用电子负载模拟电池空载先看输出电压是否稳定在 4.2V然后加 1A 电子负载用示波器测开关节点SW波形、输出电压纹波和电感电流波形。关键的检查点是开关节点波形。正常情况应该是方波上升沿和下降沿干脆利落没有明显振铃。如果 SW 波形上有高频振荡通常是输入电容位置不对或者环路补偿参数不合适。我用 15μH 电感和 44μF 输出电容的组合实测 SW 波形在满载时有过冲大概 1.5V 的尖峰后来在 SW 节点对地加了一个 RC 吸收电路10Ω 1nF尖峰压到了 0.6V 以内。这个 RC 吸收电路对 MP2642GR-Z 的同步 Buck 来说几乎是标配不加的话过冲虽然不至于立刻炸管但长期运行会对芯片造成应力积累。电感电流波形用电流探头测正常情况下是三角波平均电流等于输出电流。如果出现电流波形不对称说明可能进入了 CCM/DCM 临界状态或者电感量偏小。我 15μH 电感在 1A 负载下纹波电流大约 280mA跟计算值基本吻合。占空比在 Vin8.4V、Vout4.2V 时实测 50% 左右开关频率 500kHz 锁定准确。均衡电压收敛曲线我做了两组记录一组是两节电池电压差初始 80mV一组是初始 250mV。80mV 那组在 25 分钟均衡到 10mV 以内250mV 那组用了大约 1.5 小时均衡电流维持在 0.8A-1A 之间后期电流逐渐降低因为 Vout_set 和电池电压的差值在缩小。这个趋势说明限流逻辑工作正常如果不是这样后期电流可能反而会升高造成过冲。4.2 常见问题速查表调试过程中我踩了不少坑整理成一张速查表有相同问题的可以直接对照参考。现象可能原因排查与解决方法上电后 Buck 无输出SW 无波形使能脚电平不对、输入电容短路先测 VIN 电压、EN 引脚电平拔掉电感量 SW 端对地电阻排除焊接短路带载后输出电压跌落明显电感饱和、输出电容 ESR 过高换饱和电流更大的电感X7R 陶瓷电容替代 Y5V均衡电流过大瞬间超过 3AVout_set 比电池电压高太多限制初始压差在 0.1-0.2V增加软启动时间切换开关瞬间电池间短路开关切换死区不够固件加 100μs 死区硬件检查 MOSFET 栅极下拉电阻ADC 采样值跳变剧烈采样时机在开关切换瞬间固定采样时序避开切换后 10ms 内采样增加滤波电容电池电压缓降但均衡不收敛均衡判断使用了带载电压改为中断采样模式用开路电压做均衡判断备用电源长时间待机后电压差反弹自放电率差异启用 EEPROM 电压记忆上电快速启动均衡4.3 个人经验与后续优化方向做完整套方案我最大的体会是均衡系统的价值不在均衡动作本身而在“判断要不要均衡”和“判断均衡是否结束”。很多方案失败不是因为电路不行而是因为判断逻辑太粗糙要么均衡过头把电量从高电池搬到低电池最后变成反过来要么频繁启停让开关管寿命缩短。我现在的这套逻辑用死区 20mV 和迟滞比较的方式避免开关频繁动作把均衡结束条件设置为“开路电压差小于 20mV”而不是“端电压相等”这个细节让收敛效果明显变好。实际测试中因为电池内阻不同端电压相等的时候开路电压差可能还有 40mV 以上如果按端电压相等作为结束条件均衡就停得太早了。后续我准备做两个方向扩展一个是在支撑架两个电池单元的基础上把均衡拓扑扩展成三节甚至四节开关矩阵的通道数相应增加状态机也要改成通用配置表驱动另一个是把 MP2642GR-Z 的开关频率从 500kHz 降到 300kHz 试试牺牲一点电感尺寸换取更低的开关损耗因为备用电源工况下均衡并不是高频动作发热控制比体积更重要。最后分享一个小技巧调试这种均衡电路时不要一上来就接真实电芯先准备两节大电容或者可调电源模拟电池把所有电压、电流、时序逻辑调稳定了再上真实电池。我第一次直接上电池就在切换开关时打了一次火花虽然没烧东西但把 MOS 管栅极氧化层损伤得不轻。模拟负载调试多花一小时后面能省一整天排查问题的时间。