做储能和备用电源系统的人,迟早会在串联电池组上栽一次跟头。充电时总有一节先满,放电时总有一节先空,整组电池能用的容量被拖累得很难看。这个项目的核心,就是用 MP2642GR-Z 做功率级、用 STM32H743ZI 做控制大脑,做一套针对两串电池单元的主动均衡方案。它不只解决“电压差”的问题,更是把备用电源里最值钱的那部分剩余容量真正挖出来。
这个方案适用于便携式储能、小型备用电源、通信备电模组这些常见场景。两串电池虽然少,但串联均均衡的基本套路是一样的:把高电压电池里的能量,搬运到低电压电池那边去。文章里我会把方案选型、拓扑设计、关键参数计算、固件状态机、实测和故障排查都串起来讲,尽量做到可以直接抄作业。
1. 项目整体思路与方案选型
1.1 串联电池不均衡为什么绕不开
大家都清楚,储能电池组不是一个大电池,而是很多单体串联出来的。两个串联电池单元,看着结构简单,实际上问题一摸一个准。电池在出厂时容量基本一致,但用久了之后,自放电率不同、环境温度不同、内阻增长不同,SOC(剩余电量)就越走越偏。放在备用电源这种场景里,平时电池浮充着,系统负载很小,电压差也许只有十几毫伏;一旦市电中断,电池瞬间切到满载放电,两个单体的压差会被放大,短板电池先触及放电截止电压,保护板直接断开,整个系统就像断电一样瘫了。这时候其实另外一节电池还有不少电量,但因为串联关系,有电也放不出来。
这个问题本质上是“木桶效应”。两节串联电池能放出的总容量,取决于容量低的那一节。被动的电阻均衡方案也能用,就是给电压高的电池并联一个放电电阻,把多余电量变成热量消耗掉。这种方式便宜、电路简单,但均衡电流通常只有几十到一百毫安,而且只负责“拉高不补低”,能量白白浪费掉。在备用电源这种对可靠性和续航时间都敏感的场景里,主动均衡明显更合适:把高电池的能量搬给低电池,既不浪费在发热上,均衡速度还更快。
1.2 MP2642GR-Z 与 STM32H743ZI 为什么这样组合
先把这个项目里的分工说清楚。MP2642GR-Z 承担的,不是 MCU 的角色,而是整个均衡系统的功率处理和变换角色。它是一颗集成度比较高的电源管理芯片,内部包含同步整流开关、控制环路、限流和热保护等逻辑。把它配置成一个具备升降压能力的功率级,就可以在两节电池之间搬运能量。方向由外部开关网络来选择:第一节电压高,就把第一节接到输入侧,降压给第二节充电;反过来也是一样。MP2642GR-Z 自己完成开关管的 PWM 调节,不需要 MCU 去干预每一个开关周期,MCU 只需要管“什么时候启停、往哪个方向搬、电流限制在多少”。
STM32H743ZI 在这里更像是一个总控监视器。它选用核心 Cortex-M7,主频可以到 480MHz,放到这种两串均衡应用里其实算“大马拉小车”。但我要的就是这个余量:可以在一个主控芯片里同时完成电池电压采集、温度监控、均衡状态机、故障上报、和上级 BMS 或储能系统通信。H743 的 ADC 资源也够用,内部多路 ADC 支持同步采样,配上 DMA 可以做到连续采样不占用 CPU。后续如果想要把两串均衡扩展成多串均衡,或者叠加 SOC 估算、库仑计积分这些功能,也不用换主控。
把控制和功率分拆开还有一个实际好处:安全隔离。如果 MCU 因为软件 Bug 卡死,均衡功率级不依赖 MCU 内部的 PWM 波形,只要能切断使能信号,功率级就必然关断。再加上独立看门狗和硬件使能逻辑,系统的失效安全性会好很多。以前我做过一版直接用 MCU 产生 PWM 驱动开关管的均衡器,一旦 MCU 复位,复位瞬间 IO 可能处于高阻态,外部上拉下拉没做好的话,功率开关就有误开通的风险。这一版把 PWM 调节和电压环路放回 MP2642GR-Z 内部,心里踏实很多。
2. 均衡电路设计与关键参数计算
2.1 主动均衡拓扑结构
常见的主动均衡拓扑有好几种:电容飞渡式、电感储能式、基于 DCDC 变换器的能量转移式。电容飞渡式结构最简单,用一个大电容在两节电池之间反复切换,但均衡电流做不大,效率也一般;电感储能式适合小功率;这个项目选择的是以 MP2642GR-Z 为核心的双向 DCDC 能量转移结构。
简化来看,两节电池一高一低,把高压电池接到 MP2642GR-Z 的输入侧,低压电池接到输出侧,让 MP2642GR-Z 工作在降压模式,能量就从高压侧自动流向低压侧。但电池的电压高低是会变化的,所以系统要能自动判断并切换方向。这里用两组低导通电阻的 MOSFET 作为方向切换开关,由 STM32H743ZI 的 GPIO 控制。整体连接关系可以这么理解:
- 电池1正极 — 方向开关A — MP2642GR-Z 输入侧
- 电池2正极 — 方向开关B — MP2642GR-Z 输出侧
- 电池组负极作为公共地
当电池1电压高于电池2时,MCU 导通开关A,关断开关B,电池1的能量经 MP2642GR-Z 降压后送到电池2;当电池2电压更高时,就反过来。这套结构的好处是:每节电池不需要单独配一套隔离电源,功率级可以公用,成本低;而且均衡电流由 MP2642GR-Z 内部的限流点决定,控制起来很直接。
实际画板时要注意,方向开关 MOSFET 放在芯片外部,必须选低导通电阻的管子。常见做法是用 N-MOS 做低边、P-MOS 或半桥驱动芯片做高边。低边开关因为参考地清楚,驱动简单;高边开关建议用专用的高边驱动,别想着用一个 NPN 三极管随便拉一拉,那两个电池串联之后,高边开关的源极电压是悬浮的,驱动电压不够很容易栅极驱动不足、发热严重。
2.2 均衡电流、电感与开关频率的推算
做主动均衡,第一步是定均衡电流。均衡电流太小,容量差恢复很慢;太大,发热和器件成本都上去。对这个项目来说,我建议以 1A 到 1.5A 作为目标。以两节磷酸铁锂串联为例,单体标称电压 3.2V,工作范围 2.5V 到 3.65V。假设压差 0.3V,以 1.2A 电流搬运能量,功率大约是 3.5W 到 4W,这个量级在自然散热条件下是可控的。
电感的取值直接决定纹波大小和磁芯饱和程度。MP2642GR-Z 这类芯片内部已经有开关频率设定,常见在 400kHz 到 600kHz 区间。按 500kHz 算,降压模式下的占空比公式是 D = Vout / Vin。如果高压侧电池电压 3.6V,低压侧 3.3V,占空比大约是 0.917。电感的纹波电流可以由下式估算:
ΔI = (Vin - Vout) × D / (f × L)
要求纹波电流控制在平均电流的 20% 以内,即 0.24A。代入数字:
0.24 = (3.6 - 3.3) × 0.917 / (500kHz × L)
算出来 L 约等于 2.29µH。考虑到实际电感饱和时感量会下降、温度升高感量也会漂移,我一般会留至少一倍余量,选择 4.7µH 的功率电感。额定饱和电流至少要高于 2A,不能只看标称电流,必须看饱和电流曲线。很多人在这个地方踩坑,选了一个体积很小的贴片电感,规格书写的是 1.5A 饱和,结果均衡电流稍微一大,电感就进入饱和,纹波急剧变大,芯片发热也跟着上来。
输出电容也要配合好。电源管理芯片对输出电容有一个最低要求,最常见的是要求输出端至少有 10µF 到 22µF 的陶瓷电容。不要为了省空间只放一颗小 0402 电容,搬移能量的时候输出电流在来回跳变,电容太小会导致环路不稳定,开关波形上可能出现低频振荡。我最终用了输出侧 2 颗 22µF/10V 的 X7R 陶瓷电容并排放,靠近芯片引脚,效果比较理想。
2.3 采样与保护电路的细节处理
MCU 要判断该不该均衡、往哪个方向均衡,前提是电压采样准确。STM32H743ZI 的 ADC 精度不错,但前端分压电阻和滤波电容必须处理好。两节串联时,采样点分别接电池1正极、电池1和电池2串联中点、电池组负极。把这三个点的电压分别引到 MCU 的 ADC 通道,然后用差分计算得到单节电压。
采样电阻我用了两颗 100kΩ 的 1% 精密电阻分压,并联一颗 100nF 电容做低通滤波。100kΩ 的阻值对电池来说漏电流极小,不会影响静置时的电池电压;100nF 电容配合电阻的截止频率大约 16Hz,可以滤掉大部分开关纹波。但要注意,MCU ADC 的采样保持电路对信号源阻抗有要求,100kΩ 分压后输出阻抗偏高,会在采样瞬间造成误差。所以我在分压点和 ADC 引脚之间加了一级电压跟随器,用集成运放做缓冲,ADC 看到的就是一个低阻抗的电压源。这个方法比盲目加大分压电容更有效。
保护电路方面,我做了这几层:
- 电池输入两端并一个 TVS 管,防止热插拔或连接瞬间的尖峰损坏 MP2642GR-Z 和 MCU;
- 电池负极回路串保险丝,选定额定电流后,要留出足够余量,避免均衡大电流时误断开;
- 每节电池贴 NTC 热敏电阻,贴近电池本体,监测均衡过程中的发热;
- MCU 的供电不要直接从 MP2642GR-Z 的输出拿,用独立的低 dropout 线性稳压器供电,防止功率级启动瞬间电源跌落导致 MCU 复位。
特别说一下地线布局。两节电池串联时,电池组负极是系统地,这个没问题。但 MP2642GR-Z 功率级的地电流和 MCU 采样地如果混在一起,ADC 读数会抖动。PCB 上应把功率地、模拟地分开,单点星形接地到电池负极。这虽然是基本功,但对均衡效果影响极大。
3. 固件与算法的落地实现
3.1 MCU 资源配置与工程搭建
STM32H743ZI 的外设资源在这个项目里用得很充分。我的分配如下:
- ADC1:采集电池1电压、电池2电压,开启过采样和 DMA 循环搬运;
- ADC2:采集均衡电流采样信号、NTC 温度;
- 两个 GPIO:控制方向切换 MOSFET;
- 一个 GPIO:控制 MP2642GR-Z 的使能引脚;
- FDCAN 接口:和外部 BMS 或上位机通信;
- 独立看门狗 IWDG:喂狗任务放到最低优先级任务里,保证看门狗超时说明真的有问题。
初始化时,ADC 要设置为注入组同步采样,这样两个电池电压是同一个时刻采到的,对比才有意义。采样率不用太高,数据手册对 ADC 时钟也有要求,我是把 ADC 时钟配到合适的值,采样周期适当加长,让采样电容充分充电。过采样倍数设成 16 次,配合求平均,等效位数能增加不少,足以分辨毫伏级变化。如果你手头有外部高精度基准源,建议在 PCB 上留一个校准点,生产时用基准源对每个通道做两点校准,把增益误差和偏移误差存到 Flash 里。没有校准的话,ADC 自身精度加上分压电阻的 1% 误差,实际换算出来的电压可能偏差几十毫伏,这会直接影响均衡启停判断。
3.2 电压采样滤波与均衡开启判定
实际调试中我发现,均衡刚开始和刚结束的时候,芯片输出电流突变,电压采样会有明显扰动。如果把原始电压直接拿去判断,均衡会频繁启停,继电器触点、MOS 开关一直在啪啪啪切换,寿命受影响。所以我在代码里做了一级软件滤波:先取连续 5 次采样值,去掉最大值和最小值后取平均,再做一阶低通滤波。
均衡开启不能只看瞬间压差。电池在充电中极化、放电中极化都会造成虚压差,如果系统正在大电流充放电,这时候去均衡,很可能把能量搬错方向。我的做法是设置一个“静置窗口”:只有当电池组处于小电流或零电流状态超过 30 秒,才开始计算压差。这需要 MCU 能获取充放电电流信息,最简单的办法就是读系统已有的电流采样值,或者通过 FDCAN 接收上级 BMS 的状态。
均衡阈值要有迟滞。启动阈值和停止阈值之间留一段差值,避免临界状态反复振荡。比如启动阈值设为 20mV,停止阈值设为 10mV。差值算出来超过 20mV,系统进入均衡;均衡到压差低于 10mV,保持一小段时间再退出,防止电池电压回弹引起重新启动。这个 10mV 的迟滞带,是均衡控制稳定性的关键。
3.3 均衡状态机与使能控制逻辑
我习惯把所有均衡控制逻辑写成简单的状态机,每个状态停留的时间都明确记录。伪代码大致这样:
typedef enum { IDLE, START_DELAY, BALANCING, PAUSE, FAULT } BalanceState; BalanceState state = IDLE; void BalanceTask(uint16_t cell1_mv, uint16_t cell2_mv) { uint16_t diff = (cell1_mv > cell2_mv) ? (cell1_mv - cell2_mv) : (cell2_mv - cell1_mv); switch (state) { case IDLE: if (diff > BAL_START_MV && system_current_is_small()) { SetDirection(cell1_mv > cell2_mv ? DIR_FWD : DIR_REV); state = START_DELAY; startDelayTicks = 100; // 100ms } break; case START_DELAY: // 等待方向开关完全导通、输入电容充电完成 if (--startDelayTicks == 0) { ChipEnable(ENABLE); state = BALANCING; } break; case BALANCING: // 持续监测,一直到压差低于停止阈值或温度超限 if (diff < BAL_STOP_MV || temp > BAL_TEMP_LIMIT) { ChipEnable(DISABLE); state = IDLE; } break; case FAULT: ChipEnable(DISABLE); SetDirection(DIR_OFF); state = IDLE; break; } }使能顺序是个容易被忽略的细节。必须先导通方向开关,再使能 MP2642GR-Z。如果先开芯片再切方向,方向开关在导通的瞬间会产生很大的冲击电流,轻则让电压跌落,重则击穿 MOS 栅极。样板调试的时候我就遇到过一次:方向开关还没完全导通,MP2642GR-Z 已经启动,结果开关节点出现很高的尖峰,直接把驱动三极管打穿。后来在代码里强制加入延时,问题就消失了。
电流限制也要合理设置。MP2642GR-Z 一般通过外接限流电阻或检测电阻来设定峰值电流。我按 1.5A 峰值来整定。均衡过程中电流并不是恒定不变的,随着压差减小,实际电流会逐渐下降,这是正常现象。如果发现电流一直顶在限流点,说明两节电池之间可能还有内阻差异在起作用,需要检查电池连接片和均衡通路的接触电阻。
3.4 FDCAN 通信与系统联动
储能和备用电源系统里,单独的均衡模块不能当孤岛。它需要和系统的充电器、逆变器、大数据监控平台联动。STM32H743ZI 自带的 FDCAN 正好派上用场。我用的是 CAN 2.0 兼容模式,帧格式定义尽量简单,BCM 每个周期上传一次电池电压、压差、均衡方向、均衡电流、累计均衡时长和温度。CAN 总线波特率设为 500kbps,报文 ID 分类预留,后续多机级联也不冲突。
调试通信时要注意终端电阻。CAN 网络两端各放一个 120Ω 终端电阻,如果只在开发板上有,模块上没有,长距离通信时会看到报文错误率升高。我这边就是在模块上预留了 120Ω 焊位,最后用跳线帽决定是否接入。另一个坑是 FDCAN 滤波器配置,如果滤波掩码设置不对,会把自己发的报文也接收回来,形成环路,占用 RX FIFO。我最后把收发掩码分开配置,只接收指定 ID 的报文,问题就消失了。
上位机方面,我用一个简单的串口转 USB 工具加命令行解析,调试阶段可以在 PC 上直接下发命令,比如强制开启均衡、修改启动阈值、查询状态。量产阶段就只保留 FDCAN 报文,不开放本地串口命令,避免误操作。
4. 实测调试与问题排查实录
4.1 从模拟测试到真实电池的调试过程
硬件焊好之后,先不要急着接真实电池,先用电源和电子负载模拟电池状态。我把 MP2642GR-Z 的输入侧接一台可调直流电源,输出侧接电子负载,调到和真实电池相近的电压,验证功率级本身能不能正常升降压。这个阶段重点看三件事:
一是开关节点波形。用示波器探头加短接地弹簧测开关节点,波形应该是一个干净方波,没有严重振铃。如果振铃很大,通常需要在开关节点加 RC 吸收,我常用 1Ω 串 1nF 的方案,位置尽可能靠近芯片引脚。
二是电感电流波形。用电流探头测电感支路电流,确认峰值没有超过电感饱和电流。如果电感已经饱和,电流波形会在峰值附近出现尖刺,同时伴有吱吱声。
三是负载阶跃响应。电子负载从 0.5A 跳到 1.5A,观察输出电压有没有大的过冲。过冲过大要增大输出电容或者调整补偿网络参数。电源管理芯片的补偿网络有时需要外部 RC,这时就按手册给的典型值,再根据示波器波形微调。
模拟测试通过后,再换上两节真实的磷酸铁锂电池。我专门挑了一节容量衰减比较明显的旧电池和一节新电池搭配,人为制造一个比较大的初始压差。实测时启动均衡,压差从 180mV 开始下降,均衡电流稳定在 1.3A 左右,大概一个小时后压差收到 15mV 以内,系统按状态机自动退出。整个过程中电池表面温度升高约 5 摄氏度,功率级芯片表面温度要再高一些,但仍在安全范围内。
4.2 典型问题速查表
| 现象 | 可能原因 | 排查方法 |
|---|---|---|
| 均衡完全不启动 | 采样电压偏差太大,程序认为是虚假压差 | 用万用表实测电池电压与 MCU 上报电压对比 |
| 均衡方向反了 | 方向开关驱动逻辑反了,低压电池反而在放电 | 检查 GPIO 电平与 MOSFET 栅极驱动方向 |
| 均衡电流特别小 | 限流电阻选错、电感饱和、线束压降过大 | 用电流探头测电感电流,检查限制设点 |
| 电感或 MOSFET 发烫严重 | 开关频率设置不当、热焊盘没铺铜散热 | 检查开关波形,增大铜箔散热面积 |
| 电压采样跳动超过 20mV | ADC 采样时刻受开关纹波干扰 | 加强前端滤波,均衡停止后采样 |
| 均衡频繁启停 | 未设置迟滞,或滤波不够 | 检查启动/停止阈值设置,增加迟滞区间 |
| CAN 报文错误率高 | 缺终端电阻、波特率不一致、滤波配置错误 | 检查 120Ω 终端电阻,统一波特率 |
其中电压采样跳动这个问题我最想多说两句。很多人会去拼命加大滤波电容,结果电容太大导致电压采样响应非常慢,均衡判断变得迟钝。更聪明的办法是让 ADC 采样在 MP2642GR-Z 停止的间隙进行,或者在均衡电流稳定后再采样。我实际操作下来,在均衡进行中采用“峰值采样”思路,也就是在 PWM 开关周期的固定相位触发 ADC,能得到相对稳定的读数。但要实现这个,要求 MCU 与电源芯片的开关同步信号保持一致,通用场景下做起来麻烦。折中做法就是在代码里把滤波算法写充分,实测也够用。
4.3 项目扩展方向:从两串到多串
这套两串均衡方案做扎实以后,想扩展到多串并不困难。电池组如果有四串、八串、十六串,可以把均衡模块做成“逐级搬运”的结构:每一级管两串,级与级之间有公共的均衡母线,能量可以经由母线在不同级之间继续传递。STM32H743ZI 的剩余资源完全够用,一个 MCU 同时管理多路独立均衡模块也没问题,FDCAN 接口可以共享同一套报文格式,只是 ID 不同。
也可以把均衡算法和充电策略联动起来。储能系统在充电末端容易出现单体电压快速分化,此时提前启动均衡,可以避免过度充电。把这部分逻辑放到 MP2642GR-Z 的限流点和 STM32H743ZI 的状态机里做协调,比单纯靠充电器本身压差控制要主动得多。我后续的版本里还想加入基于库仑计 SOC 的均衡判据,不只靠电压。因为磷酸铁锂的电压平台太平坦,静置时电压差很小,但 SOC 可能已经有明显偏差,这种情况靠电压触发均衡确实反应慢。
5. 最后再分享一点个人体会
这次项目里我踩过最大的坑,是低估了方向切换开关的动作时序。两次烧毁驱动三极管以后,我才硬性规定:方向开关先动作,延时至少 50ms,再使能功率级;停止时顺序反过来,先关功率级,再切方向开关。这个顺序写进代码还不够,要在硬件层面加一个默认下拉电阻,保证 MCU 上电复位瞬间 MOSFET 处于关断状态,这样即使 MCU 没跑起来,也不会出现两个方向开关同时导通的危险状态。类似的细节还有很多,比如启动阈值和停止阈值别设太接近、ADC 校准参数记得存 Flash、输入输出电容要贴着芯片放。这些都不复杂,但每一件都能让系统在长期运行中稳定得多,也希望这篇分享能帮大家少走一些弯路。