
1. 储能电池均衡的工程背景与核心需求1.1 为什么串联电池组必须做均衡做储能和备用电源的兄弟都清楚单节锂电池的标称电压就3.6V到3.7V磷酸铁锂大概3.2V真要撑起一个48V甚至更高的母线串联是唯一的选择。但问题也随之而来同一批次出厂的电池容量、内阻、自放电率都有微小差异用久了这些差异会被放大。串联回路里电流是共用的充电时容量小的那节先到截止电压放电时它又最先掉到保护阈值整组电池的有效容量就被这节“短板”卡死了。我见过太多案例一组看起来还挺新的电池包因为长期没有均衡循环几百次之后容量直接掉了三成。这不是电池坏了是木桶效应在作祟。均衡电路要干的事就是把这根短板补上让每节电池的荷电状态尽量拉齐。1.2 被动均衡与主动均衡的取舍均衡方案分两大流派。被动均衡说白了就是给每节电池并一个电阻电压高的那节通过电阻放电把多余的能量以热量形式耗掉。优点是电路简单、成本低、可靠性高缺点是效率低、发热、均衡电流做不大通常也就几十到一百多毫安。主动均衡则是把高电压电池的能量搬到低电压电池去用电感、电容或者变压器做能量转移效率能到百分之八九十均衡电流可以做到安培级但电路复杂、成本高、控制难度大。储能和备用电源系统里如果电池组容量不大、对成本敏感、均衡时间要求不苛刻被动均衡依然是主流选择。这次要聊的方案就是围绕一颗集成度很高的均衡控制芯片来做的。1.3 MP2642GR-Z 在方案中的角色定位MP2642GR-Z 是一颗专门为多节串联电池均衡设计的控制芯片内部集成了均衡开关管和驱动电路外部只需要配少量电阻电容就能工作。它支持多节电池串联的均衡控制可以通过外部信号或者内部逻辑来决定哪节电池需要放电。相比用分立MOS管搭均衡电路这颗芯片把驱动、保护、逻辑都集成进去了PCB面积能省一大半调试也简单很多。STM32F303RC 在这里扮演的是“大脑”角色。它负责采集每节电池的电压判断哪节偏高、哪节偏低然后通过IO口或者通信接口去控制MP2642GR-Z的均衡通道。STM32F303RC 本身带多路12位ADC采样速率和精度对于电池电压监测来说够用而且它还有运算放大器可以搭差分采样电路省掉外部运放。1.4 这个方案适合谁参考如果你正在做两串电池的储能模组、便携式备用电源、小型UPS或者电动工具的电池包这个方案可以直接抄作业。两串是最基础的串联结构搞懂了它扩展到三串、四串只是增加芯片和通道的问题。对于刚入行的硬件工程师这也是一个很好的练手项目涉及ADC采样、均衡逻辑、PCB布局、热设计等多个知识点。2. 硬件电路设计与关键参数计算2.1 整体架构与信号链路整个系统的信号链路是这样的两节电池串联中间节点引出分别接到STM32F303RC的ADC输入通道。STM32通过分压电阻网络把电池电压降到ADC量程以内然后轮流采样上下两节电池的电压。采样值经过滤波和比较判断出哪节电压偏高。如果上节偏高就拉高对应MP2642GR-Z的均衡使能引脚让上节的均衡通道导通通过外部均衡电阻放电。下节偏高同理。MP2642GR-Z的供电直接从电池组取它的耐压范围要覆盖两串电池的最高电压。两串磷酸铁锂满电大概7.2V到7.3V两串三元锂满电8.4V所以芯片耐压至少要在12V以上才安全。具体参数要去翻手册确认我这里说的是选型思路。2.2 电池电压采样电路的设计细节采样电路是精度的大头。STM32F303RC的ADC参考电压如果是3.3V12位分辨率下每个LSB对应0.8mV左右。两串电池最高8.4V直接接ADC肯定烧必须分压。分压电阻的选型有讲究阻值不能太小否则持续耗电备用电源系统对静态功耗很敏感阻值也不能太大否则ADC采样保持电容充电时间不够采样值会偏低。我的经验是上分压电阻取100k下分压电阻取47k分压比大概是1比0.328.4V分压后是2.69V在3.3V量程内留了余量。这个组合的等效源阻抗大概是32k左右STM32F303RC的ADC在最长采样时间下可以接受这个阻抗。如果你用更短的采样时间就要把电阻整体减小比如上51k下24k但静态功耗会翻倍。注意分压电阻一定要用精度百分之一以上的金属膜电阻温漂要小。普通碳膜电阻温漂大夏天和冬天采样值能差几十毫伏均衡逻辑就会误判。2.3 均衡电阻的功率计算与选型均衡电阻的阻值决定了均衡电流。假设我们想让均衡电流在100mA左右单节电池电压按3.7V算均衡电阻就是3.7V除以0.1A等于37欧姆取标准值36欧姆或者39欧姆。功率是电压平方除以电阻3.7乘3.7除以36大概是0.38W所以至少要选1W的电阻留足余量。如果空间允许用2W的更好温升低长期可靠性高。这里有个坑均衡电阻的功耗是持续发热的如果PCB布局把两个均衡电阻挨着放局部温度会很高旁边的采样电阻温漂就会变大采样精度下降。我的做法是两个均衡电阻分开摆中间至少隔10mm下面铺铜散热有条件的话开窗加锡。2.4 MP2642GR-Z 的外围配置要点MP2642GR-Z的外围主要就是均衡电阻、去耦电容和使能信号的上拉或下拉。去耦电容要靠近芯片的电源引脚0.1uF和1uF各一颗0.1uF负责高频1uF负责低频。使能信号如果是从STM32的IO口过来中间可以串一个100欧姆的电阻防止振铃同时也能在芯片异常时限制电流。还有一点MP2642GR-Z的均衡通道导通时会有一定的导通电阻这个电阻和外部均衡电阻是串联的。如果芯片导通电阻是几欧姆外部电阻是36欧姆那实际均衡电流会比计算值小百分之十几。所以选外部电阻时要稍微减小一点比如用33欧姆补偿芯片的导通压降。具体导通电阻值查手册不同批次可能有差异。2.5 STM32F303RC 的ADC配置与基准选择STM32F303RC的ADC可以用内部基准也可以用外部基准。内部基准精度一般温漂大概几十ppm每摄氏度对于均衡判断来说勉强够用。但如果想做得准建议用外部基准芯片比如2.5V或者3.0V的基准源精度能做到百分之零点一。基准稳了采样值才稳均衡逻辑才不会来回跳。ADC的采样时间设置也很关键。STM32F303RC的ADC时钟最高可以到72MHz但采样时间要配合源阻抗来设。前面说的32k等效源阻抗采样时间至少要设到181.5个ADC时钟周期以上才能保证采样电容充满。我一般直接设到最长的601.5个周期牺牲一点速度换精度反正电池电压变化很慢不需要高速采样。3. 均衡控制逻辑与软件实现3.1 电压采集与滤波算法软件的第一步是把ADC原始值转换成电压值。公式很简单电压等于ADC值乘以基准电压再除以4095。但原始值会有噪声直接用来判断会导致均衡通道频繁开关。我一般用滑动平均滤波连续采16次去掉最大最小各两个剩下的取平均。这样能滤掉大部分随机噪声又不会引入太大延迟。更讲究一点可以用一阶低通滤波公式是本次滤波值等于上次滤波值乘以系数a加上本次采样值乘以1减a。a取0.9左右截止频率大概几赫兹对于电池电压这种慢变量足够了。两种方法我都用过滑动平均更直观低通滤波更省RAM看你喜好。3.2 均衡启动与停止阈值的设定阈值设定是均衡逻辑的核心。设得太小电池正常波动就会触发均衡白白浪费电设得太大均衡效果不明显。我的经验是启动阈值设在30mV到50mV之间停止阈值设在10mV到20mV之间中间留一个迟滞带防止在阈值附近来回振荡。举个例子上节电压3.75V下节3.70V差值50mV超过启动阈值开始均衡上节。上节放电后电压慢慢下降降到3.72V时差值变成20mV低于停止阈值关闭均衡。这样一次均衡循环就完成了。迟滞带的存在让系统稳定很多不会出现“均衡开、均衡关、均衡开”的抽搐现象。3.3 均衡通道的时序控制与死区两节电池同时均衡的情况要避免。如果上下节都偏高理论上可以同时放电但这样总电流大发热集中而且如果电池组正在充电同时放电会干扰充电器判断。我的做法是分时均衡同一时间只开一个通道轮流来。每个通道开100ms然后切换这样均衡电流是脉冲式的平均电流减半但发热分散对采样干扰也小。切换通道时要留死区时间大概1ms到5ms确保上一个通道完全关断后再开下一个。MP2642GR-Z的关断时间查手册一般几百纳秒到几微秒留1ms绰绰有余。死区期间可以顺便做一次ADC采样避开均衡电流造成的电压跌落。3.4 状态机设计与代码框架整个均衡控制用一个状态机来实现最清晰。状态包括空闲、采样、判断、均衡上节、均衡下节、故障保护。上电后先初始化然后进入空闲定时器每100ms触发一次采样。采样完成后进入判断比较两节电压。如果差值超过启动阈值根据哪节偏高进入对应均衡状态。均衡状态里维持一个计数器达到设定时间后回到采样重新判断。故障保护状态处理过压、欠压、过温这些异常。比如某节电压超过4.2V三元锂或者3.65V磷酸铁锂立即关闭所有均衡通道置故障标志。STM32F303RC的IO口在复位后默认是浮空输入所以MP2642GR-Z的使能引脚要加下拉电阻确保上电时均衡是关闭的。// 伪代码示意不是完整可编译代码 typedef enum { STATE_IDLE, STATE_SAMPLE, STATE_JUDGE, STATE_BALANCE_HIGH, STATE_BALANCE_LOW, STATE_FAULT } BalanceState; void balance_task(void) { static BalanceState state STATE_IDLE; static uint32_t timer 0; switch(state) { case STATE_IDLE: if (timer_elapsed(100)) { state STATE_SAMPLE; } break; case STATE_SAMPLE: sample_voltages(); state STATE_JUDGE; break; case STATE_JUDGE: if (fault_detected()) { state STATE_FAULT; } else if (v_high - v_low START_THRESHOLD) { state (v_high v_cell1) ? STATE_BALANCE_HIGH : STATE_BALANCE_LOW; } else { state STATE_IDLE; } break; // 其他状态省略 } }3.5 与上位机的通信与参数配置实际项目里均衡阈值、均衡时间这些参数最好能通过通信接口配置不用重新烧程序。STM32F303RC带CAN和UART接一个隔离的UART转USB或者CAN收发器就能和上位机或者BMS主机通信。参数存在Flash里上电读取。这样现场调试的时候用串口助手发几条指令就能改阈值效率高很多。通信协议不用搞太复杂自定义一个简单的帧格式就行帧头、命令字、数据长度、数据、校验和。校验和用累加和或者CRC8都行。注意通信接口要做好隔离储能系统里电磁环境复杂不隔离容易受干扰导致通信中断甚至损坏芯片。4. 实测调试与常见问题排查4.1 采样值跳动大的排查思路采样值跳动是最常见的问题。先看硬件分压电阻是不是精度不够基准电压是不是稳ADC输入脚有没有加滤波电容。我习惯在ADC输入脚对地并一个100nF电容和分压电阻组成RC滤波截止频率大概几十赫兹能滤掉高频干扰。但电容不能太大否则采样建立时间不够反而导致采样值偏低。再看软件采样时间是不是设得太短滤波算法是不是太激进。如果滑动平均的窗口太小噪声滤不干净窗口太大响应又太慢。我一般先用示波器看ADC输入脚的波形确认硬件没问题再调软件滤波参数。4.2 均衡电流不达预期的原因均衡电流比计算值小通常有几个原因。一是MP2642GR-Z的导通电阻比预期大这个查手册确认。二是均衡电阻的阻值选大了或者精度不够。三是PCB走线太细太长引入了额外电阻。四是电池电压本身偏低均衡电流自然小。排查方法很简单在均衡电阻两端并一个电流表或者用示波器测均衡电阻两端的电压除以电阻值就是实际电流。如果和计算值差太多逐项检查。我遇到过PCB走线宽度只有10mil的情况均衡电流100mA走线压降就有几十毫伏换成30mil之后问题解决。4.3 均衡时电压采样受干扰的处理均衡通道一开采样值就跳这是均衡电流在PCB走线和电池内阻上产生压降导致的。解决办法有几个一是采样和均衡分时进行均衡关闭后再采样这个最有效。二是采样点尽量靠近电池端子避开均衡电流路径。三是用差分采样把均衡电流产生的共模压降抵消掉。STM32F303RC内部有运放可以搭差分放大器把电池正负极的电压差放大后送ADC。这样即使地线上有均衡电流造成的压降差分放大也能抑制掉。不过差分电路要配对电阻精度要求高调试麻烦一点。如果对精度要求不是特别高分时采样就够了。4.4 常见问题速查表现象可能原因排查方法解决措施采样值跳动大分压电阻精度低、基准不稳、无滤波示波器看ADC输入脚换高精度电阻、加基准芯片、加RC滤波均衡电流偏小芯片导通电阻大、电阻选大、走线细测均衡电阻两端电压减小电阻、加宽走线、换低导通电阻芯片均衡时采样跳变均衡电流干扰采样分时采样测试均衡关闭后再采样、差分采样均衡通道不动作使能信号没到、芯片损坏测使能引脚电平检查IO配置、换芯片静态功耗大分压电阻太小、芯片漏电测电池组静态电流增大分压电阻、换低功耗芯片通信中断干扰、地环路示波器看通信波形加隔离、加共模电感、改协议重传4.5 几个容易踩的坑第一个坑忘记给MP2642GR-Z的使能引脚加下拉。STM32复位期间IO是浮空的如果此时电池已经接上均衡通道可能误导通把电池放亏。加一个10k下拉电阻到地成本几分钱能避免大问题。第二个坑均衡电阻的封装选太小。0603的电阻额定功率只有0.1W我们算出来要0.38W用0603直接烧。至少要用1206或者2512的封装或者用两个电阻并联分流。我一般用2512功率余量大温升低。第三个坑ADC基准用VDDA。VDDA是3.3V但实际可能在3.2V到3.4V之间波动而且随温度变化。用VDDA做基准采样精度直接受影响。要么用外部基准要么用STM32内部的VREFINT校准后者精度一般但比直接用VDDA强。第四个坑均衡逻辑没有迟滞。启动阈值和停止阈值设成一样结果就是均衡通道在阈值附近疯狂开关继电器或者MOS管寿命骤减。迟滞带至少留20mV最好30mV。5. 方案扩展与进阶优化方向5.1 从两串扩展到多串的思路两串搞定了扩展到三串、四串就是复制粘贴的事。每增加一节电池就多一路分压采样、多一颗MP2642GR-Z或者用支持更多通道的型号、多一个均衡电阻。STM32F303RC的ADC通道够多IO口也够用扩展到四串问题不大。但要注意串联节数多了之后最高节电池的电压可能超过分压电阻的耐压要重新计算分压比。另外多串系统的均衡策略可以更智能。比如不是简单地最高节放电而是计算平均值所有高于平均值的节都参与均衡这样均衡速度更快。但同时均衡的通道多了总发热也大要权衡。5.2 温度监测与热保护储能系统里温度监测不能省。可以在每颗均衡电阻旁边贴一颗NTC热敏电阻STM32F303RC的ADC轮流采样NTC分压值换算成温度。如果某个均衡电阻温度超过85度就暂停该通道的均衡等温度降下来再继续。这样能防止局部过热导致PCB变色甚至起火。NTC选10k B值3950的就行分压电阻也取10k25度时ADC值大概是基准的一半。温度换算用查表法或者B值公式都行查表法快B值公式省Flash。我一般用查表加线性插值精度够用代码也简单。5.3 被动均衡向主动均衡的过渡如果发现被动均衡效率太低均衡时间太长可以考虑向主动均衡过渡。最简单的主动均衡是电容飞渡用一个电容在相邻电池之间切换把高电压电池的能量搬到低电压电池。控制逻辑和被动均衡类似只是多了电容切换的时序。STM32F303RC的IO口驱动光耦或者MOS管驱动芯片控制电容的切换。再高级一点用电感或者变压器做均衡效率更高但设计难度也大很多。我的建议是先把被动均衡做稳定跑个几百次循环确认逻辑没问题再考虑升级。被动均衡虽然效率低但可靠性高很多工业级BMS至今还在用。5.4 低功耗设计要点备用电源系统对静态功耗很敏感。如果系统长期待机均衡电路的静态电流要尽量小。分压电阻是静态功耗的大头100k加47k的分压网络8.4V下静态电流大概是57微安两路就是114微安。如果觉得大可以把分压电阻整体放大10倍但ADC采样时间要相应加长或者加一个模拟开关采样时才接通分压网络平时断开。MP2642GR-Z在待机时的漏电流也要查手册确认一般在微安级。STM32F303RC可以进Stop模式定时器唤醒采样采样完继续睡。这样平均功耗可以做到几百微安对于大多数备用电源应用足够了。5.5 电磁兼容性设计的经验储能系统里电磁干扰来源多逆变器、充电器、继电器都是干扰源。均衡电路虽然电流不大但采样线长容易拾取干扰。我的经验是采样线尽量短走线远离功率线如果必须交叉走垂直交叉。分压电阻靠近STM32放置不要放在电池端。ADC输入脚加RC滤波截止频率设低一点比如10Hz。PCB布局上模拟地和数字地分开单点连接。MP2642GR-Z的电源引脚去耦电容紧贴引脚地线尽量宽。如果系统对EMC要求高可以在采样线上加共模电感或者磁珠但要注意磁珠的直流电阻会影响采样精度选直流电阻小的型号。这个方案我前后调了大概两个月从最开始的采样跳动到后来的稳定运行中间踩了不少坑。最深的体会是均衡逻辑本身不复杂难的是把采样精度做稳把干扰压下去。硬件上多花点心思软件上就能少写很多补丁。两串电池均衡搞透了后面做多串就是水到渠成的事。