2S电池组主动均衡设计:MP2642+STM32单电感半桥实战
做储能和备用电源这块手头这版2S备用电源板上最让我头疼的就是均衡问题。两节串联电芯出厂容量几乎一样跑了几十次循环之后就开始出现压差而且越拖越大整块电池的可用容量直接被最低那节电芯拽住。后来我定了方案用 MP2642GR-Z 当功率级控制核心配 STM32F446ZE 做监控和策略调度专门对两个串联电池单元做主动均衡。这篇文章就是这个项目的完整记录——拓扑怎么选、硬件怎么搭、状态机和策略怎么写、实测中踩了哪些坑适合正在做 2S 或多串 BMS、想搞懂主动均衡怎么落地的人参考。1. 为什么两节串联电芯也需要专门做主动均衡1.1 压差是怎么被“养”出来的很多人觉得电芯数量少就不需要均衡这是一个误区。两节电芯串联看似简单但电池的不一致性并不因为数量少而消失。制造工艺再接近电芯内部的电解液浸润程度、极片厚度、内阻分布都不可能完全一致。这些差异平时被充电和放电管理掩盖了等到循环次数上来、自放电率拉开差距或者电芯处于不同的温度区间时端电压就会开始分化。备用电源系统尤其容易放大这个问题。这种设备大部分时间挂在浮充状态电流很小电芯表面上很平稳但自放电率不一致让“静置”成为最大的分选杀手。靠近功率器件的那节电芯温度更高自放电更快容量衰减也更快。容量衰减快的那节电芯在同样电流下压降更大发热更大形成正反馈。我实测过一组使用了半年的两串电池初始压差只有5mV左右半年后最坏情况下静置压差跑到了80mV以上这还只是来自温度场和自放电率的差异没有算上充电管理误差。1.2 不均衡的最直接代价两节电芯串联充电时哪节先到截止电压系统就按哪节来停。高压那节先到4.2V低压那节可能还在3.9V为了保护高压节充电被迫中止低压节永远充不满。放电时反过来低压节先掉到欠压点高压节还剩三分之一电能系统就报欠压切断了。对储能和备用电源来说这个代价非常直接可用容量缩水备电时长达不到设计值。更重要的是长期被“压力”的那节电芯始终处于过充或欠压的边缘老化速度明显加快随后又反过来加剧失衡最后变成“最弱的那节电芯决定整包寿命”的局面。在两串系统里这个现象不是概率问题是时间问题跑得久了一定会遇到。1.3 被动均衡在这个工况下的短板最传统的被动均衡做法是检测到某节电芯电压偏高后通过并联的电阻放电把多余能量直接以热量形式消耗掉。两串系统用被动均衡也不是不行但在备用电源场景下有明显短板。首先被动均衡只能削高、不能补低低压那节电芯永远只能等待被补上如果两节都有偏差均衡周期会拖得很长。其次浮充状态下本来充电电流就小靠电阻放电反而给充电器增加负担发热集中在线路板局部长时间工作隐患不小。最后也是最重要的被动均衡的能量是白白烧掉的——在一台希望长待机、低功耗的备用电源设备里这种浪费不可接受。所以这版设计从一开始就锁定了主动均衡路线把能量从高压电芯直接搬到低压电芯而不是烧掉。2. 拓扑选型单电感半桥为什么能搬能量Boost母线方案为什么不行2.1 2S电池组的“地”问题决定了拓扑边界最开始我脑子里冒出来的方案是两级的“Boost母线”结构用 MP2642GR-Z 把高压电芯升压到一个固定母线再从母线给低压电芯灌能量。听起来很顺但画原理图时很快发现了一个绕不开的坑2S电池组里两节电芯的地电位不共地。两节电芯串联Cell_A 的负极是整个系统的地Cell_A 的正极同时是 Cell_B 的负极这个节点我们叫 N1。如果 Boost 的输入接 Cell_A输出接 Cell_B那 Boost 的输入地和输出地分别是 P- 和 N1二者之间隔着整整一节 Cell_A 的电压。非隔离的 Buck-Boost 拓扑根本没办法在两个不同地参考之间直接搬能硬接的话相当于把 Cell_A 短接了一部分回路。这就是为什么市面上两串均衡器几乎都是单电感加开关网络的结构而不是简单“先升压到母线再降压”。如果把它扩展到更多串地电位问题会更加复杂。所以在 2S 这个场景正确的边界条件是必须有一个悬浮在任意节点之间的储能元件再加上可控的开关网络让能量从哪个单元取、往哪个单元送由开关决定而不依赖一个固定地参考。2.2 单电感双向搬运的具体工作过程我最终采用的拓扑是经典的半桥加电感结构。储能电感一端接在电池组中点 N1另一端接半桥中点 X半桥的上管接到总正极 P下管接到总负极 P-。两个开关管互补工作但中间必须留死区绝不允许同时导通。当 Cell_B 电压高于 Cell_A需要把 Cell_B 的能量搬给 Cell_A 时上管先导通。Cell_B 的正极是 P电流从 P 经上管、电感到 N1再回到 Cell_B 负极电感被充电储存磁场能量。上管关断后电感电流不能突变X 点电压被拉低下管的体二极管或并联二极管续流电流从 N1 经 Cell_A 回到 P-再经过下管回到电感把能量释放到 Cell_A。这个过程本质上就是一个 Buck-Boost 的能量搬运一个周期搬一次PWM 频率和占空比决定平均均衡电流。反过来当 Cell_A 电压高需要把能量搬给 Cell_B 时下管先导通Cell_A 给电感充磁然后通过上管体二极管给 Cell_B 续流。两管各自的角色互换但硬件结构完全对称。这套拓扑不需要任何隔离变压器一个电感加两个 MOS 就是全部功率级非常好调试。2.3 MP2642GR-Z 在功率级里干的活那 MP2642GR-Z 在这个拓扑里扮演什么角色它不是一颗专门的均衡芯片而是一颗 PWM 升压控制器我把它用在功率级的控制环路上。均衡过程需要的是受控的脉冲开关动作也就是 PWM。MP2642GR-Z 内部有振荡器、误差放大器和限流比较器能以相对固定的开关频率产生 PWM 信号同时还支持软启动和过流限制。我让 MP2642 负责产生固定频率的 PWM并通过外部电流采样电阻做峰值电流限制STM32F446ZE 不直接去高频控制 MOS 开关而是负责低频的决策——判断方向、使能、监控电压和温度。方向切换的时候STM32 通过逻辑电路把 PWM 信号映射到当前这个方向对应的主开关管上续流管则工作在非同步状态靠体二极管完成续流。这样做的好处很明显MCU 的定时器资源不用被高频 PWM 完全占住控制环路也稳定得多。MP2642 的限流功能可以在一两个开关周期内封顶电流避免电感饱和和过流而 STM32 的软件判断再快也赶不上硬件比较器这种分工是合理的。3. 硬件实现细节半桥、电感、采样与保护3.1 半桥MOS管、驱动器和防直通逻辑半桥的上管和下管都选用了低导通电阻的 N-MOS导通电阻基本在 10 毫欧级别。上管是高边开关源极接半桥中点 X漏极接 P栅极电位必须高于 P 才能完全导通所以需要高压侧驱动。下管是低边开关源极接 P-栅极电位只要高于地就能导通驱动相对简单。我用了一颗半桥驱动器来同时驱动上管和下管由 MP2642 生成的 PWM 信号送进驱动器的高边和低边输入。这里最关键的参数是死区时间上管关断到下管导通之间的间隔必须大于 MOS 管的关断延迟时间。我实测过死区太短或者驱动器本身不带死区控制半桥就会在切换瞬间出现短暂直通P 到 P- 直接短路轻则冒烟重则烧管。所以我的做法是选择自带死区控制的驱动器同时在软件层面保证方向和使能切换时先全部关闭、等待至少 10ms、再使能另一边从两个层级杜绝直通。3.2 电感参数与均衡电流的计算电感的选型决定了均衡电流能到多大也决定了纹波和损耗。电感的励磁阶段电流上升斜率由输入电压和电感量决定。以单节 3.8V 左右、开关频率 400kHz、目标平均均衡电流 1A 为例若允许电感纹波约 0.5A那么电感量大概需要L Vin × D / (f × ΔI)其中占空比 D 在均衡时接近 0.5Vin 取 3.8Vf 取 400kHzΔI 取 0.5A算出来约 9.5 微亨。我选了 10 微亨的功率电感饱和电流按峰值电流加余量取 3A。峰值电流不想取太大因为限流点设定在 2A 左右时铜损和开关损耗都还能压住二极管续流阶段的导通损耗也比较均衡。电感选型有两个容易忽略的点。第一是饱和电流电感在峰值电流附近一旦饱和感值会急剧下降励磁电流瞬间失控MP2642 的限流都挡不住。第二是 DCR低 DCR 能减少铜损但往往意味着更大的磁芯体积。对于 1A 均衡电流DCR 控制在 30 毫欧以内就够没必要为追求极致压榨效率而牺牲体积。3.3 电芯电压采样差分、滤波和OCV窗口电压采样是整个系统的眼睛采样不准后面所有策略都是白搭。两节电芯的电压必须精确测量但在这个拓扑里有个天然难点Cell_B 的正极相对于系统地最高可到 8.4V如果直接分压进 ADCCell_B 的测量必须扣除 Cell_A 电压误差会叠加。我用了两个独立的差分采样通道分别测 Cell_A 两端和 Cell_B 两端。采样电阻网络按 1/3 分压4.2V 对应 1.4V8.4V 对应 2.8V都在 STM32F446ZE 的 3.3V ADC 量程内。差分结构的好处是共模电压不会影响差模测量Cell_B 的电压直接就是目标值不用在软件里做减法。滤波方面ADC 前级加了 RC 低通滤波截止频率设在 1kHz 左右同时软件里连续采 16 次取平均。这里有个经验均衡进行中电感和 MOS 开关产生的噪声会往采样线上耦合如果滤波不充分看到的电压会随占空比抖动甚至出现几十毫伏的假压差。所以我在策略上做了个妥协——均衡过程中的 ADC 结果只做保护判断用不做均衡完成判断要判断是否真正收敛必须停止均衡几十毫秒等电芯端电压恢复稳定后再测这就引出后面要说的 OCV 窗口。3.4 保护链路设计保护链路分为硬件和软件两层。硬件层MP2642 的峰值电流限制是第一道防线励磁电流一旦超过设定值PWM 会立刻被比较器拉低不会等到软件反应过来。第二道防线是半桥驱动器的直通保护以及驱动输入端的逻辑门防止非法状态同时开通两管。软件层STM32 每 100ms 检查一次电芯电压、母线电压、MOS 温度和电感温度任何一路异常都会让状态机进入故障态先关 PWM、再清方向开关、最后置故障标志。温度保护我放在了比较关键的位置均衡电流 1A 时续流二极管的压降和电感损耗会让局部温度明显上升如果没贴好 NTC热量聚到 MOS 附近长期运行就会出问题。4. STM32F446ZE的资源分配与均衡状态机4.1 F446ZE在项目中的资源占用STM32F446ZE 是一颗 Cortex-M4F 内核、主频 180MHz 的 MCU做均衡控制绰绰有余。均衡功能本身不占多少资源我在同一颗芯片上还跑了充电控制、放电保护、UART 调试输出和状态指示灯资源都还宽松。均衡模块用到的外设很常规两个 ADC 通道采电芯电压一个 ADC 通道采温度两个 GPIO 控制方向开关一个输入引脚接收 MP2642 的限流中断标志再加上一个用于 PWM 映射的定时器输出。实际分配时要注意一点ADC 采样和 PWM 开关最好避开同一个时刻。我在代码里没有让 ADC 完全独立连续采样而是用定时器触发的模式把采样时刻安排在 PWM 关断的间隙这样采到的电压包含的开关噪声最小。这个细节让我在调试时少走了很多弯路。4.2 采样任务与解耦设计均衡系统的采样任务不能太频繁也没有必要太频繁。电芯电压的变化是慢变量100ms 一次已经足够。我的调度很简单一个 10ms 的时基中断负责累积时间片和状态机推进100ms 到点时启动一次 ADC 转换序列转换完进入均值滤波。所有策略判断都基于滤波后的结果不对单次采样值做响应避免噪声引起误动作。还有一点值得单独说就是“解耦”。均衡开启时电感和 MOS 的工作电流会在电池组内阻上产生压降你测到的是端电压而不是开路电压。端电压包含极化电压和内阻压降两部分而均衡判断关心的是电芯的荷电状态差异也就是开路电压差异。所以我在每次启动均衡前会先让系统静置至少 30 秒采样得到一个相对稳定的 OCV再拿这个 OCV 做方向判断和触发判断。均衡过程中采到的值只用于过压、欠压和过温保护除非压差到了极危险的程度否则不干预搬送过程。4.3 状态机从待机到搬送到退出状态机是整个均衡功能的主干我用一个枚举变量表示当前状态在时基中断里周期推进。整个流程分五个状态IDLE、CHECK、BAL_PREP、BAL_ACTIVE、BAL_DONE另外还有一个故障态 FAULT。IDLE 状态什么都不做只周期性采样电压和温度计算压差。CHECK 状态里如果压差持续 10 次采样都超过 20mV就进入 BAL_PREP。BAL_PREP 是关键状态先清空所有方向开关延时 10ms确认半桥完全关断然后根据压差方向设置方向寄存器再延时 10ms最后使能 MP2642 的 PWM 输出。这个状态的目的就是防直通、防误切换。进入 BAL_ACTIVE 后MP2642 正常工作均衡电流由硬件限流圈定软件只做监控。等停止条件下的压差降到 5mV 以下并持续 30 秒进入 BAL_DONE。BAL_DONE 要做的动作和 BAL_PREP 是对称的先关闭 PWM等待电流降到零再清方向开关最后回到 IDLE。我特别强调“先关 PWM 再清开关”这个顺序如果反过来电感电流无处释放会产生很高的尖峰电压。故障态的处理相对粗暴任何异常情况下第一步永远是关 PWM第二步清方向开关第三步置故障码。宁可均衡功能停下也不能让功率级失控烧管。4.4 PWM映射与电流控制的配合MP2642 产生的 PWM 需要根据方向输出到不同的 MOS。我在硬件上加了一个方向选择逻辑用两个 GPIO 信号控制 PWM 走哪条路径。当方向为 A 给 B 供电PWM 走低边 MOS方向为 B 给 A 供电PWM 走高边 MOS。这个映射完全在硬件逻辑门里完成STM32 只负责设置方向值不参与高频翻转避免中断响应延迟带来的时序风险。电流控制同样分成两层。内层是 MP2642 的峰值电流限制设定好限流点以后硬件自动完成逐周期限制。外层是 STM32 的慢速调节我每隔 100ms 读一次电流采样值通过一个 PI 调节器微调 MP2642 的反馈参考值从而实现“大压差大电流、小压差小电流”的效果。这个慢环不需要很快因为均衡本来就是分钟级的慢过程调节太快反而会和电池极化现象互相纠缠。5. 均衡策略什么时候搬、以多大电流搬、什么时候停5.1 触发阈值与迟滞触发阈值我用的是 20mV停止阈值用的是 5mV中间留了明显的迟滞区间。设置迟滞的原因很简单电芯电压在静置状态下也会有很微小的波动如果触发和停止用同一个阈值系统会在临界点反复进入和退出均衡每次切换都要经历关断、延时、使能的过程对 MOS 和电感都是不必要的折磨。20mV 触发、5mV 停止这个区间对绝大多数锂电都是合理的。如果把触发阈值设得太低比如 5mV 就触发那均衡系统会频繁工作效率反而低设得太高比如 100mV 才触发那电芯已经被允许跑偏太久了。我自己的经验是 15 到 30mV 的触发阈值比较合适具体可以根据电芯类型和系统允许的失衡量来调。5.2 分段电流设定均衡电流不是恒定不变的。这个项目里我分了三个档位压差大于 100mV 时均衡电流 1A压差在 30mV 到 100mV 之间时均衡电流 0.5A压差小于 30mV 时均衡电流降到 0.3A。分段降流的逻辑是这样压差大时能量搬运的必要性强用大电流尽快把失衡修正回来减少高压电芯长时间处于高电压状态的老化风险。压差接近收敛时继续用大电流很容易出现过充——因为低压电芯在充电过程中端电压会升高如果反映到端电压上已经趋近再以大电流灌进去反而可能把低压电芯灌到偏高形成反向压差。所以末端降流是保护措施也是让收敛过程更平滑的手段。实测下来压差从 80mV 收敛到 10mV 的过程中大电流阶段确实明显更快末端 0.3A 的小电流则让最终收敛更精准不会因为过冲来回震荡。5.3 电压判据的局限与改进方向纯电压判据有一个理论上的局限端电压相同不代表荷电状态相同因为电芯的内阻和极化特性可能不同。同样的开路电压不同老化的电芯对应的 SOC 可能差几个百分点。对大多数应用场景来说静置后的 OCV 判断已经足够但如果做更严格的产品建议引入 SOC 辅助判断。具体做法有两种。第一种是安时积分配合在正常充放电过程中记录每个电芯的累计吞吐量当两节电芯的累计容量差异超过阈值时触发均衡。第二种是开路电压查表通过标定不同 SOC 点对应的 OCV把实际测得的 OCV 换算成 SOC 差值以 SOC 差值为主要判断依据。第二种更准确但需要针对具体电芯型号做标定工作量会大一些。我在这版项目里没有做 SOC 换算因为备用电源场景经常处于静置状态OCV 条件好电压判据已经能覆盖绝大部分情况后续如果要做多串产品我会把 SOC 判据加进去。6. 实测结果与踩坑记录6.1 一次完整均衡的数据实测对象是两节标称 3.2V 的磷酸铁锂电芯初始静置压差 85mVCell_A 3.82VCell_B 3.91V按预设策略触发均衡。前 27 分钟以 1A 电流运行压差从 85mV 降到 12mV之后进入 0.3A 小电流阶段第 46 分钟压差降到 6mV停止均衡静置 30 分钟后压差回弹到 9mV没有触发再次均衡。整个过程中最高温度出现在电感附近大约比环境温度高 10°CMOS 表面温度略低一些。回弹现象很有意思。均衡到 6mV 时你以为已经结束了但停止后电芯内部的极化慢慢释放端电压会往回弹一点。这就是为什么我在策略里要求完成判定必须在停止均衡的状态下测量并且留了 30 秒持续观察窗口。如果当初是带着均衡电流判断完成系统就会在“觉得完成了”和“实际上还没完成”之间来回折腾。6.2 坑一MOS驱动死区不足导致半桥直通第一版硬件画完后上电测试不到半分钟下管 MOS 开始发烫随后保险丝炸了。排查过程先测 PWM 波形发现上管关断沿和下管导通沿之间几乎没有间隔。换了两颗不同批次驱动芯片问题依旧最终确认是驱动器本身不带死区控制而我在设计时默认它是带死区的。修复方案分两步。硬件上换成了带死区控制的半桥驱动器死区时间设定为 100ns 左右软件上增加了一个方向切换保护逻辑任何状态迁移都必须先全关 10ms。从那以后即使在方向切换瞬间用示波器抓半桥中点电压也没有再看到直通尖峰。这个坑让我牢记一个原则半桥电路的直通保护不能只靠软件延时软件延时再短也有不确定性必须在硬件层面做死区保证。6.3 坑二电感噪声灌进ADC均衡功能调通以后我发现一个诡异现象均衡开启时ADC 读到的 Cell_B 电压会跳变到比实际值高 80mV 左右均衡一停就恢复正常。排查链路是这样的——先怀疑参考电压不稳加了钽电容滤波没用再怀疑 ADC 采样时序调整采样窗口也没用最后用示波器探到采样电阻分压点发现上面叠加了一大串开关振铃频率和均衡 PWM 完全一致。根源是采样地和功率地共了一段走线电感开关时地平面电流突变在共地段上产生了电压差而这个电压差被差分采样电路当成信号采了进来。修复方法是把采样地单独拉一根线回到电池负极功率地则走大电流路径两者在电池端单点连接。同时把软件均值滤波窗口加长从 8 次改到 16 次。这两步做完均衡开启前后的电压读数跳变从 80mV 降到了 2mV 以内。6.4 坑三方向切换瞬间的振铃方向切换时比如刚从“A 搬 B”切换成“B 搬 A”半桥中点电压会出现一段高频衰减振铃幅度最高到几十伏虽然不至于击穿 MOS但已经超过了典型耐压余量长期看是隐患。定位过程先用示波器抓驱动波形振铃发生在 PWM 映射切换的瞬间。原因是切换方向的瞬间MP2642 的 PWM 输出同时被拉低但半桥驱动器由于自身有传播延迟上管和下管都不是立刻关断导致电感电流在切换瞬间发生了强烈的换流。修复方法是增加一个“换向等待”时间也就是 BAL_PREP 状态里的两次延时第一个 10ms 等所有开关完全关断第二个 10ms 等电感电流确实衰减到零然后再使能新方向的 PWM。这之后振铃幅度明显下降剩下的部分加了一个 RC 吸收网络也压住了。6.5 后续可以扩展的方向这套单电感半桥拓扑天然支持扩展到多串系统。如果做 3S 或 4S就需要在每个相邻电池单元之间部署一个类似的均衡单元或者用开关矩阵加一个共享电感轮流搬运。MP2642GR-Z 和 STM32F446ZE 的组合目前看来完全够用如果均衡电流要提到 2A 以上需要重新整定电感参数和散热方案主控侧的处理逻辑基本不用大改。最后分享一个个人体会均衡这件事硬件占一半策略占另一半。MP2642GR-Z 把高频 PWM 和限流这些脏活累活消化掉了STM32F446ZE 只管慢速的决策调度两个芯片配合起来边界非常清晰。真正花时间的反而是那套“什么时候搬、搬多少、怎么停”的逻辑。如果你也在做 2S 或扩展多串的主动均衡第一版先把采样地和功率地分开、把状态机里的防直通延时和 OCV 判断窗口留好后续会省掉大量调试时间。