ARTICLE · INTELLIGENCE

战地情报 · 详情页

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

两串电池主动均衡控制器:MP2642GR-Z与ATmega324A实战解析

两串电池主动均衡控制器:MP2642GR-Z与ATmega324A实战解析

做储能和备用电源的同行应该都有体会,电池组里最麻烦的往往不是充电,而是充电之后的离散度。哪怕出厂同一批次、同一容量,两节电池串联跑上一段时间,电压、内阻、自放电率都会慢慢分道扬镳。这次想分享的项目,核心就是用 MP2642GR-Z 和 ATmega324A 这套组合,给两串电池做一个主动均衡控制器,用来解决储能设备和备用电源里的串联电池失配问题。如果你是做 BMS、便携储能、应急备用电源,或者实验室里自己搭充放电系统,这篇内容可以当作一份从器件选型到固件实现的参考记录。

先说结论:两节串联电池的均衡,看起来比 16 串、32 串简单太多,但真正跑起来才发现,难的不是“怎么把电压拉平”,而是如何在长期待机、低功耗、温度漂移、地线噪声这些乱七八糟的条件下,让均衡动作既可靠又不添乱。下面这些内容都是我实际踩过坑之后整理出来的,代码和参数可以直接拿来改。

1. 为什么两节串联电池也需要做均衡

1.1 串联失配比想象中更容易发生

很多人听到“均衡”两个字,第一反应是那种几十节的动力电池包,觉得两节电池串联根本不需要。其实备用电源和储能系统恰恰是失配的高发区。

两节电池在同一个回路里,放电电流完全一样,但每节电池的容量、内阻、自放电率不可能完全一致。容量小的那一节先放到截止,容量大的那一节还剩下不少;充电时反过来,容量小的那节先到上限,容量大的那节还没充满。如果系统长期挂在浮充母线或者处于待机状态,两节电池每天的微小差异会一点点叠加。自放电率差 0.3% 每月的两节电芯,放上半年就能差出近 2% 的 SOC。在磷酸铁锂那种很平的开路电压平台上,2% 的 SOC 差可能只表现为十几毫伏的电压差,但等真正切换到放电回路,末端电压差会瞬间被放大好几倍。

所以不要觉得两串就没有均衡需求。备用电源最大的特点是:大多数时间不干活,但一旦干活就必须全力以赴。平时不处理失配,关键时候短板就会暴露。

1.2 被动耗散和主动转移的取舍

均衡按能量处理方式分两类。被动均衡是把高电压电池的能量通过电阻直接耗掉,电路简单,两颗电阻加两个 MOSFET 就能做。但它有个天生缺陷:均衡电流一旦超过 150mA,发热就很可观,而且能量白白浪费。在储能柜这种密闭空间里,长期小功率发热不是好事情。更关键的是,被动均衡只会把高电压电池“拉低”,如果两节电池的电压差是因为低电池本身已经欠压,那被动均衡反而会把低电池拖得更低。

主动均衡不一样,它通过电感和开关把高电压电池的能量转移给低电压电池。能量不浪费,发热小,方向可控,适合长期浮充和备电场景。标题里用 MP2642GR-Z 搭配 ATmega324A,走的正是主动均衡这条路。前者负责执行能量转移,后者负责判断什么时候均衡、往哪个方向均衡。这套分工在工程上很清晰。

2. 器件分工:MP2642GR-Z 和 ATmega324A 分别解决什么问题

2.1 MP2642GR-Z:直接执行均衡动作的功率前端

MP2642GR-Z 在这套设计里承担的是电池均衡功率前端的角色。你可以把它理解成一个“电池和单片机之间的桥”:ATmega324A 告诉它当前该把能量往哪边送、要不要使能;它内部完成功率开关的切换,把高电压电池的能量抽出来,经过外部电感再灌到低电压电池里。

之所以不让单片机直接去推均衡开关,是因为 ATmega324A 的 I/O 驱动能力有限,而且功率路径上要处理死区、电流限制、短路保护这些细节,用普通 GPIO 去搭很容易烧管。把粗活交给专用前端,MCU 只做采样和逻辑,既安全又省事。

在实际电路里,MP2642GR-Z 需要的器件很少:外部一个功率电感、两个陶瓷电容,以及几路控制信号。具体的耐压、连续工作电流、开关频率要求,以你手里那颗芯片的实际手册为准。我这里列的是在备用电源 2S 磷酸铁锂场景下的通用接法,如果你用的是三元锂电两串,最高单体电压会到 4.2V 甚至 4.35V,选型时要把电压余量重新算一遍。

2.2 ATmega324A:负责采样、判定和保护控制

ATmega324A 是老牌的 8 位 AVR 单片机,在这个项目里负责三件事:采单体电压、算差值、控制均衡方向。选它不是因为它强,而是因为够用且可靠。

它有 32KB Flash、2KB SRAM,跑均衡状态机绰绰有余;10 位 ADC 做电压采样,通过适当的分压和校准,完全可以分辨到 10mV 以内;内部的 Timer/Counter 可以产生定时器和 PWM,方便做均衡时的间歇控制;还有 EEPROM 可以保存校准系数和上次均衡记录。在成本敏感的备用电源领域,用一颗成熟的 8 位 MCU 比上复杂的 32 位平台更划算,开发周期也更短。

ATmega324A 的 ADC 输入范围不能超过 VCC,我这里把单片机供电设为 3.3V,AVCC 和 VCC 接在一起,ADC 参考电压也直接用 AVCC。这样采样电路的设计目标就是把电池节点电压分压到 3.3V 以内。

2.3 系统控制流程

整个系统上电后的工作流程可以概括成六步:

  1. 读 EEPROM 里的 ADC 校准系数,初始化 ADC 和定时器。
  2. 循环采集电池总电压、中点电压、放电回路负极参考点。
  3. 根据分压比换算成第一串电池电压 V1 和第二串电池电压 V2。
  4. 计算差值 delta = V1 - V2,如果超过启动阈值,设置均衡方向并打开 MP2642GR-Z 的使能信号。
  5. 每均衡一段时间暂停一下,等电压平台回稳后再采样,避免开关纹波和地线压降污染读数。
  6. 检查单体电压越限、板温过高、通信异常等情况,一旦触发保护就立刻关停均衡。

第六步看起来最不起眼,但真正耗费时间的都在这里。均衡本身不是越勤越好,关键是要在正确的时间做正确的能量转移。

3. 核心电路与关键参数计算

3.1 单体电压采样网络的设计

两节串联电池的测量节点有三个:电池组负极 B-,中点 BAT1,电池组正极 BAT2。B- 和单片机 GND 共地,所以只需要对 BAT1 和 BAT2 分别做分压采样,然后数字相减得到两节单体电压。

我用的是两颗电阻组成的分压网络,分压比 K 选了 0.45。具体取值是上分压电阻 110kΩ、下分压电阻 90kΩ,因为:

K = 90 / (110 + 90) = 0.45

两节磷酸铁锂满电状态下单体 3.65V,总电压 7.3V,经过分压后:

V_mid_max = 3.65 × 0.45 = 1.6425V
V_total_max = 7.3 × 0.45 = 3.285V

ATmega324A 的 ADC 参考是 3.3V,总电压最高 3.285V,留了一点点余量。如果换成三元锂电两串 8.4V 总压,这个分压比就不合适,需要把上分压电阻加大,把分压比降到 0.39 以下,否则总电压采样会超量程。

分压电阻的阻值不能太小。阻值太小,待机时一直损耗电池能量;阻值太大,ADC 采样时因为输入阻抗不够,读数会偏。这里 200kΩ 的等效阻抗在常温下带来的采样误差很小,而且采样是间歇性的,平均功耗可以做得非常低。如果你对功耗要求更苛刻,可以在分压网络供电回路上串一颗 P 沟道 MOSFET,只在采样瞬间接通。

ADC 换算公式我用的是:

V_cell = (ADC_读数 × 3300mV / 1023) / 0.45

注意这里除以 1023 而不是 1024,因为 AVR 的 ADC 结果是 1024 等分,但满量程对应的数字就是 1023。实际算下来每个 ADC 码大约对应 7.2mV 的单体电压分辨率,配合多次采样取平均,能把读数噪声压到 2 个码以内。

3.2 从参数到布局:电感和均衡电流

主动均衡的功率级是电感式 buck-boost 结构:MP2642GR-Z 内部两个功率开关,外部一颗电感。当 V1 比 V2 高时,先把第一串电池的能量充进电感,再把电感里的能量放到第二串电池;反过来同理。MCU 只需要控制方向引脚和使能引脚。

电感量是这套电路里最需要现场调的参数。理论上它由开关频率、占空比、期望的均衡电流和纹波共同决定。项目里我先把开关频率定在 62.5kHz,因为 ATmega324A 在 16MHz 主频下用 8 位定时器分频很容易得到这个频率,而且听不到明显的噪声。

期望的平均均衡电流我定在 500mA 左右。这个电流对内部集成的功率开关来说热应力很小,对电感的体积来说也合适。按 ±20% 纹波估算,峰值电流:

I_peak = 0.5 + 0.05 = 0.55A

但实际选电感时我没有卡这个值,而是选了饱和电流大于 2A 的 22µH 功率电感,留出三倍以上的余量。原因是电池端接线长短、接触电阻、负载切换产生的瞬态电流都不可预估,电感余量太小容易饱和,饱和之后电感量骤降,开关管电流会瞬间冲高。

电感两端并联了两颗 10µF/16V 的陶瓷电容,用来吸收开关噪声。需要特别提醒的是 MLCC 直流偏压效应,同一颗 10µF 电容在 7V 直流偏压下实际容量可能只剩 6µF,所以用两颗并联。

实际调试时,用示波器看 MP2642GR-Z 开关节点电压波形,确认没有明显振铃。均衡 500mA 电流下,电感温升很小,功率路径基本不需要额外散热。

3.3 保护逻辑和低功耗处理

两串电池的均衡保护看起来简单,但其实边界条件很多。我在固件里设置了两个硬阈值:单节电压高于 3.65V 或者低于 2.9V 时,强制禁止均衡。原因是主动均衡只能在正常电压区间内做“削峰填谷”,如果在过放状态下仍然启动均衡,会把一个本来就薄弱电池的能量转移到另一个电池,虽然电压表面拉平了,实际却可能加快电池损坏。

温度保护放在功率级附近。电池本体温度用 NTC 采集,功率级温度也单独留了一路 NTC。严格来说,均衡动作引起的温升主要来自 MOSFET 导通损耗和电感磁损,把 NTC 贴在功率级旁比贴在电芯外壁更能反映真实情况。

低功耗处理同样重要。备用电源系统长期待机,控制板能省电一定要省。ATmega324A 在空闲状态可以进入 Power-down 模式,靠定时唤醒执行一次采样和均衡判定。分压网络不采样的时间段用 MOSFET 断开,整个控制板的静态电流控制在几十微安级别,这才是备用电源可以长期挂机的前提。

4. 固件实现和调试排障

4.1 ADC 初始化和校准

ADC 初始化本身很简单,关键是采样时序。ATmega324A 工作在 16MHz,ADC 时钟分频我设置成 128,得到 125kHz 采样时钟,这个频率在 AVR 手册的推荐范围内。每次切换通道后要等一小段时间,让采样电容充放电完成,否则读出来的电压会前后串扰。

下面这段是 ADC 读取的基础代码,可以直接抄:

#define VREF_MV 3300UL #define DIV_K 0.45f uint16_t read_adc(uint8_t ch) { ADMUX = (ADMUX & 0xF0) | (ch & 0x0F); ADCSRA |= (1 << ADSC); while (ADCSRA & (1 << ADSC)) ; return ADC; } float node_voltage_mv(uint8_t ch) { uint16_t raw = read_adc(ch); return ((float)raw * VREF_MV / 1023.0f) / DIV_K; }

这段代码只能保证读数“看起来合理”,真正保证精度还要做校准。电阻分压网络有 0.1% 误差,单片机内部 ADC 也有增益误差,所以我建议在装配完成后做一次两点校准:用可调电源把两个单体电压分别设到 3.0V 和 3.65V,记录实际 ADC 读数,推出每个通道的:

V_real = k × V_adc + b

校准系数存到 EEPROM 里。每个分压通道单独一组系数,不要复用。实测下来校准之后,单体电压读数误差可以控制在 ±5mV 以内。

4.2 均衡控制状态机

均衡逻辑我建议不要写成直接 if 嵌套,越复杂越容易乱。用状态机最清晰:空闲 IDLE、均衡中 BALANCING、停止等待 PAUSE。启动阈值和停止阈值要分开,加迟滞。

我用的参数是:差值超过 20mV 启动,均衡到差值小于 8mV 停止。如果你用的是磷酸铁锂,平台区非常平,20mV 对应的 SOC 差可能比三元锂大不少,这时候阈值可以适当提高到 30mV,否则均衡动作太频繁。

方向判定代码:

#define BALANCE_START_MV 20 #define BALANCE_STOP_MV 8 uint8_t direction = 0; // 0: cell1 -> cell2, 1: cell2 -> cell1 if (v1 > v2 + BALANCE_START_MV) { direction = 0; enable_balance(); } else if (v2 > v1 + BALANCE_START_MV) { direction = 1; enable_balance(); } if (abs(v1 - v2) < BALANCE_STOP_MV) { disable_balance(); }

均衡不要一口气开几个小时。实际电池在均衡停止后电压会回弹,你停下来一看差值又变大了,那是因为活性物质重新扩散,不是均衡失效。我采用 30 秒均衡、10 秒停歇的间歇式工作方式,停歇窗口内重新采样判断。这样既不会让功率级长时间发热,也能避开均衡电流对电压采样的干扰。

4.3 实测中的常见问题速查

调试过程中最容易踩坑的是 ADC 噪声、地线压降和待机功耗。我整理了一份现场排查表,基本能覆盖两串均衡板的绝大多数问题:

现象可能原因排查和处理方法
单体电压读数跳字ADC 采样电容未稳定、电源地噪声大切换通道后延时 20us;ADC 引脚并联 100nF;采样结果做 8 次平均
均衡一开启电压读数就乱跳大电流地线压降影响 AD 参考地把采样地用单点连接到电池负极,功率地用粗线单独走,二点只在电池端汇合
均衡方向总是反GPIO 控制信号逻辑反相核对 MP2642GR-Z 方向引脚电平定义,加上拉/下拉,先空载测控制波形再插电池
长时间待机后电池电压掉很多分压电阻一直耗电、MCU 未睡眠分压网络加采样开关,MCU 进入 Power-down 模式,定时唤醒
均衡温度过高电感饱和、开关频率不当示波器看开关波形,确认电感是否饱和;尝试降频或减小占空比
掉电保存后校准值丢失EEPROM 写入次数过多只在稳定状态下写一次,不要每次都写;写入前关闭中断,写后校验

这里面最容易被忽略的是第二项:采样地和功率地没有分开。均衡电流只有 500mA,但电感开关的回流电流非常尖锐,哪怕地线上只有十几毫欧电阻,产生的压降也会让 ADC 参考点抖动。一定要把信号地单独引出来,在电池负极单点连接。

5. 实测数据与下一步扩展

5.1 一组有代表性的实测数据

为了验证这套控制逻辑有没有用,我在电池模拟器上做了一组测试。模拟器把两节电池分别设成 3.656V 和 3.552V,初始差值约 104mV,这是模拟长期自放电差异后的典型状态。

均衡过程数据:

时间点Cell1 电压Cell2 电压差值
初始3.656V3.552V104mV
均衡 1 小时3.621V3.589V32mV
均衡 2 小时3.602V3.594V8mV
停止均衡 30 分钟3.618V3.578V40mV
再次均衡 30 分钟3.601V3.596V5mV

可以看到均衡过程不是一条直线往下掉,电池电压存在明显的回弹现象。第一次从 104mV 拉到 8mV 很容易,但停止之后回弹到 40mV,说明内部化学反应并没有真正拉平。这时需要的不是加大均衡电流,而是多轮“均衡—静置—再均衡”的循环。用这套间歇式控制,最终能把回弹后的差值控制在 15mV 以内,对两串备电系统来说已经足够用了。

5.2 从两串走向多串

这套方案虽然是用两串验证的,但思路可以平滑扩展到更多电芯。每两颗电芯用一片 MP2642GR-Z 构成独立均衡单元,ATmega324A 通过多路 GPIO 或者 I2C 去管理多个均衡单元。因为主动均衡没有热量堆积问题,均衡单元之间直流隔离要求也不高,机内走线会简洁很多。

如果电池串数超过 8 串,建议把 ATmega324A 换成资源更多的 MCU,因为电压采样通道、故障记录、上位机通信都会变复杂。但从控制策略上说,根本逻辑没变:先测准每一节电压,再用迟滞阈值控制均衡启停。

另一个值得做的扩展是加入库仑计或 SOC 估算。电压均衡只能处理“端电压不一致”,而 SOC 不一致才是电池组容量的真正短板。如果系统里本来就有电流采样电阻,不如顺手把充放电电流也接进 ADC,在均衡策略里同时参考 SOC 差值,这样两节电池的一致性会更好。

最后分享一点个人经验:做这种小系统,千万不要一上来就接真实电池。先用可调电源和电池模拟器把阈值、方向、保护逻辑全部调通,再换真实电芯。我第一次调试时就是贪快接了真电池,结果均衡方向写反,等发现时电池已经压出一个小坑。这种错误不难避免,但代价不值得。两串均衡看起来是个小题目,真正做完一遍之后,你对 BMS 里那些大系统的理解会通透很多。

RELATED READING

延伸阅读

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