资讯动态

两节串联锂电池主动均衡方案:MP2642GR-Z与PIC18F85K22实战

发布时间:2026/10/16 2:05:53 来源:尧图企业网站定制
1. 为什么两节串联电池的非均衡问题比想象中更棘手两节锂电池串联看起来是最简单的电池组结构。很多人第一反应是两节电池串起来用容量一致、内阻一致放电时电压同步下降能有什么问题但真正做过储能和备用电源系统的人都知道两节串联恰恰是最容易被忽视、又最容易出问题的配置。原因在于串联结构里电流是共同的但每节电池的实际状态是独立的。出厂时两节电池的容量可能只差2%但经过几十次充放电循环之后这个差异会被放大到5%甚至更多。容量小的那节电池会先到达充电截止电压而容量大的那节还没充满放电时反过来容量小的先到放电截止电压容量大的还有余量。整个电池组的可用容量被最弱的那节电池卡死了。这个现象在备用电源系统里尤其致命。备用电源的特点是长期处于浮充或待机状态偶尔才深度放电一次。长期浮充状态下如果两节电池的自放电率不同或者温度分布不均匀两节电池的端电压会逐渐拉开差距。等到真正需要备用电源顶上的时候你发现电池组的总电压看起来正常但实际能放出来的容量只有标称值的六七成。更糟糕的是过充和过放会加速弱电池的衰减形成恶性循环。均衡电路要解决的就是这个问题。它的核心思路是在充电过程中把电压偏高的那节电池的多余能量消耗掉或者转移到电压偏低的那节去让两节电池尽量同时到达满充状态在放电过程中尽量让两节电池同步放电避免某一节提前跌到截止电压。被动均衡用电阻放电简单便宜但效率低主动均衡用储能元件转移能量效率高但电路复杂。这次选用的方案是基于MP2642GR-Z这颗均衡控制芯片配合PIC18F85K22单片机来实现的走的是主动均衡路线但外围电路做了不少精简。先说说为什么选这两颗器件。MP2642GR-Z是一颗专门为多节电池均衡设计的控制IC内部集成了双向电流泵架构可以在相邻电池之间转移电荷。它的工作电压范围覆盖两节串联的典型电压区间静态电流很低适合长期待机的备用电源场景。PIC18F85K22则是一颗经典的8位单片机自带多路ADC和比较器用来采样每节电池的电压、控制均衡启停、通过UART上报状态资源刚好够用而且开发工具链成熟调试起来不折腾。两者配合一个管功率路径一个管逻辑和通信分工清晰。注意均衡电路不是万能的。如果两节电池的容量差异超过15%或者内阻差异超过20%均衡电路只能缓解问题不能根治。这种情况下应该先筛选配组再考虑加均衡。在实际动手之前有几个关键参数必须先想清楚。均衡电流要多大这取决于电池容量和期望的均衡时间。假设电池容量是2000mAh希望在一小时的充电过程中把5%的容量差异均衡掉那均衡电流至少需要100mA。MP2642GR-Z的典型均衡电流可以做到几百毫安具体取决于外部电感和采样电阻的选择。开关频率选多少这颗芯片支持外部时钟同步可以避开敏感频段。采样精度要求多高PIC18F85K22的12位ADC在参考电压4.096V时分辨率是1mV对于3.7V左右的锂电池电压监测来说够用了但要注意分压电阻的精度和温漂。还有一个容易被忽略的点均衡的触发条件。最简单的做法是电压差超过某个阈值就启动均衡但这样会在电池静置时频繁启停。更好的做法是结合充电状态来判断——只在充电过程中且电压差超过阈值时才启动均衡放电过程中只在电压差超过更大阈值时才启动。这样既能保证均衡效果又能减少不必要的能量损耗。具体的阈值设定需要根据电池特性和使用场景来调后面会详细展开。2. MP2642GR-Z与PIC18F85K22的硬件搭配逻辑2.1 MP2642GR-Z的内部架构与外围元件选型MP2642GR-Z的核心是一个双向电荷泵通过两个开关管交替导通把电荷从电压高的电池转移到电压低的电池。内部集成了功率开关和驱动电路外部只需要搭配一个电感和几个滤波电容就能工作。电感的选择很关键它决定了均衡电流的大小和纹波。根据芯片手册的推荐公式电感值可以根据期望的均衡电流和开关频率来计算。假设开关频率设为500kHz期望均衡电流200mA输入输出电压差在0.1V到0.5V之间那么电感值大概在10μH到22μH之间。实际选型时电感的饱和电流要留足余量至少是均衡电流峰值的1.5倍否则在大电流时电感饱和均衡效果会大打折扣。采样电阻的选择同样重要。MP2642GR-Z通过检测电池电压来决定均衡方向采样精度直接影响均衡效果。分压电阻的精度建议用1%或更高温漂要小于100ppm/°C。如果成本允许可以用0.5%精度的电阻。分压后的电压送到芯片的电压检测引脚芯片内部有比较器来判断哪节电池电压更高。这里有个细节分压电阻的阻值不能太大否则ADC采样时的输入阻抗会影响精度也不能太小否则会增加静态功耗。对于2000mAh的电池来说分压电阻的总阻值在100kΩ到200kΩ之间比较合适静态电流在几十微安级别对电池自放电的影响可以忽略。滤波电容的布局也有讲究。MP2642GR-Z的电源引脚需要就近放置一个1μF的陶瓷电容均衡输出端需要放置一个10μF的陶瓷电容来平滑电流纹波。这些电容要尽量靠近芯片引脚走线要短而粗减少寄生电感。如果PCB布局不当开关噪声会耦合到电压采样电路导致均衡误触发。我见过一个案例因为采样走线和功率走线平行走了一段结果均衡电路在充电时频繁误动作后来把采样走线改成垂直交叉问题就解决了。2.2 PIC18F85K22的资源分配与采样策略PIC18F85K22在这套方案里承担三个任务采样两节电池的电压、控制MP2642GR-Z的使能和方向、通过串口上报状态。这颗单片机有13路12位ADC我们只需要用其中两路来采样两节电池的分压电压。ADC的参考电压可以选择内部4.096V参考也可以用外部参考。内部参考的好处是省一个外部元件但精度略差外部参考可以用一颗高精度基准源精度能到0.1%。对于均衡应用来说内部参考的精度已经够用了因为均衡阈值本身就有一定的容差范围。采样策略上我建议用定时器触发ADC采样而不是在主循环里轮询。定时器每100ms触发一次ADC转换转换完成后在中断里读取结果并做滑动平均滤波。滑动平均的窗口取8个点既能滤掉高频噪声又不会引入太大的延迟。两节电池的电压采样要交替进行避免同时采样时ADC输入多路复用器的串扰。具体做法是先采样第一节电池等ADC转换完成后再切换通道采样第二节电池两次采样之间至少间隔一个ADC转换周期。提示PIC18F85K22的ADC在切换通道后需要一定的建立时间建议在通道切换后延时至少5μs再启动转换。这个延时可以用NOP指令实现也可以用定时器微调。串口通信方面PIC18F85K22的EUSART模块可以配置成9600bps或115200bps。如果只是上报电压和状态9600bps足够了如果需要实时上传波形数据建议用115200bps。通信协议可以自定义一个简单的帧格式帧头0xAA、命令字、数据长度、数据载荷、校验和。校验和可以用简单的累加和也可以用CRC8。对于备用电源系统来说通信不是核心功能简单可靠最重要。2.3 功率路径与信号路径的隔离设计均衡电路里功率路径和信号路径必须严格隔离。功率路径包括电池、电感、MP2642GR-Z的开关输出信号路径包括电压采样、ADC输入、单片机IO。如果两者不隔离功率路径上的开关噪声会通过地线耦合到信号路径导致采样误差甚至误触发。隔离的手段主要有三个单点接地、星型接地、以及物理分隔。单点接地的做法是把功率地和信号地分开走最后在电池负极处单点汇合。星型接地则是把所有地线都汇合到一个中心点避免地环路。物理分隔是在PCB布局时把功率区域和信号区域分开中间留出足够的间距至少2mm以上。如果空间允许可以在功率区域和信号区域之间加一条接地屏蔽线进一步减少耦合。还有一个细节MP2642GR-Z的使能引脚和方向控制引脚的电平要跟PIC18F85K22的IO电平匹配。如果单片机是3.3V供电而MP2642GR-Z的逻辑高电平阈值是2.0V那直接连接没问题。但如果单片机是5V供电而MP2642GR-Z的逻辑输入耐压只有3.6V那就需要加电平转换电路。最简单的电平转换可以用一个电阻分压但分压会降低驱动能力建议用专用的电平转换芯片或者MOS管做双向电平转换。3. 均衡控制逻辑的代码实现与参数整定3.1 电压采样与滤波的代码细节先看采样部分的代码。PIC18F85K22的ADC配置如下时钟选择Fosc/32参考电压选择内部4.096V结果右对齐通道切换后延时5μs再启动转换。采样两节电池的电压分别存在两个数组里做滑动平均。滑动平均的窗口长度取8用移位操作实现除法效率比较高。#define ADC_CH_BAT1 0 #define ADC_CH_BAT2 1 #define FILTER_WINDOW 8 unsigned int bat1_samples[FILTER_WINDOW]; unsigned int bat2_samples[FILTER_WINDOW]; unsigned char sample_index 0; unsigned int get_filtered_voltage(unsigned char channel) { unsigned int sum 0; unsigned char i; unsigned int *samples; if (channel ADC_CH_BAT1) { samples bat1_samples; } else { samples bat2_samples; } ADCON0bits.CHS channel; __delay_us(5); ADCON0bits.GO 1; while (ADCON0bits.GO); samples[sample_index] (ADRESH 8) | ADRESL; for (i 0; i FILTER_WINDOW; i) { sum samples[i]; } return sum 3; }这段代码里有个细节sample_index的更新放在主循环里每次采样完两节电池后递增。这样两节电池的采样窗口是同步的不会出现一节电池的窗口比另一节新很多的情况。另外ADC转换结果要转换成实际电压值需要乘以分压比和参考电压。假设分压电阻是100kΩ和100kΩ分压比是2:1参考电压是4.096V那么实际电压 ADC值 × 4.096 / 4096 × 2。这个计算可以用定点数实现避免浮点运算的开销。3.2 均衡启停阈值的计算与整定均衡启停阈值是这套方案里最需要仔细整定的参数。阈值设得太小均衡会频繁启停增加能量损耗阈值设得太大均衡效果不明显电池组容量还是被弱电池卡住。根据经验充电过程中的均衡阈值可以设在30mV到50mV之间放电过程中的均衡阈值可以设在50mV到80mV之间。为什么放电阈值更大因为放电时电压下降快如果阈值太小均衡电路还没来得及动作电压就已经跌到截止电压了。具体到两节锂电池满充电压是4.2V标称电压是3.7V放电截止电压是3.0V。充电时如果两节电池的电压差超过40mV就启动均衡把高电压那节的多余电荷转移到低电压那节。放电时如果电压差超过60mV也启动均衡但这时候均衡的方向是反的——把高电压那节的能量转移到低电压那节让两节电池同步下降。MP2642GR-Z支持双向均衡方向由芯片内部的比较器自动判断单片机只需要给出使能信号就行。注意均衡阈值不是固定不变的。电池老化后内阻增加电压差会变大这时候需要适当放宽阈值否则均衡电路会一直工作反而加速老化。建议每充放电100次后重新评估一次阈值。还有一个参数是均衡电流的限制。MP2642GR-Z的均衡电流由外部电感决定但单片机可以通过PWM调节使能信号的占空比来间接控制平均均衡电流。如果电池温度偏高可以降低占空比减少均衡电流避免温度进一步升高。温度采样可以用单片机内部的温度传感器也可以用外部NTC热敏电阻。内部传感器精度差一些但省一个元件外部NTC精度好但需要额外的ADC通道和分压电路。3.3 状态机设计与异常处理均衡控制逻辑用一个简单的状态机来实现比较清晰。状态机有四个状态空闲、充电均衡、放电均衡、故障。空闲状态下单片机每100ms采样一次电压判断是否满足均衡条件。如果满足充电均衡条件进入充电均衡状态使能MP2642GR-Z并设置方向如果满足放电均衡条件进入放电均衡状态。故障状态下关闭均衡使能通过串口上报故障码。异常处理要考虑几种情况电池电压过高或过低、电压差过大、温度过高、均衡超时。电池电压过高或过低时直接进入故障状态关闭均衡防止过充或过放。电压差过大比如超过200mV说明电池一致性已经很差了均衡电路可能无能为力这时候也进入故障状态上报需要维护。温度过高时降低均衡电流或者暂停均衡等温度降下来再恢复。均衡超时是指均衡状态持续超过一定时间比如30分钟电压差还是没有缩小到阈值以下说明均衡电路可能有问题进入故障状态。typedef enum { STATE_IDLE, STATE_CHARGE_BALANCE, STATE_DISCHARGE_BALANCE, STATE_FAULT } balance_state_t; balance_state_t current_state STATE_IDLE; unsigned int fault_code 0; void balance_state_machine(void) { unsigned int v1 get_filtered_voltage(ADC_CH_BAT1); unsigned int v2 get_filtered_voltage(ADC_CH_BAT2); unsigned int diff (v1 v2) ? (v1 - v2) : (v2 - v1); switch (current_state) { case STATE_IDLE: if (v1 4200 || v2 4200 || v1 3000 || v2 3000) { current_state STATE_FAULT; fault_code 0x01; } else if (diff 40 is_charging()) { current_state STATE_CHARGE_BALANCE; enable_balance(); } else if (diff 60 is_discharging()) { current_state STATE_DISCHARGE_BALANCE; enable_balance(); } break; case STATE_CHARGE_BALANCE: if (diff 20 || !is_charging()) { current_state STATE_IDLE; disable_balance(); } break; case STATE_DISCHARGE_BALANCE: if (diff 30 || !is_discharging()) { current_state STATE_IDLE; disable_balance(); } break; case STATE_FAULT: disable_balance(); if (fault_code 0x01 v1 4200 v2 4200 v1 3000 v2 3000) { current_state STATE_IDLE; fault_code 0; } break; } }这段代码里is_charging()和is_discharging()可以通过检测总电压的变化趋势来判断也可以通过外部充电器给出的信号来判断。如果系统里有充电管理芯片直接读它的状态引脚最可靠。如果没有可以用总电压的斜率来判断总电压在上升就是充电在下降就是放电。斜率计算可以用两次采样的差值除以时间间隔简单有效。4. 实测中暴露的问题与排查过程4.1 均衡电流不达预期电感选型的教训第一版样板焊好之后上电测试发现均衡电流只有不到50mA远低于设计的200mA。用示波器看MP2642GR-Z的开关波形发现开关频率只有200kHz左右而设计值是500kHz。频率偏低导致电感电流纹波变大平均电流上不去。检查外围元件发现电感用的是22μH而根据实际频率和电压差计算应该用10μH。换用10μH电感后开关频率升到480kHz均衡电流达到180mA接近设计值。这个问题的根因是电感值和芯片内部振荡器的频率匹配。MP2642GR-Z的开关频率由内部振荡器决定但外部电感值会影响开关管的导通时间进而影响实际频率。电感值偏大时电流上升慢开关管导通时间变长频率下降。所以选电感时不能只看手册的推荐值还要结合实际电压差和期望电流来算。计算公式是L (Vin - Vout) × Ton / ΔI其中Ton是开关管导通时间ΔI是电流纹波。对于两节锂电池Vin - Vout在0.1V到0.5V之间Ton在1μs左右ΔI取均衡电流的30%算出来L在10μH到22μH之间。实际选型时先选一个中间值比如15μH然后根据实测波形微调。提示如果手头没有合适的电感可以用两个电感串联或并联来凑。串联增加电感值并联减小电感值。但要注意并联时两个电感的参数要一致否则电流分配不均。4.2 采样跳变导致均衡误触发地线布局的坑第二版样板优化了布局但测试时发现一个奇怪的现象均衡电路在电池静置时偶尔会自己启动持续几秒钟又自己停掉。用示波器看采样电压发现ADC读到的电压值有几十毫伏的跳变。排查后发现MP2642GR-Z的功率地和PIC18F85K22的信号地在PCB上有一段共用走线功率地上的开关噪声通过这段共用走线耦合到了信号地导致ADC采样不准。解决方法是把功率地和信号地完全分开在电池负极处单点连接。具体做法是在PCB上划一条分割线把功率区域和信号区域分开功率地走线在分割线一侧信号地走线在另一侧最后在电池负极的焊盘处用一根粗铜线连接。改版后采样跳变从几十毫伏降到几毫伏均衡误触发的问题消失了。这个坑很典型很多新手在布局时只关注信号走线忽略了地线布局。记住一个原则功率地和信号地要分开走最后单点汇合。汇合点选在电池负极或者电源输入滤波电容的接地端这样功率电流的回路不会经过信号地。4.3 高温环境下均衡效率下降温度补偿的必要性夏天在高温环境下测试时发现均衡电流比常温时低了20%左右。用热成像仪看MP2642GR-Z的芯片温度到了85°C电感温度也有70°C。查手册发现芯片内部有温度保护当结温超过一定值时会降低开关频率来减少发热导致均衡电流下降。电感的高温特性也有影响铁氧体电感在高温下饱和电流会降低等效电感值也会变化。解决办法有两个一是降低均衡电流减少发热二是加温度补偿根据温度调整均衡策略。具体做法是在单片机里读温度传感器的值当温度超过60°C时把均衡电流限制在额定值的70%当温度超过80°C时暂停均衡等温度降下来再恢复。温度传感器可以用MP2642GR-Z内部的也可以用外部的NTC。内部传感器通过芯片的STATUS引脚读取精度差一些但省事外部NTC精度好但需要额外的ADC通道。注意高温环境下电池本身的特性也会变化内阻降低电压差可能变小均衡需求反而没那么迫切。所以温度补偿不仅要限制均衡电流还要适当调整均衡阈值。4.4 长期浮充下的均衡策略优化备用电源系统长期处于浮充状态电池电压维持在4.1V左右不充满也不放空。这种状态下两节电池的电压差通常很小但如果自放电率不同电压差会慢慢拉大。最初的策略是电压差超过40mV就启动均衡结果发现均衡电路每隔几小时就启动一次每次持续几分钟虽然每次消耗的能量不多但长期累积下来也可观。优化后的策略是浮充状态下把均衡阈值提高到60mV并且只在电压差持续超过阈值30分钟后才启动均衡。这样均衡启动的频率从每几小时一次降到每天一两次能量损耗大幅降低。同时在浮充状态下均衡电流也限制在额定值的50%因为浮充时电压差小大电流均衡反而容易引起电压波动。这个优化带来的效果很明显备用电源系统的待机功耗从原来的每月自放电5%降到3%左右电池组的循环寿命也延长了。具体的阈值和延时参数需要根据电池特性和使用场景来调没有万能值。我的经验是先设一个保守值观察一周的均衡启动次数和能量损耗再逐步调整。5. 从这套方案延伸出的几条实用经验这套基于MP2642GR-Z和PIC18F85K22的均衡方案前后调试了三个版本踩了不少坑也积累了一些可以复用的经验。第一条经验是关于器件选型的均衡芯片的均衡电流能力要留足余量至少是期望值的1.5倍。因为实际工作中电压差、温度、电感公差都会影响均衡电流留余量才能保证在最差情况下也能达到期望的均衡效果。MP2642GR-Z的标称均衡电流是500mA实际用到200mA到300mA比较稳妥。第二条经验是关于采样精度的不要迷信ADC的分辨率实际精度取决于参考电压、分压电阻、PCB布局和滤波算法。12位ADC在理想情况下分辨率是1mV但实际电路中分压电阻的温漂、参考电压的噪声、地线耦合的干扰都会让有效精度降到5mV甚至10mV。所以均衡阈值不能设得太小至少要是有效精度的3到5倍。如果有效精度是10mV阈值至少设30mV。第三条经验是关于状态上报的备用电源系统通常无人值守状态上报是唯一的监控手段。串口通信要加校验和重传机制确保数据可靠。上报的内容至少包括两节电池的电压、均衡状态、故障码、累计均衡时间。累计均衡时间这个参数很有用它能反映电池一致性的变化趋势。如果累计均衡时间突然增加说明电池一致性在恶化需要提前维护。第四条经验是关于测试的均衡电路的测试不能只测静态要测动态。静态测试只能验证采样和逻辑动态测试才能验证均衡效果。动态测试的方法是用两节容量不同的电池串联一节2000mAh一节1800mAh然后做完整的充放电循环记录两节电池的电压曲线和均衡电路的启停时间。如果均衡电路工作正常两节电池的电压差应该在充电末期缩小到20mV以内放电末期缩小到30mV以内。如果电压差没有缩小说明均衡电流不够或者阈值设置不当。最后一条经验是关于成本控制的这套方案的BOM成本主要在三块MP2642GR-Z芯片、电感、PIC18F85K22单片机。如果成本压力大可以把PIC18F85K22换成更便宜的单片机比如PIC16系列只要ADC精度和IO数量够用就行。电感可以用国产的但要注意饱和电流和温升指标。MP2642GR-Z是核心器件不建议替换因为它的双向均衡架构和低静态电流是这套方案的关键。如果实在要换可以考虑用分立元件搭一个类似的电路但调试工作量会大很多得不偿失。

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

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

免费获取报价 →
↑