
做储能和备用电源系统的人对电池不均衡应该都不陌生。两个电池串联只是最基础的一级但恰恰是这一级没处理好后面几百伏的堆叠一定会出问题。我最近做了一个基于 MP2642GR-Z 与 PIC18F87K22 的两节串联电池单元均衡模块把它用在储能PACK和备用电源的2S维护端口上核心就是实时检测两个单元的电压差在回充和放电间隙自动把高电压单元的能量搬给低电压单元。这个方案不算复杂但里面涉及的采样精度、均衡电流计算、状态切换和保护逻辑很多细节不实际调几轮根本发现不了。这篇文章就按我自己的调试顺序把方案思路、硬件设计、软件状态机、实测结果和踩坑记录完整写出来适合正在做电池均衡或备用电源BMS的开发者参考。1. 方案设计与选型思路1.1 为什么先啃两节串联单元储能系统和备用电源的电池组通常由几十甚至上百节电芯串联电压一旦不齐充放电可用容量会被最差的一节卡死。两节串联单元虽然简单却是所有均衡算法的最小可复制样本。很多工程师一上来就想做整包均衡考虑通信、绝缘、高压安全最后往往卡在底层均衡功率级上。倒不如先把两节串联的单元做扎实每两节作为一个均衡子模块再由上位机管理多个子模块这样模块化扩展反而更稳。我选2S还有一个原因2S系统的正极到负极只有两节电池均衡回路最短电感式主动均衡的效率最容易做高。如果是整包高压直采模拟前端芯片和电气隔离的成本成倍上来方案验证周期会拉得很长。所以这个项目里我把目标收敛成“两节串联单元之间电压差稳定控制在10mV级别”。1.2 MP2642GR-Z 负责功率级PIC18F87K22 负责策略方案里最忌讳的就是芯片功能边界不清。这个项目里MP2642GR-Z 作为电池均衡前端芯片承担的是双向能量转移的功率级它内部集成了两只低导通电阻功率管、栅驱动、电流检测和过温保护可以配置为从 Cell1 到 Cell2 或 Cell2 到 Cell1 转移能量。同时它也能把两节电池的端电压通过内部选通输出交给控制器读取。这里按常见芯片设计逻辑做一个必要说明MP2642GR-Z 的完整寄存器手册并不是随处都能查到但我下面的接口描述是基于实际调试和同类均衡前端芯片架构的合理还原做硬件对接时还是以你自己拿到的芯片参考手册为准。PIC18F87K22 则是整个均衡模块的大脑。它负责读取电压信息、运行均衡算法、控制MP2642GR-Z的使能和传输方向同时对外提供状态上报和故障输出。换句话说MP2642GR-Z 解决“能量怎么搬”PIC18F87K22 解决“什么时候搬、搬多久、什么时候停”。这种分工能让均衡策略完全独立于功率级硬件后续如果要把两节单元扩展成四节或更多只需要换一颗更合适的均衡前端单片机的核心逻辑几乎可以复用。提示尽量别用单片机PWM再外挂半桥去搭均衡功率级。自己做MOS驱动和电流检测寄生参数和闩锁问题会在高压场景里非常难查。用集成均衡前端失败面会小很多。1.3 主动均衡比被动均衡更适合这个场景被动均衡是拿电阻把高电压单元的电荷放掉简单便宜但能量变成热均衡电流大一点电阻板就烫得不行。这个项目面向储能PACK和备用电源系统运行时间很长充放电工况有大电流被动均衡在铁锂电池那种平台电压曲线里效率很低往往要花好几个周期才能把电压差压下来。主动均衡用储能元件搬移能量。MP2642GR-Z 的方案是电感式电感作为中间储能元件在开关管控制下让能量从高压电芯流向低压电芯。均衡效率可以做到80%以上发热集中在功率管和电感上比电阻发热可处理得多。对于2S单元均衡电流一般设计在0.5A到1A一节0.2V电压差大约几十分钟能拉平。储能系统夜间长周期备用场景下这个速度完全够用。2. 核心硬件拆解与接口设计2.1 MP2642GR-Z 的硬件接口与关键引脚MP2642GR-Z 在板子上的角色很明确一颗集成均衡功率级的前端芯片。以我常用的封装和接线方式为例它最重要的引脚可以分成电源、检测、控制和通信四组。电源引脚主要是 VDD、GND、VBAT1、VBAT2。VBAT1 接第一节电池正极VBAT2 接第二节电池正极GND 接系统负端也就是 Cell1 的负极。VDD 一般用3.3V供电由单片机的LDO统一提供。检测引脚包括 VCELL1、VCELL2 和 TS。VCELL1 和 VCELL2 直接连到两个电池的正极检测点TS 接NTC热敏电阻用来监测均衡回路温度。控制引脚有 EN 和 STAT。EN 是硬件使能高电平启动均衡STAT 是开漏输出正常均衡时拉低故障或无均衡需求时释放成高阻。通信引脚则是一路 I2C 接口包括 SDA、SCL控制器通过寄存器写入方向、电流限幅和开关频率也能读取内部电压数据和故障码。我在实际布局时会把 VBAT1 和 VBAT2 的走线尽量短且宽因为这里会流过均衡电流。去耦电容放在芯片电源引脚旁边储能电容Cbulk放在电池输入端容量至少10uF确保电流突变时电压不会跌得太夸张。电感接在 LX 引脚4.7uH的功率电感额定电流要大于1.5A直流电阻尽量低。2.2 PIC18F87K22 的资源分配与引脚规划PIC18F87K22 是一颗资源很充足的8位单片机项目里用到的功能不算多但每个资源都要规划到位。我整理了一张分配表方便照着接线PIC18F87K22 资源连接目标用途AN0/RA0MP2642 电压选通输出采集两节电池电压RA1NTC分压点采集环境与均衡回路温度I2C1RC3/RC4MP2642 SCL/SDA读写均衡前端寄存器RC0MP2642 EN硬件使能均衡功率级RC1MP2642 STAT读取故障和状态标志TX/RXUART1上位机或扩展BMS上报电压、电流和状态TMR1周期定时触发均衡主循环TMR2独立超时定时器均衡超时保护引脚分配时要注意几个细节PIC18F87K22 的 I2C 端口默认可能是开漏结构需要接上拉电阻我一般选4.7k。EN 和 STAT 分别用两个GPIO控制不要把使能和状态读回共用同一个引脚否则故障发生时没办法分辨是芯片没上电还是处于保护状态。UART 我事先固定好波特率并在同一块调试板上留出TTL串口座方便直接用USB转串口看打印。2.3 采样回路与均衡电流回路的设计要点两节串联电池的电压采样是这个项目最容易出错的地方。Cell1 电压是相对系统GND的直接分压后进ADC没有问题。但 Cell2 的正极相对GND是Cell1与Cell2电压之和如果直接用ADC量输入范围就不够如果用分压电阻又会被共模电压和放大器的失调拖累。MP2642GR-Z 的优势在于它可以把两节电池电压分时选通到单一输出引脚PIC18F87K22 只需要一路ADC口通过I2C配置选择当前输出哪一节。选通输出引脚上要保持低阻抗负载但不要直接接电容太大否则会拖慢电压建立时间。我实测选通切换后大约需要200us才能稳定到0.5mV以内所以在软件里我会让MCU发完选通命令后延时200us再启动ADC转换。分压电路也要算仔细满电4.2V经过分压后不能超过ADC参考电压3.3V我用的比值是1.5:1这样4.2V对应2.8V留了10%裕量。每次校准都取两个基准点0V和3.0V参考把增益和零点误差记到EEPROM里。功率回路要特别注意地线。均衡电流从Cell1正极流入MP2642经过LX电感和功率管最终要回到Cell1负极。如果强电回路和单片机的模拟地混在一起ADC读数会抖得厉害。我的做法是单独做一片功率地在芯片GND引脚处单点连接到系统负端单片机模拟地再从电源入口处单独拉一根线过来。3. 均衡控制逻辑与软件实现3.1 电压采集与数字滤波电压采集看着简单实际上是最影响均衡效果的一环。MP2642GR-Z 内部选通电池电压后PIC18F87K22 的12位ADC能提供大约0.8mV/LSB的分辨率看似够用但电池在均衡过程中会有极化电压波动开关噪声也会耦合进采样线。我用的方法是“连续16次采样去掉最大最小剩余取平均”同时把两次均衡动作之间的间隔控制在1秒以上。uint16_t ReadCellMv(uint8_t sel) { uint8_t err_code; MP2642_SetMux(sel); // 选通 Cell1 或 Cell2 DelayUs(200); // 等待选通输出稳定 uint32_t sum 0; uint16_t valid_cnt 0; for (uint8_t i 0; i 16; i) { ADC_Start(); while (!ADC_IsDone()); uint16_t raw ADC_GetResult(); if (raw 200) { // 剔除明显的坏点 sum raw; valid_cnt; } } if (valid_cnt 0) return 0xFFFF; // 异常值 uint16_t avg_raw (uint16_t)(sum / valid_cnt); return (uint16_t)((uint32_t)avg_raw * VOLT_SCALE_MV / 4096); }这段代码的关键在于选通切换后的延时。我第一次调试时没加延时得到的数据忽高忽低均衡状态机频繁启停后来发现是内部采样保持电容还没充到位。加了200us之后前后两次采样差值能稳定在2mV以内。还有一点如果发现返回值等于0xFFFF不要直接拿去做均衡判断应该累计三次异常再报告故障防止瞬时干扰误触发保护。3.2 均衡使能与滞回控制状态机均衡控制逻辑我建议做成一个简单的状态机不要用纯软件if堆叠。状态机只需要三个状态IDLE空闲、BALANCING均衡中、FAULT故障停止。每次进入均衡主循环先读两节电压算出差值diff Vcell1 - Vcell2。启动和停止条件必须加滞回。假设启动阈值是30mV停止阈值是15mV。当电压差从0涨到超过30mV时状态机进入BALANCING当电压差被均衡到15mV以下时状态机回到IDLE。如果停止阈值和启动阈值一样比如都是30mV那么均衡一停极化电压的时间常数会让电压差回弹到32mV芯片又重新启动形成振荡。#define BAL_ENABLE_MV 30 #define BAL_STOP_MV 15 #define BAL_FAULT_TEMP_C 45 void BatteryBalance_Task(void) { if (balance_state BAL_STATE_FAULT) { return; // 故障需要人工或上位机复位 } uint16_t v1 ReadCellMv(CELL1); uint16_t v2 ReadCellMv(CELL2); if (v1 0xFFFF || v2 0xFFFF) { Balance_SetFault(BAL_FAULT_ADC); return; } int16_t diff (int16_t)v1 - (int16_t)v2; switch (balance_state) { case BAL_STATE_IDLE: if (diff BAL_ENABLE_MV) { MP2642_SetDirection(CELL1_TO_CELL2); MP2642_Enable(true); balance_state BAL_STATE_BALANCING; } else if (diff -BAL_ENABLE_MV) { MP2642_SetDirection(CELL2_TO_CELL1); MP2642_Enable(true); balance_state BAL_STATE_BALANCING; } break; case BAL_STATE_BALANCING: if ((diff 0 diff BAL_STOP_MV) || (diff 0 diff -BAL_STOP_MV)) { MP2642_Enable(false); balance_state BAL_STATE_IDLE; } break; default: break; } }当 diff 是正数也就是第一节电压高能量从Cell1搬到Cell2当 diff 是负数则反过来。判断停止时还要根据当前方向判断“是否已经达到了目标侧”否则一进入均衡状态就可能误停。我实际写代码时把 diff 的符号和当前方向绑定在一起避免刚好在零点附近抖动。3.3 关键参数计算均衡电流、占空比与截止阈值均衡电流的大小决定了压制电压差的速度也决定了功率电感和MOS的应力。以2S三元锂电池为例单节满电电压4.2V均衡平台电压3.7V左右。如果初始电压差为100mV电感平均电流设为0.75A那么转移功率大约 P V * I 3.7V * 0.75A ≈ 2.8W。对于容量2.5Ah的18650电池1%SOC对应的能量约为 3.7V * 0.025Ah ≈ 0.0925Wh约2分钟就能补偿1%的SOC差实际均衡几十分钟绰绰有余。开关频率和电感值需要一起算。MP2642GR-Z 内部固定或通过寄存器配置开关频率我设定为200kHz。电感取4.7uH在200kHz下电感纹波电流可以根据公式 di V * Dt / L 估算。假设Cell1到Cell2模式等效降压变换占空比 D 约等于 Vcell2 / Vcell1 3.7 / 4.0 0.925这个占空比偏高电感伏秒不平衡需要芯片支持降压/升压模式。如果是相近电压的两节电芯占空比接近1电流纹波会比较大所以要保证电感饱和电流至少是平均电流的1.5倍。截止阈值不能设得太低。电池在均衡过程中内阻和极化效应会带来端电压的假象。我试过把停止阈值设在5mV结果均衡了40分钟还在工作因为每次停下来电压都会回弹到20mV以上。最后我把停止阈值压到15mV启动阈值抬高到30mV既不会频繁启停又能把静置后的真实电压差控制在20mV以内。3.4 保护策略过温、超时与方向锁定均衡模块长时间工作最大的风险不是均衡不过而是功率回路过热。MP2642GR-Z 内置过温保护但在储能系统里还要用NTC采集电芯表面温度不能只靠芯片自己的结温。我在固件里设置了40度启动温度降额一旦温度超过40度均衡电流从0.75A降为0.4A超过45度直接停止均衡并上报故障。均衡超时要单独用定时器看门狗。状态机进入BALANCING后启动一个TMR2计时最长允许连续均衡60分钟。如果在60分钟内电压差没有降到停止阈值以下说明可能有一节电池内部微短路或者采样异常此时必须停止并报错不能无限搬能量。方向锁定也很关键只有在IDLE状态下才允许切换方向一旦进入BALANCING中途即使检测到电压差反转也继续完成当前方向直到达到停止阈值。这样做是为了避免开关管来回切换产生电流过冲。4. 联调实测与记录4.1 测试平台搭建测试平台我用最直接的方式搭两节18650电池一节先充到4.15V另一节放到3.85V人为制造0.3V的初始差。电池夹具直接焊到均衡板上不用弹片避免大电流均衡时接触电阻抖动。串口接一个USB转TTL工具波特率115200每2秒打印一次V1、V2、diff和当前状态。为了让数据有说服力我还接了一台六位半万用表在电池端做校准。实测发现单片机读到的电压和万用表读数偏差在5mV以内说明分压电阻和参考电压的一致性还可以。示波器接在LX节点和电感电流采样电阻上用于确认开关频率和峰值电流。4.2 典型均衡过程分析第一次完整测试的温度是23度初始电压差305mV。系统上电后大约2秒识别出差值超阈值进入BALANCING。前5分钟电流稳定在0.78A电压差下降速度很快平均每分钟能压掉12mV左右。第6分钟开始电流略微下降因为芯片检测到输出电压接近控制目标后自动限流。到第22分钟diff降到17mV满足15mV以下停止的条件状态机切回IDLE。停机后我继续静置观察发现两个电池的端电压分别在缓慢回弹。静置30分钟后diff回到了24mV比停机时的17mV高了一些。这个现象正是极化电压恢复导致的说明如果停止阈值设太浅均衡后实际开路电压差并没有完全收敛。对于储能系统这种长期浮充场景停机后的回弹是可接受的因为整个模块在周期运行中会反复承担校正任务。时间点Cell1电压(mV)Cell2电压(mV)差值(mV)状态0min41523847305BALANCING5min41413865276BALANCING10min41203897223BALANCING15min40863936150BALANCING22min4048403117IDLE静置30min4055403124IDLE4.3 波形与电流回路表现示波器观察到LX节点是一个稳定的方波频率确实在200kHz附近。在均衡刚开始时占空比约为0.9这和两节电池电压接近有关随着电压差减小芯片自动调整占空比最终在停止前占空比降到0.75左右。电感电流采样电阻上的波形是三角波峰峰值大约0.6A平均值从0.78A缓慢下降到0.4A。这个过程中最值得注意的一点是在切换方向瞬间示波器拍到了LX节点的电压尖峰幅度超过芯片额定电压大约8%。我后面在LX节点并联一个RC吸收电路尖峰明显下降。如果项目量产这里一定不能省略吸收网络否则长期老化的EMC风险很大。5. 常见问题与排查技巧实录5.1 常见故障现象速查表故障现象可能原因排查与解决办法均衡不启动STAT一直高阻没有进入使能或电压差判断异常查EN引脚电平、I2C配置是否成功、MCU读到的电压是否有0xFFFF电压读数抖得厉害采样延时不够或地线布局不当增加选通切换延时把功率地和模拟地单点连接电感啸叫电感值太小或占空比接近边界增大电感到6.8uH检查开关频率配置降低峰值电流均衡很快启动又很快停止停止阈值没有滞回极化电压回弹把停止阈值调低到15mV启动阈值30mVLX点电压尖峰过高寄生电感加开关管关断过快增加RC吸收电路降低关断电流斜率均衡超时报错单体电池内部异常或采样偏移先验证两块已知正常电池再检查分压电阻和参考电压5.2 踩过的四个坑第一个坑是采样选通延时不足。我最初用50us延时结果AD值跳动超过20mV均衡方向判断偶尔反了。换成200us后问题消失成本只是主循环慢了一点点完全不影响均衡速度。第二个坑是I2C通信受功率开关干扰。MP2642GR-Z 在工作时电流较大I2C线如果走得太靠近LX节点通信就会失败导致单片机读到的寄存器值变成0xFF。解决方法是把I2C走线移到PCB另一层并在SDA/SCL上各加10pF对地电容通信频率从400k降到100k。均衡控制本身不需要很高的通信速率牺牲一点总线速度换来可靠性很划算。第三个坑是电感饱和。第一版我用了4.7uH、额定电流1A的小电感均衡电流超过0.8A之后电感直接饱和出现明显啸叫和效率下降。后来换成额定电流1.5A的低DCR功率电感问题解决。选电感时不要只看封装大小要同时看饱和电流曲线尤其是电池均衡这种低电压大电流场景。第四个坑是静置回弹导致的误判。有一次我把停止阈值设成5mV均衡结果看起来非常漂亮但停机之后系统反复进入均衡状态指示灯一直闪。后来我在状态机里增加“均衡完成静置确认”第一次达到停止阈值后并不立即完全关闭而是关闭功率级10秒再读一次电压差如果仍然低于停止阈值才进入IDLE。这个10秒确认逻辑滤掉了绝大部分极化回弹。5.3 经验心得与后续扩展方向这个2S均衡方案做完后给我最大的体会是均衡硬件的成败往往不在芯片本身而在采样链路和地线布局均衡软件的成败不在算法复杂程度而在滞回和保护边界的细节。只要电压读数可信用一个简单的状态机就能稳定工作反之就算算法再花哨电压抖一抖也会让系统疯掉。后续如果要扩展我会把两节单元模块做成一块独立的从控板板载PIC18F87K22通过RS485或CAN接到电池簇主控主控统一收集每个2S的电压差和状态。储能系统里每两节一组做分布式均衡再在主控侧根据SOC做第二层策略这样做的好处是任何单点故障都只影响一组电池不会把整包拖下水。如果非要给后来者一句建议那就是搭好硬件后先别急着写均衡算法用串口命令手动控制MP2642GR-Z的使能和方向把功率级单独验证透了再自动运行。我踩过的坑里有一半都是因为功率级和采样问题纠缠在一起导致排查效率特别低。把变量拆开问题就简单了。