1. 从两个串联电芯说起为什么被动均衡在储能BMS里依然是主流选择储能和备用电源系统里电池组从来不是单打独斗。以最常见的48V备用电源为例内部往往是十几节甚至几十节电芯串联而串联结构天生带着一个麻烦每节电芯的容量、内阻、自放电率不可能完全一致。充放电循环跑上几十次之后这种不一致会被放大最终表现为整组可用容量被最弱的那节电芯拖死。均衡电路要解决的就是这个问题。标题里提到的方案是用MP2642GR-Z这颗均衡专用芯片配合STM32F101ZG主控对两个串联电池单元做均衡。注意这里的关键词是两个串联电池单元——不是整组几十节而是聚焦在两节串联这个最小单元上。这个切入点很实际很多储能BMS的均衡架构是分层做的底层以两节或四节为一组做本地均衡上层再做组间均衡。把两节串联的均衡吃透是搭整套系统的基本功。MP2642GR-Z是MPS芯源系统推出的一颗电池均衡IC内部集成了功率开关和驱动逻辑外部只需要很少的元件就能构成一个双向或单向的均衡通道。STM32F101ZG则是ST的入门级Cortex-M3主控主频36MHz带丰富的外设资源在工业控制和BMS领域用量很大。这两颗芯片搭配构成的是一个典型的主控专用均衡IC架构。为什么不用主控直接驱动MOS管做均衡因为主控的GPIO驱动能力有限而且均衡电流一旦上到几百毫安甚至安培级主控直接驱动会带来发热、干扰和可靠性问题。专用均衡IC把功率级和逻辑级隔离开主控只负责发指令和读状态分工清晰。这个思路和用MCU直接推继电器与用MCU驱动继电器驱动芯片再推继电器的差别是一样的——专业的事交给专业的器件。这套方案适合谁看如果你正在做储能BMS、备用电源、便携式储能或者电动工具的电池管理需要处理两节串联电芯的均衡那这篇内容基本可以照着落地。如果你只是做单节电池保护那均衡部分可以跳过但主控与均衡IC的通信逻辑、状态机设计思路仍然有参考价值。2. MP2642GR-Z的工作边界它到底能均衡什么、不能均衡什么2.1 芯片的均衡原理与电流路径MP2642GR-Z的核心是一个集成的高边/低边开关组合配合外部电感和电容可以在两节串联电芯之间转移电荷。它的工作方式不是简单的电阻放电——那种方式把多余的能量通过电阻烧掉效率低、发热大。MP2642GR-Z做的是电荷转移式均衡把电压高的那节电芯的能量搬到电压低的那节去。具体来说芯片内部有两条功率路径一条从Cell1的正极到Cell2的正极或者反过来通过电感储能再释放。开关频率由内部振荡器决定外部只需要配置电感值和几个滤波电容。均衡电流的大小取决于电感值和开关频率典型应用里可以做到几百毫安级别。这里有一个容易踩的坑很多人以为均衡电流越大越好实际上在两节串联的架构里均衡电流受限于电芯本身的允许充放电倍率。比如两节18650电芯标称容量2500mAh如果均衡电流设到1A相当于0.4C的充放电短时间没问题但持续均衡会让电芯发热。我的经验是均衡电流取电芯容量的0.1C到0.2C比较稳妥2500mAh的电芯对应250mA到500mA。2.2 电压检测精度决定了均衡的触发时机MP2642GR-Z内部集成了电压检测电路但它的检测精度和采样速率需要结合STM32F101ZG的ADC一起看。芯片本身提供的是模拟电压输出或者通过I2C/SPI读取的数字量具体取决于配置模式STM32F101ZG的12位ADC在3.3V参考下理论分辨率是0.8mV。但实际有效精度受参考电压温漂、PCB布局和走线阻抗影响能做到±5mV已经不错了。为什么精度这么重要因为均衡的触发阈值通常设在10mV到30mV之间。如果检测精度只有±20mV那阈值设10mV就毫无意义——芯片根本分不清两节电芯是真的有压差还是检测误差。所以实际项目里我一般会把均衡阈值设在20mV以上同时用软件做滑动平均滤波把随机噪声压下去。注意MP2642GR-Z的电压检测输入引脚必须加RC滤波截止频率建议在100Hz到1kHz之间。截止频率太高滤不掉开关噪声太低会拖慢响应速度。我通常用1kΩ电阻配100nF电容截止频率约1.6kHz实测效果比较均衡。2.3 两节串联架构下的共模电压问题两节串联意味着Cell2的负极是Cell1的正极整个均衡IC的参考地是Cell1的负极。但STM32F101ZG的参考地是系统GND如果系统GND和Cell1负极不是同一个点就会引入共模电压。这个问题在备用电源系统里特别常见因为主控的供电可能来自整组电池经过DCDC之后的3.3V而均衡IC的地是电池组中间某一点。解决方式有两种一是用光耦或数字隔离器把I2C/SPI信号隔离二是让STM32F101ZG的GND直接连到Cell1负极然后主控的供电也用同一参考。第二种方式简单但要求主控的所有对外接口都做隔离否则会形成地环路。我倾向于第一种虽然多几颗元件但调试起来省心得多。3. STM32F101ZG在这套均衡系统里到底管什么3.1 主控的职责边界别让MCU干它不该干的事STM32F101ZG在这套方案里不是用来直接驱动均衡功率级的它的核心职责是四件事配置MP2642GR-Z的工作模式、读取两节电芯的电压和状态、执行均衡策略、与上层系统通信。把这四件事做好主控的负担就很轻36MHz的主频绰绰有余。配置工作模式通常通过I2C或者SPI完成。MP2642GR-Z支持寄存器配置可以设置均衡电流档位、使能/禁用均衡、读取故障标志。STM32F101ZG的I2C外设支持标准模式和快速模式跑400kHz没问题。这里要注意的是I2C总线上如果挂了多个从机地址冲突要提前规划好。MP2642GR-Z的地址通常可以通过外部引脚配置给两到四个可选地址够用了。读取电压的方式有两种一是用STM32F101ZG自带的ADC直接采两节电芯的分压二是读MP2642GR-Z内部的电压寄存器。前者灵活但精度受分压电阻影响后者精度由芯片保证但采样速率可能受限。我的做法是两者都用ADC做快速监测芯片寄存器做精确校准定期比对偏差超过阈值就报警。3.2 均衡策略的状态机设计均衡不是简单地压差超过阈值就打开开关。一个完整的均衡策略至少包含五个状态空闲、检测、均衡中、冷却、故障。状态之间的迁移条件需要仔细设计否则会出现反复启停或者均衡过度。空闲状态下主控周期性比如每100ms读取两节电芯电压。如果压差超过启动阈值比如25mV且持续超过3个采样周期进入检测状态。检测状态做一次更精确的测量确认压差真实存在然后进入均衡中。均衡中状态下均衡IC工作主控每500ms读一次电压如果压差降到停止阈值比如10mV以下进入冷却。冷却状态等待30秒让电芯电压自然稳定再回到空闲。如果任何阶段检测到过温、过压或者通信故障直接跳到故障状态并关闭均衡。这个状态机的关键是冷却状态。很多新手会忽略这一步结果均衡刚停电芯电压还没稳定主控又检测到压差再次启动均衡形成振荡。冷却时间根据电芯特性调整小容量电芯30秒够用大容量储能电芯可能需要几分钟。3.3 与上层系统的通信接口设计STM32F101ZG通常需要把均衡状态和电池数据上报给上层BMS或者EMS。通信接口可以是CAN、UART或者RS485。在储能系统里CAN用得最多因为抗干扰能力强、支持多节点。STM32F101ZG自带CAN控制器外部加一个CAN收发器就能用。上报的数据至少包括两节电芯的电压、均衡状态、均衡累计时间、故障标志。如果上层需要做数据分析还可以加上均衡次数和每次均衡的持续时间。这些数据看起来不起眼但后期做电池健康度评估的时候非常有用。我见过一个项目因为没记录均衡次数后来电池组出现容量衰减根本分不清是电芯老化还是均衡电路一直在偷偷耗电。4. 硬件设计里那些文档不会告诉你的细节4.1 电感选型不是随便找个电感就能用MP2642GR-Z的均衡电流由外部电感决定但电感的选型不只是看电感量。饱和电流、直流电阻、自谐振频率这三个参数一个都不能马虎。饱和电流必须大于最大均衡电流的1.5倍。比如设计均衡电流500mA电感饱和电流至少750mA留足余量。直流电阻直接影响效率DCR每增加100mΩ在500mA下就多出25mW的损耗看起来不大但均衡可能持续几十分钟累积发热不可忽视。自谐振频率要远高于芯片的开关频率否则电感会变成电容均衡效率急剧下降。我一般选屏蔽式功率电感电感量在10μH到47μH之间具体值根据开关频率和期望的纹波电流计算。公式是纹波电流 (输入电压 × 占空比) / (开关频率 × 电感量)。纹波电流控制在均衡电流的20%到30%比较合适。4.2 PCB布局均衡电路的噪声比你想的大均衡电路是开关电路di/dt和dv/dt都不小。PCB布局没做好噪声会串到电压检测通道导致均衡误触发或者电压读数跳动。关键原则有三条第一功率回路面积最小化电感和芯片之间的走线尽量短而粗第二电压检测走线远离功率走线最好用地平面隔开第三芯片的接地引脚单独走线到电池负极不要和功率地混在一起。我见过一个板子电压检测走线和电感走线平行走了3厘米结果均衡一启动ADC读数就跳几十毫伏折腾了好久才找到原因。提示如果空间允许在电压检测输入和地之间加一个1μF的陶瓷电容对抑制高频噪声效果很明显。这个电容要尽量靠近芯片引脚放置。4.3 热设计均衡IC的散热容易被低估MP2642GR-Z在均衡电流500mA时内部开关的导通损耗加上开关损耗总功耗可能在0.5W左右。芯片的封装热阻如果是50°C/W温升就是25°C。如果环境温度50°C结温就到75°C了虽然没超规格但长期运行可靠性会下降。改善散热的方法芯片底部如果有散热焊盘一定要焊到PCB的铜皮上铜皮面积尽量大最好打过孔到背面。如果空间允许加一个小型铝基板或者导热垫到外壳。实测下来散热焊盘焊好、铜皮面积做到1平方厘米以上温升能降10°C左右。5. 软件实现从寄存器配置到均衡状态机的完整链路5.1 MP2642GR-Z的初始化序列上电之后STM32F101ZG需要按顺序完成MP2642GR-Z的初始化。顺序错了芯片可能不工作或者进入异常状态。我总结的初始化序列是这样的等待电源稳定至少延时10ms。配置STM32F101ZG的I2C外设时钟400kHz7位地址模式。向MP2642GR-Z的配置寄存器写入均衡电流档位和使能位先保持均衡关闭。读取芯片ID寄存器确认通信正常。配置电压检测相关的寄存器设置采样速率和滤波参数。清除所有故障标志。使能均衡功能但保持均衡开关关闭等待主控指令。这个序列里第3步和第7步的顺序很关键。先配置参数再使能功能可以避免芯片用默认参数误动作。第4步读ID是必须的如果ID读不到后面所有操作都是白费。5.2 电压采样与滤波的代码实现STM32F101ZG的ADC配置成连续扫描模式两个通道分别对应两节电芯的电压。DMA搬运数据到内存避免CPU频繁中断。采样率设1kHz每100个样本做一次滑动平均得到10Hz的有效数据率。滑动平均的窗口大小需要权衡窗口太大响应慢压差变化后要等很久才能触发均衡窗口太小滤波效果差噪声会导致误触发。100个样本在1kHz采样率下是100ms窗口实测下来既能滤掉大部分开关噪声又能保证200ms内响应压差变化。代码层面用一个环形缓冲区存ADC值每次新数据进来就替换最老的数据同时更新累加和。这样计算平均值只需要一次减法和一次加法效率很高。具体实现#define WINDOW_SIZE 100 static uint16_t adc_buffer[2][WINDOW_SIZE]; static uint32_t adc_sum[2] {0, 0}; static uint8_t adc_index 0; void adc_update(uint16_t cell1, uint16_t cell2) { adc_sum[0] - adc_buffer[0][adc_index]; adc_sum[1] - adc_buffer[1][adc_index]; adc_buffer[0][adc_index] cell1; adc_buffer[1][adc_index] cell2; adc_sum[0] cell1; adc_sum[1] cell2; adc_index (adc_index 1) % WINDOW_SIZE; } uint16_t adc_get_average(uint8_t cell) { return (uint16_t)(adc_sum[cell] / WINDOW_SIZE); }这段代码在STM32F101ZG上跑CPU占用率不到1%非常轻量。5.3 均衡状态机的代码框架状态机用switch-case实现每个状态处理自己的逻辑迁移条件用if判断。核心结构如下typedef enum { BAL_IDLE, BAL_CHECK, BAL_ACTIVE, BAL_COOLDOWN, BAL_FAULT } bal_state_t; static bal_state_t bal_state BAL_IDLE; static uint32_t state_timer 0; static uint8_t check_count 0; void bal_state_machine(void) { uint16_t v1 adc_get_average(0); uint16_t v2 adc_get_average(1); uint16_t diff (v1 v2) ? (v1 - v2) : (v2 - v1); switch (bal_state) { case BAL_IDLE: if (diff START_THRESHOLD) { check_count; if (check_count 3) { bal_state BAL_CHECK; check_count 0; } } else { check_count 0; } break; case BAL_CHECK: if (diff START_THRESHOLD) { mp2642_enable_balance(v1 v2 ? 1 : 2); bal_state BAL_ACTIVE; state_timer 0; } else { bal_state BAL_IDLE; } break; case BAL_ACTIVE: if (diff STOP_THRESHOLD) { mp2642_disable_balance(); bal_state BAL_COOLDOWN; state_timer 0; } else if (state_timer MAX_BALANCE_TIME) { mp2642_disable_balance(); bal_state BAL_FAULT; } break; case BAL_COOLDOWN: if (state_timer COOLDOWN_TIME) { bal_state BAL_IDLE; } break; case BAL_FAULT: mp2642_disable_balance(); if (fault_cleared()) { bal_state BAL_IDLE; } break; } state_timer; }这个框架里MAX_BALANCE_TIME是保护机制防止均衡因为某种原因一直不停。我一般设30分钟超过就报故障。COOLDOWN_TIME设30秒到60秒根据电芯容量调整。6. 实测中遇到的三个典型问题与排查过程6.1 均衡启动后电压读数反而变大第一次调试的时候均衡一启动两节电芯的压差读数不但没减小反而变大了。关掉均衡读数又恢复正常。这个问题折腾了我一个下午。排查过程先用示波器看电压检测引脚的波形发现均衡启动后引脚上叠加了一个开关频率的纹波幅度大概30mV。ADC采样的时候正好采到纹波的峰值或者谷值导致读数偏差。根本原因是电压检测的RC滤波截止频率设得太高1.6kHz的截止频率对几百kHz的开关噪声衰减不够。解决方案把RC滤波的电容从100nF加大到1μF截止频率降到160Hz。同时把ADC的采样时机和均衡开关的相位错开在开关管关断期间采样。改完之后压差读数正常了均衡也能正确触发。6.2 两节电芯电压同时下降另一个奇怪的现象均衡运行一段时间后两节电芯的电压都下降了而不是一节降一节升。这说明均衡电流没有在两节之间转移而是从两节电芯一起往外漏。查了原理图才发现MP2642GR-Z的某个配置引脚接错了芯片工作在放电均衡模式而不是电荷转移模式。放电均衡就是把高电压电芯的能量通过电阻放掉两节电芯都会因为电阻放电而电压下降只是高的那节降得多一点。改掉配置引脚之后电荷转移模式正常工作一节降一节升总电压基本不变。这个坑的教训是均衡IC的配置引脚一定要对照数据手册逐条确认不能凭感觉接。MP2642GR-Z的配置引脚功能比较多接错一个就可能改变整个工作模式。6.3 通信偶尔丢包导致均衡中断STM32F101ZG和MP2642GR-Z之间的I2C通信在均衡启动后偶尔会丢包。丢包后主控读不到芯片状态状态机进入故障均衡中断。用逻辑分析仪抓I2C波形发现丢包发生在均衡开关动作的瞬间。原因是均衡开关动作时电源线上有较大的电流跳变通过共模路径耦合到了I2C线上。I2C的上升沿变缓某些位被误判。解决方案有两个一是把I2C的上拉电阻从4.7kΩ减小到2.2kΩ加快上升沿二是在I2C线靠近芯片端加小电容100pF滤高频。两个措施一起上丢包率从每天几次降到基本为零。如果还不行就得考虑用数字隔离器把I2C完全隔离但那样成本和板面积都会增加。7. 从两节均衡扩展到多节串联的架构思路两节串联的均衡做通了扩展到多节就是复制和分层的问题。最常见的做法是每两节配一颗MP2642GR-Z多颗芯片通过I2C总线挂在同一个STM32F101ZG下面。主控轮询每颗芯片的状态依次执行均衡。这里要注意I2C的地址分配。MP2642GR-Z的地址引脚通常支持2到4个地址如果串联节数超过4节就需要用I2C多路复用器或者切换到SPI接口。SPI没有地址概念用片选信号选通扩展性更好但占用引脚多。我的经验是8节以下用I2C加多路复用器8节以上直接上SPI。分层均衡的策略也需要调整。底层两节均衡负责把相邻电芯的压差控制在阈值内上层均衡负责把各组之间的平均电压拉平。上层均衡可以用同样的MP2642GR-Z但电流可以设小一点因为组间压差通常比组内压差小。整个系统的均衡优先级是先做底层底层稳定后再做上层避免同时动作导致系统振荡。注意多节串联时每颗MP2642GR-Z的供电和参考地都不同通信隔离必须逐级处理。如果直接用I2C总线连所有芯片共模电压差可能超过芯片的绝对最大额定值损坏芯片。我见过一个项目因为忽略了这一点一次上电烧了六颗均衡IC。8. 几个让系统更稳的工程习惯第一个习惯每次上电先做一次自检。自检内容包括读芯片ID、读两节电芯电压、检查故障寄存器、测试均衡开关能否正常打开和关闭。自检不通过就不启动均衡直接上报故障。这个习惯能避免很多现场问题因为均衡电路出故障的时候如果不自检主控可能一直以为均衡在工作实际上芯片早就挂了。第二个习惯记录均衡的累计时间和次数。STM32F101ZG的Flash里划一小块区域每次均衡结束后写入累计数据。这些数据对后期维护非常有用。比如均衡次数异常增多说明电芯一致性在变差可能需要提前更换电芯。第三个习惯均衡电流不要设到芯片的最大值。MP2642GR-Z标称能到1A但实际用到700mA以上发热和噪声都会明显增加。留20%到30%的余量系统稳定性会好很多。我一般把最大均衡电流控制在600mA以内配合良好的散热设计连续跑几个小时芯片也只是温热。第四个习惯电压检测的校准要在量产时逐板做。分压电阻的精度通常是1%但两节电芯的分压路径如果用了不同的电阻相对误差可能到2%。在3.7V的电芯上2%就是74mV比均衡阈值还大。量产校准的方法很简单用高精度电源给两节电芯输入相同的电压读ADC值计算每路的校准系数存到Flash里。这个步骤花不了多少时间但能显著提升均衡的准确性。这套MP2642GR-Z加STM32F101ZG的两节均衡方案硬件不复杂软件也不重但细节很多。把上面这些点都照顾到做出来的均衡系统基本可以稳定运行在储能和备用电源场景里。后面如果要扩展到更多节架构思路是通的只是隔离和地址分配需要重新规划。