首页 / 资讯中心 / 文章详情

基于MP2642GR-Z与STM32H743ZI的两串电池主动均衡方案设计

基于MP2642GR-Z与STM32H743ZI的两串电池主动均衡方案设计 ★ FEATURED ARTICLE
做储能和备用电源系统的人迟早会在串联电池组上栽一次跟头。充电时总有一节先满放电时总有一节先空整组电池能用的容量被拖累得很难看。这个项目的核心就是用 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 发烫严重开关频率设置不当、热焊盘没铺铜散热检查开关波形增大铜箔散热面积电压采样跳动超过 20mVADC 采样时刻受开关纹波干扰加强前端滤波均衡停止后采样均衡频繁启停未设置迟滞或滤波不够检查启动/停止阈值设置增加迟滞区间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、输入输出电容要贴着芯片放。这些都不复杂但每一件都能让系统在长期运行中稳定得多也希望这篇分享能帮大家少走一些弯路。
阅读完成 · 觉得有帮助?
咨询建站