基于MP2642GR-Z与STM32L031C6的两串电池主动均衡设计 两串电池装在同一组电池包里用了不到一年备用电源系统突然报警——其中一串的电压比另一串低了将近0.4V。拆下来测容量低电压那串只剩额定容量的六成另一串还有九成。拆开电芯做化成数据复盘发现问题出在长期浮充时均衡电流不够加上两组电芯的初始内阻差异。这不是偶发故障是串联电池组必然要学会面对的问题。这篇文章就说说我是怎么用一颗MP2642GR-Z均衡控制器搭配STM32L031C6在两串串联的储能/备用电源系统上把均衡这件事做扎实的包括硬件拓扑、策略逻辑、调试过程和实测结果适合正在做小容量电池包、备用电源或者便携储能BMS的工程师参考。1. 两串电池的偏科问题不平衡从哪来为什么备用电源里更致命1.1 制造差异只是导火索使用差异才是放大器很多人一看到电池不均衡下意识就归咎于电芯厂家工艺不行。实际上哪怕是从同一批次分容选出来的电芯串联使用一段时间后照样会出现电压差。差别来自三个层面首先是初始参数电压、内阻、自放电率不可能完全一致其次是温度场电池包内靠近发热元件的那一串电芯温度更高化学反应速率更快充放电效率就不一样然后是电流路径串联回路上连接片的电阻、焊点电阻不一致也会让每串电芯实际承担的电流出现微小的分化。这些差异单独看都很小但在储能和备用电源系统里它们会被循环深度和浮充时间不断放大。浮充状态下电池组长期处于恒定电压容量偏高的一串会更容易达到满充而欠充的一串却始终吃不饱时间一长就形成了强者恒强、弱者恒弱的马太效应。放电场景里也一样内阻偏大的一串压降更大在UPS切换或者断电备电瞬间更容易触底反而激化了老化速度。1.2 备用电源的浮充工况比动力电池更容易让不均衡暴露我最初是在一个户外备电柜里做这套方案电池组只有两串磷酸铁锂标称3.2V串联后由一组12V太阳能充电控制器配合稳压模块进行浮充。这套系统的特点就是长期不放电每个月可能只有一到两次短时备电切换。这种工况对均衡系统极其不友好因为大部分时间电池都处在充电末端区间。在充电末端容量偏小的那一串会率先达到充电截止电压而容量偏大的那串还在继续吸收电流。如果这时候均衡系统启动不够快控制器就会因为最高单体电压达到保护值而终止充电导致整个电池组永远充不满。更麻烦的是备电场景的放电深度往往很低放电倍率又大恰恰是这种浅充浅放最容易让两串的SOC拉开差距。被动均衡在这种工况下基本没戏因为它的本质是把高容量串的能量通过电阻烧掉均衡电流一般只有几十毫安面对长期的浮充积累的SOC偏差根本搬不动多少电荷。1.3 被动均衡为什么撑不住储能备电的场子传统两串电池包里最常见的均衡方案是开关电阻被动均衡一颗MOS管对一颗功率电阻把电压高的那串多余能量耗散掉。优点是便宜、结构简单、不挑MCU。但问题也很明显它只会在充电末端工作而储能备电系统大部分时间都在浮充温度上升这个副作用不可忽视电阻发热还会让电池包局部温度偏高反过来又加剧电芯差异。而且耗散掉的能量不仅浪费转化出来的热对有密封要求的电池舱也并不友好。主动均衡的思路完全不同它不烧而是搬。通过电感或者变压器把电压高的电芯里的能量转移到电压低的电芯里转移效率能做到80%~90%以上均衡电流也可以做到几百毫安甚至安培级。这也是我在这个项目里最终选型转向主动均衡的根本原因。用一颗合适的前端均衡芯片配合一颗便宜的超低功耗MCU就能在长期浮充下稳定地把压差控制在20mV以内。2. 系统设计MP2642GR-Z 做搬运工STM32L031C6 做调度员2.1 电路拓扑与能量转移路径整个均衡系统由三部分构成电池组、MP2642GR-Z均衡通道、STM32L031C6控制单元。MP2642GR-Z的典型做法是作为双向升降压拓扑的核心控制器外部配一颗功率电感和两只采样电阻就可以在AB两串电池之间建立一条能量转移通道。它的内部集成了两颗功率开关管外部只需要很少的元件就能实现从高压端Buck降压并给低压端充电或者反向Boost从低压端抽取能量回灌高压端。因为两串电池是串联的公共中点结构均衡器就挂在串联总成两端之间采样电压差值决定电流方向电流大小由芯片的CS限流引脚设定。我搭的实际电路是电池正端BAT连接均衡器的VIN电池中点BAT/-连接到芯片的开关节点电池负端BAT-作为参考地。STM32L031C6通过两个IO口分别控制均衡器的使能和方向切换通过ADC通道采集三处电压总压、第一串电压、第二串电压。这样即使芯片内部没有集成分压逻辑MCU也能独立判断谁高谁低。均衡电感选择的是10uH的功率电感额定饱和电流按最大均衡电流的1.2倍选避免在大电流下磁饱和导致发热和效率下降。2.2 为什么选这颗MCU和这颗均衡器先说MCU。STM32L031C6是一颗Cortex-M0内核的超低功耗MCU主频最高32MHzFlash 32KBRAM 8KB封装可以从QFN32到TSSOP20选非常灵活。选择它主要看中三点一是硬件I2C、SPI、USART齐全跟外部通信和校准设备对接方便二是低功耗模式比较多备用电源这种常年在线又需要低待机电流的场景很合适sleep模式下配合外部中断唤醒整机待机电流可以压在20uA左右三是有多个带内部参考的ADC通道虽然分辨率是12bit但对电压采样来说足够外部加一个精密基准做校准后采样精度能做到±5mV以内。再说均衡器。MP2642GR-Z这颗芯片在这个设计里扮演的角色类似一个受控的能量搬运工。它本身不决定均衡策略策略完全由MCU负责。这意味着方案升级起来非常灵活如果以后电池从两串变成三串、四串只需要把均衡通道的数量增加MCU换一颗多ADC通道的型号即可外围电路不用推翻重来。它的外围元件少PCB面积小对结构紧凑的备用电源模块来说很关键。2.3 关键外围电路采样分压、电感与供电电压采样是整条控制链路的眼睛。两串电芯电压通过双电阻分压后送入MCU的ADC引脚分压比例选2:1这样电芯最高4.2V时采样端只有2.1V留足余量。采样引脚并联100nF滤波电容软件里再做移动平均滤波能有效避免高频噪声引起的误判。这里有一个容易被忽略的坑分压电阻的温漂系数一定要选50ppm或者更低的如果图便宜用普通厚膜电阻温度一变采样电压就飘均衡判据跟着变整个系统看起来在均衡实际上在做无用功。电感的选型要看均衡电流目标。我设计的最大均衡电流是500mA按升降压电路的经验值电感纹波电流取20%~40%算下来约10uH。这里要注意MP2642GR-Z的数据手册会给出电感的饱和电流下限必须选额定饱和电流大于750mA的电感否则在大压差启动瞬间电感进入饱和噪音大而且功率管应力升高。至于芯片供电直接用串联电池组的电压经过一颗LDO降压到3.3V给STM32L031C6供电同时用芯片自带的内部参考作为ADC基准省掉一颗外部基准IC。3. 均衡控制策略如何判定该搬多少电3.1 电压采样与滤波不能拿到原始ADC值直接用控制策略的核心数据是两串电芯各自的电压但原始ADC值直接拿来用一定会出事。原因有两个一是电芯在均衡电流流过时自身内阻上会产生压降采样到的值不等于真正的开路电压如果直接用这个值做均衡判断可能会出现越均衡越偏的假象二是开关电路带来的纹波会混入采样通道导致数字值跳变。我的做法是在每个均衡周期前先关断均衡电流200ms等电芯电压恢复稳定后对两串电压各采样32次去掉最大和最小各8次剩下的16次取平均然后做一阶低通滤波滤波系数取0.2。这样既滤掉了纹波又保留了电压变化的趋势。需要注意的是这个200ms的安静窗口要避开系统正在给负载供电的时段否则电压跌落的动态误差会被当成真实压差反而触发错误的均衡。3.2 均衡判据与迟滞避免频繁启停从软件逻辑上说均衡判据非常简单当第一串电压与第二串电压的差值绝对值大于启动阈值时打开均衡器并设定电流方向当差值回落到停止阈值以下时关闭均衡器。但如果你把这个逻辑直接写进代码必然会出现振荡——均衡刚把压差拉到目标范围内由于采样噪声或者电芯极化恢复差值又反弹到阈值以上芯片就会在几十秒内反复启停不但影响电芯寿命也会让MP2642GR-Z的热设计压力变大。解决方法是引入迟滞。我设的启动阈值是30mV停止阈值是15mV。也就是说只有在压差超过30mV时才开始搬移能量搬移一直到压差低于15mV才会停手。因为两个阈值之间有15mV的缓冲区系统不太容易在边缘处反复横跳。另外还要加一个最短运行时间限制至少让均衡器持续运行60秒才能关断防止因为负载突变导致的短时压差波动被算法当成均衡完成的信号。3.3 PWM/硬件使能控制与保护联动MP2642GR-Z的使能脚在低电平时关闭高电平时启动但均衡电流的方向需要额外的一根方向控制线来决定。STM32L031C6的定时器定时轮询采样每个循环周期做一次均衡状态机的刷新。状态机有四个状态空闲、等待、均衡中、保护停机。在空闲和等待状态均衡器完全关闭只有MCU的ADC在低功耗模式下周期唤醒工作这样能把系统待机功耗控制在很低的水平。保护联动方面当单片电芯电压超过4.25V或者低于2.5V时状态机必须无条件切换到保护停机无论当前压差是否满足均衡条件。这是因为均衡动作本身可能掩盖过充过放例如当一串电压偏高、一串偏低时均衡器向低电压串转移电流但高电压串可能已经接近过充边缘这时候单纯看压差继续均衡就危险了。我还在代码里加了一个看门狗超时如果MCU因为干扰死机均衡器使能被硬件拉到低电平保证电池组不会长时间处于不受控的均衡状态。4. 从裸板到稳定运行校准、通信与实测数据复盘4.1 校准电压采样先让眼睛可靠整个系统联调的第一步不是写均衡逻辑而是校准电压采样。我建议先用一台精度不低于0.05%的台式万用表实测电池组串联总压和两串分压记录下MCU ADC读到的原始码值然后通过两点线性校准把AD值换算成实际电压。校准公式很简单Vreal (ADCount / 4096) * Vref * k b其中k和b由两点校准求出。别嫌这一步麻烦采样不准后面所有均衡逻辑都是白搭。这里分享一个小技巧校准点不要选在3.0V和3.2V这种常规区间而是尽量贴近这个系统实际的浮充区间比如选3.4V和3.6V两个点做两点校准。因为ADC的增益误差在电压区间两端往往不一致选取贴近工作区的校准点能有效减小系统误差。校准后把k和b存进Flash的最后几页掉电不丢失后续生产时每台设备单独标定一次。4.2 通信上报与上位机观察备用电源系统不像电助力车那样能频繁人机交互但维护人员仍然需要知道电池状态。我在这个系统里用STM32L031C6的USART1接了一路RS485收发器采用Modbus-RTU协议只实现了04功能码读输入寄存器和03功能码读保持寄存器两个功能。寄存器地址定义是这样的0x00是总压0x01是第一串电压0x02是第二串电压0x03是压差0x04是均衡状态0x05是均衡电流方向。上位机通过一个简单的串口工具就能定时读取不需要额外仪表。调试通信时最容易遇到的一个坑是RS485的A/B线极性接反然后是终端电阻忘加。这几个问题通常都会导致收不到响应或者偶发乱码。我的排查习惯是先用USB转TTL直接接MCU的UART排除协议问题后再接入RS485链路一旦通信正常再把波特率从9600慢慢往上调最终工作在19200bps。不要一上来就上高速干扰问题会渗进来。4.3 实测数据与踩坑记录完成校准和通信后我搭建了一个模拟备用电源浮充的测试环境两串磷酸铁锂电芯其中一串先用充放电机充到3.65V另一串保持在3.30V制造出350mV的初始压差然后让系统进入浮充状态。实测过程中MP2642GR-Z在启动后立即以500mA电流向低压串转移能量压差从350mV下降到50mV大约用了14分钟继续降到15mV停止阈值总共用了不到25分钟。均衡停止后我又静置了4小时复测压差最终稳定在12mV说明极化恢复后没有出现明显反弹。再列一个实测采样值和均衡状态对比表方便大家快速理解工作过程时间点第一串电压第二串电压压差均衡状态0分钟3.651V3.302V349mV开启向第二串5分钟3.618V3.350V268mV开启向第二串14分钟3.551V3.500V51mV开启向第二串25分钟3.532V3.517V15mV停止压差阈值内4小时后3.530V3.518V12mV停止状态稳定整个调试过程中踩过两个比较深的坑。第一个是均衡电流方向搞反了第一次上电调试时我以为芯片方向控制脚高电平代表从第二串向第一串转移实际正好相反结果压差不但没缩小反而从300mV涨到500mV。后来我查了数据手册的时序图才发现方向定义和我想的相反提醒大家在接控制逻辑之前一定要先对照datasheet里的真值表确认方向电平。第二个坑是采样间歇窗口时间不够最初只关了均衡电流50ms你会发现电压恢复还没完成就采完了样每次算出来的压差都偏小导致均衡提前停止、压差反弹。把安静窗口加到200ms以后这个问题就消失了。最后再分享一点经验两串电池的均衡系统看着简单但真正影响长期可靠性的往往不是均衡算法本身而是采样基准的温度漂移、电感饱和裕量、方向控制的反接保护这些外围细节。我在这个项目里最满意的改动其实是给两个IO口各自加了RC滤波并且把方向控制线设置成默认低电平在MCU初始化完成之前不会误触发均衡。这些小改动体感不大但在量产设备上能省掉大量售后排查。如果你也在做类似的小型储能备电方案这套专用均衡器低功耗MCU的组合值得一试。