ARTICLE · INTELLIGENCE

战地情报 · 详情页

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

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

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

1. 项目缘起与核心需求拆解

1.1 为什么串联电池组必须做均衡

但凡接触过锂电池组的人都知道一个常识:串联电芯之间的一致性,直接决定了整组电池的可用容量和循环寿命。两颗标称容量相同的电芯,出厂时容量差可能只有1%到2%,但经过几十上百次充放电循环之后,由于自放电率、内阻、温度分布的细微差异,容量差会逐渐拉大。这时候如果还按整组电压来判断充放电截止,容量小的那颗电芯会先被充满、先被放空,整组电池的实际可用容量就被那颗最弱的电芯卡死了。

我见过太多储能和备用电源项目,电芯本身品质不差,但因为没有做均衡,用了不到一年就出现明显的续航衰减。拆开一测,两颗串联电芯的压差能到200mV以上,一颗3.9V另一颗已经3.7V了。这种情况下继续充放电,弱电芯长期处于过充过放状态,内阻进一步恶化,形成恶性循环。

所以这个项目的核心需求很明确:在储能和备用电源系统里,对两颗串联的电池单元做主动或被动均衡,把压差控制在一个合理范围内,延长电池组整体寿命。标题里提到的MP2642GR-Z和PIC18F85K90,就是实现这个目标的硬件组合——前者是一颗电池管理前端芯片,后者是一颗带CAN控制器的8位单片机,负责逻辑控制和通信。

1.2 两颗串联电芯的均衡场景有什么特殊性

有人可能会问,两颗电芯的均衡有什么难的,随便找个均衡IC不就行了?这里面的门道其实不少。

两颗串联电芯的均衡,和动辄十几串的电动车BMS相比,看似简单,但应用场景完全不同。储能和备用电源系统通常要求长期在线、低功耗待机、偶尔大电流放电。这意味着均衡电路不能一直开着耗电,得在需要的时候才工作;同时系统往往有通信需求,要把电池状态上报给上位机或者主控板。

另外,两颗电芯的电压采样精度要求其实比多串系统更高。因为总共就两串,每一串的电压偏差对整组的影响权重更大。如果采样精度只有±50mV,那均衡的判据本身就不可靠了。MP2642GR-Z这类前端芯片的采样精度通常在±10mV以内,这是它适合这个场景的关键原因之一。

还有一个容易被忽略的点:两颗电芯的均衡电流怎么定。被动均衡靠电阻放电,电流一般几十毫安;主动均衡靠电感或电容搬移能量,效率高但电路复杂。对于储能和备用电源这种对成本敏感、对体积有一定要求的场景,被动均衡往往是更务实的选择,前提是均衡电流要匹配电芯的自放电差异和系统的工作占空比。

1.3 目标读者与前置知识

这篇内容适合谁看?如果你正在做储能电源、UPS备用电池、便携式储能站的BMS方案,或者你手头有个项目需要监控两颗串联电芯的状态并做均衡,那这篇东西应该能帮到你。前提是你对基本的模拟电路和单片机编程不陌生,至少知道什么是I2C、什么是ADC采样、什么是MOSFET驱动。

如果你是完全的新手,也没关系,我会尽量把每个环节的“为什么”讲清楚,让你知道每一步在干什么、为什么要这么干。但如果你连串联电池的基本原理都不清楚,建议先补一下基础,不然看下去会比较吃力。

2. 方案选型与核心器件解析

2.1 为什么选MP2642GR-Z做电池前端

MP2642GR-Z这颗芯片,是专门为多串电池管理设计的模拟前端。它内部集成了电压采样、电流采样、温度采样、被动均衡驱动等功能,通过I2C接口和主控通信。选它来做两颗串联电芯的均衡,主要看中几个点。

第一是集成度高。两颗电芯的电压采样、均衡MOSFET驱动、过压欠压保护,一颗芯片全包了。你不用再单独搭分压电阻网络和运放,省了板子面积也省了调试时间。第二是采样精度够用,前面说了,两颗电芯的场景对精度要求反而更高,MP2642GR-Z的电压采样误差在±10mV以内,做均衡判据完全够。第三是它支持被动均衡,内部有均衡开关,外面只需要接均衡电阻就行,电路简单可靠。

这里要说明一下,MP2642GR-Z的具体寄存器配置和引脚定义,不同批次的datasheet可能有细微差异,实际用的时候一定要以你手头那份官方文档为准。我下面讲的配置思路是基于常见用法的合理推断,不是照搬某个特定版本的手册。

2.2 PIC18F85K90的角色定位

PIC18F85K90是一颗8位单片机,带CAN控制器、多路ADC、I2C和UART。在这个方案里,它的角色是系统主控,负责几件事:通过I2C读取MP2642GR-Z的采样数据,根据压差判断是否需要开启均衡,控制均衡的启停,通过CAN或UART把电池状态上报给上位机,以及处理一些保护逻辑。

为什么选带CAN的PIC18F85K90?因为储能和备用电源系统里,CAN总线是非常常见的通信方式,抗干扰能力强,适合长距离传输。如果你只是做个简单的便携电源,用UART也够,但既然标题里指定了这颗片子,我们就按CAN通信来设计。

PIC18F85K90的ADC分辨率是10位,对于读取前端芯片的模拟输出来说够用了。它的I2C接口可以配置成主模式,直接和MP2642GR-Z通信。另外它的低功耗模式做得不错,适合备用电源这种需要长期待机的场景。

2.3 均衡方式的选择:被动还是主动

前面提到了被动均衡和主动均衡的区别,这里展开说一下为什么这个方案更适合被动均衡。

被动均衡的本质是把电压高的那颗电芯的多余能量,通过电阻以热量的形式消耗掉。效率低,但电路极其简单,成本也低。主动均衡是把能量从高电压电芯搬到低电压电芯,效率高,但需要电感、电容和复杂的开关网络,成本和体积都上去了。

对于两颗串联电芯的储能和备用电源场景,电芯之间的容量差异通常不会特别大,均衡电流有个几十毫安到一百毫安就够用了。被动均衡完全能胜任,而且可靠性更高——电阻和MOSFET的失效模式比电感电容简单得多。另外,储能系统本身对能耗不是特别敏感,损失的那点均衡能量相对于整组电池的容量来说微乎其微。

所以这个方案的核心思路就是:MP2642GR-Z负责采样和被动均衡驱动,PIC18F85K90负责逻辑判断和通信,两颗芯片通过I2C总线连接,构成一个完整的两串电池管理单元。

3. 硬件设计与关键参数计算

3.1 采样电路的设计要点

MP2642GR-Z的电压采样输入,通常需要外接RC滤波网络。这个RC网络的参数选择很关键,选大了响应慢,选小了滤波效果不好。

以两颗电芯为例,每颗电芯的电压采样点分别接到芯片的对应引脚。假设我们用的滤波电阻是100Ω,滤波电容是0.1μF,那么截止频率是:

f_c = 1 / (2π × R × C) = 1 / (2 × 3.14 × 100 × 0.1 × 10^-6) ≈ 15.9kHz

这个截止频率对于电池电压采样来说足够了,因为电池电压的变化非常缓慢,我们只需要滤掉高频噪声。但要注意,电阻不能选太大,否则会引入额外的压降,影响采样精度。100Ω的电阻在采样电流为微安级时,压降可以忽略不计。

另外,采样走线要尽量短,远离功率走线和电感等干扰源。如果板子空间允许,采样点直接从电芯正负极引出,不要和均衡电流路径共用走线,否则均衡开启时采样值会跳变。

3.2 均衡电阻和MOSFET的选型

被动均衡的核心是均衡电阻和驱动MOSFET。均衡电阻的阻值决定了均衡电流的大小,而均衡电流又决定了均衡速度和发热量。

假设我们希望的均衡电流是100mA,电芯最高电压按4.2V算,那么均衡电阻的阻值大约是:

R_bal = V_cell / I_bal = 4.2V / 0.1A = 42Ω

取标准值43Ω或者39Ω都可以。但要注意,均衡电阻的功率要留足余量。按100mA、4.2V算,电阻上的功耗是:

P = V × I = 4.2V × 0.1A = 0.42W

所以至少要选1W的电阻,最好选2W的,留一倍以上的余量。封装上,0805的电阻额定功率通常只有0.125W,肯定不行,得用1206或者更大的封装,或者用两个电阻并联分流。

MOSFET的选择相对简单,因为MP2642GR-Z内部通常已经集成了均衡开关,外面只需要接电阻就行。但如果芯片内部没有集成,就需要外接N沟道MOSFET,选低导通电阻、耐压20V以上的型号即可。栅极驱动电压要匹配芯片的输出电平,通常是3.3V或5V逻辑。

3.3 I2C总线的布线与上拉电阻

MP2642GR-Z和PIC18F85K90之间的I2C通信,是这套方案的数字核心。I2C总线的布线有几个讲究。

首先是上拉电阻的选择。I2C总线的上拉电阻通常取2.2kΩ到10kΩ之间,具体取决于总线电容和通信速率。如果通信速率是100kHz,总线电容在100pF以内,4.7kΩ是比较稳妥的选择。如果总线走线较长、电容较大,就要减小上拉电阻,比如2.2kΩ,但这样会增加功耗。

其次是走线。I2C的SCL和SDA要尽量平行走线,长度尽量短,远离功率电感和均衡电阻。如果板子上有多个I2C设备,要注意地址冲突问题。MP2642GR-Z的I2C地址通常是固定的或者通过引脚配置的,具体要看手册。

还有一个容易踩的坑:I2C总线上拉电阻的供电电压,要和芯片的IO电平匹配。如果MP2642GR-Z是3.3V供电,PIC18F85K90也是3.3V,那上拉电阻接3.3V没问题。但如果一边是3.3V一边是5V,就需要电平转换电路,否则可能损坏芯片。

3.4 电源与保护电路

储能和备用电源系统对可靠性要求高,所以电源和保护电路不能省。

MP2642GR-Z的供电通常来自电池组本身,通过一个线性稳压器或者DC-DC降到合适的电压。但要注意,电池组电压在放电过程中会下降,所以稳压器的输入范围要覆盖电池组的最高和最低电压。比如两颗串联的锂电,满电8.4V,放空6.0V,稳压器的输入范围至少要覆盖6V到9V。

保护电路方面,过压保护、欠压保护、过流保护都要有。MP2642GR-Z内部通常集成了过压欠压保护,但过流保护可能需要外部采样电阻和比较器来实现。另外,均衡电阻附近要留足够的散热空间,不要用热缩管把整个板子包死,否则均衡时局部温度会很高。

4. 软件逻辑与均衡策略实现

4.1 初始化流程与寄存器配置

PIC18F85K90上电之后,第一步是初始化自己的IO口、I2C模块、CAN模块和定时器。然后通过I2C向MP2642GR-Z写入配置寄存器,设置采样速率、均衡使能、保护阈值等参数。

这里要注意,MP2642GR-Z的寄存器配置通常需要按特定顺序写入,有些寄存器可能需要在特定模式下才能写入。我建议的做法是:先读一遍所有寄存器的默认值,确认通信正常,再按手册推荐的顺序逐项配置。配置完成后,再读回来验证一遍,确保写入成功。

初始化流程大致如下:

// 伪代码示意,具体寄存器地址以手册为准 I2C_Init(100000); // I2C初始化,100kHz CAN_Init(500000); // CAN初始化,500kbps Timer_Init(); // 定时器初始化,用于周期任务 MP2642_WriteReg(CONFIG_REG1, 0x01); // 使能电压采样 MP2642_WriteReg(CONFIG_REG2, 0x03); // 设置采样速率 MP2642_WriteReg(BALANCE_REG, 0x00); // 先关闭均衡 MP2642_WriteReg(PROTECT_REG, 0x1A); // 设置过压欠压阈值 // 读回验证 uint8_t val = MP2642_ReadReg(CONFIG_REG1); if (val != 0x01) { // 通信异常处理 }

这段代码只是示意,实际寄存器地址和配置值一定要以你手头的datasheet为准。我见过有人直接抄网上的配置代码,结果芯片版本不一样,寄存器定义变了,调了半天调不通。

4.2 电压采样与压差计算

初始化完成后,系统进入周期采样模式。PIC18F85K90每隔一定时间(比如100ms)通过I2C读取MP2642GR-Z的两颗电芯电压值,然后计算压差。

压差的计算很简单:

float v_cell1 = MP2642_GetCellVoltage(1); float v_cell2 = MP2642_GetCellVoltage(2); float v_diff = fabs(v_cell1 - v_cell2);

但这里有几个细节要注意。第一,采样值要经过滤波,不能直接用单次采样结果做判断。我通常会用滑动平均滤波,取最近8次采样的平均值,这样能有效抑制随机噪声。第二,压差判断要加迟滞,不能压差一到阈值就开均衡,压差一低于阈值就关均衡,那样会频繁启停。通常的做法是:压差大于50mV开启均衡,压差小于20mV关闭均衡,中间留30mV的迟滞带。

第三,均衡开启的条件不只是压差大,还要考虑电芯电压是否在合理范围内。如果电芯电压已经低于3.0V,这时候开均衡没有意义,反而可能把弱电芯放得更空。所以均衡的使能条件应该是:压差大于阈值 且 最高电芯电压高于某个下限(比如3.3V)。

4.3 均衡启停逻辑与状态机

均衡逻辑用一个简单的状态机来实现比较清晰。状态机有三个状态:空闲、均衡中、故障。

空闲状态下,系统周期采样,计算压差。如果满足均衡开启条件,切换到均衡中状态,通过I2C向MP2642GR-Z写入均衡使能命令,打开对应电芯的均衡开关。

均衡中状态下,系统继续采样,监控压差变化。如果压差降到关闭阈值以下,或者最高电芯电压降到下限以下,或者收到上位机的停止命令,就关闭均衡,回到空闲状态。如果采样值异常或者通信失败,切换到故障状态。

故障状态下,关闭均衡,记录故障码,通过CAN上报,等待上位机处理或者自动恢复。

状态切换的代码逻辑大致如下:

typedef enum { STATE_IDLE, STATE_BALANCING, STATE_FAULT } BalanceState; BalanceState state = STATE_IDLE; void Balance_Task(void) { float v1 = GetFilteredVoltage(1); float v2 = GetFilteredVoltage(2); float v_diff = fabs(v1 - v2); float v_max = (v1 > v2) ? v1 : v2; switch (state) { case STATE_IDLE: if (v_diff > 0.05 && v_max > 3.3) { EnableBalance(v1 > v2 ? 1 : 2); state = STATE_BALANCING; } break; case STATE_BALANCING: if (v_diff < 0.02 || v_max < 3.3) { DisableBalance(); state = STATE_IDLE; } break; case STATE_FAULT: DisableBalance(); // 等待故障清除 break; } }

这个逻辑很朴素,但实际跑起来很稳。关键是要把采样滤波和迟滞做好,不然状态机会频繁切换。

4.4 CAN通信与数据上报

PIC18F85K90自带CAN控制器,配置好波特率和验收滤波器之后,就可以周期性地把电池状态打包成CAN帧发出去。上报的数据通常包括:两颗电芯的电压、压差、均衡状态、故障码、温度(如果有温度采样的话)。

CAN帧的ID和数据结构要和上位机约定好。我一般会把电压值乘以1000转成整数发送,避免浮点数传输的麻烦。比如3.856V发送3856。压差同理,50mV发送50。

发送周期不用太快,1秒一次足够了。储能和备用电源系统对实时性要求不高,发送太快反而增加总线负载。如果压差变化剧烈,可以临时提高发送频率,但要有上限,不能把总线占满。

这里有个经验:CAN通信一定要加超时和重发机制。如果总线负载高或者有干扰,单次发送可能失败。我通常会在发送后等待应答,超时没应答就重发,重发三次还失败就记录通信故障。但要注意,重发不能无限循环,否则会阻塞主循环。

5. 调试与常见问题排查

5.1 采样值跳动大怎么办

采样值跳动是调试阶段最常见的问题。可能的原因有几个:滤波参数不合适、采样走线受干扰、均衡开启时采样点受影响、I2C通信误码。

排查顺序建议从软件到硬件。先看滤波参数,如果滑动平均的窗口太小,比如只取2次平均,那跳动大是正常的,加大到8次或16次试试。如果滤波加大了还是跳,就要查硬件了。用示波器看采样点的波形,如果有明显的高频噪声,说明滤波RC参数不对或者走线受干扰。如果均衡开启时采样值突然跳变,说明采样点和均衡电流路径有耦合,需要重新布线。

I2C通信误码也会导致采样值异常。可以在读取电压值的同时读一下通信状态寄存器,如果误码率高,检查上拉电阻和总线电容。我遇到过因为上拉电阻太大导致通信不稳定的情况,换成2.2kΩ之后问题消失。

5.2 均衡开启后压差反而变大

这个现象听起来反直觉,但实际调试中确实会遇到。原因通常是采样点位置不对。如果采样点取自均衡电阻之后,均衡电流在走线上产生的压降会被算进采样值里,导致采样到的电压并不是电芯的真实电压。

解决办法很简单:采样点一定要从电芯正负极直接引出,不要和均衡电流路径共用走线。如果板子已经做好了不好改,可以在软件上做补偿,但补偿值很难标定,不如改板子来得彻底。

还有一种可能是均衡通道搞反了。比如程序里判断电芯1电压高,应该开电芯1的均衡,结果开成了电芯2的,那压差当然越来越大。这种低级错误在调试初期很容易犯,建议在代码里加个打印,把判断结果和实际操作都输出出来,一眼就能看出来。

5.3 I2C通信失败怎么排查

I2C通信失败的表现是读不到数据或者读到的数据全是0xFF。排查步骤可以按这个顺序来:

先确认硬件连接,SCL和SDA有没有接反,上拉电阻有没有焊,供电有没有到。然后用示波器或者逻辑分析仪抓I2C波形,看有没有起始信号、地址字节、应答位。如果完全没有波形,说明主控的I2C模块没初始化好或者引脚配置错了。如果有起始信号但没有应答,说明从机地址不对或者从机没上电。如果有应答但数据不对,说明寄存器地址或者读写方向搞错了。

我踩过的一个坑是:MP2642GR-Z的I2C地址是7位的,但PIC18F85K90的I2C模块配置时,地址需要左移一位,最低位是读写位。如果直接把7位地址写进去,通信肯定失败。这个细节在手册里通常有说明,但很容易看漏。

5.4 均衡电阻发热严重

均衡电阻发热是正常的,但如果热到烫手甚至变色,说明功率余量不够。前面算了,100mA均衡电流下,43Ω电阻的功耗是0.42W,如果用的是0.25W的电阻,那肯定过热。换成1W或2W的,或者用两个0.5W的电阻并联,问题就解决了。

另外,均衡电阻的布局也要注意。不要把它放在温度敏感器件旁边,比如晶振、基准电压源。也不要把它放在电芯正上方,否则热量会传给电芯,影响电芯一致性。我通常会把均衡电阻放在板子边缘,周围留足够的铜皮散热。

还有一个细节:均衡电阻的走线要够宽。100mA电流虽然不大,但如果走线太细,也会有明显的压降和发热。一般1oz铜厚的话,走线宽度至少0.5mm,最好1mm以上。

5.5 常见问题速查表

现象可能原因排查方法解决措施
采样值跳动大滤波不足、走线干扰示波器看采样波形加大滤波窗口、优化布线
均衡后压差变大采样点位置错误、通道搞反检查采样点和均衡通道重新布线、修正代码
I2C通信失败地址错误、上拉电阻不当逻辑分析仪抓波形核对地址、调整上拉电阻
均衡电阻过热功率余量不足、走线太细测电阻温度、算功耗换大功率电阻、加宽走线
CAN通信丢帧总线负载高、终端电阻缺失看总线波形、查终端电阻降低发送频率、加终端电阻

6. 实操心得与扩展思路

6.1 调试顺序很重要

我建议的调试顺序是:先单独调通MP2642GR-Z的I2C通信,能正确读到电压值;再调通PIC18F85K90的CAN通信,能正常发送数据;最后把两者结合起来,加均衡逻辑。不要一上来就把所有功能都打开,那样出了问题很难定位是哪个环节的毛病。

单独调I2C的时候,可以用PIC18F85K90做一个简单的读写测试,每隔一秒读一次电压值并通过UART打印出来。确认电压值准确之后,再调CAN。CAN调通之后,再把均衡逻辑加进去。每一步都确认稳定了再走下一步,这样效率最高。

6.2 均衡阈值不要设得太激进

有些同行为了追求电芯一致性,把均衡开启阈值设得很低,比如压差20mV就开均衡。结果均衡频繁启停,电阻反复发热,反而影响可靠性。我的经验是,对于储能和备用电源场景,压差50mV开启、20mV关闭是比较合理的。如果电芯本身一致性很好,压差长期在30mV以内,那均衡基本不用怎么工作,这是最好的状态。

另外,均衡电流也不是越大越好。100mA的均衡电流,对于100Ah的储能电芯来说,均衡一整天才搬移2.4Ah的能量,相对于电芯容量来说很小。所以均衡的作用是“细水长流”地修正一致性,不是“快刀斩乱麻”地拉平压差。指望靠均衡把两颗差异很大的电芯拉回一致,是不现实的,那种情况应该换电芯。

6.3 后续可以扩展的方向

这套方案目前只做了两颗电芯的均衡,如果后续要扩展到四串甚至更多,MP2642GR-Z可能就不够用了,需要换成支持更多串数的前端芯片。但PIC18F85K90的主控逻辑和CAN通信框架可以复用,只需要修改采样和均衡的通道映射就行。

另一个扩展方向是加温度采样。电芯温度对均衡策略有影响,低温下不应该大电流均衡,高温下要降低均衡电流。可以在板子上加NTC热敏电阻,接到PIC18F85K90的ADC口,把温度纳入均衡使能条件。

还可以加历史数据记录功能。PIC18F85K90的Flash空间虽然不大,但记录一些关键事件(比如均衡开启次数、最大压差、故障记录)还是够的。这些数据对于分析电池组健康状态很有价值。

6.4 最后分享几个小技巧

第一个技巧:在均衡电阻旁边放一个LED指示灯,均衡开启时点亮。调试的时候一眼就能看出均衡有没有在工作,比看代码或者量电压方便多了。

第二个技巧:I2C通信加一个重试机制。单次读写失败不要立刻报错,重试两次再报错。很多偶发的通信失败重试一下就好了,没必要触发故障处理。

第三个技巧:CAN上报的数据里加一个计数器,每次发送递增。上位机如果发现计数器不连续,就知道丢帧了。这个计数器不占多少带宽,但排查通信问题的时候非常有用。

第四个技巧:板子做好之后,先不焊电芯,用可调电源模拟两颗电芯的电压,从3.0V到4.2V扫一遍,确认采样值和实际值的误差在允许范围内。这一步能提前发现采样电路的问题,避免焊上电芯之后返工。

这套方案我在几个备用电源项目里实际用过,两颗电芯的压差长期控制在30mV以内,均衡电路工作稳定,CAN通信也没出过问题。当然,每个项目的电芯特性、工作环境、成本要求都不一样,具体参数需要根据实际情况调整。但核心思路是一样的:选对前端芯片,做好采样滤波,均衡逻辑加迟滞,通信加保护,剩下的就是耐心调试了。

RELATED READING

延伸阅读

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