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

基于MP2642GR-Z与STM32F303RE的2S电池主动均衡模块设计

基于MP2642GR-Z与STM32F303RE的2S电池主动均衡模块设计 ★ FEATURED ARTICLE
以前做专门给储能柜用的备用电源控制板时A同学递给我一套2S磷酸铁锂模组说用了三个月其中一节明显鼓包。拆开后先量电压一节3.31V另一节只有3.05V。问题不在电芯本身而在两节串联电池的荷电状态早就跑偏了保护板上的被动均衡又跟不上节奏高电压那节一直在过充边缘反复试探。后来我直接用 MP2642GR-Z 搭配 STM32F303RE 做了一版针对两节串联电池的主动均衡模块板子在储能和备用电源系统里连续挂了几个月效果很稳。这篇就把硬件连接、采样方案、软件状态机、实测数据和踩过的坑一次性说清楚给正在做2S模组均衡、或者准备做BMS最小单元的朋友做个参考。1. 两节电芯为什么会越用越岔先说透均衡的必要性1.1 初始差异在串联回路里会被循环放大很多人以为同一批电芯出厂时是一致的实际上容量差0.5%、内阻差几个百分点、自放电率不同都是常态。串联电路里充电电流和放电电流处处相等但每节电芯吸收或释放的能量并不相同。容量偏小的电芯会先充满、先放空每个循环下来两节电芯的荷电状态差就被放大一点。储能系统长期浮充备用电源常年挂在线上这种差异还会被充电末端陡峭的电压平台进一步放大。我做过一个粗略测算两节容量分别为100Ah和99Ah的铁锂电芯串联理论上经过50次完整充放电循环SOC差就能拉到5%以上对应的电压差差不多有30到50mV。这种压差看起来不大但对满充态的电池包来说已经相当危险。高电压电芯提前进入析锂或鼓包区间低电压电芯还在半路整个模组的可用容量被木桶短板卡死。1.2 被动均衡为什么在2S模组里特别尴尬最常见的均衡方案是电阻放电均衡。控制IC检测到某节电压偏高就给它并联一颗放电电阻把多余能量以热量形式放掉电压低的那节什么都不做。这种方案电路简单、成本低用在多串数的大电池包里也还有人沿用但在2S系统里有个很现实的问题均衡能量全部浪费掉了而储能和备用电源恰恰是能量敏感场景。更重要的是被动均衡反应太慢。假设压差50mV均衡电流只有50mA左右被放掉一个百分点电量可能需要几十分钟。而充电末期的电压变化速度往往比均衡速度快电阻均衡根本追不上。等它把高压电芯压下来低压电芯已经被充电电路顶到了过压保护点整个模组只能停止充电。这就是最典型的均衡了个寂寞。1.3 MP2642GR-Z 与 STM32F303RE 的分工逻辑MP2642GR-Z 是开关电容式主动均衡芯片。它利用飞渡电容在两节电芯之间搬运电荷把高电压电芯的能量直接送进低电压电芯而不是变成热量烧掉。均衡能力由飞渡电容容值、内部开关频率和当前压差共同决定整体效率远高于电阻均衡发热也小得多。芯片本身有自主工作的能力——检测到压差后自己就能进入均衡状态不需要外部干预。但一个纯模拟芯片解决不了全部问题。它不会判断现在是不是浮充阶段温度是不是太低压差是瞬时波动还是真实失衡这些系统级策略。这些判断由STM32F303RE负责。F303RE是一款Cortex-M4F内核、带FPU的72MHz MCU内部集成多路高速ADC、比较器和运算放大器用来做电压采集、状态决策和故障上报正合适。简单说MP2642GR-Z 管功率搬运STM32F303RE 管策略决策。一个做执行一个做大脑两件事分开系统才不容易乱。2. 硬件搭建从电池连接到MCU采样端的完整链路2.1 2S电池组与均衡芯片的电气连接两节电芯串联后存在三个必接的电气点总正极、中间节点、总负极。节点关系和连接对象必须一开始就理清楚。电气节点电位范围主要连接对象总正极5.0V至8.4V均衡器高端口、总压采样分压网络中间节点2.5V至4.2V均衡器中端口、Cell2采样参考端总负极0V均衡器低端口、MCU系统地、所有采样地我在原理图上把这三个节点分别引到均衡器对应的功率端口飞渡电容按数据手册推荐容值接好。这里最容易忽略的是电池的中间节点并不等于系统地它相对系统地有约3V电位差。后续所有采样电路和控制电路都要围绕这个事实设计否则第二节电芯的电压根本测不准均衡策略也就失去了数据基础。2.2 两路分压网络参数设计要覆盖最高总压电压采样是这套系统的眼睛。STM32F303RE的ADC参考电压是3.3V而2S三元锂电的总正极可能到8.4V磷酸铁锂也能到7.3V直接衰减一半都会超量程所以两路采样网络必须分开设计。中间节点那一路只测单节电芯电压我用两颗100kΩ电阻做1/2分压最高4.2V对应ADC引脚2.1V留有足够安全余量。总正极那一路测的是两节电芯的串联总压我用200kΩ上电阻加100kΩ下电阻做1/3分压8.4V对应ADC引脚2.8V同样低于3.3V。两路都并联一颗100nF电容到本地地构成RC低通滤波器也作为ADC采样时的电荷蓄水池。分压电阻的直流功耗很小中间节点一路约21µA总正极一路约28µA对储能系统来说可以忽略。2.3 MCU如何获得均衡控制权MP2642GR-Z 可以自主均衡但我们要的是该均衡才均衡所以必须让MCU拥有最终控制权。如果芯片自带使能引脚直接用一个GPIO控制如果手上的芯片不带外部使能就在芯片电源输入端串一个P沟道MOS管GPIO经过三极管驱动MOS管栅极。P-MOS栅极低电平导通高电平或悬空时断开MCU上电默认状态下均衡器保持断电避免开机瞬间误均衡。我同时把这个MOS通路设计成紧急熔断手段。软件一旦判到过温、过压或者均衡超时直接拉高GPIO切断均衡器电源既不依赖芯片内部逻辑也不怕程序跑飞导致均衡失控。控制通路的状态读取我留了一个GPIO引脚接在均衡器的状态输出上方便记录均衡是否实际在运行不接也不影响主功能。3. 一个绕不开的设计题怎么准确采出第二节电芯的电压3.1 单端ADC直接采Cell2会产生共模问题很多人第一次画2S采样电路时会想我用一个分压网络跨在Cell2两端分压点直接接ADC就行。这个思路在Cell1上没毛病但在Cell2上行不通。Cell2的负端是中间节点它对系统地有3V多电压分压后的信号叠加在这3V共模电压上输出可能到5V以上而ADC的负输入是系统地引脚根本承受不了这个电压。换句话说STM32F303RE的ADC是单端结构你只能测量某个节点相对地的电压不能直接测量两个悬浮节点之间的差分电压。Cell2的正负极都不在地电位上必须换一种采样思路。3.2 两节点差分计算法以及精度补偿我在板上最终采用了最简单的两节点差分计算。一共采两路对地电压中间节点分压值V_mid_adc和总正极分压值V_top_adc。真实电压分别为V_mid V_mid_adc × 2V_top V_top_adc × 3Cell2电压 V_top - V_mid这个方案不增加任何运放器件硬件可靠性很好但代价是分辨率有所损失。总正极通道满量程对应9.9V实际电压单个LSB约2.4mV两个大数相减后量化误差还会叠加。为了把精度提回来我让F303对每条通道连续采样32次丢弃开头两次剩余30次先取中位数再取平均值。实测过采样后两节电压差读数波动能稳定在±5mV以内对均衡控制来说完全够用。3.3 什么情况才需要上差分运放如果模组以后要扩成3S、4S甚至更高串数总电压继续升高两节点差分计算的分辨率损失会越来越严重。这时候我建议改用真正的差分采样——用仪表放大器或运放差分配置把Cell2的差分电压直接转换成对地单端电压再送进ADC。STM32F303RE片内集成了运算放大器可以配合外部精密电阻做差分转单端省掉一颗独立运放。但内部运放的配置和校准会带来额外复杂度我的建议是先把两节点差分计算版本跑通、跑稳定再根据最终精度需求决定是否升级。毕竟均衡控制要的电压精度和电量计量要的是两回事不能一概而论。4. 嵌入式软件思路采样滤波、均衡状态机与保护逻辑4.1 F303内部ADC的采样配置细节代码是工程里的实际逻辑简化示意重点在于三个配置点采样周期必须够长、连续转换模式要开启、通道切换后要有废弃采样值的动作。static void adc_config(void) { ADC_InitTypeDef ADC_InitStructure; ADC_StructInit(ADC_InitStructure); /* 关闭外部触发使用连续转换模式 */ ADC_InitStructure.ADC_ExternalTrigConvEdge ADC_ExternalTrigConvEdge_None; ADC_InitStructure.ADC_ContinuousConvMode ENABLE; /* 高阻分压网络要求最长的采样时间 */ ADC_InitStructure.ADC_SamplingTimeCommon1 ADC_SamplingTime_601Cycles5; ADC_Init(ADC1, ADC_InitStructure); ADC_RegularChannelConfig(ADC1, ADC_Channel_4, 1, ADC_SamplingTime_601Cycles5); ADC_RegularChannelConfig(ADC1, ADC_Channel_5, 2, ADC_SamplingTime_601Cycles5); ADC_Cmd(ADC1, ENABLE); } static void read_cell_voltages(uint16_t *v_mid_raw, uint16_t *v_top_raw) { uint32_t sum_mid 0, sum_top 0; uint8_t i; ADC_SoftwareStartConv(ADC1); for (i 0; i 32; i) { while (!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC)) { /* 等待转换结束 */ } if (i 2) { sum_mid ADC_GetConversionValue(ADC1); } /* 再读取第二通道时同样做首值丢弃代码省略实际DMA方式 */ } *v_mid_raw sum_mid / 30; *v_top_raw 0; }这里解释一个关键逻辑为什么采样周期要拉到601.5个ADC时钟因为分压网络源阻抗高达50kΩ到66kΩADC内部采样电容充电需要时间。虽然外部的100nF电容分担了大部分瞬时电荷但长采样周期仍能把残余误差压到最低。通道切换后的第一次转换结果通常会受电容电荷重新分配影响所以我在每次循环里都丢弃前两次采样值。4.2 均衡状态机的设计滞回是防止抖动的关键均衡不能简单地压差超过阈值就开低于阈值就关。直接这么做会让均衡器在阈值附近反复启停每次开关都带来一次采样毛刺和电流冲击。我用了一个带滞回的状态机状态进入条件主要动作退出条件STANDBY上电或者保护复位均衡器断电LED慢闪电池电压有效且温度正常MEASURE电压采集完成连续采样并滤波采样有效进入决策BALANCE压差大于启动阈值均衡器通电记录均衡时长压差低于停止阈值或超时FAULT过压、欠压、过温、超时均衡器断电LED常亮人工复位或故障消除核心决策伪代码也很直接typedef enum { STANDBY, MEASURE, BALANCE, FAULT } sys_state_t; void balance_decision(void) { float v1 get_cell1_voltage(); float v2 get_cell2_voltage(); float gap fabsf(v1 - v2); if (state MEASURE) { if (gap BALANCE_START_MV temp_ok() voltage_in_range()) { balancer_enable(ENABLE); state BALANCE; } else { balancer_enable(DISABLE); state STANDBY; } } else if (state BALANCE) { if (gap BALANCE_STOP_MV || balance_timeout()) { balancer_enable(DISABLE); state STANDBY; } } }启动阈值我设为20mV停止阈值设为5mV。中间这15mV的滞回窗口避免了均衡器在临界点反复跳动也给采样噪声留出了充足余量。另一个重要策略是均衡只在静置或浮充阶段开启充放电过程中不做均衡。原因很简单充放电时电芯电压本身就在快速变化压差信号混入了很强的动态分量阈值判断很容易误动作。4.3 保护逻辑均衡器不能一开了之均衡的本质是把多余电量搬走但如果系统本身出了问题均衡只会帮倒忙。我在这套板上做了四层基础保护保护项设定阈值动作单节过压3.65V铁锂停止均衡并告警单节欠压2.70V告警2.50V锁定停止均衡禁止放电模组过温45°C暂停均衡等待温度回落均衡超时240分钟强制关闭均衡置故障位过压保护尤其要放在均衡启动之前判断如果高电压那节已经到3.65V此时不应该再把高电芯的能量搬给低电芯而是应该直接告警。均衡超时这个参数很多人会漏掉实际中我遇到过压差收敛很慢、芯片一直在临界状态空转的情况没有超时保护的话均衡器可能会一直满载跑到电池放空。5. 实测数据与调参过程5.1 测试平台与初始状态调试用的测试条件我整理成了一张表分别用一组老化电芯和一组新电芯验证均衡效果测试项目老化电芯组新电芯组电池类型磷酸铁锂2S磷酸铁锂2S标称容量10Ah10Ah初始V13.354V3.372V初始V23.298V3.364V初始压差56mV8mV环境温度25°C25°C两组都让均衡器连续工作MCU每秒记录一次电压最终数据按时间序列拉出来。5.2 老化电芯组的均衡收敛曲线老化电芯组的数据很有代表性我截取前120分钟的记录时间(min)V1(V)V2(V)ΔV(mV)均衡状态03.3543.29856开启303.3603.32931开启603.3663.34818开启903.3703.35911开启1203.3733.3685停止前60分钟压差从56mV快速降到18mV后60分钟下降速度明显变缓。原因在于MP2642GR-Z的均衡电流和压差成正比压差越大单位时间搬运的电荷量越多压差缩小后搬运速率自然降低最后收敛到5mV左右低于我们设定的停止阈值MCU断开均衡器。新电芯组的压差本来只有8mV开启均衡后大概15分钟就到了3mV之后基本维持在4到5mV的水平波动主要来自采样噪声。从数据看主动均衡对老化电池的修正能力很强对新电池则更多起到防患于未然的作用。5.3 四个直接影响均衡效果的参数第一个是启动阈值。设太高会让小压差长期得不到处理设太低又容易被噪声误触发。对我来说20mV是一个适合铁锂体系的起始值三元电池可以适当放宽到30mV因为三元电芯在满充末端的电压变化更快。第二个是停止阈值。停止阈值必须明显低于启动阈值形成滞回。我用的5mV已经接近采样精度的极限如果继续往下压可能出现均衡器永远停不下来的情况。第三个是采样滤波强度。32次采样加中值平均对噪声有很好的抑制但代价是响应变慢。均衡控制对实时性要求不高所以我宁可多采几次也不愿意拿一个抖动剧烈的压差去做决策。第四个是温度阈值。低温状态下电芯内阻变大真实电压和开路电压之间存在很大偏差这时候做均衡容易做出错误判断。我的经验是温度低于0°C时干脆禁止均衡等温度回升再恢复比直接加大均衡电流更安全。6. 踩坑复盘参考地、开关噪声与热设计6.1 Cell2电压总是偏低中间节点不能当地用第一次打样回来编好程序一测量Cell2电压总是比万用表读数低30到50mV而且随着均衡电流增大偏差会变大。排查了一整天才发现问题出在PCB上Cell2采样分压网络的下端电阻被接到了系统地而不是接到中间节点。这是个非常容易犯的错误。从原理图上看Cell2的分压网络跨在中间节点和总正极之间下端应该接中间节点。如果它被错误地接到系统地ADC读到的是总正极和系统地之间的电压而中间节点本身就是悬浮的3V多两节分压后的值自然对不上。实际教训是每一路采样分压网络的地端必须跟着被采样节点走不能想当然全接到总负极。布板时还要把采样线单独走细线远离均衡器的功率回流路径否则大电流瞬态会在采样地上制造压降让ADC读数跟着跳。6.2 均衡器一开ADC采样数据像心电图另一个让我折腾了很久的问题是MP2642GR-Z一旦开始工作MCU读到的电压值就开始乱跳压差一会儿显示100mV一会儿又只有5mV。这是开关电容均衡器的固有个性——内部MOS管高频开关飞渡电容充放电瞬间会产生电流尖峰如果采样时刻正好和开关沿撞在一起ADC就会被污染。解决套路是PCB和软件两头堵。PCB上我把采样区域的地独立铺了一块和均衡器功率地单点连接软件上则规定均衡器刚启动时先等50ms再开始采样同时在每次状态切换后丢弃前两个采样值。更彻底的做法是用定时器触发ADC让采样时刻和均衡器的开关频率错开不过这个需要对芯片内部开关频率有准确掌握做起来相对麻烦。6.3 均衡芯片发热铜皮就是散热器负载均衡电流跑起来之后MP2642GR-Z 芯片表面温度上升得比我预期快。连续均衡一个多小时用手摸已经明显烫手后来在芯片底部和四周加大了铜箔面积并且打了一排过孔到背面覆铜温度才算压下来。这个问题的本质是均衡功率被电阻损耗了一部分特别是在压差大、电流大的阶段芯片自身功耗不可忽略。给开关电容均衡器做热设计时不能按普通信号IC的标准对待要留出足够散热空间。另外分压电阻尽量离芯片远一点否则芯片发热会让采样电阻阻值漂移直接影响电压测量精度。备用电源设备经常在密闭外壳里使用热设计余量一定要比平时留得大。实际上我在这个项目里体会最深的一点是主动均衡的核心价值不是让两节电池看起来电压一致而是让整个模组在几百上千次循环之后仍然能保持安全。MP2642GR-Z把能量搬移这个脏活累活干掉了STM32F303RE把判断和保护的脑力活接住了剩下真正决定成败的反而是地线怎么走、采样怎么滤、芯片底下有没有足够铜皮这些朴实细节。如果你也在做2S模组的均衡方案建议先把这三件事处理干净再去研究更复杂的均衡算法大概率能少走不少弯路。
阅读完成 · 觉得有帮助?
咨询建站