☰
基于MP2642GR-Z与PIC18F55K42的两串锂电池被动均衡方案设计与实现
2026/10/17 2:24:35 网站建设 项目流程

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

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

但凡接触过锂电池组的人都知道一个铁律:串联越多,一致性越难保。两个标称容量相同的电芯,出厂时容量差可能只有1%,但经过几十次充放电循环后,由于自放电率、内阻、温度分布的微小差异,容量差会逐渐拉大。串联回路里电流处处相等,容量小的那颗电芯会先被充满、也先被放空。充电时它先到上限电压,继续充就会过充;放电时它先到下限电压,继续放就会过放。过充过放对锂电芯来说都是折寿甚至要命的事。

所以串联电池组必须配均衡电路。均衡的本质就一句话:把电压高的那颗电芯里的多余能量,想办法消耗掉或者搬到电压低的那颗里去。前者叫被动均衡,后者叫主动均衡。我这个项目做的是两串电池单元的被动均衡方案,核心器件选了一颗专用均衡控制器加一颗通用单片机做管理。

1.2 为什么选 MP2642GR-Z 这颗芯片

MP2642GR-Z 是一颗专门为两串电池设计的均衡管理芯片,它的定位很清晰:集成度高、外围简单、适合小容量备用电源场景。我选它主要看中三点。

第一,它内部集成了均衡开关管,不需要外挂MOSFET。很多分立方案要自己搭两个N沟道MOS加驱动电路,PCB面积和物料成本都上去了。MP2642GR-Z 把开关管做在里面,外围只需要几个电阻电容,对空间敏感的产品非常友好。

第二,它自带过压保护和均衡启动逻辑。芯片会监测每颗电芯的电压,当某颗电芯电压超过设定阈值时,自动开启对应通道的均衡放电。这个阈值可以通过外部电阻分压来设定,不需要单片机干预,响应速度快。

第三,它的静态功耗很低。备用电源系统大部分时间处于待机状态,均衡电路如果静态电流大,反而会把电池放空。MP2642GR-Z 的待机电流在微安级别,长期挂载不会成为负担。

1.3 PIC18F55K42 在系统里扮演什么角色

有人会问,既然 MP2642GR-Z 已经能自动均衡了,为什么还要加一颗单片机?答案在于“管理”和“通信”。MP2642GR-Z 只负责执行均衡动作,它不知道电池组的总电压、充放电电流、温度,也没法把状态上报给上位机。PIC18F55K42 就是来补这块的。

PIC18F55K42 是Microchip的一款8位单片机,带12位ADC、多个定时器、UART和SPI接口,资源对于这个应用绰绰有余。它负责采集电池组总电压、两颗电芯的分压、NTC温度,通过UART把数据发给系统主控或者显示模块。同时它还能监控 MP2642GR-Z 的状态引脚,判断均衡是否在进行、有没有故障。换句话说,MP2642GR-Z 是“手脚”,PIC18F55K42 是“眼睛和嘴巴”。

1.4 这个方案适合谁参考

这套方案适合做小型储能、备用电源、便携设备电池包的人参考。比如户外应急电源、小型UPS、太阳能储能小系统,只要是两串锂电、容量不大、对成本敏感、又需要基本状态上报的场景,都可以直接抄这个架构。如果你做的是大容量动力电池或者多串高压系统,这个方案不适用,得换主动均衡或者专用BMS芯片。

2. 硬件架构与关键参数设计

2.1 整体框图与信号流向

整个系统分三块:电池组、均衡执行电路、管理采集电路。电池组是两颗锂电芯串联,中间引出中点。MP2642GR-Z 的两组电压检测引脚分别接两颗电芯的正负极,均衡输出引脚通过限流电阻接到电芯两端。PIC18F55K42 的ADC通道分别采集电池组总电压、中点电压、NTC分压,UART接到系统主控。

信号流向是这样的:电芯电压变化 → MP2642GR-Z 检测并决定是否均衡 → PIC18F55K42 采集电压温度 → 通过UART上报 → 主控决定是否继续充放电。均衡动作是芯片自主完成的,单片机不参与控制,只做监测和上报。这种分工的好处是均衡响应快,不受单片机程序跑飞的影响。

2.2 均衡电流怎么定

均衡电流是这套方案最核心的参数。电流太小,均衡效果慢;电流太大,电阻发热严重,PCB受不了。MP2642GR-Z 的均衡电流由外部限流电阻决定,公式是 I = Vcell / R,其中 Vcell 是电芯电压,R 是限流电阻。

我实测下来,两串锂电的均衡电流设在50mA到100mA之间比较合适。假设电芯电压3.7V,要得到80mA电流,电阻取 3.7V / 0.08A ≈ 46Ω,选标准值47Ω。这时候电阻功耗是 I²R = 0.08² × 47 ≈ 0.3W,得用0805或者1206封装的电阻,0603会烫得厉害。

如果均衡电流设到200mA,电阻功耗就接近1.5W,普通贴片电阻根本扛不住,得用功率电阻甚至加散热片。所以我的建议是:小容量备用电源,均衡电流50mA足够;如果电池容量超过5000mAh,可以适当加大到100mA,但要做好散热。

2.3 电压检测精度的保障

PIC18F55K42 的ADC是12位的,参考电压选内部4.096V。电池组总电压最高8.4V,中点电压最高4.2V,都需要分压后才能进ADC。分压电阻的精度直接影响电压检测精度。

我用的方案是:总电压用100k和20k分压,分压比6:1,8.4V进来变成1.4V,在ADC量程内。中点电压用100k和30k分压,分压比4.33:1,4.2V变成0.97V。分压电阻选1%精度的金属膜电阻,温漂50ppm以下。普通5%精度的碳膜电阻温漂大,夏天冬天读数能差几十毫伏,对于锂电来说几十毫伏已经不小了。

另外ADC输入端要加0.1uF滤波电容,靠近单片机引脚放置。电池线上的噪声、均衡开关动作时的尖峰,都会被这个电容滤掉。没有这个电容,ADC读数会跳得厉害,软件滤波都救不回来。

2.4 温度采集与保护逻辑

NTC选10k B值3950的常见型号,和10k上拉电阻分压后接ADC。温度计算用B值公式,或者直接查表。我在程序里用的是查表加线性插值,比实时算对数快得多,8位单片机算对数很吃力。

温度保护逻辑设了两级:一级是45度降额,均衡电流减半或者暂停充电;二级是60度切断,直接关断充电回路。备用电源系统很多时候放在密闭机箱里,夏天内部温度能到50度以上,没有温度保护很容易出事。

3. 软件实现与核心逻辑

3.1 PIC18F55K42 的ADC采集与滤波

ADC采集不能采一次就用,电池电压上有开关噪声、均衡动作的干扰。我的做法是每个通道连续采16次,去掉最大最小各2个,剩下12个取平均。这样一次采集大概耗时几百微秒,对于电池电压这种慢变量完全够用。

代码里用一个环形缓冲区存16次采样值,每次采完做一次排序,去掉头尾各2个,累加中间12个求平均。排序用冒泡就行,16个元素冒泡很快,8位单片机跑起来毫无压力。

#define ADC_SAMPLES 16 #define TRIM 2 uint16_t adc_filter(uint8_t channel) { uint16_t buf[ADC_SAMPLES]; uint16_t sum = 0; for (uint8_t i = 0; i < ADC_SAMPLES; i++) { buf[i] = adc_read(channel); } // 冒泡排序 for (uint8_t i = 0; i < ADC_SAMPLES - 1; i++) { for (uint8_t j = 0; j < ADC_SAMPLES - 1 - i; j++) { if (buf[j] > buf[j+1]) { uint16_t tmp = buf[j]; buf[j] = buf[j+1]; buf[j+1] = tmp; } } } for (uint8_t i = TRIM; i < ADC_SAMPLES - TRIM; i++) { sum += buf[i]; } return sum / (ADC_SAMPLES - 2 * TRIM); }

这段代码实测下来很稳,电压读数波动在正负5mV以内。如果不做滤波,波动能到正负30mV,根本没法用来判断均衡状态。

3.2 电压换算与均衡状态判断

ADC读回来的是0到4095的数字量,要换算成实际电压。公式是 V = adc_value × Vref / 4096 × 分压比。Vref是4.096V,分压比根据前面电阻计算。

总电压分压比是 (100k + 20k) / 20k = 6,所以 V_total = adc × 4.096 / 4096 × 6。中点电压分压比是 (100k + 30k) / 30k = 4.333,V_mid = adc × 4.096 / 4096 × 4.333。

两颗电芯的电压分别是 V_cell1 = V_total - V_mid,V_cell2 = V_mid。压差就是 V_cell1 - V_cell2 的绝对值。当压差超过50mV时,认为需要均衡;低于20mV时,认为均衡完成。中间加30mV的回差,防止在阈值附近反复开关。

3.3 UART通信协议设计

PIC18F55K42 通过UART把数据发给主控,协议要简单可靠。我用的是固定长度帧:帧头0xAA 0x55,然后是总电压高字节、低字节,中点电压高字节、低字节,温度高字节、低字节,状态字节,最后是校验和。

状态字节的每一位代表不同含义:bit0表示均衡进行中,bit1表示过温,bit2表示过压,bit3表示欠压。主控收到后解析,决定下一步动作。

波特率设9600,8位数据位,无校验,1位停止位。这个配置兼容性最好,主控那边不用特殊设置。发送周期100ms一次,对于电池监测来说足够快,也不会占用太多带宽。

3.4 MP2642GR-Z 状态引脚的读取

MP2642GR-Z 有一个状态输出引脚,均衡进行时拉低,空闲时高电平。PIC18F55K42 用一个普通IO口读这个引脚,加上10k上拉电阻。读之前先延时1ms去抖,连续读3次如果都是低电平才认为均衡在进行。

这个引脚不能直接接单片机中断,因为均衡开关动作时会有毛刺,容易误触发。用轮询加去抖最稳妥。我在程序里每10ms读一次,连续3次一致才更新状态。

4. 实操过程与调试记录

4.1 PCB布局的注意事项

均衡电路虽然简单,但PCB布局有几个坑。第一,MP2642GR-Z 的电压检测引脚要走差分线,尽量靠近电芯接线端子,不要和均衡输出的大电流路径平行走线。平行走线会有耦合,检测电压会被均衡电流干扰。

第二,限流电阻要放在MP2642GR-Z 和电芯之间,不要放在芯片和地之间。放在电芯侧,电阻发热不影响芯片;放在地侧,芯片地引脚会随均衡电流波动,影响内部基准。

第三,ADC分压电阻要靠近单片机引脚,滤波电容紧贴引脚。分压电阻如果离得远,走线电感会让滤波效果大打折扣。

第四,地线要单点接地。均衡电流的地和单片机的地在电池负极处汇合,不要在中途乱接。地线环路会让ADC读数带上均衡频率的纹波。

4.2 上电调试步骤

第一次上电不要直接接电池,先用稳压电源模拟两颗电芯。稳压电源设3.7V和3.8V,模拟压差100mV的情况。这时候应该能看到MP2642GR-Z 状态引脚拉低,均衡启动。

然后用万用表测限流电阻两端电压,算均衡电流。如果电流和设计值差太多,检查电阻值对不对、焊接有没有虚焊。我遇到过限流电阻虚焊的情况,状态引脚显示均衡中,但实际没有电流,电芯电压半天不降。

接着调ADC。用稳压电源从3.0V慢慢升到4.2V,看单片机读回来的电压和万用表差多少。如果误差超过20mV,检查分压电阻精度和参考电压。PIC18F55K42 的内部参考电压需要校准,可以在程序里加一个偏移量修正。

4.3 均衡效果实测

我用两颗2200mAh的电芯做测试,初始压差120mV。开启均衡后,压差逐渐缩小。前30分钟压差降得比较快,从120mV降到60mV;后面越来越慢,从60mV降到20mV用了将近2小时。这是被动均衡的固有特性:压差越小,均衡电流虽然不变,但需要转移的能量占总能量的比例在变化,而且电芯本身的极化电压也在恢复。

实测数据:均衡电流80mA,初始压差120mV,2.5小时后压差降到15mV。这个速度对于备用电源来说可以接受,因为备用电源大部分时间在浮充状态,均衡可以慢慢做。

4.4 温升测试

均衡电阻温升是重点。我用47Ω 0805电阻,均衡电流80mA,功耗0.3W。室温25度下,电阻表面温度稳定在55度左右,温升30度。这个温升在密闭机箱里会叠加,夏天机箱内50度时,电阻表面能到80度。虽然0805电阻额定功率0.125W,但实际0.3W已经超了,长期跑有风险。

后来我换成1206封装,同样47Ω,功耗一样,但散热面积大,表面温度降到45度,温升20度。所以我的经验是:均衡电阻功率至少留2倍余量,封装选1206以上,别用0603。

5. 常见问题与排查技巧

5.1 均衡不启动或频繁启停

均衡不启动,先查MP2642GR-Z 的使能引脚和供电。使能引脚如果悬空,芯片可能不工作。供电电压要在规定范围内,太低芯片不启动,太高会烧。

频繁启停通常是阈值设置太窄。压差在阈值附近波动,芯片就会反复开关。解决办法是加回差,比如启动阈值50mV,停止阈值20mV,中间30mV的回差。另外ADC滤波要做好,读数不稳也会导致误判。

5.2 ADC读数跳变或偏差大

读数跳变先查滤波电容。没有0.1uF电容,读数能跳几十毫伏。电容要靠近引脚,地线要短。如果加了电容还跳,检查分压电阻是不是离单片机太远,走线太长会引入噪声。

偏差大先查分压电阻精度。5%精度的电阻,分压比误差能到5%,8.4V上就是400mV误差。换1%精度电阻。再查参考电压,内部参考电压有初始误差,需要在程序里校准。校准方法:用高精度万用表测实际电压,和ADC读数对比,算一个修正系数存到EEPROM里。

5.3 均衡电阻发热严重

发热严重说明功耗超了。先算功耗:I²R。如果超过电阻额定功率的50%,就要换更大封装或者减小均衡电流。别想着加散热片,贴片电阻加散热片不现实,换封装最直接。

如果空间允许,可以把均衡电阻分散布局,不要挤在一起。两个电阻挨着放,热量叠加,温度更高。分开至少5mm,让空气对流。

5.4 通信丢包或数据错误

UART丢包先查波特率。单片机内部振荡器精度不够,波特率误差超过2%就会丢包。PIC18F55K42 可以用外部晶振,精度高得多。如果必须用内部振荡器,波特率选低一点,9600比115200容错率高。

数据错误查校验和。校验和算错说明传输过程中有干扰。检查UART走线有没有和均衡电流路径平行,平行走线会耦合噪声。UART线加100Ω串联电阻和100pF对地电容,能滤掉大部分高频干扰。

5.5 常见问题速查表

现象可能原因排查方法解决措施
均衡不启动使能引脚悬空、供电异常测使能引脚电压、测供电使能引脚接上拉或下拉、调整供电
均衡频繁启停阈值太窄、ADC读数不稳观察压差波动、看ADC原始值加回差、加强滤波
ADC读数跳变滤波电容缺失、走线太长检查电容、检查走线加0.1uF电容、缩短走线
ADC偏差大分压电阻精度低、参考电压未校准测电阻值、对比万用表换1%电阻、程序校准
均衡电阻发热功耗超额定、封装太小算功耗、摸温度换大封装、减小电流
通信丢包波特率误差、干扰测波特率、看波形用外部晶振、加滤波
温度读数异常NTC接触不良、分压电阻错测NTC阻值、查分压重新焊接、换电阻

6. 方案扩展与个人体会

6.1 从两串扩展到多串的思路

这套方案是两串,如果要扩展到三串或四串,MP2642GR-Z 就不够用了,得换支持更多串的均衡芯片。但架构思路是一样的:专用均衡芯片负责执行,单片机负责采集和通信。扩展时注意每颗电芯都要有独立的电压检测和均衡通道,单片机ADC通道要够用,不够就加模拟开关切换。

多串系统的地线布局更讲究,每颗电芯的检测地都要单独走线到芯片,不能共用。共用的话,均衡电流在地线上的压降会串到其他通道,导致电压检测错误。

6.2 主动均衡的适用场景

被动均衡把多余能量消耗在电阻上,效率低,但成本低、电路简单。如果系统对能耗敏感,比如太阳能储能,白天充晚上放,被动均衡消耗的能量也是宝贵的,这时候可以考虑主动均衡。主动均衡用电感或电容把能量从高电压电芯搬到低电压电芯,效率能到80%以上,但电路复杂、成本高。

我的建议是:小容量备用电源,被动均衡足够;大容量、频繁充放电的场景,主动均衡更划算。别为了省几块钱电费上主动均衡,电路复杂度上去了,故障率也上去了。

6.3 我在这个项目里踩过的坑

第一个坑是限流电阻封装选小了。一开始用0603,0.3W功耗下电阻表面温度到90度,手都不敢摸。后来换1206,温度降到45度。这个教训是:功耗算完还要留余量,封装宁大勿小。

第二个坑是ADC参考电压没校准。第一批板子读回来的电压普遍偏高30mV,以为是分压电阻问题,换了1%电阻还是偏高。后来查手册发现内部参考电压有初始误差,需要在程序里校准。校准后误差降到5mV以内。

第三个坑是UART走线没注意。均衡电流路径和UART线平行走了5cm,通信偶尔丢包。后来把UART线绕开,加串联电阻和电容,丢包率降到零。这个教训是:强电和弱电走线要分开,别图省事。

6.4 后续可以优化的方向

一个是加EEPROM存校准系数和配置参数。现在校准系数是写死在程序里的,换一批板子要重新烧录。加EEPROM后,产线校准一次就行,程序不用改。

另一个是加看门狗和故障记录。单片机跑飞了能自动复位,故障发生时把电压温度状态存到EEPROM,方便事后分析。备用电源系统很多时候无人值守,故障记录很有价值。

还有一个是优化均衡策略。现在是固定阈值,压差超过50mV就均衡。可以改成自适应阈值,根据电池容量和充放电状态动态调整。充电时阈值低一点,放电时阈值高一点,减少不必要的均衡动作。

这套方案我前后调了两个月,从原理图到PCB到程序,踩了不少坑,但最终跑得很稳。两颗电芯压差长期保持在20mV以内,温度保护、通信上报都正常。如果你也在做类似的两串电池管理,这个架构可以直接参考,关键参数和注意事项我都列在上面了,照着做能少走很多弯路。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询