资讯动态

2S电池主动均衡设计:STM32+升降压转换器全记录

发布时间:2026/10/15 1:15:45 来源:尧图企业网站定制
两节串联电池的电压差是所有2S储能和备用电源方案里最容易被低估的问题。最近我做的一个备用电源模块额定输出、充放电逻辑、保护功能都调得差不多了最后卡在了一个很朴素的环节放了半年电芯一个3.4V一个3.8V系统直接判故障。于是重新设计了均衡模块主控用 STM32F405RG能量搬运用 MP2642GR-Z 这颗升降压转换器把两节串联电芯之间的电压差主动拉平。这篇就完整记录一下这个设计的思路、硬件电路和固件算法也把调试时踩过的几个坑一并说出来。1. 项目背景与整体设计思路1.1 两串电芯为什么非均衡不可先说结论两节串联电池天生就不可能一直保持均衡。出厂时电芯容量、内阻、自放电率都有散差使用中还会因为温度场不均匀、充放电倍率不同、老化速度不一而进一步分化。我把同一批电芯在恒温箱里放了两个月自放电率差异就能造成十几毫伏的偏差再加上日常充放的循环老化差几个月后电压差拉到两三百毫伏非常正常。问题的严重性在于2S 系统的充放电上下限由“最差的那颗电芯”决定。放电时低的那颗先到截止电压比如 3.0V整组必须停止充电时高的那颗先到保护上限比如单节 3.65V整组又得停。结果就是高的一直被嵌住低的一直没充满可用容量一路缩水。更麻烦的是如果每次都是同一颗电芯拖后腿它可能在保护逻辑的缝隙里被反复过压或欠压轻则容量加速衰减重则有安全风险。在备用电源系统里这个现象尤其让人头疼。设备大多数时间是待机浮充状态电芯长期停在满电附近靠微小的浮充电流维持。这时候两颗电芯的自放电率只要差一点点电压就会缓慢分叉平时看不出来真到市电断电要带载那一刻就会发现有一半的能量根本放不出来。储能系统同理频繁深度充放电时内阻大、老化快的那颗电芯会被“挤”得更狠直到整组提前退役。1.2 主动均衡与被动均衡的取舍传统的被动均衡简单说就是给高电压的那颗电芯并联一个放电电阻把多余的能量烧成热。原理简单、成本极低很多低成本保护板还在用。但在备用电源这个场景里我有两个不能接受的点一是浪费电芯之间差的那点能量本来就少再烧掉一部分均衡效率和系统整体效率都难看二是热长时间均衡时电阻表面温度可以到七八十度放在密封的备电模块里还得额外考虑散热。所以这个项目选了主动均衡方案核心就是让能量从高的那颗电芯直接搬到低的那颗。实现方式有很多电容式的、电感式的、变压器式的都有。对于两节串联这个拓扑一个四开关同步升降压转换器加一颗电感是最简洁的路径能量路径短、控制灵活、电流可以做到几百毫安甚至更高而且不依赖两颗电芯的压差大小。这里顺便解释一下为什么必须用升降压而不是纯降压或纯升压。均衡过程中刚开始可能是 3.8V 那节给 3.4V 那节充电看上去是降压但均衡到接近尾声时两颗电芯电压几乎一致转换器要在输入输出近乎相等的边界上工作。如果方向反过来输出目标又可能略高于输入。四开关升降压天然覆盖这三段工作区模式切换由控制环路自己完成设计上省心很多。1.3 系统架构一句话描述整个系统就是一个微型闭环STM32F405RG 通过两条分压采样链读两颗电芯的端电压软件里做滤波、校准、判差决定要不要搬运能量决定后控制方向切换MOSFET网络把高电压电芯接到 MP2642GR-Z 的输入侧低电压电芯接到输出侧转换器按设定的限流值把能量送过去然后再回采电压循环往复直到两节电压差进入死区。旁边还挂了一路 NTC 测温、一路串口状态上报方便联调时看内部状态。2. 硬件设计功率级与采样通道2.1 能量搬运级MP2642GR-Z 在均衡里扮演什么角色MP2642GR-Z 是一颗集成度很高的四开关同步升降压转换器四个功率开关管全在芯片内部外围只需要一颗电感、输入输出电容和反馈设置网络BOM 很精简。对单节电芯 2.5V 到 4.2V 的电压范围、0.5A 这个量级的均衡电流来说参数非常匹配。选它还有一个现实理由备用电源模块对板面积和器件高度都敏感外置四颗分立 MOSFET 加驱动电路的方案占地方又容易出问题集成方案把功率级控制得很小。在这套设计里它不是一个标准意义上的“输出电压可调的电源”而是一条电子水管输入接高电位电芯输出接低电位电芯只要把输出目标电压设置得比低电位电芯的当前电压高一点点转换器就会持续向低电位电芯注入电流输入侧则自然从高电位电芯抽取等比例的能量。升降压拓扑保证了任何时刻输入输出关系都能适配。有一点要提醒拿到这颗料以后务必先打开手册核对引脚定义、I2C寄存器名和内部限流设置方式不同批次固件版本细节可能不一样。后缀里的字母一般是封装、编带等包装信息不影响电路设计采购时按盘料信息核对即可。2.2 方向切换网络大部分升降压芯片的输入输出引脚是固定的不能靠软件互换。而我们这套系统要求既能 C1→C2又能 C2→C1所以功率路径上必须加一组方向切换MOSFET。我做了一个四管的路由网络由 STM32 的 GPIO 控制等效关系如下工作方向功率路径连接备注C1→C2C1接转换器输入C2接转换器输出默认方向C2→C1C2接转换器输入C1接转换器输出反向切换停止输入输出全部断开转换器必须禁用这组MOSFET的选型要点是导通电阻尽量小我选了 20mΩ 以下的管子因为路径电阻会直接叠加进均衡电流的回路里太高会让目标电压的余量白白被吃掉。驱动上要注意电平匹配电芯正极最高到 4.2V 左右3.3V 的 GPIO 直接驱动 PMOS 可能关不彻底必须用专门的栅极驱动器或者电平转换电路。切换时机比电路本身更容易翻车。我的状态机里规定改路由之前必须先禁用转换器等待几个开关周期让电感电流泄放完再断开旧路由、闭合新路由最后重新使能转换器。一句话绝对不允许带电流切开关否则瞬间尖峰轻则炸取样电阻重则打坏开关管。2.3 电感、电容与电流限制功率级外围参数直接决定均衡电流能不能稳定输出。我按 0.5A 均衡电流设计具体取值如下电感2.2µH 到 4.7µH 范围DCR 低于 50mΩ饱和电流必须留够 1.5 到 2 倍余量。我选的是额定饱和电流 2A 的屏蔽电感防止磁耦合干扰旁边采样线。输入输出电容各放 22µF 到 47µF 的陶瓷电容耐压按 10V 或 16V 选。这里有个坑X5R/X7R 陶瓷电容在直流偏压下实际容量会缩水同样一颗 22µF 电容在 4V 偏压下可能只剩一半容量所以耐压别卡着用。电流限制优先用芯片内部限流设置为均衡目标电流的 1.5 倍左右。如果想精确读电流可以加一个 10~20mΩ 的低边采样电阻配专用运放但备用电源场景里内部限流已经够用。再补一个计算。0.5A 均衡电流经过典型 18650 电芯内阻约 30mΩ会在端电压上叠加 15mV 的压降所以目标电压不能只按电芯静态电压加几个毫伏至少留 30mV 到 50mV 的余量否则电流根本顶不上去。2.4 STM32F405RG 采样通道设计两节串联电芯有三个测量节点B、C、B-。电压关系很简单V1 V(B) − V(C)V2 V(C) − V(B−)。我做了两条电阻分压链分别把两个电压降到 ADC 输入范围内然后由 ADC 分别采软件里做减法。这里有一个特别容易忽略的细节分压链本身也在消耗电芯的能量。采 V1 的那条分压链横跨整组电池电流从 B 经分压电阻流到 B-对两颗电芯来说是串联负载耗电均匀但采 V2 的那条链是从 C 直接拉到地电流只从下面那颗电芯流出等于给下面那颗额外加了一个泄放负载。备用电源长期待机时这个微小的不对称电流会持续把两颗电芯往不同的方向推。所以我把两条分压链的总阻值都做到了 1MΩ 级别让电流降到几微安底部的采样开关也只在需要测量的十几毫秒内接通待机时完全断开。电阻分压还有一个精度问题。如果用了 1% 精度的电阻2% 的增益误差在 4V 电压上就是 80mV 的偏差我们 30mV 的均衡阈值全部被淹没。所以分压电阻必须用 0.1% 精密电阻或者干脆在出厂校准阶段用四位半万用表逐板记录增益误差把修正系数写进 Flash。第一版我为了省成本用了 1% 电阻整晚都在追着假数据跑后来换 0.1% 电阻再校准读数才算真正可信。为了扛住 ADC 输入级的采样干扰我把每条采样链都加了 10kΩ 串阻加 100nF 电容组成 RC 滤波。如果分压链总阻抗很高最好再加一级轨到轨运放做单位增益缓冲把高阻信号转成低阻信号再喂 ADC。这一步经验是血的教训不加运放时 ADC 采样保持电容的电荷注入会让读数在一个固定偏置上飘。2.5 PCB 布局的关键点采样地必须和功率地分开最后单点接到电池负极。均衡电流 0.5A 走地的路径电阻只要 20mΩ就会在 ADC 参考地和电池负极之间产生 10mV 的电位差这个量级会直接污染 30mV 均衡阈值。每颗电芯的采样线用开尔文接法从电芯端子上单独引感测线到采样前端不要在功率铜皮上取。电池连接器附近留测试焊盘方便万用表校准时直接点。电感是强磁辐射源尽量远离采样线、反馈网络和 ADC 走线。四开关升降压的开关节点电压跳变特别剧烈这一小段铜皮要短要粗。MP2642GR-Z 这类 QFN 封装需要有足够的底部散热铜皮和过孔阵列均衡电流连续输出时芯片温度才能压得住。3. 固件实现与均衡算法3.1 电压采样与软件滤波固件写起来很简单但要做好没那么轻松。最基础的是多采样取平均我用 16 次采样求均值采样间隔 100µs 左右避免连续采样被同一个周期噪声污染。还要注意不能在转换器运行的时候采电压。均衡电流会改变两颗电芯的端电压——源端被拉低受端被抬高这时候采出来的差值反映的是内阻压降加实际不平衡不是真实 OCV差。所以我的采样流程是先禁用转换器等 200ms 让极化电压恢复再打开采样开关读电压读完立刻关闭采样开关。基础采样代码大致长这样#define SAMPLE_CNT 16 #define VREF_ADC 3.3f #define ADC_RES 4095.0f #define CH_GAIN 2.0f // 分压比实际量产后按校准值修正 float sample_cell_voltage(uint32_t adc_ch) { uint32_t sum 0; for (uint8_t i 0; i SAMPLE_CNT; i) { sum read_adc_single(adc_ch); delay_us(100); } float avg (float)sum / SAMPLE_CNT; return avg * VREF_ADC / ADC_RES * CH_GAIN; }量产固件里我不会用delay_us阻塞而是把 ADC 配成 DMA 双缓冲定时器每 1ms 触发一次转换主循环直接消费结果。这样既不阻塞控制逻辑又能稳定地拿到每节电芯的电压。标定也别忘了。裸机跑起来之后先用四位半万用表实测电芯端子电压再对比串口打印的 ADC 换算值。我习惯在 3.0V 和 4.0V 两个点各记一次用两点校准消掉增益误差和硬件的固定失调算出的斜率存进 Flash之后每次上电加载。3.2 均衡判定逻辑阈值、迟滞与超时均衡判定的核心其实就是一句话差值超过启动阈值就搬低于停止阈值就停中间加滞后和超时防止振荡。我设计的启动阈值是 30mV停止阈值是 10mV。启动和停止之间留了 20mV 的迟滞区间避免系统在临界点附近反复切换方向时把开关管折腾坏。同时加了最大均衡时间 30 分钟到点强制停止重新评估一次。因为正常情况下一颗电芯的容量差不会大到需要连续搬几小时的能量如果 30 分钟还没收敛多半是硬件路径有问题先停下来排查比硬顶着更安全。核心判断逻辑的伪代码typedef enum { BAL_IDLE 0, BAL_C1_TO_C2, BAL_C2_TO_C1 } BalState; BalState bal_process(float v1, float v2) { static BalState st BAL_IDLE; static uint32_t t_start 0; float delta v1 - v2; switch (st) { case BAL_IDLE: if (delta BAL_START_DELTA) { st BAL_C1_TO_C2; t_start HAL_GetTick(); route_switch_set(ROUTE_C1_TO_C2); conv_set_target(v2 BAL_TARGET_MARGIN); conv_enable(true); } else if (delta -BAL_START_DELTA) { st BAL_C2_TO_C1; t_start HAL_GetTick(); route_switch_set(ROUTE_C2_TO_C1); conv_set_target(v1 BAL_TARGET_MARGIN); conv_enable(true); } break; case BAL_C1_TO_C2: if ((delta BAL_STOP_DELTA) || (HAL_GetTick() - t_start BAL_TIMEOUT_MS)) { conv_enable(false); route_switch_set(ROUTE_NONE); st BAL_IDLE; } break; case BAL_C2_TO_C1: if ((delta -BAL_STOP_DELTA) || (HAL_GetTick() - t_start BAL_TIMEOUT_MS)) { conv_enable(false); route_switch_set(ROUTE_NONE); st BAL_IDLE; } break; default: st BAL_IDLE; break; } return st; }还有几个附加条件要写死在判定函数外面。高电压的那颗电芯如果已经低于某个下限比如 2.8V就别搬了——在低 SOC 下均衡没有意义还可能把本来就亏电的电芯拉到保护电压。反过来受电的那颗电芯如果快接近满电上限比如磷酸铁锂 3.55V 或三元 4.10V也要立刻停绝不能为了追求差值收敛把某颗电芯顶到过压。另外一个场景是系统正在大电流充电或放电时我建议直接禁止均衡因为端电压受负载电流影响判据不可靠而且均衡电流会叠加在系统电流上增加热负担。3.3 转换器控制目标电压怎么给转换器的控制目标就是受电电芯的目标电压但不能直接给电芯当前电压要给当前电压加一段余量否则充电电流上不去。余量按受电电芯内阻加回路MOS管导通电阻加连接器接触电阻的总和估算。按 0.5A 电流、总回路阻抗 40mΩ 算余量至少 25mV实际我会多留一点按 50mV 给。如果芯片支持 I2C 动态配置输出目标最舒服的做法是软件分步爬坡先给目标电压加 20mV稳定几个毫秒再加到 50mV让电容充电电流和电芯的极化过程都平滑一点。如果用的是模拟反馈版本我会用 STM32 的一路 PWM 加 RC 滤波生成一个 0 到 1.2V 左右的参考电压接到反馈节点去动态抬高目标输出效果一样只是校准时要多测一组 PWM 占空比和目标电压的对应关系。如果芯片支持恒流模式那就更直接了直接把均衡电流设成 0.5A不用关心目标电压余量。有一点需要特别注意随着受电电芯电压不断抬升固定目标电压下的充电电流会自动衰减表现为均衡后半段越来越慢。这是正常物理现象不是故障。想加快收敛速度就得每几十秒重新读一次受电电芯电压动态更新目标值让电流一直顶在设定限流附近。3.4 保护与状态机总览整个系统是一条简单的顺序状态流采样 → 判定 → 使能均衡 → 等待收敛 → 停止 → 再采样。稳定运行的主循环周期在 1 秒左右其中大部分时间主控在低功耗模式待机由 RTC 定时唤醒。保护逻辑挂在状态的每个出口上。我把故障分成四类电压故障单颗电芯过压或欠压、温度故障NTC 超过 60°C 或低于 -20°C、均衡超时故障、转换器异常限流频繁触发或目标电压无法跟踪。任何一类触发的处理动作都是相同的禁用转换器断开路由MOSFET置位故障标志记录故障码同时保留电压监控继续运行。等故障条件恢复且没有重新触发才允许回到正常工作状态。备用电源还有一个特殊要求待机功耗。整个模块长期挂在线路上均衡功能平时完全处于关闭状态转换器 shutdown 引脚拉低分压链的采样开关断开主控进入 STOP 模式。实测整机待机电流能压到 30µA 以下这对靠电池长期值守的场景非常重要。4. 调试实录与常见问题排查4.1 采样跳变误判均衡方向上电初期我用串口观察电压发现一秒内读数能跳二三十毫伏而转换器一开跳变幅度更大甚至出现差值符号来回翻转、均衡方向反复切换的闹剧。用示波器夹在分压电阻输出节点上能看到频率和开关频率对得上的高频毛刺最大幅值有三四百毫伏明显是功率级噪声灌进了采样通道。处理分了几步走。硬件上把采样链的 10kΩ 串阻和 100nF 电容补上并把采样线改成开尔文接法直接回到电池负极固件里增加 16 次采样平均同时强制规定“转换器关断后 200ms 再采样”。这三项叠加之后读数稳定度从 ±50mV 改善到 ±3mV。排查过程有个小技巧怀疑采样被干扰时在固件里强制把转换器关掉一个完整周期看电压读数能不能立刻回到稳定值。能说明是噪声耦合不能说明分压链或者参考源本身有问题。4.2 目标电压设好了电流却远低于预期有段时间串口打印显示转换器使能了路由也切对了但均衡电流只有预期的三分之一。排查下来是目标电压余量给得不够。前面算过0.5A 电流在 30mΩ 电芯内阻上要吃掉 15mV如果目标电压只比受电电芯静态电压高 10mV电流肯定顶不上去。再加上我路由MOSFET的导通电阻和连接器接触电阻回路总阻抗比电芯内阻还高需要的余量更大。解决方法是把目标余量从 10mV 提到 50mV并用示波器电流探头直接测电感或者采样电阻两端的电流波形确认实际电流。我还把当前回路总阻抗的实测值融进固件配置里让目标余量可以离线调整调试时改一个宏就行不用重新编译整包固件。4.3 共地压降导致“假不平衡”第三个坑比较隐蔽。均衡电流流过 PCB 上的一段共享地铜皮时会在 ADC 参考地和电池负极之间产生毫伏级的电位差。0.5A 经过 20mΩ 铜皮就是 10mV对 30mV 阈值来说不是小数字。表现出来就是停止均衡后软件算出的电压差会和均衡中读到的值对不上刚停下看起来平衡过几分钟又“恢复”不平衡实际是地电位在迁移。修法是重新规划地平面。所有采样分压链的底线用细线单独引到电池负极的星点不再和功率地共享ADC 的参考地和模拟地也在同一个星点处汇合。改完用万用表验证最大均衡电流下ADC 参考地到电池负极的压差要小于 1mV。达不到这个指标就先别谈采样精度。4.4 老化验证怎么做均衡功能不能只测“能工作”还得测“能不能收敛、稳不稳定”。我的测试流程是准备一对刻意造出 100mAh 容量差的电芯初始电压差大约 100mV然后开机观察全流程。记录项包括两颗电芯电压、均衡模式、电流和目标电压每 5 秒一条日志。合格标准是电压差在合理时间内收敛到 10mV 以内停止均衡后静置 24 小时再量差值不回弹超过 15mV。温升测试也不能省。在 45°C 恒温箱里连续跑 60 分钟均衡用热像仪看整板热点电感和 MP2642GR-Z 表面温度控制在 65°C 以下。如果超了我会优先加大底部散热铜皮其次把均衡电流从 0.5A 降到 0.3A。储能场景一般允许慢一点但温度和寿命不能妥协。4.5 常见问题速查表现象大概率原因排查与解决电压读数跳 ±50mV开关噪声耦合进采样线加 RC 滤波关断转换器后采样采样线做开尔文接法均衡方向反复横跳采样噪声导致差值符号翻转加大迟滞提高采样稳定性先确认读数可信再谈判定均衡电流远低于设定值目标电压余量不足回路阻抗偏高估算全回路阻抗目标余量按 I × R 留足停止后电压差又回来共地压降造成假平衡分离模拟地和功率地单点接地后压差做到 1mV 以下切向瞬间电流尖峰大带电流切换路由MOSFET先禁用转换器等电感电流泄放完再切换长时间不收敛分压链不对称泄漏或其他漏电路径检查待机电流路径采样开关待机时必须断开5. 几个容易被忽略的设计细节5.1 采样电阻精度和两点校准前面提过 1% 电阻的增益误差会吃掉均衡阈值。这里再展开一句分压电阻的温漂同样不能忽视。备用电源模块工作温度跨度大如果电阻温漂系数是 ±100ppm/°C从 25°C 到 60°C 就有差不多 1.4% 的增益变化对 4V 量程而言又是几十毫伏的漂移。所以分压电阻选 0.1% 精度、25ppm 以下的低温漂型号量产后每块板做两点校准这是标准的低成本高可靠性做法。5.2 别让均衡和主充电打架如果系统正在用外部充电器给整组充电充电电流会流过两颗电芯同时均衡电流又叠加在其中一颗上。比如充电电流 1A均衡电流 0.5A低电压那颗电芯实际流过 1.5A发热和极化都会显著增加甚至触发转换器限流。我的规矩是只有充电电流降到 C/20 以下或者系统明确进入浮充/顶充阶段才允许启动均衡。大电流放电时同理直接禁止均衡。5.3 待机功耗与采样开关控制分压链待机断开的那颗小MOSFET普通人很容易忽略但它在整个系统里很重要。如果没有它两条分压链长期挂在电芯上不仅耗电还会造成不对称泄放等于自己给自己制造不平衡。我把它设计成由 GPIO 控制的低边开关只在采样窗口内导通其余时间完全断开。配合 STM32 的 STOP 模式和 RTC 唤醒整板均衡相关电路的待机电流能控制在微安级。5.4 把均衡当闭环系统做而不是当硬件功能做这个项目我前后改了三版 PCB第一版为了省掉运放缓冲把采样前端做糙了结果整个调试周期的瓶颈全在假数据上。后来把采样链路做干净、把校准做细致均衡算法本身反而不复杂阈值、迟滞、超时、保护几句话就能讲清楚。如果你也在做类似的模块我最想提醒的是先让读数可信再写控制逻辑。任何时候发现均衡行为异常先问三个问题——读数准不准方向对不对电流有没有按预期走。抓着一串打印数据去改算法往往是在给硬件缺陷打补丁。最后再分享一个小技巧怀疑采样链路被干扰时在固件里临时加一个“强制关闭转换器一秒钟”的测试函数看电压读数是否立刻稳定。这一招能帮你最快地区分仪器噪声、耦合噪声和真实电芯压差项目联调阶段特别实用。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑