资讯动态

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

发布时间:2026/10/17 2:24:46 来源:尧图企业网站定制
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:18.4V进来变成1.4V在ADC量程内。中点电压用100k和30k分压分压比4.33:14.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[j1]) { uint16_t tmp buf[j]; buf[j] buf[j1]; buf[j1] 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.333V_mid adc × 4.096 / 4096 × 4.333。两颗电芯的电压分别是 V_cell1 V_total - V_midV_cell2 V_mid。压差就是 V_cell1 - V_cell2 的绝对值。当压差超过50mV时认为需要均衡低于20mV时认为均衡完成。中间加30mV的回差防止在阈值附近反复开关。3.3 UART通信协议设计PIC18F55K42 通过UART把数据发给主控协议要简单可靠。我用的是固定长度帧帧头0xAA 0x55然后是总电压高字节、低字节中点电压高字节、低字节温度高字节、低字节状态字节最后是校验和。状态字节的每一位代表不同含义bit0表示均衡进行中bit1表示过温bit2表示过压bit3表示欠压。主控收到后解析决定下一步动作。波特率设96008位数据位无校验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初始压差120mV2.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 我在这个项目里踩过的坑第一个坑是限流电阻封装选小了。一开始用06030.3W功耗下电阻表面温度到90度手都不敢摸。后来换1206温度降到45度。这个教训是功耗算完还要留余量封装宁大勿小。第二个坑是ADC参考电压没校准。第一批板子读回来的电压普遍偏高30mV以为是分压电阻问题换了1%电阻还是偏高。后来查手册发现内部参考电压有初始误差需要在程序里校准。校准后误差降到5mV以内。第三个坑是UART走线没注意。均衡电流路径和UART线平行走了5cm通信偶尔丢包。后来把UART线绕开加串联电阻和电容丢包率降到零。这个教训是强电和弱电走线要分开别图省事。6.4 后续可以优化的方向一个是加EEPROM存校准系数和配置参数。现在校准系数是写死在程序里的换一批板子要重新烧录。加EEPROM后产线校准一次就行程序不用改。另一个是加看门狗和故障记录。单片机跑飞了能自动复位故障发生时把电压温度状态存到EEPROM方便事后分析。备用电源系统很多时候无人值守故障记录很有价值。还有一个是优化均衡策略。现在是固定阈值压差超过50mV就均衡。可以改成自适应阈值根据电池容量和充放电状态动态调整。充电时阈值低一点放电时阈值高一点减少不必要的均衡动作。这套方案我前后调了两个月从原理图到PCB到程序踩了不少坑但最终跑得很稳。两颗电芯压差长期保持在20mV以内温度保护、通信上报都正常。如果你也在做类似的两串电池管理这个架构可以直接参考关键参数和注意事项我都列在上面了照着做能少走很多弯路。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑