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.3V,12位分辨率下每个LSB对应0.8mV左右。两串电池最高8.4V,直接接ADC肯定烧,必须分压。分压电阻的选型有讲究:阻值不能太小,否则持续耗电,备用电源系统对静态功耗很敏感;阻值也不能太大,否则ADC采样保持电容充电时间不够,采样值会偏低。
我的经验是上分压电阻取100k,下分压电阻取47k,分压比大概是1比0.32,8.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的就行,分压电阻也取10k,25度时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要求高,可以在采样线上加共模电感或者磁珠,但要注意磁珠的直流电阻会影响采样精度,选直流电阻小的型号。
这个方案我前后调了大概两个月,从最开始的采样跳动到后来的稳定运行,中间踩了不少坑。最深的体会是:均衡逻辑本身不复杂,难的是把采样精度做稳,把干扰压下去。硬件上多花点心思,软件上就能少写很多补丁。两串电池均衡搞透了,后面做多串就是水到渠成的事。