2S电池均衡实战:Buck-Boost有源均衡与BMS状态机设计详解
两节串联电池还需要专门做均衡这是很多人拿到需求后的第一反应。我动手做这个储能备用电源项目之前也这么想过——2S结构压差能有多大直到把MP2642GR-Z这颗同步Buck-Boost控制器和PIC32MZ1024EFK144这颗主控放到同一块板上跑完常温老化和充放电循环之后才弄明白均衡这件事在长期浮充的备用电源里有多关键。这篇文章就是把这个项目的完整思路、硬件参数、软件状态机和调试踩过的坑一次性讲清楚给正在做类似两串电池均衡、或者准备在大电池组里做单元均衡模块的朋友当参考设计笔记用。1. 两串电池的均衡真不是小题大做1.1 不一致从哪来又会带来什么串联电池组里流过每一节电芯的电流是完全相同的但每节电芯“能存多少电、愿意放出多少电”却不一样。这种差异从出厂就存在正极材料批次波动、化成工艺残余、内阻偏差都会让相邻两节电芯的初始容量和自放电率差出1%到2%。再加上工作时的温度梯度靠散热片近的电芯和靠外壳边缘的电芯温差可能达到5℃以上自放电速度进一步拉开。几个月跑下来两节电芯的荷电状态SOC就会明显错位。错位带来的直接后果是充放电末端被“短板电芯”卡住。充电时容量小的一节先到达截止电压如果继续充它就会过充放电时又是这一节先放到截止电压整组的可用容量被它锁死。储能备用电源又是长期挂在浮充状态下的电池常年处在满电附近低压电芯会持续被顶到过压边缘。这种工况下串联节数越少问题反而越明显——两串电池里每一节都承担了一半的组电压任何一节的劣化都会被成倍放大。一开始我在项目里也犹豫过配了均衡电路是不是过度设计。后来翻了一批运行了三年多、从未做过均衡的同型号2S备电模组数据静态压差普遍在80mV到150mV之间最差的甚至有200mV。整组可用容量比出厂时下降了将近35%拆开检测永远是电压偏低的那一节最先出现容量坍塌。均衡不是给新电池准备的是给电池“老化之后”兜底的。1.2 储能备用电源场景的特殊性和电动汽车电池包不一样备用电源的典型工况是“平时不放电、常年浮充、偶尔深度放电”。这种工况对不均衡的放大作用特别明显浮充电压长期加在两节串联电芯上容量低的那节被持续过压内部副反应加速产气、电解液消耗、内阻上升内阻一上来浮充电流在它身上的压降更大相当于给它“额外充电”形成恶性循环。备用电源还要求极高的可靠性停电时才顶上结果却因为某节电芯过放导致整组提前低压保护这比电动汽车里电池衰减的后果更隐蔽也更危险。所以在这个场景里均衡策略要回答的问题不是“能不能把压差压到零”而是“如何让两节电芯在全生命周期内都不会因为累积偏差进入过充或过放状态”。这也是后面整套软件状态机设计的核心出发点。1.3 四种均衡方案放在一起比做方案选型时我把常见的均衡路线都列了一遍。无源电阻均衡最简单每个电芯并联一个开关和放电电阻电压高的那节通过电阻把多余能量放掉但能量以热量形式损耗掉均衡电流还不敢做大一般只有0.1A左右适合低成本、小容量、压差问题不严重的场合。开关电容均衡不需要软件控制靠电容在相邻电芯间来回搬运电荷但均衡电流小、且两节电压差越小搬运能力越弱不适合需要真正搬移能量的场景。本项目用的方案是Buck-Boost有源均衡通过一颗升降压控制器把能量从高电压电芯直接搬到低电压电芯能量只经历一次电感传递损耗小、电流可控。还有一种更复杂的是整组独立充电机方案用隔离电源给低压电芯单独补电效果好但成本高、体积大在2S小系统里完全没有必要。对比下来Buck-Boost有源均衡在成本、效率、控制灵活性之间是最平衡的选择。均衡方式能量去向均衡电流效率成本适合场景电阻耗散变为热量0.05~0.2A低低小容量低端备电开关电容电容搬运0.1~0.3A中中压差小的串联组Buck-Boost有源搬移给低压电芯0.5~2A高中2S单元均衡模块独立充电机外部能量补充取决于电源高高多串大容量高端BMS2. 方案架构谁干活谁说了算2.1 为什么必须是升降压拓扑两节串联电芯在工作过程中哪边电压高是动态变化的。充电末端可能是第一节高放电末端可能是第二节高磷酸铁锂的平台电压很平但两端电压摆动范围也有2.5V到3.65V。如果只用降压拓扑就只能单向从高到低压电芯搬能量一旦方向反了就无能为力。Buck-Boost拓扑让能量流动方向完全由开关时序决定任何时候都能把能量从电压高的那节搬到电压低的那节不需要管哪边是“源”哪边是“负载”。这个特性对均衡来说太重要了因为均衡动作的触发条件恰恰是“哪节高就放哪节”方向是实时变化的。如果用固定升降压方向的方案就要额外加换向开关增加复杂度和损耗。2.2 MP2642GR-Z在系统里的具体职责MP2642GR-Z在这套系统里承担的是能量搬运的“执行机构”角色。按这颗控制器在均衡类应用中的典型定位来看它内部集成了同步Buck-Boost控制所需的两个半桥驱动逻辑、高精度电流采样放大链路和PWM调制电路外部只需要配四个功率MOSFET、一颗电感和若干电阻电容就能构成完整的双向能量转移通道。控制回路是让它按恒定电流工作的。电流采样电阻把均衡电流转换成电压信号送入芯片内部的误差放大器和MCU设定的目标基准比较后闭环调节开关占空比维持设定的均衡电流值。MCU不直接干预每个开关周期只告诉芯片“现在把电流设成1A、方向是从第一节到第二节”然后由芯片自己把电流稳住。这种分工很大程度降低了MCU的实时负载也避免了软件环路响应速度不够导致电流震荡。针对均衡应用这颗控制器的关键优势在于支持双向电流路径、能在很小的输入输出电压差值下工作。两节电芯压差可能只有30mV到50mV需要在低占空比、高开关频率下保持稳定输出这是普通Buck或Boost控制器很难处理的场景。2.3 PIC32MZ1024EFK144为什么够用主控选型时有人问过我就均衡两节电池用得着MIPS内核带浮点单元的PIC32MZ1024EFK144吗用一颗8位单片机跑状态机不也一样坦白说只看均衡动作本身8位机确实也能做。但我考虑的是整个系统的可扩展性和可靠性。PIC32MZ1024EFK144这颗芯片主频200MHz带FPU其性能足以支撑实时操作系统和复杂的数字滤波1024KB Flash和512KB RAM可以同时放Bootloader、应用固件和比较长的数据记录缓冲区12位ADC配合过采样能把电压采样分辨率做得很精细6路UART和2路CAN为以后连接上位机或级联到多串BMS主控预留了充足接口。144脚TQFP封装在中小批量生产阶段也容易焊接调试不像BGA那样对PCB工艺要求高。最关键的是安全方面的考量。均衡是个需要长期后台运行、又必须绝对可靠的功能主控要有足够资源做故障记录、参数校准、看门狗和通信诊断。这些功能在8位机上不是做不了而是一旦以后需求扩展比如从2串变成4串、或者要接显示屏重新选型换板子的成本远高于一开始用高一个档次的主控。3. 硬件设计从器件选型到参数计算3.1 功率级参数计算均衡电流我设定为1A。这个值在2S备电系统里是经过权衡的太小则搬能量太慢压差50mV对应约2%SOC差对100Ah电芯就是2Ah0.2A电流得搬10个小时没有实用价值太大则电感、MOSFET、PCB走线都要加粗对成本和体积又不友好。以1A计算搬2Ah只需要2小时配合备用电源的昼夜浮充周期完全来得及。开关频率选500kHz。频率高电感和电容可以缩小但MOSFET开关损耗会上升驱动电路也更难设计。500kHz在工业级应用中是个成熟平衡点MP2642GR-Z在典型推荐下也能稳定支持这个频率。电感值按最恶劣降压工况计算。假设高电压电芯满电3.65V低电压电芯在2.5V两者压差最大。降压模式占空比D Vo / Vin 2.5 / 3.65 ≈ 0.685。电感纹波电流取均衡电流的30%即ΔIL 0.3A则理论电感值L ≥ (Vin - Vo) × D / (fsw × ΔIL) (3.65 - 2.5) × 0.685 / (500000 × 0.3) ≈ 5.25μH留出设计余量后取标准值5.6μH。电感饱和电流要按最大峰值电流考虑1A均衡电流加0.15A纹波半峰值约1.15A但还要考虑上电瞬态和电芯电压差快速翻转时的冲击取3倍以上余量选额定饱和电流不小于5A的功率电感。耐流值大一点的电感体积略大但对稳流精度和长期可靠性帮助很大这个余量值得留。功率MOSFET选30V耐压、RDS(on)在10mΩ以内、栅极总电荷Qg不要超过15nC的N沟道MOS管。驱动平均电流约等于 fsw × Qg 500kHz × 15nC 7.5mA芯片内置驱动可以直接带动导通损耗I²R 1² × 0.01 10mW可以忽略不计发热主要来自开关损耗正常工作时MOS表面温度控制在60℃以内即可。电流采样电阻取10mΩ。满载时压降为10mV虽然小但足够被芯片内部高精度放大器可靠读取。电阻必须用温漂系数低、功率容量足够的合金电阻封装方面推荐2512或至少1812规格。PCB上要从电阻两端单独引出感应走线做开尔文连接避免大电流路径上的铜箔压降造成的采样误差。3.2 采样与检测电路设计电压采样用分压电阻加RC滤波。每节电芯电压经过100kΩ和10kΩ分压后进入MCU的ADC引脚分压比11:13.65V对应约0.332V处于12位ADC的合适量程内。RC滤波用100Ω电阻和1μF电容截止频率约1.6kHz有效衰减开关噪声。但这里有一个容易忽略的问题MCU的ADC引脚输入阻抗有限如果直接从分压点接进去采样会引入额外电流导致分压比偏移。我的做法是在分压电阻和ADC引脚之间加一级跟随器运放或者把分压电阻阻值改小到10kΩ/1kΩ让分压点的源阻抗足够低。由于均衡板空间有限我选择了后者代价是分压电阻自身损耗略有增加但对测量精度的提升立竿见影。温度采样用NTC热敏电阻贴在每节电芯表面经过10kΩ上拉电阻分压后接入ADC。两节电芯各贴一个NTC除了做均衡过热保护还能在均衡过程中监控温度变化判断是否因为电芯内阻异常导致局部过热。MCU的ADC参考电压不要用内部参考。我在样机阶段实测过内部参考随温度漂移最大能到十几毫伏对均衡判定门槛来说偏差太大。换成一颗高精度外部基准2.048V或4.096V后ADC读数在全温度范围内的稳定性明显改善。3.3 PCB布局与保护设计布局上最核心的一条原则功率回路和控制回路分开。电感、MOSFET、采样电阻组成的大电流环路面积要尽可能小这是EMI和开关振铃的主要来源控制信号、MP2642GR-Z的反馈网络、MCU的ADC走线则要远离功率区尤其不要让ADC采样线和电感靠太近。均衡板和电芯之间通过四根接插件连接正极、中点、负极、温度采样地。接插件要选能承载2A以上持续电流的型号我一开始图省事用了普通排针结果在长时间2A短路测试时端子发热严重后来换成了额定电流3A的带锁扣端子才解决。保护电路方面除了芯片自身的过流保护外我在MCU侧加了输入过压、欠压和温度保护。均衡模块不允许在电芯电压超出2.5V到3.65V范围时工作否则极容易把故障电芯继续充坏。每节电芯的电压采样同时送到硬件比较器和MCU的ADC一旦电压超过硬件保护阈值会直接切断MP2642GR-Z的使能信号这条路径不经过软件响应时间在微秒级别。4. 均衡策略与状态机实现4.1 阈值怎么定均衡阈值的设定是整个软件策略里最讲究的部分定大了没效果定小了误动作。我根据磷酸铁锂的特性倒推平台区电压对SOC不敏感静置状态下30mV压差大约对应1%到2%的SOC差而测量噪声加上ADC量化误差累计会在3mV到5mV。启动阈值定在50mV。这是一个“压差已经明显超过正常老化范围”的信号确保均衡动作不会因为测量噪声或短暂的温度波动而频繁启停。停止阈值定在15mV因为继续往下均衡的效率会急剧下降而且电芯极化产生的电压回弹会让结果变得不可信。动作还加了迟滞启动后要等到压差小于15mV才停止停止后要重新超过50mV才会再次启动这避免了在阈值附近反复振荡。同时给均衡加时间上限。无论压差有没有收敛单次均衡时间最长4小时到点强制停止并记录事件。这主要防两件事一是电芯内部微短路导致怎么均衡都拉不平二是均衡电路本身故障却还在继续搬能量。4小时对应1A电流搬移4Ah能量足够处理绝大多数正常老化场景。4.2 状态机设计与代码实现均衡软件按状态机实现轮询周期500ms。对应两节电芯电压采样和温度检查每个周期都完整跑一遍安全逻辑再做状态迁移。核心状态包括空闲、判定、搬移、完成和故障。typedef enum { BAL_IDLE, BAL_CHECK, BAL_C1_TO_C2, BAL_C2_TO_C1, BAL_DONE, BAL_FAULT } bal_state_t; bal_state_t bal_state BAL_IDLE; static uint8_t chk_cnt 0; static uint32_t bal_timeout_ms 0; void bal_task_500ms(void) { float v1 adc_read_cell1(); float v2 adc_read_cell2(); float t1 adc_read_ntc1(); float t2 adc_read_ntc2(); if (v1 3.65f || v2 3.65f || v1 2.50f || v2 2.50f || t1 65.0f || t2 65.0f) { mp2642_disable(); bal_state BAL_FAULT; fault_record(FAULT_OV_UV_OT); return; } switch (bal_state) { case BAL_IDLE: if (fabsf(v1 - v2) 0.05f) { chk_cnt 0; bal_state BAL_CHECK; } break; case BAL_CHECK: if (fabsf(v1 - v2) 0.05f) { chk_cnt; if (chk_cnt 3) { if (v1 v2) { mp2642_set_direction(C1_TO_C2); bal_state BAL_C1_TO_C2; } else { mp2642_set_direction(C2_TO_C1); bal_state BAL_C2_TO_C1; } bal_timeout_ms 0; } } else { chk_cnt 0; bal_state BAL_IDLE; } break; case BAL_C1_TO_C2: case BAL_C2_TO_C1: bal_timeout_ms 500; if (fabsf(v1 - v2) 0.015f) { mp2642_disable(); bal_state BAL_DONE; } else if (bal_timeout_ms 4UL * 3600UL * 1000UL) { mp2642_disable(); bal_timeout_record(); bal_state BAL_IDLE; } break; case BAL_DONE: mp2642_disable(); if (fabsf(v1 - v2) 0.015f) { bal_state BAL_DONE; } else { bal_state BAL_IDLE; } break; case BAL_FAULT: mp2642_disable(); if (v1 2.50f v1 3.65f v2 2.50f v2 3.65f t1 55.0f t2 55.0f) { bal_state BAL_IDLE; } break; } }代码里有几个细节值得强调。连续3次确认才开始均衡是为了避开电芯极化电压的假性压差均衡过程中每500ms采样一次发现压差小于15mV立即停止而不是等到整个周期结束故障状态下必须故障原因消失且温度回落到55℃以下才能复位避免频繁自动恢复导致元器件热损伤。4.3 均衡过程中的安全联动均衡启动前先检查电池组是否处于充电状态。在备用电源场景里如果市电正常电池一直挂在浮充机上浮充电流会以很快的速度抵消均衡搬移的效果此时启动均衡没有意义。我加了一个简单判断通过外部IO检测充电状态若在充电则延迟均衡直到电池进入静置态或者浮充电流很小时再开始。均衡方向切换时加软启动。MP2642GR-Z的电流环从零上升到1A要分几步走而不是一上来满电流否则会在电感和电池之间产生较大冲击电流也容易把滤波电容短路瞬间拉出大幅电压跌落。我在芯片的基准电压脚用DAC或PWM滤波控制电流目标值让它从0.2A开始、每500ms增加0.2A5步到达1A。最后是看门狗和故障记录。PIC32MZ1024EFK144的独立看门狗在1秒内必须被主循环喂狗任何死循环或跑飞都会触发复位。复位后Bootloader检查均衡状态标志位确认没有异常后恢复典型配置最后一次均衡的方向、电流设定、持续时间、停止原因都写入Flash日志方便后续BMS主控读取排查。5. 调试实录与常见问题速查5.1 从第一次上电到稳定跑通第一批样机焊完后上电我先干了一件事不接电池用可调电源模拟两节电芯电压第一节设3.45V第二节设3.25V从MFG测试软件里观察均衡是否按预期启动。结果第一次就没过——状态机确实切到了C1_TO_C2但电流检测显示只有0.35A远低于设定的1A。查了半天发现是采样电阻的布线问题。设计时采样电阻两端用开尔文走线引出到芯片的电流检测引脚但PCB上我图省事把感应走线直接连到了电阻的焊盘根部结果大电流路径上的铜箔压降也叠加到了检测信号上。把感应走线改到电阻封装的内侧、尽量避开大电流路径之后检测值恢复正常均衡电流稳定在1.0A。这是典型的新手布局坑建议做类似设计的朋友在Layout阶段就把开尔文连接的要求写进Checklist。接下来调软启动。刚上电时MP2642GR-Z的使能脚被MCU拉高芯片按默认最大电流输出瞬间在电感里产生了明显的啸叫。接上示波器看电流波形峰值冲到了2.3A。把电流目标值改成通过PWM滤波控制、分5档缓升之后啸叫消失峰值电流也稳定在1.2A以内和理论计算的1.15A基本吻合。5.2 实测数据与收敛效果均衡验证用了一对从旧备电设备上拆下来的老化电芯磷酸铁锂100Ah标称剩余容量分别为92Ah和88Ah。静置12小时后测得第一节开路电压3.426V第二节3.285V压差141mV。启动1A均衡后每半小时记录一次数据均衡进行到2小时时压差降到52mV4小时时压差只剩下17mV状态机自动进入停止和二次判定状态。停止后静置2小时由于浓差极化回弹压差回到26mV没有超过50mV启动阈值系统保持待机。第二天再次静置后记录到压差22mV证明绝大部分真实SOC差已经被消除。整个均衡过程的能量效率我也单独测过。通过高精度功率计记录输入侧和输出侧的能量4小时共搬移约3.9Ah能量折算效率约93%。损耗主要来自电感铜损、MOSFET导通损耗和少数开关损耗对备用电源系统来说这个效率已经高到完全可以忽略。热成像下电感表面温度最高59℃MOSFET温度约55℃没有主动散热条件下工作稳定。5.3 常见问题排查表调试过程中整理了一份问题速查表后续维护人员按表排查效率高了很多分享出来供参考。现象可能原因检查与处理均衡不启动压差一直大MCU状态机未切过去MP2642使能脚没拉高方向信号接反串口打印状态测EN引脚电平用MFG工具控制方向验证接线均衡电流只有设定值的1/3采样电阻开尔文连接错误芯片电流基准没校准电感量偏大导致CCM边界异常示波器看ISENSE波形复核电流基准电压核对电感感量均衡时MCU频繁复位功率回路噪声灌入MCU电源电感靠近复位引脚均衡启动电流冲击过大MCU电源加LC滤波远离电感软启动分档加电电压读数上下跳变30mV以上ADC采样窗口叠加开关噪声分压电阻源阻抗过高内部参考漂移加RC滤波器降低分压电阻阻值换外部精密基准某节电芯温度异常升高长时间大压差导致均衡时间过长电芯内阻偏大产生损耗限制单次均衡时间内阻检测后标记异常电芯停止均衡后压差重新拉开浓差极化导致检测阈值误判电芯存在微短路延长停止静置时间二次判定后再启动连续三次不收敛则报警5.4 最后分享一点个人心得这套方案真正让我觉得值回票价的地方不只是压差从141mV降到17mV这个结果而是整个均衡过程在备用电源全生命周期里变得“可观测、可控制、可记录”了。MP2642GR-Z负责把能量稳稳地搬到该去的地方PIC32MZ1024EFK144负责判断该不该搬、搬多久、什么时候停两者的配合让均衡从一种“碰运气”的硬件补偿变成了长期运维里可靠的保障手段。最后给准备做类似设计的朋友一个建议先把采样精度和阈值逻辑做好再谈均衡电流大小。均衡电流做1A还是2A对整个系统稳定性的影响远没有你想象的大但ADC读数要是跳个30mV你那套精心设计的阈值和状态机全都会变成摆设。硬件上多花一点心思在采样和布局上后期调试会省下大把时间。