做储能和备用电源的朋友应该都遇到过这种问题:两个串联电池单元,一个状态好一点,一个状态差一点,充满放尽之后电压总差一截。我最近在给一套备用电源系统做电池管理时,直接用 MP2642GR-Z 加 STM32F373VC 搭了一条均衡支路,把原来那种靠电阻发热的被动均衡整个换掉了,实测下来效果比预想中好很多。这篇文章就把整个方案的选型逻辑、主电路设计、采样链路、软件状态机和调试中的坑完整梳理一遍,给同样在做电池均衡的朋友一个可以直接参考的路径。
1. 为什么是 MP2642GR-Z + STM32F373VC:先讲清楚选型逻辑
1.1 被动均衡的痛点与主动均衡的收益
早些年我做两串锂电池保护板,用的还是最传统的方案:每节电池并联一个放电电阻,哪个电压高就把它多出来的电放掉,让两边电芯尽量接近。这个方案在最简单的消费类产品里能用,但放到储能和备用电源场景里就有几个绕不开的问题。
首先是功率做不大。电阻均衡的电流一般只能控制在 50mA 到 100mA 左右,电流再大,那个功率电阻的发热量就很夸张,散热还不好做。备用电源柜里的温升本来就有严格预算,你不可能为了均衡专门加一套散热。
其次是能量白白浪费掉。均衡的本质是让高电量电芯的能量转移到低电量电芯,但被动均衡直接把这份能量变成热量散掉了。对于每天要充放电的储能系统来说,这本身就是一种效率损失。
更麻烦的是均衡时间太长。两节电芯压差比较大的时候,靠 100mA 级别的放电电流去拉平衡,一两个小时都未必拉得回来,而大部分实际应用场景根本不会给预留这么长的均衡时间。
所以当 MP2642GR-Z 这颗料出现在我面前的时候,我第一反应就是它可以做主动均衡。它的核心能力是双向功率传输,天然适配"把某一节电池的能量搬到另一节"这个动作。
1.2 MP2642GR-Z 在方案里到底扮演什么角色
MP2642GR-Z 本质上是一颗升降压转换器,但它最有价值的地方在于功率路径是双向的。我在方案里并没有拿它去当普通的 DC-DC 电源用,而是把它当成一个可控的能量搬运装置。
在均衡系统里,两个串联电池单元的电压关系是动态的:有时候上面那节电压高,有时候下面那节电压高,两者的压差经常只有几十毫伏。如果用普通的 Buck 或者 Boost 单向电路,就只能做到"从固定的一侧搬能量到另一侧",一旦电压方向反了就没辙。MP2642GR-Z 这种升降压双向结构就没有这个问题,它可以根据两端电压判决自动决定工作模式,也可以由 MCU 直接控制功率流动方向。
另一个很实际的优点是它把驱动电路、控制和保护逻辑都集成在芯片内部了。如果不用这种集成方案,我们得自己搭 H 桥或者半桥,加上驱动芯片、电流采样放大器、环路补偿网络,PCB 面积会被吃掉一大块,调试难度也指数级上升。
这颗芯片加上外部电感、采样电阻和少数几个阻容元件,就能构成一个完整的双向变换功率级,留给 MCU 的工作就是采样电压、跑均衡策略、输出 PWM 控制,边界非常清楚。
1.3 STM32F373VC 的隐藏优势:高精度采样与多定时器资源
MCU 我选了 STM32F373VC。说实话,论算力它在这个项目里绰绰有余,真正让我选择它的是外设组合。
最关键的一点是它自带多路 16 位 Σ-Δ ADC。电池均衡最怕的是什么?是电压采样不够准。两节串联电芯,差值只有 10mV 到 20mV 的时候,如果采样误差就有 5mV,那你根本没法判断该不该启动均衡。Σ-Δ ADC 的高分辨率配合合理的硬件分压和校准流程,能把电压感知做到毫伏级别,这是普通 12 位逐次逼近型 ADC 很难稳定做到的事情。
其次,STM32F373VC 有足够多的定时器资源,可以输出带死区控制的互补 PWM。均衡功率级需要两路互补信号来驱动开关管,如果 MCU 没有硬件死区插入,你就得在中断里手动加延时,既麻烦又危险。这颗 MCU 直接用定时器的互补输出就能把这个问题解决掉。
还有一点容易被忽略:它内置了比较器和 DAC。比较器可以做硬件过流保护,电流一旦超限立刻切断 PWM,不用等 CPU 进中断,这对电源类应用的可靠性很重要。DAC 则被我用来做调试输出,把实时电流信号映射成模拟电压送到示波器观察,调试效率高了很多。
下面的表格是我当初做选型对比时用的,思路可以给各位参考。
| 对比项 | 电阻被动均衡 | 通用 Buck/Boost 单向方案 | MP2642GR-Z + STM32F373VC |
|---|---|---|---|
| 能量去向 | 变为热量 | 转移至低电压侧 | 转移至低电压侧 |
| 典型均衡电流 | 50mA 级别 | 可到数百 mA | 可设计到 1A 以上 |
| 电压方向适应性 | 无方向性,只放电 | 固定方向 | 双向,自动适应 |
| 功率级集成度 | 高但功率小 | 低,需自搭驱动 | 高,内部集成保护 |
| 采样与控制 | 不需要 | 需要额外采样 | 高分辨率采样+闭环控制 |
2. 两个串联单元的能量搬运:主电路拓扑与工作过程
2.1 电路接法与工作模式的逻辑
这套均衡支路的接法其实不复杂。两个电池单元串联,中间节点称为串联中点,上面电池的正极和下面电池的负极分别连接到均衡变换器的两个功率端口,下面电池的负极同时作为整个系统的参考地。
MP2642GR-Z 的两个功率端口分别接在上面电池的正极和串联中点,参考地接在下面电池的负极。这样接完之后,变换器随时能看到两个电池单元的电压,也能随时在上侧电池和下侧电池之间建立功率通道。
当下面电池电压偏高时,控制芯片工作在反向模式,能量从下侧电池抽出,经变换器灌入上侧电池;当上面电池电压偏高时,能量从上侧电池抽出,灌入下侧电池。整个过程里没有电阻消耗,只是能量的再分配。
这里有个关键点我要特别说明:两个电池电压可能非常接近,但变换器在这种小压差下反而要持续工作,这需要芯片有很好的轻载能力和环路稳定性。MP2642GR-Z 在这点上表现不错,压差只有 30mV 时仍然能保持稳定的电流输出。
2.2 一个完整均衡周期的细节
均衡不是"检测到压差就一股脑地搬能量",实际运行要讲究节奏。我在程序里定义了一个完整的均衡周期,分为四个阶段。
第一个阶段是电压检测和判决。MCU 通过两路 ADC 分别读取上侧电池和下侧电池电压,做滤波处理后计算差值。当差值超过设定的启动阈值,进入均衡状态。
第二个阶段是启动和软开始。不要让功率级突然以最大占空比投入工作,先给定一个很小的目标电流比如 100mA,让电感电流逐渐建立起来,然后以斜坡方式升到设定值。这么做的好处是避免反向恢复损耗和电压过冲。
第三个阶段是恒流均衡。MCU 跑电流闭环,把变换器的平均电流稳定在目标值,同时持续监测两个电池电压。随着能量转移,压差逐渐缩小,但电流不能一直不变,要根据电压收敛情况和电池温度做适当调整。
第四个阶段是终止和恢复。当压差降到停止阈值以下,或者均衡时间超过预设的保护时限,系统先让功率级停止开关,等待电感能量完全释放后再断电,否则会有一波反向电流冲击。
2.3 电感取值与电流纹波的工程计算
电感是这套电路里最关键的元件之一。取值太小,电流纹波大,输出不稳定;取值太大,瞬态响应慢,而且电感的体积和成本都上去了。我按典型工况推导一次计算过程,方便大家复现。
以两节磷酸铁锂电池为例,均衡目标电流设为 1A,开关频率取 300kHz,纹波系数按 0.3 设计,即允许 300mA 的峰峰电流纹波。假设某时刻上侧电池电压 3.6V,下侧电池电压 3.4V,变换器先从 3.6V 侧取电,降压到 3.4V 侧输出。Buck 模式下的占空比近似为输出电压除以输入电压:
D = Vout / Vin = 3.4 / 3.6 = 0.944
电感上的伏秒积等于 (Vin - Vout) × D,代入纹波电流公式可得:
L = (Vin - Vout) × D / (f × ΔI) = 0.2 × 0.944 / (300000 × 0.3) = 2.1uH
实际取标称值 2.2uH 到 4.7uH 都可以。如果希望纹波更小,把 4.7uH 装上去也没问题,但要留意电感的饱和电流必须大于最大的均衡电流,留 30% 以上裕量比较稳妥。另外电感尽量选屏蔽式的,避免对旁边采样电路产生磁场干扰。
实际操作里,我习惯在焊完板子后先用电子负载跑一下不同压差下的电流波形,确认电感没有饱和尖叫,再进均衡整机测试。电感选型只看理论值是不够的。
3. 电压采集是均衡的地基:从分压电阻到 ADC 校准
3.1 串联电池的共模电压与分压网络设计
做两串电池均衡,最容易栽跟头的地方其实是电压采样。两个电池串联后,上侧电池的正极电位相对系统地来说可能是 7V 左右,这就是共模电压的问题——MCU 的 ADC 输入范围通常只有 0 到 3.3V,你不能直接把电池电压接进去。
常规的做法是分压电阻网络。上侧电池电压和下侧电池电压分别通过各自的分压电阻降到 ADC 可以接受的范围,然后由 ADC 读取。这里有一个隐含的坑:下侧电池的电压是相对系统地测量的,它没有共模问题;但上侧电池的电压测量点是在上面电池正极,它相对地的电压是两节电池电压之和,分压以后采样到的数值不仅包含上侧电池电压,还叠加了参考点偏移的影响。所以正确的计算方式应该是:上侧电池电压 = 上侧正极相对地电压 - 下侧电池电压,这个关系在软件里一定要理清楚。
分压电阻的精度直接影响采样准度。我用的分压电阻精度是 0.1%,温漂控制在 25ppm 以内。关于温漂这一点,很多方案在常温下校准得很好,一到高温环境就跑偏,就是因为忽视了电阻温漂。
下面的表格是我设计分压网络时的基本要求:
| 采样点 | 共模电压范围 | 分压比例 | 对应 ADC 输入 |
|---|---|---|---|
| 下侧电池正极(串联中点) | 0 到 4.2V | 3:1 | 0 到 1.4V |
| 上侧电池正极 | 4.2V 到 8.4V | 6:1 | 0.7V 到 1.4V |
| 均衡电流采样电阻 | 两端电压约 20mV | 1:1 | 直接差分输入 |
3.2 STM32F373VC 的 Σ-Δ ADC 配置要点
STM32F373VC 的高分辨率 ADC 用起来和常规 ADC 有些不同,需要留意的不是精度本身,而是转换速率和滤波配置。
Σ-Δ ADC 的原理是过采样加数字滤波,转换结果有延迟,等效于一个低通滤波器。这个特性对电池电压采样其实是好事,可以把高频噪声滤掉。但要注意滤波器的截止频率不能设得太低,否则电压变化反应太慢,均衡控制会滞后。我的做法是把 ADC 转换周期配置在微秒量级,然后在 MCU 里做 16 次软件平均,既保留了快速响应,又进一步压缩了噪声。
另一个要注意的是参考电压。ADC 的精度上限由参考电压决定,如果直接用 MCU 的内部参考源,精度可能不够稳定。上板时我把外部基准电压接到 VREF+ 引脚,并且用一个小电容做了 RC 滤波,把参考源的噪声压下去。实测下来,校准后的整套采样链路能做到 2mV 以内的重复精度,这对均衡判断来说足够了。
3.3 采样校准:别只靠电阻精度
分压电阻精度再高,也有初始误差和装配误差。为了保证采集准度,我会在每一块 PCBA 上都做一次单板校准。
具体流程是:先用高精度台式万用表实测两节电池的电压,比如分别测到 3.6210V 和 3.4980V,然后读取 MCU 的 ADC 原始码值。根据已知电压和采样码值,可以算出该板子的实际增益系数和零点偏移。我把这两组校准值写入片内 Flash 的固定区域,程序启动时自动加载。
这里有一个小技巧:不要只校准一个点,至少要校准高电压和低电压两个点,把增益和偏移都算出来。如果只做单点校准,只能修正偏移,修正不了增益误差。两块板子之间的采样结果差异,大多数情况下就是校准流程没做全导致的。
校准电阻网络时,务必用四线制的万用表连接,避免表笔接触电阻引入误差。别问我为什么特意强调这一句,第一次我只用普通表笔,校准数据漂到没法用,查了半天才发现是接触电阻的问题。
4. 均衡策略与软件实现:不只是一个简单的 PID
4.1 均衡启动阈值、停止阈值与滞回控制
均衡策略的第一件事是定阈值。阈值定得太小,均衡系统过于敏感,频繁启停,接触器和功率开关寿命都会受影响;阈值定得太大,均衡效果不明显,失去了意义。
我参考了同一厂家同批次电芯的电压差异分布,同时结合磷酸铁锂的放电平台特性来定参数。磷酸铁锂开路电压在中段非常平缓,电压差 10mV 可能对应的容量差很小,但如果此时容量并不均衡,不启动又容易累计偏差。最终我把启动阈值设为 20mV,停止阈值设为 5mV,并且加入滞回逻辑。
滞回逻辑的作用是防止系统在阈值附近反复横跳。比如电压差达到 20mV 启动均衡,经过一段搬运后压差降到 15mV,如果这时立即停止,过一会儿电池自身极化恢复,压差可能又回到 20mV 以上,均衡器就会不停开关。加了滞回之后,只有压差降到 5mV 以下才真正停止,这样整个系统稳定很多。
对应具体实现,我的状态机里实际上维护了一个均衡使能标志和三个状态:空闲、均衡中、恢复监测。恢复监测状态下,即使压差降到 5mV 以下,也要等待一轮延时确认,再关闭功率级。
4.2 恒流控制与方向切换的关键细节
确定了什么时候均衡,接下来说怎么均衡。我采用的是恒流均衡策略,即控制变换器的平均电流恒定在设定值,而不是直接固定占空比。固定占空比的问题很直接:两个电池电压会随着均衡进程变化,同一占空比下电流会漂移,没法保证均衡速度的一致性。
电流闭环的实现思路是:通过采样电阻检测流经变换器的电流,与目标电流比较,误差送入 PI 调节器,输出占空比。我在 STM32F373VC 里用浮点运算直接算 PI,10ms 的控制周期完全足够。
方向切换反而是最需要小心的环节。当压差从"上侧偏高"变成"下侧偏高"时,功率级需要把能量搬运方向反过来。绝对不能在功率管还在导通的时候就切换逻辑,必须在停止状态下等待电感电流完全归零,再加入一定延时,然后才能以相反方向重新启动。这个等待时间一般取 5 到 10 个开关周期,具体看电感和电流大小。
4.3 主循环与状态机的伪代码结构
下面的伪代码是我实际工程里主循环的简化版,去除了平台相关部分,逻辑是完整的。它展示了从电压采集到状态判决再到 PWM 输出的整个链路。
// 均衡控制主循环,每 10ms 执行一次 void Balancing_Task(void) { float v_cell1 = Read_Voltage(CH_CELL1); // 上侧电池电压,已校准 float v_cell2 = Read_Voltage(CH_CELL2); // 下侧电池电压,已校准 float diff = v_cell1 - v_cell2; // 均衡所需状态在 SystemState 中维护 switch (SystemState) { case BAL_IDLE: if (fabs(diff) > ENTRY_THRESHOLD_MV) // 20mV { SystemState = BAL_SOFTSTART; Bal_Direction = (diff > 0) ? CELL1_TO_CELL2 : CELL2_TO_CELL1; Bal_TargetCurrent = INIT_CURRENT_MA; // 100mA Bal_Timer = 0; } break; case BAL_SOFTSTART: Bal_TargetCurrent += CURRENT_RAMP_STEP_MA; if (Bal_TargetCurrent >= MAX_CURRENT_MA) // 1A { Bal_TargetCurrent = MAX_CURRENT_MA; SystemState = BAL_RUNNING; } Current_PI_Control(Bal_TargetCurrent, Bal_Direction); break; case BAL_RUNNING: if (fabs(diff) < EXIT_THRESHOLD_MV) // 5mV { SystemState = BAL_WAIT_CONFIRM; } else if (Bal_Timer > MAX_BAL_TIME_MIN) // 超时保护 2h { SystemState = BAL_SHUTDOWN; } else { Current_PI_Control(Bal_TargetCurrent, Bal_Direction); } break; case BAL_WAIT_CONFIRM: // 延时 200ms 后再次确认压差,避免电压反弹导致误停 if (Confirm_Counter++ > 20) { if (fabs(diff) < EXIT_THRESHOLD_MV) SystemState = BAL_SHUTDOWN; else SystemState = BAL_RUNNING; Confirm_Counter = 0; } break; case BAL_SHUTDOWN: Disable_PWM_Output(); // 等待电感电流完全释放,之后才能允许新的均衡任务 if (Inductor_Current_Near_Zero()) SystemState = BAL_IDLE; break; } }代码里值得留意的是 BAL_WAIT_CONFIRM 这个状态。均衡停止后,电池电压会因为内部极化慢慢反弹,如果一降到阈值就立刻停止,反弹后又会重新启动,整个系统容易在临界点附近震荡。加一个确认阶段,让系统有一个短暂的稳定周期,实战下来效果立竿见影。
5. 实测复盘:调试中容易翻车的几个地方
5.1 电感啸叫与环路稳定性问题
第一次上电做均衡测试时,我听到板子发出轻微的吱吱声,频率不是固定开关频率,而是会随着压差变化漂移。这种声音通常来自电感或陶瓷电容的振动,本质原因是控制环路的占空比在小信号扰动下发生低频振荡。
排查方式是断开负载,用示波器观察开关节点波形,发现占空比在以较低频率周期性地摆动。后来调整了电流环的 PI 参数,降低 Kp,适当增大 Ki 的积分时间,再把控制周期从 5ms 改到 10ms,问题就消失了。这个教训说明,均衡电路不能只看稳态精度,动态调节过程里的稳定性同样关键。
5.2 采样点走线导致的电压测量漂移
第二块板子调试时发现一个诡异现象:下侧电池电压采样值会随着均衡电流大小变化而漂移,电流越大,读数越低。
我用万用表实测确认电池端电压并没有变化,问题出在 PCB 布局。因为采样走线恰好经过功率电流路径,大电流流过铜箔时产生压降,这个压降串进了采样回路。解决办法是采用开尔文接法:从电池端子单独拉一对细线到分压电阻,不让功率电流经过采样走线。改板之后,采样值在 1A 均衡电流下稳定在 1mV 以内的波动。
5.3 均衡结束后的电压反弹问题
均衡停止后,电池端电压会出现一个明显的反弹。比如均衡结束时两点压差只有 3mV,但停止 10 分钟后压差又回升到 12mV。
这其实是电池内部的浓差极化在恢复,并不代表均衡失效。如果软件没有意识到这一点,可能会误认为均衡根本没起作用,然后让均衡器重新启动,造成无意义的循环。我提到过的 BAL_WAIT_CONFIRM 状态就是专门应对这个现象的,另外在上位机观察均衡效果时,也要等停止 5 分钟以后再评估,而不是看停止瞬间的数据。
5.4 PWM 死区时间设置不当造成的功率器件发热
互补 PWM 驱动功率级时,死区时间如果设置得太短,上下管会瞬间直通,造成电流尖峰,开关管发热严重。这个问题的隐蔽性在于,负载电流不算大时整块板子还能正常工作,只是效率比预期低了不少。
我最初死区设置是 100ns,后来用示波器观察开关节点波形,发现有明显的直通毛刺,把死区调到 300ns 后毛刺消失,效率也提了上来。在调试时,大家可以用热成像仪看功率管的温度,单管温度明显偏高通常就是死区设置有问题。
5.5 电流采样电阻的选型与滤波
电流采样电阻直接决定了恒流控制的基准,电阻温漂和布局错误都会导致实际电流偏离设定值。我选的是毫欧级别的合金电阻,温漂系数低于 50ppm,并用差分走线方式接入 ADC。
还有一点,采样电阻两端的电压非常小,几毫伏到几十毫伏,很容易被开关噪声淹没。我在 ADC 输入端加了一组 RC 低通滤波器,截止频率大概 200kHz,同时利用 Σ-Δ ADC 自身的过采样特性进一步滤除噪声,电流读数稳定下来之后,环路控制的效果明显改善。
5.6 上位机监控手段:DAC 和串口的组合
调试均衡系统最痛苦的是一边看功率流程一边看 MCU 内部状态。我用 STM32F373VC 自带的 DAC 做了两个调试输出通道:一路输出电流环的目标电流,一路输出实际的电流采样值。把这两路接到示波器,就能直观看到电流环的响应过程。
同时串口打印系统状态、压差和温度日志。一套流程跑下来,哪个阶段出了问题几乎一眼就能定位。这个手段虽不起眼,但调试效率提升非常明显,建议做类似项目的朋友从一开始就预留这个功能。
6. 从两串到多串:这套方案的扩展路径与备电场景落地
6.1 多级均衡的级联思路
这套方案目前是针对两个串联电池单元设计的,但储能和备用电源系统里往往不止两串。比如通信备电常见的 48V 系统,需要 15 串磷酸铁锂或 13 串三元锂,这时候单个 MP2642GR-Z 支路就不够用了。
可行的扩展方式是把"两串一个均衡器"当作基础模块,多个模块级联起来。每一个模块负责相邻两个电池单元的均衡,模块之间通过软件协调,保证不出现"上模块向 A 电池充能、下模块同时从 A 电池抽能"的矛盾情况。STM32F373VC 有多路 PWM 输出,理论上可以同时控制几个独立的均衡支路,只要功率部分各自独立,MCU 资源是够用的。
需要提醒的是,多级级联时均衡指令的仲裁逻辑一定要做严谨,否则系统内部容易出现能量内耗。我的建议是给每个模块分配唯一的均衡优先级,同一时刻只允许相邻的两个模块执行搬运。
6.2 备用电源场景的功率预算与实际收益
备用电源和普通储能系统有一个明显不同的地方:电池长期处于浮充状态,绝大多数时间均衡需求不大,但真正需要均衡时往往是在线均充阶段或者备电放电后重新充电的阶段。
我以 50Ah 的两串磷酸铁锂备电模块为例算一笔账。电池间容量差如果达到 2%,对应的电量差就是 1Ah。按照 1A 均衡电流计算,理论上 1 小时可以把这 1Ah 差额补回。但实际考虑到电池极化、效率损失和控制策略的保守性,设计上按 2 到 3 小时完成一次均衡来规划比较稳妥。与此对比,被动均衡 50mA 的电流要把 1Ah 的差额拉平需要 20 个小时,根本没有实用性。
所以 MP2642GR-Z 这套方案在备用电源场景中最核心的收益是把均衡从"摆设"变成了"真正可用的功能"。均充窗口一般只有几个小时,只有主动均衡才能在这个窗口里完成调节任务。
6.3 与 BMS 通信的状态上报
均衡器不能闷头干活,得让主控制器知道它当前的运行状态。我用 STM32F373VC 的 CAN 外设把均衡状态打包上报,内容包括当前压差、均衡电流、均衡方向、累计均衡时间以及故障码。
在整机联调时,上位机可以根据这些数据生成电压分布趋势图,判断整个电池组的一致性走向。如果发现某个模块频繁进入均衡状态,说明对应电池单元的容量可能已经明显落后,这是一个很有效的早期劣化预警信号。
我实际运行中的体会是,均衡电路的设计没有太多玄学,真正拉开差距的地方在于采样准确度、状态机逻辑和调试手段这三块。把这三块都做到位,两串电池均衡这套方案就能稳定运行,后续扩展到更多串联单元也只是规模问题,核心思路是一致的。