有些人可能觉得,两节电池串联而已,维护起来还不是轻轻松松。等你在储能柜里巡检,发现一节的电压已经顶到保护阈值,另一节还趴在3.0V以下;或者备用电源系统在市电闪断之后带载十分钟就低压报警,拆开一看,两节电池的容量差了快30%……你就知道“均衡”这两个字不是课本里的抽象概念,而是系统寿命和可用容量之间的一道真实分水岭。
我最近完成了一个小项目:在储能和备用电源系统里,用 MP2642GR-Z 这颗均衡控制器配合 ATmega324PA 单片机,对两个串联电池单元做主动均衡。标题里那串字看起来很硬件,其实拆开也就是三件事:两串电池为什么需要均衡、MP2642GR-Z 怎么把高的一节能量搬到低的一节、ATmega324PA 又如何决定什么时候搬、搬多少。整套做下来大概花了两周,其中三天花在排查一个特别隐蔽的电感啸叫问题上。这篇文章就把完整的设计思路、电路参数、固件状态机和调试踩坑全部摊开讲,适合正在做小型BMS、便携储能或者双串备用电源的朋友直接抄作业。
1. 项目背景与整体设计思路
1.1 为什么必须做主动均衡,而不是被动电阻均衡
先看一个最基础的物理事实:两节电池串联,流过相同的电流,所以充进去的电量、放出来的电量理论上完全一样。但现实里没有两节完全相同的电池,内阻、自放电率、温度系数、甚至出厂时的SOC差异,都会导致每节电池的实际电压和容量逐渐拉开差距。
被动均衡的玩法是:电压偏高的那节电池并联一个放电电阻,把多余的能量烧成热,烧到和低电压那节差不多为止。优点是电路简单、成本极低,缺点也很明显——能量被浪费了,而且均衡电流通常只有几十毫安到一两百毫安,碰上压差大的电池组,均衡时间可能长达几十个小时。在储能系统里,更严重的还不是浪费,而是发热:热量集中在PCB局部,对电池簇热管理是额外负担。
主动均衡则是用功率变换电路把能量从高电压电池搬运到低电压电池,能量没有变成热,而是被“循环利用”了。它带来的直接好处有两个:第一,均衡电流可以做到1A甚至更高,压差恢复速度快得多;第二,因为在储能和备用电源场景里,电池长期处于浮充或待命状态,均衡动作经常需要在静置时进行,小电流的被动均衡在这种场景下几乎没有实用性。
我这次选的是电感式相邻电池均衡拓扑,也就是 buck-boost 电荷搬移结构。简单描述就是:一节电池给电感充磁,然后电感给另一节电池放磁,能量直接从Cell 1搬到Cell 2,中间不经过整机总线,效率高、EMI也好控制。MP2642GR-Z 就是一颗专门干这个活的控制器。
1.2 方案选型:为什么是 MP2642GR-Z + ATmega324PA
选型时我其实纠结过三个方向:
第一,用全模拟的比较器搭均衡电路。不用单片机,压差超过阈值就自动启动。优点是没有代码,缺点是策略固定、阈值不灵活、没法上报状态,而且温漂控制得靠精密电阻堆成本。对于要量产的产品,这种方案后期维护很痛苦。
第二,用一颗带均衡功能的电池保护IC。很多保护芯片集成了被动均衡或者简单的主动均衡。好处是外围少,但均衡开关时刻、电流大小、死区时间都不是开放的,调试空间很小。对于双串小系统看似够用,可一旦你想加温度补偿、SOC联动、定时均衡这些策略,芯片内部逻辑就成瓶颈了。
第三,就是我最终选定的方向:专用均衡控制器 + MCU。MP2642GR-Z 负责功率级的开关时序和峰值电流控制,ATmega324PA 负责电压采集、策略判决、状态上报。这么做最大的好处是“功率级黑盒化、策略级全开放”。MP2642GR-Z 管好电感充放电的微观时序,ATmega324PA 管好“什么时候均衡、往哪个方向均衡、均衡到多少压差停止”这些宏观决策。两边各干各擅长的,系统复杂度被拆得很干净。
ATmega324PA 这颗MCU是8位AVR架构,主频最高20MHz,Flash 32KB,SRAM 2KB,带10位ADC、USART、SPI、I2C。它的优势不是性能强,而是在这种慢速闭环里性能冗余很大、外设够用、价格友好,而且哪怕在-40℃工业温度范围内也能跑得很稳。对一个均衡策略周期通常在数百毫秒到数秒的控制系统,它的大多数时间都在闲着睡低功耗模式,非常适合电池长期挂在系统里的场景。
1.3 系统架构全景
整个系统的硬件链路不算长:
两节串联电池的正负极引出电压采样点 → 分压电阻网络 → RC滤波 → ATmega324PA 内部ADC。MCU根据采样结果判断压差和方向 → GPIO输出控制信号 → MP2642GR-Z 的使能与方向引脚 → 功率级通过外部电感在电池间转移能量 → 均衡电流采样电阻反馈回 MCU ADC,形成闭环。
另外,ATmega324PA 还挂了一路NTC采集电池温度、一路UART输出调试数据。温度参与策略判决:温度高于45℃强制停止均衡,以免在故障电池上持续加热。UART则每秒输出一次电压、电流、状态机,方便联调时看内部运行状况。
这种结构还有一个容易被忽略的好处:MCU和功率级是异步的。即使单片机死机或者程序跑飞,MP2642GR-Z 的硬件保护仍然能保证均衡电流不会失控,不会出现把某一节电池反充到爆炸的情况。这一点在储能系统里非常重要,因为均衡电路通常和电池直接相连,不具备整机断电条件。
2. 硬件电路核心设计
2.1 电感式相邻电池均衡拓扑的原理细节
先把这个拓扑的工作原理讲透。两节电池串联,连接点叫电池中点 Vmid。MP2642GR-Z 在内部集成了两个功率开关管,负责交替把电感的两个端点连接到 Cell1 的正端或者 Cell2 的负端。
假设 Cell1 电压高于 Cell2,均衡方向就是把 Cell1 的能量搬到 Cell2。工作过程分成两步:
第一步,Cell1 通过开关管给电感充电,电感电流线性上升,磁场储能。这个阶段电感两端电压基本等于 Cell1 电压,电流上升斜率是 V_cell1 / L。
第二步,开关管断开,电感电流不能突变,电流通过另一个开关管和续流二极管进入 Cell2,电感把储存的能量释放给 Cell2。这个阶段电感两端电压被 Cell2 的电压钳位,电流以 V_cell2 / L 的斜率线性下降。
两个阶段交替,就形成一个标准的 buck-boost 能量搬移过程。搬移功率等于电感每个周期的储能乘以开关频率。
和普通 buck-boost 电源不同的是,这个电路的输入侧和输出侧都不是稳压源,而是电压随时可能变化的电池。因此,均衡电流不是恒定的,它和两节电池的电压差、电感量、开关频率都有关系。这也是为什么要用MCU做闭环控制,不能像普通电源一样固定占空比开环跑。
MP2642GR-Z 把这两个开关管和驱动、峰值电流检测都集成好了,外部只需要配一个电感、两个限流电阻、一个采样电阻以及几个引脚配置电阻。MCU甚至不需要输出PWM,只需要给出“开/关”和“方向”两个电平信号,芯片内部会自己产生高频开关时序。这大大降低了固件复杂度,也保证了开关频率的稳定性不会受MCU主频影响。
2.2 电感选型与参数计算
电感是整个均衡功率级的核心元件。我这边目标均衡电流是平均1A,峰值不超过2.5A,电池平台电压3.2V(磷酸铁锂),开关频率取400kHz左右。
根据伏秒平衡,每个开关周期内电感储能和释能必须相等,占空比 D 由两个电池电压决定:
D = V_cell2 / (V_cell1 + V_cell2)
搬移功率 P = V_cell1 × V_cell2 / (V_cell1 + V_cell2) × I_L_avg
均衡电流和电感纹波的关系是:
ΔI = V_cell1 × D / (L × f_sw)
代入典型值,Cell1 = 3.4V,Cell2 = 3.0V,D = 3.0 / 6.4 ≈ 0.47,f_sw = 400kHz,如果选 L = 6.8µH,则:
ΔI = 3.4 × 0.47 / (6.8e-6 × 4e5) ≈ 0.59A
平均值1A时,峰值电流约1.3A。但如果电池压差很小,占空比接近0.5,且平均电流还是1A,纹波电流占比就会变大。为了保险,我最后选了感值5.6µH、饱和电流3.5A的功率电感。这个余量看起来很大,但储能系统里电池电压会随着温度变化,磷酸铁锂在低温平台电压会明显下降,占空比变动范围比想象中宽,饱和电流余量不足的话,电感进入饱和后均衡电流会失控,轻则发热重则烧开关管。
选择磁芯材质时,我用的是铁硅铝合金磁环电感。这种材质的饱和曲线是缓变型的,即使瞬间过流也不会像铁氧体那样直接掉感值,对均衡这种电流波动大的工况更友好。如果手头只有铁氧体电感,起码要把饱和电流余量放到1.5倍以上。
2.3 电压采样与反向保护电路
均衡电路对电压采样的要求其实很高。原因很简单:主动均衡的启动阈值往往设置在10mV级别,而10位ADC在2.048V基准下,一个LSB就是2mV。也就是说,如果采样电路不做足功夫,ADC本身的量化误差就能吞掉一半的均衡精度。
我的做法是三段式处理:
第一段,分压。使用精度0.1%的薄膜电阻,把电池电压分压到ADC可测范围。Cell1正极到地、Cell2正极到地各一条支路,分压比选1/2.5左右,保证最高4.35V电池电压时ADC输入不超过参考电压。
第二段,RC滤波。在每个采样点对地和ADC引脚之间都加一个RC低通滤波,截止频率取5Hz左右。这个频率远低于均衡开关频率,能有效滤掉电感电流切换引起的电压纹波。R取100kΩ、C取330nF,时间常数33ms,ADC每次读取前等50ms再采,确保电容电压稳定。
第三段,软件滤波。ATmega324PA 每次均衡启动前,连续采样32次,去掉最大值和最小值后做平均,等效分辨率可以提升约2.5位,相当于把一个采样周期内的噪声压低到0.5mV级别。
还有一路比较容易被忽略的:均衡启动瞬间,电池电压会明显跌落,因为电池有内阻。如果MCU在均衡运行中持续采样并实时调整策略,很可能误判“压差还没消除”或者“电压跳变异常”。我在固件里专门做了处理:电压判决只用均衡停止后300ms的采样值,均衡运行期间只检测过压和过温保护。
ATmega324PA 的ADC参考电压我接了外部基准,没有用内部2.56V。内部基准的温漂和噪声对10mV级别均衡阈值来说太大了。外部基准选了一颗2.048V、初始精度0.1%、温漂5ppm/℃的芯片。这个投入换来的稳定性,在45℃储能柜里对比特别明显——用内部基准时,早上和下午的均衡启动点能差20mV,换外部基准后一直稳在设定值附近。
3. 固件实现与均衡控制策略
3.1 软件状态机的设计与流转逻辑
固件整体逻辑不复杂,但我坚持用了经典状态机结构,而不是简单的主循环if判断。原因很现实:均衡系统存在多个需要互斥的状态,比如“正在均衡Cell1到Cell2”和“正在均衡Cell2到Cell1”绝对不能同时发生,用状态机可以天然保证这种互斥关系。
状态机一共五个状态:
- IDLE:空闲态。定时采样电压和温度,判断压差是否超过启动阈值。
- PRE_BALANCE:预均衡态。确认压差方向后,启动MP2642GR-Z,等待300ms,比较启动前后的电压变化,确认均衡电流正常建立。
- BALANCING:均衡态。持续均衡,同时监控温度、电压、运行时间。
- DONE:完成态。压差降到死区以下,关闭均衡,记录本次均衡时长。
- FAULT:故障态。过温、过压、均衡电流异常、通信异常时进入,需要复位或断电才能退出。
状态流转的触发条件我做了滞回处理。比如启动阈值是10mV,停止阈值是3mV,那么从IDLE进入PRE_BALANCE需要压差大于12mV(加了2mV噪声余量),从BALANCING退出到DONE则要压差小于3mV且持续5个采样周期。这两个数字我实测调过很多次。如果滞回太小,电池稍微波动就会反复启停,继电器和MOS管开关次数暴增;如果滞回太大,均衡结束后残余压差偏高,影响系统效率。
3.2 电压测量与数字滤波算法
ADC采样最怕的不是噪声,而是间歇性的尖峰。均衡电路开关节点的dV/dt很高,即使PCB布局做得再好,采样线路上也会耦合到开关尖峰。如果滤波算法只做平均值,几个尖峰就能把结果拉偏。
我用的组合:中值滤波 + 滑动平均。
第一步,连续采样16次原始ADC值,排序后取中间值。这一步把尖峰干扰直接剔除,中值滤波对脉冲噪声几乎是免疫的。
第二步,将中值结果送入长度为8的滑动窗口做平均。这一步进一步平滑电池本身的随机波动,同时保证响应速度不至于太慢。
实测下来,这套组合能把采样标准差压到0.8mV以内,比单纯32次平均的效果好很多。而且计算量在ATmega324PA上毫无压力——16个样本的排序用冒泡排序实现,8MHz主频下耗时不到1ms。
还有一个小细节:分压电阻虽然用了0.1%精度,但是每一批PCB的电阻实际值总有离散,所以我在EEPROM里存了两个该校准系数,生产时用高精度电压源逐台标定。标定过程很简单——输入一个已知电压,读取ADC原始值,反推分压比修正系数。这一步在实验室里觉得麻烦,到了产线才发现是救命的。不标定的板子,两节电池充电到相同电压时,采样误差最多能到15mV,均衡系统会一直错误启动。
3.3 均衡方向判定、启停逻辑与保护策略
均衡方向判定不需要额外硬件,直接比较两个ADC采样值即可。但实际中发现一个容易踩的坑:电池中点的电压不是恒定的。当Cell1均衡到Cell2时,中点电压会漂移,导致MCU从单个电池采样结果中扣除中点电压时出现误差。解决这个问题的方法不是修改硬件,而是固件里把两节电池的电压改为相对中点分开测量:Cell1的采样值等于Vbat+对地减去Vmid对地,两个差值独立计算,避免共模误差传递。
均衡运行中我设置了三个保护:
第一个是过温保护。NTC贴在电池表面,温度超过45℃立即停止均衡,且通过UART上报警告。这里不是随便设置的数字——磷酸铁锂在均衡电流1A下,电池表面温升通常不会超过5℃,但如果电池本身开路内阻变大,均衡电流会显著加热,温度上升速度就是故障信号。
第二个是均衡超时保护。单次均衡最长运行4小时,到点必须停止并冷却30分钟。正常工况下,10mV压差在1A均衡电流下半小时内就能拉回来,跑满4小时说明电池内部状态异常,继续均衡只会掩盖问题。
第三个是电流异常保护。采样电阻电压经过运放放大后送入MCU ADC,正常情况下均衡电流稳定在0.9~1.1A之间。如果采样值低于0.5A或高于1.8A,说明电感开路、开关短路或电池电压异常,立即停机并锁存故障码。设这个保护是因为MP2642GR-Z本身的峰值电流保护只能管住单周期峰值,对持续偏低或偏高的情况不敏感,需要MCU做宏观判断。
3.4 与上位机的UART通信与参数配置
调试阶段,我在UART上挂了一个简单协议,115200bps,每500ms发送一帧数据。帧格式是:帧头(0xAA55) + 状态字 + Cell1电压 + Cell2电压 + 均衡电流 + 温度 + 运行时间 + 校验和。
这套协议没有用MODBUS那种复杂结构,因为本地调试只需要单向上报就够了。但在量产版本里,我预留了双向指令通道:可以远程修改均衡启动阈值、停止死区、超时时间,避免每改一个参数就烧录一次固件。每个参数都校验上下限,防止误操作写入非法值把系统搞坏。
这里有一点需要注意:UART发送期间不要启动均衡。虽然均衡启动的电压判决用的是另一个采样通道,但UART的中断如果在ADC转换中途到来,理论上不会影响转换结果,实际测试中却发现打印数据量大的时候,均衡结束后的首次采样偶尔会被UART干扰。后来我干脆把UART发送放到了均衡停止后的静默窗口,问题就再没出现过。
4. 系统联调与问题排查
4.1 均衡功能实测与电流波形验证
电路板焊接好后,我先用两节3.2V的磷酸铁锂串联做测试,其中一节有意识放电到2.9V,另一节保持3.4V,压差500mV。这个初始压差远大于正常工况,目的是快速验证功率级能不能正确搬移能量。
上电后,MCU检测到压差超阈值,启动均衡,方向是Cell1→Cell2。用电流探头夹在电感和Cell2之间,能看到一个标准的三角波电流:上升沿斜率约0.6A/µs,下降沿斜率约0.5A/µs,频率402kHz,和设计计算基本吻合。平均电流约0.95A,没有超过设定目标。
测试了约20分钟后,压差从500mV降到320mV。均衡速度虽然比理论慢了一些,但考虑到电池内阻和电感DCR损耗,属于正常范围。我用万用表同时监测两节电池电压,确认没有出现“越均衡越失衡”的异常趋势。
接下来又做了一次反向测试:把高压电池改成Cell2,均衡方向必须自动翻转。MCU状态机上正确地在PRE_BALANCE阶段重新判定方向,电流波形随之反向。这个反向能力很重要,因为均衡系统不能假设哪一节电池一定是偏高的一方,双向均衡才叫主动均衡。
4.2 调试中遇到的4个典型问题
第一个问题是电感啸叫。刚开始通电时,整个板子发出刺耳的吱吱声,声音频率听得人头皮发麻。用频谱分析仪一看,MP2642GR-Z 的开关频率在300kHz附近,按理说超出人耳范围不该被听到。后来排查发现,不是基波在响,是占空比切换瞬间,电感电流进入断续模式,产生二分之一开关频率的振荡包络,刚好落在20kHz以下的可听范围内。解决办法是把电感值加大一档,从4.7µH改成5.6µH,让电感在最小均衡电流下也能维持连续导通模式,啸叫直接消失。
第二个问题是采样电压偏移。从原理上想不通:分压电阻精度高、基准也是外部的,为什么两个采样通道在相同电压下会差出8mV?后来用示波器量ADC引脚波形,发现开关节点的尖峰串到了采样电容上,充放电让ADC保持电容上的电压发生了偏移。处理办法是分压电阻和ADC引脚之间串了一个3.9kΩ的限流电阻,同时优化了PCB走线,让采样线远离开关节点。改版后偏移降到0.5mV以内。
第三个问题是均衡启动瞬间系统误报警。现象是均衡一开,MCU检测到Cell1电压瞬间跌了30mV,触发了低压报警。这个现象后来我确认是合理的——均衡电流1A流过电池内阻,压降本来就该有几十毫伏,采样点在电池电极附近,必然会看到这个跳变。对策是在报警逻辑里加了均衡使能标志,均衡运行期间不检测低压报警,只检测过压和过温。
第四个问题是温度保护误触发。调试重点放在电流和电压上,忽略了NTC的位置布局。最初我把NTC放到了均衡电感旁边,电感在充放电时的温升传导到NTC,系统跑20分钟就误报过温。后来把NTC移到了电池表面,和电感之间加了隔热垫,问题解决。这个坑提醒我:温度采样点尽量贴近被测物,不要贴在发热元件旁边,否则测到的永远是环境温度加元件温升,而不是电池的真实温度。
4.3 常见问题排查速查表
我把调试过程中最可能遇到的现象、原因和解决手段整理成一个速查表,方便遇到类似问题的人快速定位。
| 现象 | 可能原因 | 排查手段与解决方案 |
|---|---|---|
| 均衡启动后电流为0 | 方向接反、电感虚焊、使能引脚下拉 | 检查MP2642GR-Z的EN电平;用示波器看开关节点波形;用马甲线补焊电感焊盘 |
| 均衡电流超过设定值 | 峰值电流采样电阻阻值漂移、电感饱和 | 测量采样电阻实际阻值;用手持LCR表测电感是否在电流偏置下掉感值 |
| 均衡启动后电池电压跳变太大 | 电池内阻偏高、采样点离电池极耳太远 | 确认采样点靠近电芯本体;均衡电流降低至0.5A测试 |
| 电压采样结果漂移 | 分压电阻温漂、基准噪声 | 换0.1%低温漂电阻;示波器看ADC引脚纹波;确认基准负载电流稳定 |
| UART数据乱码 | 地环路干扰、波特率误差 | 示波器看TX波形边沿质量;确认晶振负载电容准确;接收端用同样的波特率误差范围 |
| 均衡结束后压差反弹 | 电池极化恢复、均衡深度不够 | 适当增加均衡时间;停止阈值再低2mV;检查电池是否老化 |
5. 量产一致性与扩展思考
5.1 从样品到量产:一致性、校准与可靠性细节
从打样到小批量,卡了三个平时实验室里注意不到的细节。
第一个是电感批次一致性。我从不同批次磁环电感里抽取10颗,测出电感量离散度达到15%。对均衡系统来说,电感量偏大偏小都会影响均衡电流:偏大电流小、均衡慢;偏小纹波大、开关管应力高。解决措施是把电感列为核心来料检验项,每批次进料都抽测电感量和饱和电流,超出公差范围直接退货。
第二个是电阻分压比的标定效率。前期手工标定一片板子要两分钟,产能根本撑不住。后来我改了产线流程:用可编程电源同时给两串电池加压到精确值,软件自动完成零点校准和增益校准,数据直接写入EEPROM,一片板子的标定时间压缩到15秒。这个方法也同步解决了“每一片板子分压电阻离散度不同”的问题。
第三个是MP2642GR-Z周边配置电阻的精度。功率控制器的工作频率、峰值电流由外部电阻设定,这些电阻如果不是精密类型,工作点会偏离设计值。我在BOM里把这类电阻全部指定为0.1%精度、25ppm温漂,单价虽然贵了几毛钱,但省去了产线逐台调试的巨额人工成本。这个投入在1000片产量时就已经回本了。
5.2 从两串扩展到更多串联电池的注意点
两串均衡做通以后,很自然会想扩展到四串、六串甚至更高。方向是对的,但有些设计在扩展时必须提前留好余地。
首先是通信拓扑。我目前MCU直接通过GPIO控制MP2642GR-Z,扩展后每增加一个均衡单元就得多占用一组GPIO。到了四串以上,建议改成SPI或I2C总线连接均衡芯片,地址由外部引脚配置,MCU通过总线广播命令,能大幅降低端口占用。
其次是均衡路径的邻居限制。电感式相邻均衡一次只能搬移相邻两节电池的能量,Cell1要均衡到Cell4,必须经过Cell2、Cell3逐一传递,效率会逐级衰减。我的经验是:超过4串的大型系统,建议改用变压器隔离的集中式均衡方案,或者采用多路开关切换的电容式均衡拓扑,否则均衡时间会指数级拉长。
再来说说软件架构。两串系统的状态机很简单,扩展到多串后必须引入“均衡调度器”的概念。调度器定期扫描所有电池电压,生成一个“是否需要均衡、方向、优先级”的任务队列,按优先级逐个执行。这个过程最容易犯的错是让优先级过高的任务一直霸占均衡器等资源,导致低优先级电池的电压差恶化,需要在策略上给每个任务设置最大连续运行时间和最小调度间隔。
5.3 当前方案可以继续深挖的两个方向
第一是SOC联动均衡。目前的方案只看电压差,但电压并不总是能反映SOC差异。磷酸铁锂电池的电压平台非常平缓,在SOC 30%~80%区间,电压变化很小;如果两个电池SOC差了10%,电压差可能只有几毫伏。更好的做法是把电流积分作为辅助判决条件,在充电、放电、静置三个状态下分别执行不同的均衡策略。
第二是故障诊断的深入化。均衡过程中积累的数据其实很有价值:均衡电流和电压变化率的比值,可以反推电池内阻;均衡结束后压差的恢复速度,可以判断电池极化状态。把这些数据存下来,定期做趋势分析,就能在电池容量衰减的前期预警。我目前已经在固件里增加了运行日志记录,定期导出到上位机做二次分析,等数据积累得差不多,再整理一篇文章专门聊这部分。
最后再分享一个小技巧:调试这种低功耗电池系统时,最好在电池正极串联一个保险丝或者可复位开关,然后功率地单独打孔走短粗线。我在初期联调时因为操作不小心,探针碰到均衡电感引脚,造成电池正负极瞬间短路,火花直接烧掉了MP2642GR-Z的采样电阻。后来加了保险丝,类似的失误最多烧掉保险丝,不至于整板报废。这套小保护,建议所有做电池相关硬件的人无条件加上,成本不到两块钱,关键时刻能救一块价值几百块的板子和一个完整的周末。