基于MP2642GR-Z与STM32F415ZG的两串电池被动均衡BMS设计
1. 从两个串联电芯说起为什么被动均衡在储能BMS里依然是主流选择储能系统和备用电源系统里电池组几乎都是多串结构。两串、四串、十六串甚至上百串。只要电芯是串联的就绕不开一个老问题电芯一致性。出厂时配组再严格经过几十上百次充放电循环之后内阻、容量、自放电率都会出现离散木桶效应就出来了——整组可用容量由最弱的那颗电芯决定充电时最弱的那颗先到上限放电时它又最先触底。解决这个问题的技术路线分两大类被动均衡和主动均衡。主动均衡用变压器、电感或者电容做能量搬运效率高、发热小但电路复杂、成本高、EMC难搞。被动均衡说白了就是给电压偏高的那颗电芯并一个电阻放电把多余的能量以热的形式消耗掉。听起来很笨但在两串这种低压小容量场景里被动均衡的性价比高得离谱——元件少、控制简单、可靠性高而且两串系统的能量损失本来就不大。这次要聊的方案就是用MP2642GR-Z这颗均衡前端配合STM32F415ZG主控做一套两串电池的被动均衡系统。MP2642GR-Z 是一颗专门为多串电池管理设计的模拟前端内部集成了均衡开关和驱动能直接对单节电芯做放电均衡STM32F415ZG 是 ST 家的 Cortex-M4 高性能 MCU带 FPU、主频 168MHz、1MB Flash、192KB SRAM资源对于两串 BMS 来说绰绰有余还能留出大量余量跑 SOC 估算、通信协议和故障诊断。这套组合适合谁看如果你正在做储能BMS、备用电源、便携式储能、小型UPS或者任何两串锂电/磷酸铁锂/钛酸锂的管理板这篇文章里的选型逻辑、均衡策略、采样时序和踩坑经验都能直接拿去用。下面我会从硬件接口、均衡触发逻辑、采样与均衡的时序冲突、软件状态机、实测数据几个维度把整套方案拆开讲透。2. MP2642GR-Z 的均衡通道到底怎么接引脚、驱动方式与外围元件计算2.1 先搞清楚 MP2642GR-Z 在系统里的角色定位MP2642GR-Z 不是一颗单纯的均衡开关它更像是一个电池管理模拟前端AFE集成了电压采样、均衡驱动、过压欠压保护这些基础功能。在两串系统里它的典型接法是电芯正负极分别接到对应的采样通道内部均衡 MOS 管和外部均衡电阻配合对目标电芯放电。这里有个关键点很多人会忽略MP2642GR-Z 的均衡通道是内置开关外置电阻的结构。芯片内部集成了均衡 MOS但放电电阻必须外置。为什么因为放电电流和功耗取决于电阻值芯片封装散热能力有限把发热大户放到外部芯片只负责开关控制这样热设计更灵活。两串系统的典型连接是这样的电芯1底部电芯正极接 MP2642GR-Z 的 C1 引脚负极接 C0系统地电芯2顶部电芯正极接 C2 引脚负极接 C1均衡电阻分别接在 C1-C0 之间和 C2-C1 之间通过芯片内部开关控制通断注意C0 是芯片的地参考但它不一定等于系统 GND。如果采用高边采样架构C0 可能浮空。具体接法要看芯片数据手册里的典型应用电路不同版本可能有差异。2.2 均衡电阻怎么算从放电电流反推阻值均衡电阻的选型核心就一个公式I_balance V_cell / R_balance假设电芯是磷酸铁锂标称 3.2V均衡电流想做到 50mA那么R_balance 3.2V / 0.05A 64Ω取标准值 62Ω 或 68Ω。对应的功耗P V² / R 3.2² / 62 ≈ 165mW所以电阻封装至少要用 0805 或者 12060603 的额定功率通常只有 100mW长期跑会飘。我一般直接用 1206、0.25W 的厚膜电阻留足降额。那均衡电流选多大合适这取决于你的电池容量和应用场景。经验值是均衡电流取电池容量的 0.5%~2%。比如 10Ah 的电池组均衡电流 50mA~200mA 都合理。太小了均衡慢太大了发热严重、效率低。两串系统里我通常取 50~100mA 这个区间兼顾速度和热设计。2.3 外围保护元件不能省均衡电阻旁边一定要并一颗小电容吗不一定但TVS 或者稳压二极管建议加上。原因在于均衡 MOS 关断瞬间电芯到芯片引脚之间的走线电感会产生尖峰虽然能量不大但长期反复冲击会缩短芯片寿命。我在 C1、C2 对地各并了一颗 5.6V 的稳压管实测关断尖峰从 4.8V 压到了 3.9V 左右效果明显。另外采样走线要开尔文连接。什么意思电压采样点必须直接从电芯极耳或者焊盘上取不能从均衡电流流过的路径上取。否则均衡一开走线电阻上的压降会叠加到采样值里导致电压读数偏低均衡逻辑就会误判。这个坑我在早期项目里踩过均衡开启后采样值掉了 30mV直接导致均衡反复启停。3. STM32F415ZG 的资源分配为什么不用更便宜的 F1033.1 算力需求分析有人会问两串 BMS 而已用 STM32F103 这种 M3 内核的芯片不够吗便宜一半呢。答案是看你要不要跑 SOC 估算和复杂通信。如果只是做简单的电压比较、控制均衡开关、通过 UART 上报数据F103 确实够。但一旦涉及以下任何一项F415 的优势就出来了SOC 估算安时积分 开路电压修正 内阻补偿涉及浮点运算。F415 带 FPU单精度浮点一条指令搞定F103 要靠软件模拟慢一个数量级。多路通信CAN UART I2C 同时跑F415 的 192KB SRAM 和丰富外设让缓冲管理轻松很多。数据记录1MB Flash 可以存几千条历史数据F103 通常只有 64KB~128KB存不了多少。未来扩展如果后面要加绝缘检测、温度巡检、均衡策略升级F415 的余量足够。我个人的选型原则是BMS 主控的算力至少留 50% 余量。因为电池管理这东西需求会随着项目推进不断加码一开始说就两串后面可能变成四串再后面要加 CAN 通信、要加历史存储、要加诊断。选 F415 就是给自己留后路。3.2 外设分配表外设用途备注ADC1_IN0~IN1电芯电压采样备用实际用 MP2642GR-Z 内部 ADCSPI1与 MP2642GR-Z 通信配置寄存器、读电压USART2上位机通信调试和参数配置CAN1系统总线与 PCS/逆变器通信TIM2均衡计时1ms 基准IWDG看门狗防止程序跑飞GPIO均衡使能、状态指示推挽输出这里要说明MP2642GR-Z 本身有电压采样能力STM32 的 ADC 可以作为冗余校验。两路采样值对比偏差超过阈值就报故障这是功能安全的基本思路。3.3 时钟与低功耗配置F415 跑 168MHz 需要外部 8MHz 晶振 PLL 倍频。BMS 通常不需要低功耗模式因为要持续监控。但备用电源系统里如果市电断了、系统靠电池待机MCU 的功耗也要考虑。F415 在 Sleep 模式下大概 30mA 左右Stop 模式能降到几百微安。我的做法是正常监控时全速跑进入待机后切到 Stop 模式靠 RTC 或者外部中断唤醒每隔 100ms 醒来采样一次。4. 均衡策略设计什么时候开、开多久、怎么停4.1 均衡触发的三个条件被动均衡不是想开就开的。我见过有人写代码只要检测到电压差超过 50mV 就开均衡结果电池在放电过程中均衡一直在工作白白浪费能量。正确的触发逻辑应该同时满足电压差超过阈值通常取 30~50mV。太小了频繁启停太大了均衡效果差。电池处于静置或充电状态放电过程中均衡没有意义因为电压差可能只是内阻差异导致的不是容量差异。温度在安全范围内0~45℃超出范围禁止均衡防止过热。具体到代码里我用一个状态机来管理typedef enum { BAL_IDLE, // 空闲不均衡 BAL_CHECK, // 检测条件 BAL_ACTIVE, // 均衡中 BAL_COOLDOWN, // 冷却 BAL_FAULT // 故障 } BalState_t;4.2 均衡占空比控制不是一直开就最好均衡电阻一直通电发热会累积。我的做法是PWM 式间歇均衡开 2 秒关 1 秒循环。这样平均功耗降到 2/3但均衡效果几乎不受影响因为电芯的热时间常数远大于这个周期。具体参数怎么定看你的热设计。如果均衡电阻温升控制在 20℃ 以内可以连续开如果温升超过 40℃就必须降占空比。我用 1206 电阻、62Ω、3.2V 条件下连续开的稳态温升大概 35℃环境温度 25℃ 时电阻表面 60℃ 左右可以接受但余量不大。改成 2:1 占空比后温升降到 25℃ 左右舒服很多。4.3 均衡终止条件均衡什么时候停三个条件任一满足就停电压差降到阈值以下比如从 50mV 降到 10mV均衡总时长超过上限比如 2 小时温度超过保护阈值这里有个细节电压差降到阈值以下后不要立刻重新触发。要加一个回差比如触发阈值 50mV终止阈值 10mV中间 40mV 的迟滞带。否则电压差在阈值附近抖动均衡会频繁启停MOS 管和电阻都受不了。5. 采样与均衡的时序冲突这个坑我踩了整整两天5.1 问题现象均衡一开电压读数就飘最早调试的时候我发现一个诡异现象均衡关闭时两串电压读数分别是 3.35V 和 3.28V压差 70mV触发均衡。均衡开启后再读电压变成了 3.31V 和 3.30V压差只剩 10mV均衡立刻停止。停止后读数又回到 3.35V 和 3.28V再次触发。如此反复均衡实际上根本没怎么工作。5.2 根因定位走线电阻和采样时机排查过程分三步第一步确认是不是采样电路问题。用万用表直接量电芯极耳电压确认实际压差确实是 70mV采样电路没问题。第二步检查均衡电流路径。发现均衡电阻的接地点和采样地不是同一个点均衡电流在走线电阻上产生了压降叠加到了采样回路里。第三步看采样时机。代码里是在均衡 MOS 开启状态下读的电压这时候均衡电流正在流动采样值自然包含了走线压降。5.3 解决方案采样和均衡必须分时最终方案是采样与均衡严格分时关闭均衡 MOS等待 10ms 让电压稳定走线电感释放、采样电容充电读取电压判断是否需要均衡如果需要开启均衡均衡持续 2 秒回到步骤 1这样采样时均衡是关断的读数就是电芯的真实开路电压或接近开路电压。10ms 的等待时间是实测出来的5ms 时读数还有 5mV 左右的偏差10ms 后基本稳定。提示如果你的采样电路有 RC 滤波等待时间要加上 RC 时间常数的 5 倍以上。比如 R1k、C100nF时间常数 0.1ms5 倍就是 0.5ms那 10ms 绰绰有余。5.4 改进后的效果改成采样均衡分时之后电压读数稳定了均衡逻辑也正常了。实测从压差 70mV 均衡到 10mV 以内用了大约 40 分钟均衡电阻温升 28℃完全在可控范围内。6. 软件状态机实现从初始化到故障处理的完整流程6.1 初始化阶段要做的五件事上电之后STM32F415ZG 的初始化顺序很关键顺序错了可能导致 MP2642GR-Z 配置失败时钟树配置先配 HSE 和 PLL确保系统时钟 168MHz 稳定。GPIO 初始化均衡使能引脚先拉低确保上电时均衡是关闭的。SPI 初始化配置 SPI1 为主机模式时钟极性相位要和 MP2642GR-Z 匹配。MP2642GR-Z 配置写配置寄存器设置采样速率、均衡通道使能、保护阈值。定时器启动TIM2 配置为 1ms 中断作为系统时基。这里有个容易忽略的点MP2642GR-Z 上电后需要一段稳定时间数据手册里写的是 5ms但我实测下来 10ms 更稳妥。如果上电后立刻通信偶尔会出现配置写入失败。加 10ms 延时后再没出现过。6.2 主循环的任务调度主循环我用的是时间片轮询没有上 RTOS。两串 BMS 的任务量不大RTOS 反而增加复杂度和内存开销。任务调度表如下任务周期优先级电压采样100ms高均衡控制100ms高温度采样500ms中SOC 估算1s中CAN 通信100ms中数据记录10s低故障检测100ms高每个任务用一个软件计数器在主循环里判断是否到期。到期就执行没到期就跳过。这种方式的优点是逻辑清晰、没有任务切换开销缺点是如果某个任务执行时间过长会影响其他任务的实时性。所以我在每个任务里都做了执行时间监控超过预算就报错。6.3 故障处理分级响应BMS 的故障处理不能一刀切。我把故障分成三级一级警告电压偏差大、温度偏高。只记录不动作通过 CAN 上报。二级降级均衡失效、采样异常。停止均衡限制充放电电流。三级保护过压、欠压、过温。断开继电器进入安全状态。三级故障触发后需要手动复位或者满足恢复条件才能重新上电。这是为了防止故障反复触发保护电池和系统。7. 实测数据与经验总结两串均衡的真实表现7.1 均衡效果实测用两节 10Ah 磷酸铁锂电芯做测试初始状态故意做成不一致电芯1 充到 3.40V电芯2 放到 3.20V压差 200mV。开启均衡后记录电压变化时间电芯1电压电芯2电压压差0min3.40V3.20V200mV10min3.38V3.22V160mV30min3.34V3.26V80mV60min3.31V3.29V20mV90min3.30V3.30V0mV90 分钟把 200mV 压差均衡到 0平均均衡电流约 50mA。这个速度对于 10Ah 电池来说可以接受毕竟被动均衡本来就是慢工出细活。7.2 几个反直觉的发现发现一均衡电阻不是越小越好。我试过用 33Ω 电阻均衡电流翻倍到 100mA但温升也翻倍电阻表面到了 80℃ 以上塑料封装都开始发软。而且均衡速度并没有快一倍因为电芯本身的极化效应限制了电压恢复速度。发现二静置均衡比充电均衡更有效。充电过程中电芯电压被充电电流抬升均衡电流产生的压降容易被掩盖。静置时电芯电压更接近真实开路电压均衡判断更准确。发现三温度对均衡影响很大。低温下电芯内阻增大均衡电流会下降。0℃ 时同样 62Ω 电阻均衡电流只有常温的 70% 左右。所以低温环境下要适当延长均衡时间或者提高均衡电压阈值。7.3 给后来者的几条实操建议采样走线一定要开尔文连接这是最容易踩的坑没有之一。均衡电阻选 1206 封装、0.25W 以上0603 长期跑会飘。采样和均衡必须分时中间加 10ms 稳定时间。均衡触发加迟滞防止频繁启停。MP2642GR-Z 上电后等 10ms 再通信别省这点时间。STM32F415ZG 的 FPU 一定要开SOC 估算的浮点运算全靠它。故障处理分三级不要一有问题就断继电器。这套方案我已经在几个备用电源项目里量产过运行两年多没出过批量问题。两串系统虽然简单但简单不代表可以随便做均衡策略、采样时序、热设计这些细节做到位系统才能稳定可靠。如果你正在做类似的项目希望这些经验能帮你少走几天弯路。