做过储能和备用电源的朋友,应该都有过这种经历:两节串联的锂电池,刚出厂装配时压差只有0.01V,跑几个月后变成0.15V、0.3V,保护板动不动就报过压或者欠压,整包可用容量眼看着缩水。均衡电路就是用来治这个毛病的。这次我在一套两串主动均衡系统里,把MP2642GR-Z和STM32F722VE组合起来,专门给两个串联电池单元做电压均衡,配合双向Buck-Boost功率拓扑,实现能量在电池单元之间来回转移。这篇把从选型、拓扑设计到软硬件联调的全过程展开聊聊,适合正在做便携储能、UPS备电、或者两串电池PACK方案的硬件工程师参考。
1. 为什么两节串联也要均衡:被忽略的容量黑洞
很多人觉得两个电池串联很“简单”,电压不够就串,容量一样就并联,保护板顶多加个过压欠压检测。但真正放到储能和备用电源系统里跑一段时间,问题就出来了:单体电池之间的容量、内阻、自放电率总会有差异。哪怕出厂一致性是0.5%,经过几百次充放电后,容量衰减快的那个会明显落后。这时候串联组的可用容量,不是两个电池的平均值,而是被最差的那节电池卡死了。
举个实际场景:某储能模块采用两节100Ah磷酸铁锂串联,标称电压6.4V,带一个6V的备电负载。假设其中一节实际容量衰减到85Ah,另一节还是95Ah。放电时,85Ah那节会先到电压下限,保护板一旦检测到过放就切负载,剩下那节即使还有10Ah余量也不能用;充电时,容量小的那节会先充满,保护板一旦检测到过压就停充,容量大的那节永远填不满。一来二去,整包实际可用容量可能只有80%左右,后面每一次充放电都是“满放不满充”的恶性循环。
被动均衡是常规做法:每节电池并联一个耗能电阻和开关,电压高的那节通过电阻放电,把多余能量变成热量耗掉。它有两个问题,一是均衡电流小,常见只有几十到一两百毫安,要拉平明显压差需要好几小时;二是能量白白浪费,在备电系统里这很讽刺,本来就在省电,均衡时反倒消耗能量。尤其在储能和备电场景,我们通常希望尽可能保住每Ah电量,而不是把它烧掉。
主动均衡的思路正好相反:把能量从高电压电池“搬”到低电压电池,从一个单元取出电能,经过功率变换存储、释放到另一个单元。这正适合用DC-DC电路来做。关键是搬多少、往哪搬、什么时候停,得有一套控制逻辑,这就是STM32F722VE介入的用武之地。
2. 器件分工:MP2642GR-Z管功率,STM32F722VE管智能
做两串主动均衡,市面上可以选的路子其实不少。最常见的是用带均衡逻辑的模拟前端AFE芯片,比如很多电池监控芯片,内部集成了电压采样、充放电控制和被动均衡驱动。但这种方案在两串场景下有点“杀鸡用牛刀”,而且均衡通道往往被限制在几十毫安的内部电流能力,做不到大电流主动转移。
还有专用的主动均衡芯片,比如能量转移式电池管理芯片,内部集成了开关阵列和控制器,但价格贵,供货周期长,而且只适合特定拓扑,灵活性不高。对于两串这种只需要“一个双向功率变换器+一个MCU”的场景,用通用控制器自己搭反而是更可控的方案。
这次选MP2642GR-Z,核心看重的是它的功率级集成度。它是一款同步Buck-Boost控制芯片,内部集成了高、低端栅极驱动、电流采样放大、软启动和一系列保护比较器,外部搭上电感、MOS管和少量阻容,就能构成一套完整的双向DC-DC功率级。它的开关频率可以通过外部电阻配置,我这次设置在400kHz,兼顾效率和电感尺寸。芯片的电流检测引脚可以直接反映电感电流或者输出电流,给STM32提供闭环控制所需的“眼睛”。
STM32F722VE负责智能层。首先,它自带12位ADC,采样两串电池电压不需要额外接专用的电压采集芯片;其次,它带高级定时器TIM1和TIM8,能产生带死区控制的互补PWM,驱动同步Buck-Boost的正负半桥刚好够用;再者,Cortex-M7核心主频跑216MHz,做浮点运算和滤波算法绰绰有余。两串均衡的算法其实不复杂,但涉及状态机、滞回比较、软启停、故障保护,用这颗MCU完全是降维打击。
用表格看一下方案对比,可能更直观:
| 方案 | 均衡电流 | 能量去向 | 电路复杂度 | 成本 | 适用性 |
|---|---|---|---|---|---|
| 被动均衡 | 0.05~0.2A | 电阻发热 | 低 | 低 | 少量压差,小型电池包 |
| 专用主动均衡芯片 | 0.5~5A | 转移至低电压电池 | 中 | 高 | 电池节数多、要求高 |
| MP2642GR-Z + STM32F722VE | 0.5~3A可调 | 转移至低电压电池 | 中 | 中 | 两串储能/备电,灵活定制 |
实际实验下来,这套方案均衡电流做到1A左右很稳定,发热集中在MOS管和电感的导通损耗,整体效率约85%~90%。这个效率在主动均衡里已经算不错了,而且电流大小完全由软件可调,不像固定功能IC那样只能靠手册给的参数。
3. 双向Buck-Boost均衡拓扑:能量怎样从高节跑到低节
两个电池串联,任意时刻总有一节电压偏高。理论上有两种均衡方向:如果B1电压高于B2,就让能量从B1流向B2;反过来B2高于B1,就让能量从B2流向B1。这要求功率级必须是双向的,MP2642GR-Z本身是单向DC-DC控制思路,但我们可以通过外部桥臂组合和STM32控制来实现方向切换。
我采用的拓扑可以理解为“双半桥有源均衡器”。两个半桥、一个电感,跨接在两节电池串联结构上。电感的一端接在两节电池的中点M,另一端通过两个半桥分别可以选择连到B1的正端还是B2的负端。实际工作时,根据电压比较结果,STM32决定让能量从高到低流过。等效来看,就是在一个Buck-Boost变换器基础上,通过换向逻辑把输入输出互换。
以B1电压高、能量从B1转移到B2为例。第一步,控制B1正端对应的MOS管导通,让B1给电感充电,电感电流线性上升,把能量存储在磁场里;第二步,关断这个MOS,再导通B2负端对应的续流MOS,电感电流通过续流路径流向B2,给B2充电。这就是典型的Buck-Boost工作过程,只是把传统二极管换成了同步整流MOS,进一步提高效率。B2电压高时,过程完全对称,只是把PWM施加到另一组开关管上。
这里有一个关键点:两个电池串联在一起,拓扑必须处理好共地问题。整个系统以一个统一的参考地设计,但电池组是浮地的,所以电压采样一定要用差分方式或者独立分压采样,绝不能把电池负端直接当成系统地接入MCU的地,否则会把电池组短路风险引入控制电路。很多初学者在这里栽跟头,我也是调试时烧了一路ADC采样接口后才意识到。
对于参数设计,最核心的是确定占空比和电感值。Buck-Boost在连续导通模式CCM下,占空比满足:
D = V_out / (V_in + V_out)
如果V1=4.0V,V2=3.8V,均衡电流目标1A,则正向转移时占空比D=3.8/(4.0+3.8)=0.487。电感电流纹波可以由下式估算:
ΔI_L = (V_in × D) / (f_sw × L)
开关频率400kHz,取L=10μH,则ΔI_L = (4.0 × 0.487) / (400000 × 0.00001) ≈ 0.487A。如果负载电流是1A,那么电感电流峰值约1.24A,平均值1A。选择电感额定饱和电流至少为峰值的1.3倍,即1.6A以上,我实际选了2.2A饱和电流的功率电感,余量比较充足。
效率方面,Buck-Boost的损耗主要来自MOS导通损耗、开关损耗、电感DCR损耗和驱动损耗。4V级别的输入电压比较低,同步整流MOS的导通损耗影响比较大,所以要选低导通电阻、低栅极电荷的组合。我用的40V耐压MOS,Rds(on)约8mΩ,双管并联驱动半桥,均衡电流1A时发热基本可以忽略。
4. 硬件电路搭建与关键参数计算
硬件上,我大致分了几个模块:功率级、驱动与门极电阻、电流采样、电压采样、温度保护和MCU外围。这里按模块说关键设计。
功率级是MP2642GR-Z配合外部MOS管构成同步Buck-Boost。电感选择上,除了饱和电流,还要注意额定电流和纹波电流下的温升。我一开始用了贴片一体成型电感,10μH,额定电流1.6A,但在环境温度40℃下做连续均衡测试,电感温度明显偏高,后来换成允许温升更低的功率电感,问题解决。
MOS管驱动:STM32F722VE的TIM1可以通过HAL库配置输出互补PWM,一个通道给出高边PWM,另一个通道给出低边PWM,并自动插入死区时间。死区太短会直通短路,太长会增加体二极管导通损耗,我最终定在400ns,实测波形没有直通。
电压采样用两路分压电阻加RC滤波进STM32F722VE的ADC。两个电池电压都是3.0~4.35V范围,如果用MCU的VDDA=3.3V,直接采样会超量程,必须分压。我在B1两端并联两个不相同的分压电阻,把大约0~4.5V映射到0~3.0V,同时用100nF电容做RC滤波。需要特别注意分压电阻的精度,我选1%精度的金属膜电阻,并且用两路ADC通过同一个内部基准校准。STM32F722VE内部有一个ADC参考电压,不会受VDDA波动影响,实测下来电压分辨率能做到大约1mV以内,这个精度足够均衡使用了。
电流采样:MP2642GR-Z本身就带电流检测引脚,但我为了调试方便,还是在外部分压采样电阻上并联一个差分放大器,输出到STM32另一个ADC通道。采样电阻用10mΩ合金电阻,额定功率1W,流过1A均衡电流时压降10mV,经过差分放大50倍变成500mV,配合12位ADC可以监测到50mA级别的均衡电流。这个信号同时用于软件上的过流保护,如果电流超过设定值立即封锁PWM。
温度保护方面,我在两个MOS管散热位置和电感附近各贴了一个NTC热敏电阻,通过STM32的ADC读取。超过80℃时降额运行,超过95℃时停止均衡。实际均衡过程中,1A电流连续工作半小时,整个板温大约60℃,还算安全。
整个硬件连接关系可以用下面这个伪连接清单表示:
- B1正极 → MP2642GR-Z的VIN端 + 分压采样1 → STM32 ADC1_IN0
- B2负极 → MP2642GR-Z的GND端 + 分压采样2 → STM32 ADC1_IN1
- STM32 TIM1_CH1/CH1N → 半桥驱动 → 功率级一端 → 电感 → 中点M
- STM32 TIM1_CH2/CH2N → 另一组半桥驱动 → 功率级另一端 → B1+/B2-路径
- MP2642GR-Z的电流检测引脚 → 差分放大器 → STM32 ADC1_IN2
需要说明,MP2642GR-Z的基准电压、频率设定电阻、软启动电容等都按数据手册推荐值接好。整个控制环路没做成模拟闭环,而是把芯片当成一个受控PWM功率级,由STM32实时计算目标占空比。这样虽然响应速度不如模拟闭环快,但便于软件调整方向、限制电流和实现复杂保护逻辑,在两串均衡这种毫秒级动态的场景下完全够用。
5. 均衡算法与STM32F722VE软件实现
软件部分,核心是三步:高精度电压采集、滞回比较判断、PWM控制输出。
电压采集要做到稳定,不能直接读一次就拿来用。电池电压在均衡过程中会由于内阻和电感电流波动产生毛刺,我采用10次连续采样,去掉最大值和最小值后取平均。采样时间安排在PWM周期的固定相位,比如在PWM关断瞬间后延时50μs采集,这样能最大程度避开电感电流峰值对电压采样的干扰。
均衡方向判断采用滞回比较,避免频繁启动和停止。比如设定压差超过30mV开始均衡,压差低于10mV停止均衡。这样既防止较小的电压抖动导致开关频繁切换,又能保证最终把压差压到较低水平。滞回窗口的上下阈值可以做成参数,通过串口或按键配置,调试时很方便。
PWM控制实现用的是STM32F7的高级定时器TIM1。初始化时,把TIM1配置为中央对齐模式,频率400kHz,使能互补输出,死区时间寄存器配置为400ns。均衡方向不同时,只需要修改比较寄存器的值,让占空比作用于对应的桥臂,另一组桥臂固定为续流状态。
下面是一段简化的均衡任务代码,实际项目里我把采集、状态机、PWM控制分别拆成了几个文件,但核心逻辑就是这样一个状态机:
#define EQ_IDLE 0 #define EQ_BALANCING 1 #define EQ_FAULT 2 #define EQ_START_THR 0.030f /* 30mV 启动均衡 */ #define EQ_STOP_THR 0.010f /* 10mV 停止均衡 */ #define EQ_CURRENT_SET 1.0f /* 目标均衡电流 1A */ static uint8_t eq_status = EQ_IDLE; static uint8_t balance_dir = 0; /* 0: B1->B2, 1: B2->B1 */ void BatteryBalance_Task(void) { float v1 = Get_Battery1_Voltage(); float v2 = Get_Battery2_Voltage(); float delta = v1 - v2; switch (eq_status) { case EQ_IDLE: if (delta > EQ_START_THR) { balance_dir = 0; EQ_SetDirection(balance_dir); EQ_SetCurrent(EQ_CURRENT_SET); eq_status = EQ_BALANCING; } else if (delta < -EQ_START_THR) { balance_dir = 1; EQ_SetDirection(balance_dir); EQ_SetCurrent(EQ_CURRENT_SET); eq_status = EQ_BALANCING; } break; case EQ_BALANCING: /* 正常完成条件:压差小于停止阈值 */ if (fabsf(delta) < EQ_STOP_THR) { EQ_Disable(); eq_status = EQ_IDLE; } /* 异常保护:压差反而变大,说明电池异常或均衡路径故障 */ else if (fabsf(delta) > 0.3f) { EQ_Disable(); eq_status = EQ_FAULT; } break; case EQ_FAULT: /* 故障状态需要外部复位才能重新工作 */ if (System_Reset_Requested()) { eq_status = EQ_IDLE; } break; default: break; } }EQ_SetCurrent函数里面做的是占空比计算。由于Buck-Boost的输入输出电压都在变化,不能简单地用固定占空比输出,我采用了一个开环控制思路:根据V1、V2估算实现目标电流所需的平均电流,然后通过PI修正占空比,让实际电流接近目标值。PI调节周期是10ms一个循环,均衡过程本身时间常数很慢,所以完全稳定。如果以后要做更高动态响应的场景,可以考虑把MP2642GR-Z内部的电流环用起来,由STM32给定基准电压控制电流,这样响应会更快。
另外,软件里必须做初始化检查。上电后先读两节电池电压,如果任一节电压低于2.5V或者高于4.5V,或者两节压差大于0.5V,都不允许启动均衡,只能报警。否则在大压差下强行大电流均衡,可能让低电压电池继续被充电,导致损坏,也容易让电感电流过大。
6. 实测数据、调试过程和那些坑
硬件和软件联调后,我搭了一个模拟两串电池组的测试平台:两节磷酸铁锂单体,一节充到3.45V作为高电压节,另一节放到3.25V作为低电压节,初始压差0.20V。启动均衡后,以约1A的电流从高节向低节转移能量,记录电压随时间的变化。
实测数据如下表:
| 时间(min) | B1电压(V) | B2电压(V) | 压差(mV) | 均衡电流(A) |
|---|---|---|---|---|
| 0 | 3.452 | 3.250 | 202 | 0.96 |
| 5 | 3.440 | 3.268 | 172 | 0.98 |
| 15 | 3.421 | 3.301 | 120 | 0.98 |
| 30 | 3.405 | 3.341 | 64 | 0.95 |
| 45 | 3.398 | 3.372 | 26 | 0.92 |
| 55 | 3.395 | 3.385 | 10 | 0.00 |
可以看到,压差从202mV下降到10mV,大约花了55分钟。由于均衡后期压差变小,实际功率越来越低,电流会稍微下降。整个过程B1电压下降了约57mV,B2电压上升了约135mV,说明不仅把压差拉平,还让两个电池的电量状态都发生了变化,能量确实从高节转移到了低节。算一下转移能量:平均电流约0.95A,平均转移压差约3.3V,运行约47分钟有效均衡时间,转移能量约2.4Wh,大致相当于把B1放掉了约0.7Ah的电量,充进了B2约0.65Ah(算上效率损耗),这和理论估算基本符合。
调试过程中有几个坑,值得专门写出来。
第一个坑是电压采样读数跳动。用示波器一看,每次PWM开关动作时,ADC采样引脚上都会叠加一个很大的噪声尖峰。原因是功率回路的di/dt很大,通过地平面和采样路径的寄生电感耦合到了模拟信号上。解决办法是两个方向配合:一是在PCB布局上把采样电阻、分压电阻和ADC输入引脚尽量靠近,并且单独走一小块模拟地,用单点连接到功率地;二是在软件上做固定相位采样,避开PWM开关边沿。这两招下去,电压读数从晃动几十mV变成稳定在1mV以内。
第二个坑是死区时间配置不当。最初我把死区设得太小,大概150ns,结果半桥两个MOS管偶尔出现共通,电源输入端电流尖峰很大,用热成像看MOS管局部发烫。后来逐步加大死区,同时用示波器观察两个栅极波形,确保在一路关断完全之后再开启另一路,最后定在400ns。对于400kHz开关频率,400ns死区带来的损耗增加很小,但可靠性大幅提升。
第三个坑是电感啸叫。刚开始用的是一只10μH屏蔽电感,在均衡电流超过1A以后,电感发出“滋滋”声,效率也明显下降。示波器看电感电流波形出现了明显萎缩,判断是电感受到了饱和或者接近饱和。换成了饱和电流2.2A的电感后,啸叫消失,效率也回到了正常。这里建议大家选电感时不要只看DCR和体积,一定要看饱和电流,并且要按最高峰值电流留出至少30%余量。
第四个坑是方向切换瞬间的电流冲击。当软件从B1->B2方向切到B2->B1方向时,如果直接在均衡中途切换,电感电流无法突变,会造成很大的电压尖峰。我在软件里加了软切换流程:先关闭PWM输出,等待500ms让功率级完全放电,再改变方向,然后通过占空比斜坡慢慢增大输出。这样切换过程很平滑,没有再出现电压尖峰。
这些坑单独看都不算高级,但串在一起,非常考验对功率路径和采样路径的把握。尤其是两个电池串联的系统,地线方案非常敏感,调整一次PCB布局往往比改十次软件参数都有效。
7. 个人经验:这套方案还能延伸到哪些场景
两串均衡只是最基础的应用,但把这套“MCU+功率级控制器+双向Buck-Boost”的组合理解透彻以后,很容易扩展到更多场景。比如把两节串联改成四串、六串,可以用多个MP2642GR-Z分别做相邻电池单元间的均衡,或者采用开关矩阵选通任意一对电池单元,配合STM32F722VE的丰富IO口和ADC通道,构建一个分布式主动均衡系统。在更大的储能柜里,均衡策略还能和充电策略联动,比如在浮充阶段开启均衡、在放电深度大时暂停均衡,这些逻辑有了MCU后都很好加。
另外,STM32F722VE的运算能力其实没有完全发挥,这套系统里还闲着很多资源。我在后续版本里加入了电池SOC估算,用开路电压法和安时积分法结合,在每个均衡周期结束后更新两个单元的SOC估计,从而更合理地分配均衡优先级。对于有通讯要求的场景,F722VE自带的以太网MAC、CAN、UART都能满足和上位机或BMS主控交互的需求,这意味着这套均衡单元不是孤立存在,而是整个电池管理系统的组成模块。
最后分享一个很实际的建议:开发这类项目,建议先把功率级做成一块独立的子板,控制板做成另一块,中间用排针连接。这样在调试前期,可以先用一个简单的开环测试程序验证功率级,确定半桥驱动没有问题,再让MCU介入闭环控制。如果一开始就把两层电路焊在一块,遇到问题时很难分清是功率级的问题还是控制逻辑的问题。我的样机第一版就是合并设计,结果排查噪声问题花费了大量时间;第二版拆成子板后,调试顺畅了很多,很多问题在子板阶段就暴露并被解决了。希望这篇记录能帮你少走这些弯路。