ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

基于MP2642GR-Z与STM32F756ZG的两串电池均衡方案设计与实现

基于MP2642GR-Z与STM32F756ZG的两串电池均衡方案设计与实现

1. 为什么储能系统里“两串电池均衡”是个绕不开的硬骨头

做储能和备用电源的同行都有个共识:电池组里最怕的不是某一节电芯坏掉,而是两节电芯“闹别扭”。你手上如果只有两个串联的电池单元,看起来简单得不能再简单,但恰恰是这种两串结构,把均衡问题推到了最前台。因为串联回路里电流是同一个,容量却由最弱的那一节决定,只要两节电池的荷电状态出现偏差,整组可用容量就会像木桶效应一样被短板卡死。我在几个备用电源项目里反复验证过,两串电池如果不做主动均衡,运行半年后容量落差能拉到8%到15%,充电时一节先到上限、另一节还饿着,放电时一节先见底、另一节还有余量,循环几次之后偏差只会越来越大。

这个项目标题里给出的组合很有意思:MP2642GR-Z 加 STM32F756ZG。前者是一颗面向电池管理的模拟前端类器件,后者是带浮点单元和丰富外设的 Cortex-M7 主控。把它们放在储能和备用电源场景里做两串电池均衡,本质上是在解决三个层次的问题:第一层是“看得准”,要能独立采集每节电池的电压和温度;第二层是“算得清”,要判断当前偏差到底该不该均衡、往哪个方向均衡;第三层是“动得稳”,要控制均衡电流的开启、关断和限流,不能因为均衡本身把电池搞热甚至搞坏。

很多刚接触这个领域的朋友会问:两串电池而已,我用两个电阻加一个比较器不就行了?这话对一半。被动均衡确实简单,但它的代价是把多余的能量以热的形式烧掉,在备用电源这种长期浮充的场景里,持续发热会加速电芯老化,而且均衡电流通常只有几十毫安,遇到大容量电芯根本杯水车薪。所以这个项目选择 MP2642GR-Z 这类器件配合 STM32F756ZG 来做,方向上是奔着更精细的采集和更可控的均衡策略去的,而不是简单粗暴地“烧电阻”。

我先把这篇要讲清楚的事情列一下:MP2642GR-Z 在两串架构里到底承担什么角色、STM32F756ZG 为什么适合做这个主控、硬件上怎么把这两颗芯片连起来、均衡策略怎么设计、实测中会遇到哪些坑。这些内容我会结合自己在类似项目里的经验展开,涉及具体参数的地方会说明推算过程,涉及操作的地方会给出可复现的步骤。适合正在做储能 BMS、备用电源管理、或者任何需要两串电池均衡的嵌入式开发者参考,哪怕你之前没碰过 MP2642GR-Z,也能顺着思路把方案搭起来。

2. MP2642GR-Z 在两串电池架构里的真实定位

2.1 它到底解决了“采集”还是“均衡”的问题

先把一个容易混淆的概念掰开:电池管理里“采集”和“均衡”是两件事,但经常被同一颗芯片或同一套电路同时承担。MP2642GR-Z 这类器件在我的理解里,核心价值在于它把多节串联电池的电压采集和部分均衡控制集成到了一起,减少了外围分立器件的数量。对于两串电池来说,你需要的是能分别测量 Cell1 和 Cell2 的正负极电压,同时最好能提供一条可控的均衡通路。

如果只用 STM32F756ZG 的 ADC 直接去测两串电池,会遇到一个经典问题:STM32 的 ADC 参考地是系统 GND,而 Cell2 的正极电压是两节叠加的,直接分压测量会引入共模和精度问题,而且两节电池的测量参考点不一致,软件上还要做减法,误差会累积。MP2642GR-Z 这类前端器件的意义就在于,它内部有专门的电平转换和差分采集结构,能把每节电池的电压以合适的共模电平送到主控能接受的范围,同时保证两节之间的测量是一致的。

注意:具体到 MP2642GR-Z 的引脚定义和寄存器映射,一定要以你手上那份数据手册为准。不同批次的模拟前端在寄存器地址和采样时序上可能有差异,我下面讲的是这类器件的通用工作逻辑,落到代码时必须对照手册逐条核对。

2.2 两串场景下它的通道怎么分配

两串电池意味着有两个电芯节点:一个是 Cell1 的正极(也就是整组电池的负极往上第一节),一个是 Cell2 的正极(整组正极)。MP2642GR-Z 通常会有多个电压采集通道,在两串应用里你只需要用到其中两个通道,但接线时要注意采样点的选取位置。我的习惯是把采样点直接放在电芯极耳或者汇流排的螺丝端子上,而不是放在 PCB 的走线末端,因为均衡电流流过走线时会产生压降,如果采样点选得不对,你测到的电压里会混进均衡电流造成的 IR 压降,导致均衡判断来回震荡。

具体接线逻辑是这样的:Cell1 的负极接系统的电池组负极,也是采集的参考地;Cell1 的正极接第一个采集通道的正端;Cell2 的正极接第二个采集通道的正端,而 Cell2 的负极其实就是 Cell1 的正极,所以第二个通道的负端要接到第一个通道的正端上。这种“堆叠式”接法是串联电池采集的标准做法,MP2642GR-Z 内部会处理通道之间的共模问题。

2.3 均衡通路的两种可能形态

MP2642GR-Z 如果内置了均衡开关,那它通常提供的是被动均衡通路,也就是在每个电芯两端并一个电阻加一个内部 MOS,通过导通 MOS 让电芯通过电阻放电。这种方式的均衡电流由外部电阻决定,公式很直接:I = Vcell / R。假设单节电芯 3.7V,你想做 100mA 的均衡电流,那电阻就是 37 欧姆,功耗是 0.37W,得选至少 1W 的封装,不然电阻会烫得让你怀疑人生。

如果 MP2642GR-Z 只是提供采集和均衡驱动信号,真正的均衡功率级要外挂,那你就需要自己设计 MOS 和限流电阻。这种情况下 STM32F756ZG 的角色就更重,它要通过 GPIO 或者通信接口去控制外部均衡开关。我在实际项目里更倾向后者,因为外挂功率级可以灵活调整均衡电流,散热布局也好做,缺点是占板面积大一些。

3. STM32F756ZG 做主控的选型理由与资源分配

3.1 为什么不是随便一颗 F103 就够

有人会觉得,两串电池均衡而已,用 STM32F103 这种经典款不就行了?从纯逻辑控制的角度,F103 确实能跑。但 STM32F756ZG 的价值在于它有几个在电池管理里很实在的优势。第一是它的 ADC 精度和采样速率,F756 的 12 位 ADC 在多通道扫描时的稳定性比老款好,配合 DMA 可以做无 CPU 干预的连续采样,这对需要同时监控电压、电流、温度的 BMS 来说很关键。第二是它的浮点单元,做 SOC 估算或者滤波算法时,浮点运算不用再靠软件模拟,省下来的 CPU 时间可以拿去跑通信协议栈。第三是它的外设丰富度,多路 UART、CAN、SPI、I2C 都有,方便同时接前端芯片、上位机和保护电路。

我在一个备用电源项目里做过对比:同样跑一套电压采集加滑动平均滤波加均衡判断的逻辑,F103 在 72MHz 下 CPU 占用率能到 40% 左右,而 F756 在 216MHz 下加上硬件浮点,占用率不到 8%。这个差距在功能简单时不明显,但一旦你要加历史数据记录、通信加密、故障录波,资源余量就是能不能按时交付的分水岭。

3.2 外设怎么分给采集、均衡和通信

拿到 F756ZG 之后,我一般这样分配资源:ADC1 配合 DMA2 专门扫 MP2642GR-Z 送过来的模拟采集通道,或者如果前端是数字接口,就用 SPI 或 I2C 去读寄存器。定时器方面,用一个通用定时器比如 TIM3 产生 1ms 的时基,作为采集周期和均衡 PWM 的基准。均衡控制如果走 GPIO,就用一组普通推挽输出;如果要调均衡电流,就用 TIM1 的高级定时器输出 PWM 去驱动外部 MOS。

通信这块,UART1 留给调试串口,UART2 或 CAN1 留给系统主控或者上位机。这里有个经验:调试串口一定要独立,不要和业务通信共用,否则一旦业务通信出问题,你连日志都打不出来,排查会非常痛苦。我在早期项目里吃过这个亏,后来所有板子都强制留一路独立调试口。

3.3 时钟和供电的细节不能马虎

F756ZG 的供电是 3.3V,但电池组电压远高于此,所以你需要一套降压电路从电池组取电。这里要注意,如果从整组电池取电给 MCU 供电,当电池组电压跌到很低时,MCU 可能先于电池失效而掉电,导致你丢失最后的保护动作机会。我的做法是用一颗宽压输入的降压芯片,保证在电池组最低工作电压以上都能稳定输出 3.3V,同时在软件里设置低压预警阈值,提前把关键数据写进 Flash。

时钟方面,F756ZG 外部挂 25MHz 晶振比较常见,配合内部 PLL 倍频到 216MHz。如果你要用 USB 或者高精度定时,晶振的负载电容和走线要按手册推荐来,别随手放两个 22pF 就完事,我见过因为晶振起振不良导致整个系统时基漂移的案例,均衡周期从 1 秒变成 1.3 秒,虽然不致命,但会让 SOC 估算的积分误差慢慢累积。

4. 硬件连接:把 MP2642GR-Z 和 STM32F756ZG 接成一个整体

4.1 电源与参考地的处理

整个系统的地参考要以电池组负极为准,MP2642GR-Z 的模拟地和 STM32 的数字地要在单点汇合,通常是靠近 ADC 参考引脚的地方。千万不要把均衡大电流的回路地和采集小信号地混在一起走,否则均衡一开,采集值就跳。我的做法是给模拟采集部分单独铺一块地,用 0 欧姆电阻或者磁珠在一点连接到主地,均衡功率级的地则直接走粗线回到电池负极。

MP2642GR-Z 的供电如果是从电池组直接取,要注意它的耐压范围。两串电池满电可能到 8.4V 甚至更高,如果器件耐压不够,必须加预稳压。我一般会在前端加一颗高压 LDO 或者简单的稳压管加三极管,把电压稳到器件推荐的工作区间,同时加 TVS 管防浪涌。

4.2 采集通道的滤波与保护

从电芯到 MP2642GR-Z 采集引脚之间,我强烈建议加 RC 滤波。典型值是 100 欧姆串联电阻加 0.1uF 到 1uF 的电容到地,截止频率算一下:f = 1/(2πRC),100 欧姆加 0.1uF 大概是 16kHz,足够滤掉开关噪声又不影响你毫秒级的采集。电阻要选精度 1% 的,因为两节电池的采集通道如果电阻误差不一致,会直接变成电压测量误差。

保护方面,每个采集引脚对地加一个肖特基二极管做钳位,防止电芯反接或者浪涌把前端打坏。这个成本很低,但能救你一块板子。我在一次测试中因为电池接反,没有钳位二极管的板子直接烧了前端,有钳位的只是二极管发热,换掉就好。

4.3 均衡功率级的布局要点

如果均衡功率级外挂,MOS 和限流电阻的布局要遵循“短而粗”的原则。均衡电流虽然只有几百毫安,但它是持续的,走线电阻造成的压降会影响均衡电流的精度。我的做法是把两节电池的均衡回路各自独立走线,不要共用回流路径,避免一节均衡时影响另一节的采集。

散热也要考虑。假设均衡电流 200mA,单节 4.2V,电阻功耗 0.84W,两个电阻就是 1.68W,如果板子空间小,温升会很可观。我通常会把限流电阻的封装放大一号,比如算出来 1W 够用,实际用 2W 的,留足余量。MOS 选低导通电阻的,Rds(on) 在几十毫欧级别,这样 MOS 上的压降和发热都可以忽略。

4.4 通信接口的连线与隔离

如果 MP2642GR-Z 是数字接口,SPI 或 I2C 的连线要尽量短,必要时加缓冲。SPI 的 CS、SCK、MOSI、MISO 四根线,如果走线超过 10cm,建议降低速率或者加串联电阻匹配。I2C 则要注意上拉电阻的选取,通常 4.7k 欧姆,但如果总线电容大,要适当减小。

在储能系统里,主控和前端之间有时需要隔离,尤其是高压电池组和低压控制板之间。如果做隔离,SPI 可以用数字隔离器,I2C 也有专用的隔离器件。隔离之后,两边的地彻底分开,采集精度和安全性都会提升,代价是成本和板面积增加。我的经验是,如果电池组电压超过 24V,隔离就值得考虑;两串电池电压不高,可以先不做,但要在布局上给隔离器件留位置,方便后续升级。

5. 均衡策略:从“什么时候均衡”到“均衡多久”

5.1 电压差阈值不是拍脑袋定的

均衡启动条件最直接的就是电压差。两节电池电压差超过某个阈值就启动均衡,低于某个阈值就停止。这个阈值怎么定?我见过有人直接写 50mV,也有人写 10mV。定得太小,采集噪声就会让你频繁启停,均衡开关来回动作,反而增加损耗;定得太大,偏差已经很明显了才动手,均衡时间会拉得很长。

我的做法是结合采集精度来定。如果 MP2642GR-Z 加 STM32 的采集链路整体精度能做到 ±5mV,那阈值至少要是精度的 4 到 5 倍,也就是 20mV 到 25mV。这样噪声不会误触发,同时偏差超过 25mV 时启动均衡,目标是把偏差压到 10mV 以内。启动和停止之间留一个回差,比如启动阈值 25mV,停止阈值 10mV,避免在阈值附近反复开关。

5.2 均衡方向与“谁给谁让路”

两串电池均衡的方向很简单:电压高的那节放电,电压低的那节不动,等高的降下来。但这里有个细节,如果两节都在充电过程中,你给高的那节放电,实际上是在把充电电流分流一部分,让高的那节充得慢一点,低的继续充,最终达到平衡。如果是在放电过程中,给高的那节放电只会让整组更快没电,所以我的策略是只在充电阶段或者静置阶段做被动均衡,放电阶段除非偏差极大,否则不均衡。

还有一种情况是两节电压都偏低但偏差不大,这时候不应该均衡,而应该先充电。均衡的本质是“削峰填谷”,不是“无中生有”,能量只能从高的那节搬到低的那节或者耗散掉,不能凭空产生。所以均衡逻辑里一定要有“当前是否在充电”“当前电压是否在合理区间”的前置判断。

5.3 均衡电流与占空比的控制

如果均衡通路是简单的开关加电阻,那均衡电流是固定的,你能控制的就是“开多久”。这时候可以用 PWM 来调节平均均衡电流。比如你希望平均 100mA,但电阻决定的满电流是 200mA,那就用 50% 占空比。PWM 频率选多少?太低会有可听噪声,太高 MOS 开关损耗大。我一般选 1kHz 到 10kHz,1kHz 以下电感类元件可能啸叫,10kHz 以上开关损耗开始明显。

如果均衡通路是可控电流源,那就可以直接设定电流值,控制更精细。但两串电池用可控电流源成本偏高,大多数场景还是电阻加 MOS 的被动均衡。被动均衡的缺点是效率低,但优点是简单可靠,在备用电源这种不需要频繁均衡的场景里,性价比很高。

5.4 温度与安全的兜底逻辑

均衡过程中电池温度会上升,尤其是大电流均衡。我的做法是在均衡逻辑里加温度门限:如果电芯温度超过 45 摄氏度,降低均衡占空比或者暂停均衡;超过 60 摄氏度,直接停止并报故障。温度采集可以用 NTC 贴在电芯表面,通过 MP2642GR-Z 的辅助通道或者 STM32 自己的 ADC 读进来。

安全兜底还包括:均衡时如果检测到某节电压异常下降(可能是内阻过大或者接触不良),立即停止均衡并报警;如果通信中断超过一定时间,前端要能自动关闭均衡,不能因为主控死机就让均衡一直开着。这些逻辑看起来琐碎,但真正出问题的时候,就是这些兜底在保护你的电池和系统。

6. 实测中那些手册不会告诉你的坑

6.1 采集值跳动:先查地,再查滤波

我第一次调通采集的时候,发现 Cell2 的电压读数比万用表测的低了 30mV 左右,而且跳动很大。排查过程是这样的:先确认万用表没问题,然后查 MP2642GR-Z 的采集引脚电压,发现引脚上的电压是对的,但读出来的数字不对。再查参考电压,发现 ADC 的参考地不是电池组负极,而是经过了 PCB 走线,走线上有均衡电流的回流,产生了压降。把参考地改到电池组负极的直接采样点之后,读数立刻准了。

这个坑的教训是:采集的参考地一定要和被测信号的参考点一致,而且这条路径上不能有大电流流过。后来我在所有采集通道的参考地上都加了独立的走线,直接连到电池负极的采样端子,问题再没出现过。

6.2 均衡一开,通信就断

第二个坑更隐蔽。均衡功能打开之后,STM32 和上位机的通信偶尔会丢包。一开始以为是通信协议的问题,查了很久没结果。后来用示波器看电源纹波,发现均衡开启瞬间,3.3V 电源上有一个几百毫伏的跌落。原因是均衡功率级和 MCU 共用了一路降压,均衡电流突变时把电源拉低了。

解决办法有两个:一是给 MCU 的 3.3V 加足够的去耦电容,尤其是靠近芯片引脚的地方放 10uF 加 0.1uF;二是把均衡功率级的供电和 MCU 供电分开,从电池组分别取电,各自稳压。我最后用了第二种方案,通信再没丢过包。这个坑告诉我,均衡功率级虽然电流不大,但它的开关动作对电源的干扰不能忽视。

6.3 均衡停止后电压“反弹”

还有一个现象很有意思:均衡停止后,被均衡的那节电池电压会慢慢回升一点,导致你以为均衡没效果。这其实是电池的极化效应,均衡时电池在放电,电压被拉低,停止后电池内部重新平衡,电压会恢复一部分。所以判断均衡效果不能看均衡刚停止时的电压,要等静置一段时间,比如 30 分钟后再看。

我的做法是在均衡逻辑里加一个“静置计时”,均衡停止后至少等 10 分钟再重新评估电压差,避免因为极化效应导致误判。这个时间可以根据电池类型调整,磷酸铁锂的极化恢复比三元锂慢一些,静置时间要更长。

6.4 低温下均衡要更保守

冬天做测试的时候发现,同样的电压差,低温下均衡后电压恢复得更慢,而且电池内阻增大,均衡电流产生的压降更明显。这时候如果还按常温的阈值和电流来均衡,效果很差,还可能因为压降过大触发欠压保护。我的调整策略是:温度低于 10 摄氏度时,均衡电流减半,阈值放宽到 40mV,并且延长静置时间。这些参数不是理论推导出来的,是实测中一点点试出来的,不同电芯体系会有差异,需要你自己在项目里标定。

7. 软件框架:把采集、判断、均衡串成一条稳定的流水线

7.1 用定时器驱动的主循环结构

我的软件框架通常是一个 1ms 的定时器中断作为时基,在中断里置标志位,主循环里按标志位执行任务。采集任务每 10ms 执行一次,读 MP2642GR-Z 的两路电压和温度;均衡判断每 100ms 执行一次,因为电压变化没那么快,没必要频繁判断;通信任务每 50ms 执行一次,处理上位机命令和上报数据。这种分频执行的方式可以让 CPU 负载很均匀,不会因为某个任务耗时过长影响其他任务。

中断里只做最轻的事情,比如置标志、翻转 GPIO,绝对不要在中断里做浮点运算或者通信。我见过有人在 ADC 中断里直接算 SOC,结果中断执行时间过长,影响了其他中断的响应,系统时不时卡一下。后来把计算移到主循环,问题就消失了。

7.2 电压采集的滤波与校准

采集进来的原始值一定要滤波。我的做法是滑动平均加中值滤波的组合:先连续采 5 次,去掉最大最小,剩下 3 个取平均,然后再和上一次的滤波值做一阶低通。这样既能滤掉突发噪声,又能跟踪真实变化。一阶低通的系数选 0.1 到 0.3 之间,太小了响应慢,太大了滤波效果差。

校准方面,每块板子最好做一次两点校准:用一个高精度电源给一个已知电压,记录 ADC 读数,再换一个电压,记录读数,算出增益和偏移。校准系数存在 Flash 里,上电时读出来用。不做校准的话,不同板子之间的采集误差可能有几十毫伏,对于均衡阈值只有 25mV 的场景来说,这个误差是不能接受的。

7.3 均衡状态机的设计

均衡逻辑我用状态机来实现,状态包括:空闲、判断中、均衡中、静置中、故障。状态转移条件很明确:空闲状态下如果满足均衡条件,进入判断中;判断中确认偏差持续存在,进入均衡中;均衡中达到停止条件,进入静置中;静置中计时结束,回到空闲。任何状态下如果检测到故障,直接跳到故障状态,关闭均衡并报警。

状态机的好处是逻辑清晰,不会出现“均衡开着但判断条件已经不满足”这种混乱情况。每个状态都有明确的进入动作、退出动作和超时保护。比如均衡中状态如果超过预设的最大均衡时间(比如 2 小时),强制退出并报故障,防止因为判断逻辑卡死导致均衡一直开着。

7.4 故障记录与恢复策略

故障记录我一般用一块独立的 Flash 区域,循环写入,记录故障类型、发生时间、当时的电压温度等快照信息。这样现场出问题的时候,你可以把板子拿回来读日志,不用靠猜。故障恢复方面,过温、过压这类故障在条件消失后可以自动恢复,但恢复后要限制均衡电流,观察一段时间再放开。通信故障则要等通信恢复后手动清除,避免通信时断时续导致均衡反复启停。

8. 从两串到更多串:这套方案的延展思路

两串电池均衡跑通之后,如果你要扩展到三串、四串甚至更多,MP2642GR-Z 这类前端器件的通道数可能就不够了,需要多颗级联或者换更多通道的型号。级联的时候,通信接口要支持菊花链或者多片选,STM32F756ZG 的 SPI 可以接多个片选,但要注意时序和隔离。均衡策略上,多串的均衡不再是简单的“高的放电”,而是要选最高的那节放电,或者选最低的那节让其他节给它充电(主动均衡),复杂度会上升一个量级。

我的建议是先把两串做扎实,把采集精度、均衡逻辑、故障保护都验证透,再往上扩展。因为两串是所有多串系统的基础单元,两串做不好,多串只会把问题放大。STM32F756ZG 的资源对于两串来说绰绰有余,你甚至可以在上面跑一个简单的 SOC 估算和健康状态记录,为后续升级留好接口。

最后分享一个我在实际项目里养成的习惯:每次改完均衡参数,不要只看一次测试结果,要连续跑至少 50 个充放电循环,观察电压偏差的长期趋势。均衡效果好不好,短期看不出来,长期趋势才说明问题。如果偏差在循环中逐渐收敛,说明参数合适;如果偏差震荡或者发散,那就要回头检查采集精度和均衡逻辑了。这个习惯帮我避免了好几次“实验室看着挺好、现场跑几个月就出问题”的尴尬。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进