两串电池到底能差多少我调一台后备电源样机时静态搁置5小时后测到的两只电池电压差了0.29V。这个数字看着不大但对一个容量只有20Ah的小电池包来说意味着每次充放电都被“短板”那一串卡住可用容量直接缩水一成以上。储能和备用电源场景里这种失配问题尤其讨厌——它不是一次性的恶化而是循环次数越多压差滚得越大。为了把它压住我搭了一套以 MP2642GR-Z 做隔离能量搬运、STM32F107VCT6 做采样与控制的二串主动均衡模块。这篇文章不聊泛泛的BMS理论直接把选型逻辑、硬件链路、固件状态机和实测数据完整写出来给正在做电池均衡或储能备电项目的同学一个可以照着抄的框架。1. 两串电池失配问题为什么值得单独做一个均衡模块1.1 失配来源制造、老化和温度带来的压差很多人第一次接触均衡会下意识觉得只有串联节数多的大型电池包才需要。但我在调试中发现两串电池的失配问题同样不可忽视而且因为节数少问题反而更容易暴露。失配的来源主要有三个。制造初始差异同一批次电芯的内阻、容量和自放电率做不到完全一致。容量差哪怕只有2%在一个20Ah的电池包里就是0.4Ah的差异折算到电压上充电末端能差出几十毫伏甚至上百毫伏。循环老化差异两只电池的放电深度、工作温度不完全一样老化速度就不同。老化快的那只内阻上升快在同样电流下压降更大反过来又加剧了它的老化。这是一个正反馈过程不干预的话失配会加速恶化。自放电和温度梯度备用电源长期浮充自放电率高的电芯会在静置阶段悄悄“漏掉”电量。如果是户外机柜靠近发热源的那只电池温度可能比另一只高5℃以上自放电率差距会进一步拉大静置压差。我测到的那次0.29V压差就是静置5小时后出现的不是充电过程里的动态压差。这种“安静状态下还在扩大”的失配最危险因为它会直接吃掉系统容量而你在运行日志里很难察觉。1.2 “最小单元”两串场景的特殊性两串电池有一个常被忽视的特点它没有“中间电芯”。在四串以上的电池组里可以用相邻电芯互相搬运能量的方式做均衡比如电容飞渡拓扑。但两串场景里两只电池是物理上的两端要么把高的一侧能量直接搬到低的一侧要么就只能被动耗散掉。这里有个很实际的问题被动均衡是“把多的那串放掉”。两串系统中放掉高串后整体可用容量下降了而且放掉的能量变成热量留在电池仓里。对储能和备用电源这种对可用容量和热管理都有要求的场景被动均衡的方案是很难接受的。另一个特殊点在充电路径。两串电池充电时充电电流流过连接线、接触器、采样线束上下两串走线的阻抗天然不同。我实测过某台样机充电电流15A时上下两串的端电压差能凭空多出60mV。这种由“外部回路”引入的压差如果用监控端的动态电压去判断均衡时机很容易误触发。所以两串场景需要的均衡逻辑必须能区分“真实容量失配”和“回路压降造成的假象”。这就是为什么要引入静置判定和迟滞窗口单纯的电压比较电路做不了这么细的决策。1.3 均衡粒度与系统设计的关系我选择把“两串”作为独立的均衡单元还有一层考虑是模块化。储能或备电系统往大了做可能是四串、六串甚至更多。如果把均衡模块做成标准的“二串单元”多串电池包只需要级联几个单元就行每个单元内部管好自己的两只电池单元之间通过总线上报状态。这样设计有几个好处。第一功率器件和变压器的规格可以统一不需要根据总串数重新选型。第二均衡算法在每个单元内独立运行计算量小对MCU的要求可以压得很低。第三故障隔离做得好——一个单元的功率级出问题不会拖垮整组。代价是单元之间需要做系统级的数据汇聚和策略协调。这个话题放到后面扩展部分细说但我在设计初期就把这个模块化思路定下来了后续所有硬件和固件的取舍都围绕它展开。2. 均衡拓扑与器件选型为什么是 MP2642GR-Z 加 STM32F107VCT62.1 三种主动均衡拓扑的对比先看主流的主动均衡拓扑有哪些可以选。我列了一个对比表基本能覆盖两串场景的决策空间拓扑功率器件数量能量转移路径典型均衡电流控制复杂度两串场景评价电容飞渡2个开关1电容只能相邻搬运0.1A~0.3A低两串时等同直接搬运可用但速度一般反激式C2C隔离变换1个MOSFET变压器副边开关任意两只电池之间直接搬0.15A~0.5A中适合作模块化核心隔离性好双向Buck-Boost2个电感4个开关任意方向搬0.3A~1A高功率大但外围多两串性价比低被动耗散1个电阻1个开关无转移纯放能0.05A~0.1A极低只适合小压差热管理麻烦电容飞渡拓扑在两串场景里其实可以简化为一个电容加两个半桥结构确实简单。但它的均衡电流由电容容值和开关频率决定要跑大电流就得用大电容和更高频率的开关体积和成本往上走。而且电容飞渡对MOSFET的驱动时序要求严格一旦两个半桥直通就是直接短路电池。双向Buck-Boost的性能最好但两串系统里它的优势发挥不出来。四串以上中间电芯可以用Buck-Boost和上下邻居双向互动拓扑的灵活性才能体现。两串时Buck-Boost的开关管数量、电感体积和环路设计成本都偏高属于“杀鸡用牛刀”。所以我的结论是两串场景反激式隔离C2C是最合理的折中。它提供天然的电气隔离避免均衡回路和主放电回路之间形成地环路变压器本身就是一个“能量搬运工”把高侧电池的能量先变成磁场再释放到低侧电池而且后端扩展模块时隔离特性可以防止多个均衡单元之间形成循环电流路径。2.2 反激式能量转移方案里MP2642GR-Z 承担什么角色MP2642GR-Z 这颗控制器我这边是按隔离反激功率级的 PWM 控制芯片来用的。它内部集成了振荡器、电流采样比较器和驱动级外部只需要配一个功率 MOSFET、一个变压器和几个阻容就能搭出一路隔离的能量搬运通道。注意具体引脚定义和开关频率设定方式请以你手里那批芯片的数据手册为准本文描述的电路逻辑基于这一类控制器在中小功率反激应用里的通用用法。它的核心逻辑并不复杂原边 MOSFET 导通时变压器初级电感储能电流线性上升电流达到电流检测比较器设定的阈值后关断原边关断瞬间变压器磁芯中的能量感应到副边由副边的整流开关或者二极管释放到目标电池。控制器只需要维持“导通—关断—释放”这个周期即可至于搬运多少能量由单片机的 PWM 使能信号和电流检测电阻共同决定。选 MP2642GR-Z 有几个实际原因。它的外围比分立的反激控制方案少省掉了单独的振荡器、误差放大器和驱动IC它的开关频率可以调到100kHz级别变压器可以做得很小这对PCB布局和结构设计都友好它对输入电压的要求宽能工作在2.5V以上的电池电压范围这对于电池快没电时仍然需要保持部分均衡能力很重要。有一点需要说清楚这里的“控制器”和“转发桥”之间的分工。MP2642GR-Z 负责的是功率级的执行即把原边能量按时序搬到副边而方向切换、均衡启停、故障判断、迟滞逻辑全部由 STM32F107VCT6 来完成。纯硬件均衡器做不到这种精细化管理这正是把 MCU 放进系统的价值所在。2.3 STM32F107VCT6 在这套系统里负责什么STM32F107VCT6 是意法半导体互联型系列里偏中高配的一颗芯片Cortex-M3 内核主频72MHzFlash 256KBSRAM 64KB封装是LQFP100。这套系统里其实用不到它的联网功能但它的 ADC、定时器和通信外设组合非常合适。我盘点了一下它在整个均衡模块中的分工12位 ADC 加 DMA采样两只电池的电压、温度、辅助电源电压。两串系统需要的模拟量很少但采样精度和时序要求高DMA 能保证采样的连续性。TIM1/TIM8 高级定时器可以输出互补 PWM 带刹车功能。均衡功率级的 PWM 使能信号我从这里出一旦检测到故障硬件刹车能直接把 PWM 拉低比软件关断快得多。多路 GPIO 控制功率路径上的方向切换 MOSFET配合互锁逻辑。CAN 或 UART 接口上报均衡状态和故障码方便接入系统 BMS。剩余资源还能跑一个简单日志记录存下每次均衡的开始时间、结束时间和压差变化曲线。为什么不用更小的 MCU因为均衡判定不是简单阈值比较它需要处理历史数据。比如“压差超过80mV持续10分钟才允许开启均衡”这种逻辑涉及时间戳和滤波再比如“均衡进行4小时后压差没有收敛要报故障”这个需要记录均衡起始时刻。如果用纯模拟比较器硬件搭会把逻辑焊死在板上后期调参数非常痛苦。STM32F107VCT6 的 256KB Flash 对于这套固件来说绰绰有余我甚至只用了不到40KB。选它而不选更低端的型号主要是考虑到后续扩展多模块系统级联动、上位机通信、甚至本地存均衡历史曲线都需要预留足量的代码空间和接口资源。3. 硬件设计从电压采样到能量搬运回路的完整链路3.1 两串电压采样共模问题与 ADC 方案两串电压采样有一个很隐蔽的坑地电平不一致。假设电池组的地是公共地那么下串电池的负极就是地下串电压是“相对地”的电压而上串电池正极的绝对电压可能高达8.4V远超单片机的 ADC 输入范围。直接不分压就采单片机就烧了。最简单的方案是两只电池分别用电阻分压然后都量到单片机的 ADC 上。上串电压用 BAT 对 GND 分压下串电压用 MID 点对 GND 分压最后在数字域做减法算出上串真实电压。这里要特别注意分压电阻的选值。我用的比例是让满电电压8.4V对应的ADC输入大约在 2.77V 左右也就是分压比约 0.33。实际取 R1100kΩ、R249.9kΩ 组合并联后等效阻抗约 33kΩ对地误差影响小。R1 放在高压侧R2 放在低压侧中间抽头并联一个 100nF 陶瓷电容做滤波截止频率大概在几十赫兹级别能把开关噪声滤掉一部分。但只靠这个分压ADC 分辨率是不够的。上串电压在 0~4.2V 范围映射到 ADC 输入只有 0~1.386V。12位ADC在3.3V参考电压下满量程是4096个码对应到1.386V只有约1723个码也就是说理论分辨率约 2.4mV。这还够用但如果要识别10mV级别的压差变化再加上采样噪声就有挑战了。我最后的做法是上串电压单独走一个差分放大采样通道。用仪表放大器把 BAT 和 MID 之间的差压直接放大到合适的ADC范围而不是靠两支分压再做减法。成本高点但精度和共模抑制比好很多。如果你预算有限用第二路分压再软校准也能跑但压差判定阈值必须放宽到30mV以上否则容易出现误动作。3.2 以 MP2642GR-Z 为核心的反激功率级与外围设计反激功率级是这套均衡模块的能量核心它的设计质量直接决定均衡效率。变压器是这里最关键也最容易翻车的器件。两串电池之间电压本来就接近所以变压器匝比取 1:1原边和副边绕组完全对称。磁芯用 EE10 或者等效的罐型磁芯就够电感量设计在 10µH 左右。我的设计目标是让均衡功率落在 0.5W~0.8W 之间平均转移电流约 0.15A~0.25A这个量级对散热和电池影响都比较温和。开关频率我定在 100kHz。这个频率下10µH 的电感配合 DCM 断续工作模式能获得一个稳定的峰值电流。计算如下设输入电压 Vin3.0V占空比 D0.4频率 f100kHz电感 L10µH。原边MOSFET导通期间电流按 Vin/L 速率线性上升导通结束时峰值电流Ipk Vin × D / (L × f) 3.0 × 0.4 / (10µH × 100kHz) 1.2A单周期存储的能量 W0.5 × L × Ipk² 0.5 × 10µH × 1.44 7.2µJ。乘以开关频率得到理论输入功率P W × f 7.2µJ × 100kHz 0.72W按80%的效率估算副边能输出约 0.58W对应平均电流约 0.19A按3V输出电压折算。这个量级的均衡电流能在一个小时内转移约0.2Ah的电量足以应对常见的0.1V~0.3V压差。峰值电流由 MP2642GR-Z 的电流检测比较器配合采样电阻设定。我用了 0.25Ω 的采样电阻对应约 1.2A 的峰值限流。注意采样电阻不是随便选的太大会限制功率太小会让 MOSFET 和变压器超应力。我建议首次做实验时把采样电阻略微取大比如0.33Ω先把功率压到0.5W以下验证逻辑后再逐步调小。变压器漏感产生的电压尖峰是另一个必须处理的问题。原边 MOSFET 关断瞬间漏感能量无处释放会在开关管漏极打出一个高压尖峰。我的做法是标准的 RCD 钳位一个快恢复二极管串联一个电阻和一个电容并联在变压器原边两端把尖峰钳到安全范围。经验值电阻 10kΩ电容 1nF二极管用耐压100V以上的快恢复管。这个参数需要实测调整基本原则是钳位电阻上的损耗越小越好只要尖峰不超过MOSFET耐压的80%即可。3.3 功率路径切换与互锁保护两串电池的反激均衡方向切换是躲不开的问题。当上串电压高、下串电压低时能量应该从BAT流到MID当下串电压更高时能量应该反着走。MP2642GR-Z 本身不会自动换方向我加了两组功率开关做路径选择。具体的连接方式是这样的反激变压器的原边正端通过一组MOSFET可以选择接 BAT 或 MID原边负端接地副边的正端通过另一组MOSFET选择接 MID 或地。这样原边从哪只电池取电副边往哪只电池灌电都由单片机决定。这种拓扑下最关键的是互锁逻辑。我规定方向切换前必须先把所有路径开关全部关断然后等 10ms 以上确保路径上没有任何残余电流再闭合目标方向的两组开关。这10ms延时是硬写进状态机的不允许在中断里被跳过。还有一个容易忽略的细节MOSFET 的体二极管会形成一个“默认导电路径”。如果 MOSFET 的源漏方向画反了即使栅极没给高电平体二极管也能把电池串接到不该接的地方。处理办法画原理图时手动标注每个MOSFET的电流流向在BOM和PCB确认阶段逐一核对。我在早期样板里就吃过这个亏详见后面调试章节。功率级供电我做了个折中设计MP2642GR-Z 和驱动电路由系统3.3V辅助电源供电不直接从电池取电。这样做的原因是均衡模块可能在电池电压很低时仍然需要工作而反激控制器的启动电压范围不一定覆盖。代价是需要一路隔离的辅助电源我用了一个小功率的反激辅助电源模块来带整体成本增加不多可靠性提升明显。4. 固件架构与均衡控制策略4.1 均衡判定的参数设计与迟滞窗口固件的第一个问题电压在什么条件下才算“需要均衡”最忌讳的做法是一采样到压差高于阈值就立刻开机。我遇到过充电过程中压差刷到 150mV结果一关充电机静置十分钟后压差自己回落到 30mV 的情况。如果用动态电压做判定就会白白开启一轮均衡浪费能量也增加电池循环。我的固件只在“静置窗口”内判定。判定条件有三条系统处于非充放电状态且已经静置超过 10 分钟电池温度在 0℃~45℃ 范围内压差超过开启阈值 80mV且持续时间超过 10 秒滤波后。开启阈值 80mV 是我反复调出来的值。取太小比如20mV会频繁触发均衡但每次搬运的能量很少系统大部分时间都在做无意义的热功耗取太大比如150mV则失配已经发展到比较严重的程度均衡时间长可能一次均衡周期搞不定。停止阈值我设得比开启阈值低很多只有 20mV。这形成了一个迟滞窗口只有当压差真正收敛到20mV以内均衡才停机。这样可以避免“刚停下来压差又抖回五六十毫伏”的反复启停问题。另外我加了一个温差修正如果两串电池的温度差超过 5℃那么开启阈值放宽到 120mV。原因是温度差会导致两只电池的开路电压本身就存在几十毫伏的差异此时强行均衡意义不大反而是能量浪费。4.2 均衡状态机的状态定义与迁移条件这套固件的核心是状态机所有操作路径都是通过状态迁移实现的。我定义了五个状态状态含义进入方式退出方式IDLE待机路径断开PWM关闭上电或故障恢复满足静置条件进入CHECKCHECK判定阶段连续采样统计压差IDLE进入压差超限进入BALANCE不超限回到IDLEBALANCE主动均衡中MP2642GR-Z功率级使能CHECK进入压差入窗口回IDLE超时等进入COOLDOWN或FAULTCOOLDOWN暂停散热PWM关闭路径保持断开BALANCE定时暂停冷却时间到回到CHECKFAULT故障锁存需人工清除任意状态检测到故障只能软件复位退出BALANCE 阶段我加了一个“最大均衡时间保护”默认 6 小时。如果开启均衡后连续6小时压差都没有收敛到停止阈值说明系统存在问题比如采样偏差、变压器饱和或者电池内部微短路继续均衡只会浪费时间固件会转入 FAULT 并上报故障码。这是我踩过坑之后加的第一次做均衡逻辑时没有时间保护有块电池内部微短路均衡连续跑了三天把另一只电池的电压也拖到了保护值以下。COOLDOWN 状态是针对反激变压器和 MOSFET 发热的。我设定每均衡45分钟就强制暂停15分钟。2串系统里的功率不大其实温升不明显但预留这一档可以防止环境温度高时长时间工作导致磁性材料饱和。如果你的外壳散热条件好可以考虑缩短冷却时间到5分钟提高均衡效率。FAULT 状态我用的是锁存逻辑。故障源包括单体电压超过充电保护上限、单体电压低于放电保护下限、板载温度超过70℃、均衡电流超过设定限值。进入 FAULT 后无论故障源是否消失都必须等外部上位机发送清除指令才可恢复到 IDLE。这是BMS的常规做法硬件和软件都不允许在异常状态未确认时自动恢复。4.3 采样滤波、开关同步采样与故障保护采样滤波这部分我吃过不少苦头。反激变换器工作时的开关频率100kHz产生的共模噪声能达到几十毫伏而这个噪声正好落在ADC采样范围内比我要判定的压差阈值还大。我用了三层手段来解决。第一层是硬件滤波分压电路上的100nF陶瓷电容把高频噪声截止到几十kHz以下。第二层是软件滑动平均每250ms采一次电压连续采16次取平均也就是大约4秒出一个稳定值。滑动窗口可以有效滤除周期噪声。第三层是开关同步采样。这是我后来加上的效果最明显。方法用 STM32 定时器的触发输出连接到 ADC 的注入通道触发引脚让ADC只在反激PWM关断期间采样。PWM关断时变压器原边电流为零噪声能量最小采到的电压最接近电池的开路电压。实测对比不做同步采样时电压读数抖动±40mV做了同步采样之后抖动压缩到±5mV以内。故障保护我不只依赖软件。TIM1高级定时器我配置了刹车输入一旦外部过温保护信号拉低硬件直接封锁 PWM 输出不需要 CPU 干预。软件负责的则是更复杂的故障判定均衡电流持续超过设定值1.5倍、均衡方向开关位置与目标方向不一致、均衡期间总电压出现异常波动等等。故障发生后固件还会在Flash里写一条故障记录包括故障类型、发生时间、当时的压差和温度。这些数据对后期分析非常有价值量产阶段甚至可以根据故障记录做批次质量评估。5. 实测数据、参数调整与踩坑记录5.1 一组两串均衡实测数据我在一台两串磷酸铁锂后备电源样机上做了均衡测试。电池标称3.2V单体容量20Ah测试前静置5小时实测初始压差0.29V。时间上串电压下串电压压差说明0h3.61V3.32V0.29V均衡前压差超阈值0.5h3.56V3.37V0.19V平均转移电流约0.18A1h3.53V3.40V0.13V压差缩小转移电流略有下降2h3.48V3.44V0.04V接近迟滞停止窗口2.4h3.46V3.45V0.01V压差低于20mV停止均衡整个过程约2.4小时转移电量约0.43Ah。注意看两串电压的平均值从起初的3.465V降到了3.455V这10mV的下降是反激变换器损耗带来的。均衡不是无损操作设计时要有这个预期。我还测了一组对照同样压差的电池包不做均衡连续20次充放电循环后压差扩大到0.51V做了均衡的电池包每轮循环前自动均衡到20mV以内20轮后静态压差仍稳定在0.03V左右。这说明主动均衡不是一次性补救而是每一轮循环都要执行的过程。5.2 调试中遇到的三个典型问题及解决过程第一个问题ADC读数在开关动作瞬间跳变导致均衡误启停。现象均衡刚启动不到30秒固件就报告压差已经小于停止阈值关断PWM但10秒后又检测到压差远超开启阈值重新启动。如此反复均衡根本无法稳定工作。排查过程先在示波器上看电池两端电压纹波只有30mV远没到触发阈值。再看ADC原始值发现PWM开关瞬间有约80mV的毛刺。问题出在采样时机上——ADC转换正好落在原边MOSFET关断的瞬间变压器漏感释放产生的尖峰直接串进了采样通道。解决方法改用开关同步采样让ADC只在上一个PWM周期完全结束后采样配合滑动平均滤波毛刺从80mV降到5mV。光这一步就把“均衡误启停”彻底解决。这也是我用“定时器触发ADC注入组”而不是“轮询采样”的根本原因。第二个问题RCD钳位电阻取值太小长时间均衡时钳位电阻发热严重。现象连续均衡1小时后用热成像看板子钳位电阻表面温度到了95℃其他元件都在50℃以下。均衡效率也偏低输入功率0.72W输出侧只有0.5W效率不到70%。原因分析调试初期为了追求MOSFET低应力我把钳位电容和电阻选得过大每个开关周期都让钳位电路提前吸收了一部分正常励磁能量相当于变压器还没把能量交给副边就先被钳位电阻消耗掉了。解决重新绕制变压器把漏感控制在电感量的5%以内同时调小RCD参数让钳位只吸收漏感尖峰不参与主能量转换。改完后效率提升到82%钳位电阻温度降到60℃。第三个问题功率路径开关MOSFET体二极管方向接反导致均衡未启动时已经有漏电流。现象系统上电后没让任何MOSFET导通电池却每个月漏掉约2%的电量。排查时用万用表测路径开关的DS两端发现虽然栅极电压为0但二极管压降端方向是通的。原因PCB布局时我把源漏极性画反了体二极管直接跨接在电池两端形成了一条微电流回路。这种问题特别隐蔽因为静态测量时如果没有仔细区分“体二极管方向”和“目标电流方向”根本看不出来。解决重新核对每个MOSFET的封装和引脚定义按电流设计方向重新布局并且加了一道软件自检均衡启动前先测量路径开关两端的电压差如果发现开关未闭合却有电压差为零的“疑似导通”情况直接禁止均衡并报警。这道自检在后来的样机上至少拦住了两次由于焊错元件导致的事故。5.3 从两串到多串扩展思路与工作量评估如果你的电池包不止两串这套模块也留了明确的扩展路径。模块化拼接每个两串单元独立均衡单元之间通过 CAN 总线互联。系统侧有一个协调器负责汇总所有单元的压差信息决定是否需要“跨单元均衡”。跨单元均衡通常只在系统压差超过某个阈值时才启用平时单元内部均衡就够用了。时钟同步多个均衡模块在同一机箱里工作时各自的开关频率如果不一致会产生差频干扰。我的做法是所有模块共用同一个 CAN 同步帧协调器每秒钟发一次同步消息各模块收到后调整自己的 PWM 周期起点把相互干扰压到最低。实测两组模块开同步后干扰噪声下降了约60%。防环流多单元共享总线时如果均衡路径设计不当可能出现“A单元往总线灌电、B单元从总线抽电”的环流。解决思路是每个单元的均衡功率级输入输出都加隔离和方向限制开关保证能量只在单元内部流动除非协调器明确发出跨单元指令。工作量方面从两串扩展到六串硬件层面只是增加单元数量主控芯片不用换固件层面需要增加一个协调器任务和CAN协议解析整体工作量大概增加一倍主要是联调和异常用例的测试成本。我现在做的几台样机里这套均衡模块对压差大于80mV的电池包能稳定把压差拉到20mV以内整体容量利用率提升约8%~12%。如果你只是想要一个能跑通的均衡方案直接按这套框架做硬件和状态机就能出结果。我最后想提醒的只有一件事均衡不是给电池“治病”它只是帮系统把可用电量释放出来真正的电池健康管理仍要靠长期的内阻跟踪和温度记录来支撑这些长期数据的价值反而比均衡动作本身更值得投入。