首页 / 资讯中心 / 文章详情

基于STM32L4与MP2642的两串电池被动均衡方案

基于STM32L4与MP2642的两串电池被动均衡方案 ★ FEATURED ARTICLE
1. 从两串电池的电压差说起为什么被动均衡在储能场景里依然能打储能系统和备用电源系统里两节串联电池的电压不均衡是个绕不开的问题。我接触过不少做BMS电池管理系统的团队大家一开始都觉得均衡这事应该交给专用AFE芯片一颗芯片搞定采样加均衡省心。但实际做下来会发现专用AFE虽然集成度高可一旦你的通道数不多——比如就两串电池——用AFE反而显得笨重成本也不划算。这时候用一颗带DAC和比较器的MCU配合一颗高压侧电流检测放大器自己搭一套被动均衡电路反而是更灵活、更可控的方案。我这次要聊的组合是STM32L4A6RG加MP2642GR-Z。STM32L4A6RG是ST那边L4系列里资源比较足的一款Cortex-M4内核带FPU1MB Flash、320KB RAM关键是它有两路12位DAC、三路比较器、还有丰富的定时器和ADC通道做两串电池的电压采集和均衡控制绰绰有余。MP2642GR-Z则是MPS的一颗高压侧电流检测放大器共模电压范围能覆盖到几十伏用来监测均衡回路里的电流非常合适——这一点很关键因为被动均衡本质上是把高电压那节电池的能量通过电阻消耗掉你得知道电流到底流了多少才能判断均衡有没有真正在执行而不是靠“我打开了MOS管所以应该在工作”这种想当然。这套方案适合谁看如果你正在做小规模储能、备用电源、便携式电源站这类两串锂电或磷酸铁锂的BMS通道数不多又希望均衡逻辑完全自己掌控那这套组合值得参考。它不适合动辄十几串的大储能柜那种场景还是老老实实上专用AFE。但两串这个量级用MCU自己搭你能把均衡策略、保护逻辑、状态上报全部揉进一颗芯片里BOM也干净。下面我会从硬件拓扑、采样与均衡的时序设计、MP2642GR-Z的电流监测细节、以及实际调试中踩过的坑几个角度把这套方案拆开讲清楚。所有参数和步骤都是基于常见工程实践给出的合理方案你照着搭能跑通但具体数值还得根据你自己的电池特性微调。2. 两串电池被动均衡的硬件拓扑与器件选型逻辑2.1 为什么是“上管均衡”而不是“下管均衡”两串电池串联标号从下往上叫Cell1和Cell2Cell1的负极是系统地Cell2的正极是电池组正极。被动均衡的做法是给每一节电池并联一个“电阻开关”的支路当某节电压偏高时闭合开关让电流流过电阻把这节多余的能量以热的形式放掉。这里有个容易忽略的点开关管放在电池的正端还是负端。对于Cell1它的负端就是系统地开关管放负端栅极驱动参考地很简单。但对于Cell2它的负端是Cell1的正端也就是一个浮动的中间电位。如果你把Cell2的均衡开关放在它的负端也就是中间节点那这个开关的参考电位会随着Cell1的状态变化驱动起来很别扭。所以工程上更常见的做法是Cell2的均衡开关放在它的正端也就是电池组正极那一侧用PMOS或者高边驱动NMOS。这样开关的参考点固定在电池组正极驱动逻辑清晰。我这次方案里两节电池的均衡开关都采用高边NMOS加电荷泵驱动的方式或者直接用PMOS。用PMOS的话栅极拉低就导通电路简单但PMOS的导通电阻通常比同规格NMOS大功耗会高一点。两串电池均衡电流一般设计在100mA到300mA之间这个量级下PMOS的Rds(on)带来的压降和发热可以接受所以用PMOS是性价比很高的选择。2.2 均衡电阻的取值不是随便选个10欧就行均衡电阻R_bal的取值直接决定了均衡电流和发热。假设单节电池电压最高到4.2V三元锂或3.65V磷酸铁锂你希望均衡电流I_bal在150mA左右。以4.2V算R_bal ≈ 4.2V / 0.15A 28Ω取标准值27Ω或30Ω。这时候电阻上的功耗P I²R 0.15² × 27 ≈ 0.6W。所以你不能用普通的0805电阻至少得用1206封装或者两颗0805并联功率余量留够。这里有个经验均衡电阻的功耗计算要按最高电池电压来算而不是标称电压。很多人按3.7V算觉得0.5W够了结果电池充满到4.2V时电阻烫得不行长期跑下来阻值漂移均衡电流越来越小最后均衡失效。我一般会让电阻的实际功耗不超过额定功率的50%比如0.6W的功耗就选1W以上的电阻或者用两颗0.5W的并联分摊。另外均衡电阻不要紧贴着电池或温度敏感器件放。我见过一个设计均衡电阻离NTC热敏电阻只有5mm一均衡温度采样就飘MCU以为电池过热把充电停了其实只是电阻烤的。布局时均衡电阻要单独放一块区域最好背面铺铜散热远离采样电路。2.3 MP2642GR-Z在均衡回路里的位置MP2642GR-Z是一颗高压侧电流检测放大器它的作用是放大采样电阻两端的微小压差输出一个跟电流成正比的电压给MCU的ADC。在均衡回路里我把一个采样电阻R_sense串在均衡支路的地端或者高端然后用MP2642GR-Z去测它两端的压差。为什么不用MCU自带的ADC直接测采样电阻因为均衡电流150mA流过比如0.1Ω的采样电阻压差只有15mV。STM32L4的ADC虽然12位但参考电压3.3V下1LSB约0.8mV15mV也就不到20个码值噪声一进来根本没法看。MP2642GR-Z的增益通常是50V/V或100V/V15mV乘以50就是750mVADC能采到接近1000个码值分辨率足够了。MP2642GR-Z的共模电压范围要覆盖你的采样点电位。如果采样电阻放在均衡支路的地端共模电压接近0那用普通运放也行。但如果你想同时监测两节电池的均衡电流且采样电阻放在各自支路的高端共模电压就会到4V甚至8V以上这时候MP2642GR-Z的高共模能力就体现出价值了。我建议采样电阻放在高端这样还能顺带检测均衡开关是否短路失效——如果开关没打开但采样电阻上有电流说明开关击穿了这是个很重要的故障诊断信息。3. STM32L4A6RG的片上资源分配与均衡控制时序3.1 DAC比较器做硬件过压保护ADC做常规采样STM32L4A6RG有两路12位DAC我可以拿其中一路DAC输出一个参考阈值比如2.5V对应电池电压4.2V经过分压后的值。然后配置片内比较器把电池分压后的电压跟DAC输出比较一旦超过阈值比较器输出翻转可以触发中断甚至直接硬件关断均衡开关。这条路径完全不经过CPU响应速度是微秒级比ADC采样再软件判断快得多。常规的电压采样则用ADC的多个通道分别采Cell1、Cell2的分压以及MP2642GR-Z输出的均衡电流信号。STM32L4的ADC支持扫描模式加DMA我可以让ADC自动轮流采这几个通道DMA把结果搬到内存数组CPU定期去读就行不占CPU时间。这里有个细节电池分压电阻的取值。假设电池最高4.2VADC参考3.3V分压比至少要是4.2/3.3≈1.27但为了留余量我一般分压到2.5V左右分压比约1.68。用两个电阻上电阻100k下电阻150k分压比就是150/(100150)0.64.2V×0.62.52V正好。但要注意分压电阻会持续消耗电池电流100k150k250k4.2V下电流约16.8μA对备用电源来说这个漏电流可以接受但如果你的系统要求极低静态功耗就得加大电阻到兆欧级同时加一个MOS管在采样时再接通分压支路平时断开。3.2 均衡开关的驱动时序先确认再动作被动均衡的控制逻辑看起来简单——电压高的那节打开均衡开关——但实际写代码时时序上有很多讲究。我的做法是分几个阶段第一阶段是采样确认。ADC连续采多次电压去掉最大最小值取平均避免单次噪声导致误判。确认某节电压确实高于另一节超过阈值比如50mV且高于均衡启动门限比如3.4V才进入下一阶段。第二阶段是开关动作前的电流归零检查。在打开均衡开关之前先读一次MP2642GR-Z的输出确认均衡电流为零。如果这时候就有电流说明开关已经短路了不能继续得报故障。第三阶段是打开开关并等待建立。打开均衡开关后电流不会瞬间达到稳态因为回路里有电感和电容。我一般延时1ms再读电流确认电流在预期范围内比如100mA到200mA之间。如果电流明显偏小可能是开关没完全导通或者电阻变大了如果偏大可能是电池电压比预期高。第四阶段是均衡过程中的周期性监控。均衡不是打开开关就不管了每100ms要重新采一次电压和电流如果被均衡的那节电压降到了目标值以下或者温度超限就关闭开关。这套时序用STM32L4的定时器中断来驱动最合适。我一般用TIM2做一个1ms的时基在中断里做状态机切换主循环只负责响应状态变化和上报数据。3.3 用DAC做均衡电流的模拟监控输出STM32L4A6RG的DAC除了做比较器阈值还能反过来用——把均衡电流的数字化值通过DAC输出一个模拟电压送给外部的一个小表头或者记录仪。这在调试阶段特别有用你可以用示波器直接看DAC输出的波形就知道均衡电流什么时候建立、什么时候关断比串口打印日志直观得多。具体做法是ADC采到MP2642GR-Z的输出后经过换算得到实际电流值然后把这个值写进DAC的数据寄存器DAC输出对应的电压。比如0A对应0V300mA对应3.0V这样示波器上1V就是100mA一目了然。这个功能在产品化时可以关掉但调试阶段能省很多事。4. MP2642GR-Z电流检测的精度保障与噪声处理4.1 采样电阻的选型和布局采样电阻R_sense的取值要在精度和功耗之间权衡。R_sense越大同样的电流下压差越大信噪比越好但功耗也越大。均衡电流150mA如果R_sense取0.1Ω压差15mV功耗0.15²×0.12.25mW可以忽略。如果取0.5Ω压差75mV信噪比好很多但功耗11.25mW而且会在均衡回路里引入额外压降影响均衡电流的稳定性。我一般取0.1Ω到0.22Ω之间。0.1Ω的话MP2642GR-Z用100V/V增益输出1.5VADC采到接近满量程的一半比较合适。采样电阻要选低温漂的至少50ppm/°C否则温度一变同样的电流下压差变了你读到的电流就不准。封装上至少0805功率余量留够。布局上采样电阻的两端要走差分线到MP2642GR-Z的输入端这两根线要尽量靠近、等长远离均衡电阻和开关节点这些高dv/dt的地方。MP2642GR-Z的REF引脚要接一个干净的参考电压我一般用STM32L4的另一个DAC输出或者一颗低噪声LDO不要直接接MCU的3.3V数字电源否则数字噪声会串进来。4.2 增益误差和失调的校准MP2642GR-Z这类电流检测放大器datasheet上给的增益误差通常是±1%左右失调电压在几百微伏量级。对于均衡电流监测来说±1%的增益误差可以接受但失调电压会导致零电流时输出不为零影响“开关是否短路”的判断。我的做法是在系统上电初始化时做一次零电流校准确保所有均衡开关都关闭读MP2642GR-Z的输出把这个值记为零点偏移。之后每次读电流都减去这个偏移。这样能把失调的影响降到很低。如果系统工作环境温度变化大可以在每次均衡启动前都做一次零点校准反正关开关到读数的稳定时间也就几百微秒。增益误差的校准需要外部给一个已知电流这在产线上做比较方便现场使用一般不做。如果你对电流精度要求高可以在产线用高精度源表给一个标准电流记录ADC读数算出一个增益校正系数存在Flash里运行时用这个系数换算。4.3 滤波硬件RC加软件滑动平均MP2642GR-Z的输出在均衡开关动作瞬间会有振铃因为回路里的寄生电感电容在开关瞬间会产生高频振荡。硬件上我在MP2642GR-Z输出到ADC之间加一个RC低通R取1kC取100nF截止频率约1.6kHz能把大部分开关噪声滤掉。软件上再做一层滑动平均每次ADC采16个点去掉最大最小各2个剩下12个取平均。这样出来的电流值很稳波动在几mA以内。但要注意滑动平均会引入延迟如果你用这个电流值做快速保护判断延迟不能太大。我的做法是快速保护用比较器硬件路径不走ADCADC的电流值只用于状态监控和上报延迟几十毫秒无所谓。5. 均衡策略的代码实现与状态机设计5.1 电压采集的换算与电池模型STM32L4的ADC是12位参考3.3V但实际参考电压会有偏差我一般用内部参考电压VREFINT来校准。STM32L4有一个出厂校准值存在系统存储区读出来可以算出实际的VDDA然后用VDDA去换算ADC读数这样电压精度能到±10mV以内。电池电压经过分压后进ADC换算回实际电压要除以分压比。但分压电阻本身有误差1%的电阻会导致1%左右的电压误差4.2V下就是42mV这个误差比ADC本身的误差还大。所以我在产线会做一次电压校准用高精度源给一个已知电压读ADC算出实际分压比存在Flash里。没有产线校准条件的话至少用0.1%精度的分压电阻能把误差压到10mV以内。电池模型方面我不用复杂的等效电路模型就用一个简单的查表加线性插值。根据电池类型三元锂还是磷酸铁锂存一条OCV-SOC曲线均衡时根据电压查SOC判断哪节电池SOC更高。但注意均衡时电池有电流端电压不等于OCV所以均衡判断要基于端电压加一个小的回差避免在阈值附近反复开关。5.2 状态机的状态划分与转移条件我用一个五状态的状态机来管理均衡IDLE空闲态所有均衡开关关闭定期采样电压。如果发现某节电压高于另一节超过50mV且高于均衡门限转到CHECK。CHECK检查态做零电流校准确认没有短路故障。如果电流为零且温度正常转到BALANCE否则转到FAULT。BALANCE均衡态打开高电压那节的均衡开关周期性采样电压和电流。如果电压差缩小到20mV以内或者被均衡节电压降到门限以下转到IDLE如果温度超限或电流异常转到FAULT。FAULT故障态关闭所有均衡开关上报故障码等待上位机清除或自动恢复条件满足。COOLDOWN冷却态均衡关闭后等一段时间让电阻和电池温度回落再回到IDLE。状态转移的条件都要加去抖比如电压差超过50mV要连续3次采样都满足才转移避免噪声导致状态乱跳。5.3 温度保护与均衡电流的降额均衡电阻发热是必然的如果散热不好电阻温度能到100°C以上。我在均衡电阻附近放一颗NTC用STM32L4的ADC采它的分压换算成温度。当电阻温度超过85°C时降低均衡占空比比如从100%降到50%让平均电流减半发热也减半。如果超过100°C直接关闭均衡转到COOLDOWN。电池本身的温度也要监控一般锂电池充电时0到45°C放电时-20到60°C。均衡属于放电行为但电流很小温度范围可以放宽到-10到55°C。超出范围就暂停均衡等温度回来再继续。这里有个经验均衡占空比的调节不要用PWM调开关因为均衡开关频繁开关会增加开关损耗和EMI。更好的做法是“慢速通断”——比如1秒周期开500ms关500ms平均电流就是50%。这样开关次数少电阻温度波动也小。6. 实测中遇到的几个坑和排查过程6.1 均衡开关关不断PMOS栅极驱动电阻选大了最早我用PMOS做均衡开关栅极通过一个10k电阻拉到地来导通通过另一个10k电阻拉到源极来关断。理论上没问题但实测发现关断很慢因为栅极电容加上10k电阻时间常数到了几十微秒在关断过程中PMOS处于放大区发热严重。排查过程用示波器看栅极电压波形发现从0V升到源极电压用了超过50μs而且中间有个平台说明PMOS在米勒平台区停留太久。把栅极电阻从10k降到1k关断时间缩到5μs以内发热明显改善。但1k电阻会增加驱动电路的静态功耗所以我在关断路径上用1k导通路径上还是用10k因为导通时PMOS很快进入饱和区慢一点没关系。这个坑的教训是PMOS的栅极驱动电阻要根据开关速度要求来选不能随便用10k。如果你用NMOS加电荷泵也要注意电荷泵的驱动能力电荷泵输出电流不够的话栅极充放电慢同样会有开关损耗问题。6.2 电流检测在均衡启动瞬间误报过流MP2642GR-Z的输出在均衡开关打开的瞬间会有一个尖峰因为采样电阻上的电流从0跳变到150mAMP2642GR-Z的带宽有几十kHz能把这个跳变放大出来。这个尖峰被ADC采到后软件以为过流了直接报故障关断。解决办法有两个一是在软件里加一个消隐时间开关打开后50μs内不采电流等尖峰过去再采二是在MP2642GR-Z输出加一个RC滤波把尖峰滤掉。我两个都用了消隐时间设100μsRC滤波截止频率1.6kHz双保险。消隐时间不能太长否则真的过流时响应太慢100μs对于150mA的均衡电流来说即使真的短路电流上升时间也在微秒级100μs内不会造成损坏。6.3 两节电池电压采样串扰分压电阻共地问题Cell1和Cell2的分压电路如果共用同一个地Cell2的分压电阻下端接的是Cell1的正端不是系统地。我一开始没注意把Cell2分压电阻的下端接到了系统地结果采到的Cell2电压实际上是Cell2正极对系统的电压也就是Cell1Cell2的总电压完全错了。正确的接法是Cell2的分压电阻下端接Cell1的正端也就是两节电池中间的节点。这样分压出来的才是Cell2单独的电压。但这样ADC的输入参考地就变成了中间节点而STM32L4的ADC参考地是系统地所以不能直接接。解决方案是用差分放大器把中间节点为参考的电压转换成以系统地为参考的电压或者用两颗电阻分压后接一个运放做减法。我最终用的是运放减法电路Cell2正极和中间节点分别经过分压后接运放的同相和反相输入端输出就是以系统地为参考的Cell2电压。这个电路多花一颗运放但换来了正确的采样值得。6.4 均衡电阻长期工作后阻值漂移这个问题比较隐蔽。我用的是1206封装的27Ω电阻额定功率0.25W实际功耗0.6W超了。一开始没在意觉得电阻热点没关系。结果跑了三个月后发现均衡电流从150mA降到了110mA拆下来测电阻阻值变成了35Ω。电阻长期过载导致阻值漂移均衡能力下降。后来换成两颗1206的56Ω并联等效28Ω每颗功耗0.3W在0.25W额定附近但没超太多同时把电阻下面的铜皮加大通过PCB散热。再跑三个月电流基本没变。所以均衡电阻的功率余量一定要留够至少按实际功耗的2倍选额定功率或者用多颗并联分摊。7. 从两串到多串的扩展思路与器件替换建议这套两串方案跑通之后如果你要扩展到三串、四串硬件上主要是增加均衡支路和分压采样通道STM32L4A6RG的ADC通道和GPIO数量足够撑到四串。但MP2642GR-Z只有一颗怎么监测多路均衡电流两个办法一是每路均衡支路各用一颗MP2642GR-Z成本高但简单二是用一颗MP2642GR-Z配合多路模拟开关轮流切换采样成本低但采样率下降。我倾向于第二种因为均衡电流变化很慢轮流采样完全来得及。用一颗CD4051之类的模拟开关STM32L4控制通道选择MP2642GR-Z的输出接模拟开关的公共端切换后ADC采。注意模拟开关的导通电阻会影响精度选低导通电阻的型号或者在MP2642GR-Z输出加缓冲运放再进模拟开关。如果串数更多比如到六串以上STM32L4A6RG的ADC通道可能不够而且高串数的共模电压会超过MP2642GR-Z的耐压。这时候要么换更高耐压的电流检测放大器要么改用专用AFE。我的建议是四串以内用这套MCU加电流检测放大器的方案灵活且成本可控超过四串就认真考虑AFE别硬撑。器件替换方面STM32L4A6RG如果缺货可以看STM32L4R5或者STM32G4系列G4的ADC更快、运放更多但DAC只有一路需要权衡。MP2642GR-Z如果找不到可以看TI的INA240或者INA282功能类似但引脚和增益可能不同硬件要改。替换时重点确认共模电压范围、增益、带宽和输出摆幅这四个参数决定了能不能直接替换。8. 写在最后几个让我少走弯路的实操习惯做这类电池均衡项目我养成了几个习惯分享出来可能对你有用。第一个习惯是每次改硬件先测静态电流。均衡电路在待机时不应该消耗电流如果待机电流偏大多半是某个开关管漏电或者分压电阻太小。我一般会在电池正极串一个微安表所有开关关闭时看电流正常应该在几十微安以内。这个测试能提前发现很多硬件问题。第二个习惯是均衡电阻的温度用红外测温枪实测不要只靠NTC。NTC测的是它自己所在位置的温度不一定代表电阻本体的温度。红外测温枪能直接看到电阻表面的温度更真实。我一般让电阻表面温度不超过90°C留足够余量。第三个习惯是均衡逻辑里加一个“最大均衡时间”限制。比如单次均衡最多持续30分钟到了就强制关闭冷却5分钟再继续。这是防止某个电池异常导致均衡一直开着把电阻烧了。这个限制在正常电池上很少触发但一旦触发就能避免事故。第四个习惯是保留一路DAC输出均衡电流的模拟波形即使产品化也留着。调试时接示波器一眼就能看出均衡有没有在工作、电流稳不稳。这个成本几乎为零但排查问题时能省大量时间。这套MP2642GR-Z加STM32L4A6RG的两串均衡方案我从打样到小批量跑了大半年硬件改了三版代码重构了两次现在算是比较稳定了。核心体会就是被动均衡看着简单但细节特别多尤其是电流检测和热设计稍不注意就出问题。希望这些经验能帮你少踩几个坑。
阅读完成 · 觉得有帮助?
咨询建站