两节串联锂电池放在一起用最让人头疼的往往不是容量下降而是几轮充放之后两节电池的电压开始“分道扬镳”。我之前做一个 2S 电池包的均衡方案时选用了 MP2642GR-Z 同步降压转换器作为能量搬运核心PIC18F4550 单片机负责采样、决策和控制专门解决储能和备用电源系统里两节串联电池电压不齐的问题。这篇文章把整个设计思路、电路参数、固件状态机和调试踩坑都整理出来适合对电池管理有一定基础、想自己动手做主动均衡的开发者参考。1. 串联电池失衡的代价为什么非做主动均衡不可1.1 两串电池的“木桶效应”比想象中更明显串联电池组有个绕不开的铁律容量取决于最弱的那节。两节标称 3.7V、容量 2.5Ah 的锂电芯出厂时电压差可能只有几毫伏但经过几十轮充放循环、温度差异、内阻增长不一致之后电压差会逐渐拉大到几十甚至上百毫伏。充电时电压高的那节先达到 4.2V保护板为了防止过充直接切断充电回路另一节永远充不满放电时电压低的那节先跌到截止电压整组系统立刻停止输出明明另一节还有不少电量。放在储能系统里这等于白白损失了可用容量放在备用电源里更致命的是负载切换瞬间需要电池组提供全部电流短板电池压降过大可能触发欠压保护整个备用系统直接失效。实际测试中我用两节同批次 18650 电芯做对比一组从不均衡一组每 50 次循环做一次均衡维护。到第 150 个循环时不均衡的那组整组可用容量只剩初始的 71%均衡组仍然保持在 87% 左右。所以对于串联电池单元均衡不是一个可做可不做的附加功能而是直接影响系统可用性和寿命的核心环节。1.2 被动均衡与主动均衡的取舍市面上很多成品 BMS 里用的均衡方案是被动均衡原理就是给每个电芯并联一个放电电阻和开关电压高的电芯通过电阻把多余能量以热量形式放掉。它的优点是电路极其简单一个电阻加一个 MOS 管就能做一路缺点也很明显能量被浪费掉而且均衡电流通常只有 30mA 到 100mA面对容量 2Ah 以上的电芯动辄需要几小时才能把压差压下来。主动均衡的思路完全不同。它是把能量从高电压电芯搬送到低电压电芯而不是烧掉。对两串电池来说能量搬运的拓扑也相对简单用一颗降压转换器从整组电池取电经过开关选择后给其中一节低压电芯充电。这种方案均衡电流可以做到 0.5A 到 1A速度快得多而且没有明显的发热点。你会问为什么不直接用专用的 BMS 均衡芯片这确实是最省事的路子但如果你需要自定义均衡时机、在上位机上报每节电芯状态或者希望深入理解均衡控制逻辑用通用 MCU 加 DC-DC 的方案反而更灵活。我选这个组合的另一个原因是 MP2642GR-Z 本身是一颗体积小、效率高的同步降压器件PIC18F4550 又自带 USB 和足够多的 ADC 通道后续扩展和调试都非常顺手。1.3 两个核心器件的分工逻辑MP2642GR-Z 的角色可以理解为“能量搬运工”。它从整组电池正极取电把 6.0V 到 8.4V 的电压降压成一个稳定的低压输出再由控制逻辑决定这份能量送到哪节电芯去。选择同步降压而不是普通的 LDO是因为均衡电流接近 1A 时线性降压的损耗太大了铜箔和芯片都会吃不消而同步降压效率通常在 90% 左右发热可控。PIC18F4550 则是整个系统的“决策中枢”。它负责两件事第一通过 ADC 实时读取两节电芯的电压计算当前压差第二根据压差和当前系统状态决定是否打开 MP2642GR-Z 的使能脚、导通哪一路选通开关。整套逻辑看起来不复杂但真正的难点在于采样精度、开关时序和迟滞控制后面我会逐一展开。2. 硬件电路详解采样差分、均衡通路与开关互锁2.1 两节串联电池的电压采样用差分放大器绕开“共地难题”两节电芯串联之后中间点电压是浮动的单片机的地通常接在电池组负极。如果直接把电池正极到中间点的电压用电阻分压后送进 ADC你会发现第二节电芯的电压根本测不准因为 ADC 引脚对地的压差并不是那节电芯的实际电压还叠加了第一节电芯的电位偏移。最简单的解决办法是使用差分放大器。我用两路运放搭建两个差分采样电路分别把“BAT 对 MID”和“MID 对 BAT-”的电压差转换成对地电压后送入 PIC18F4550 的 ADC 引脚。运放输出端的地和单片机共地所以采样和处理都顺理成章。差分采样电路的具体参数是这样的输入侧用两个 100kΩ 电阻串联做分压运放增益设置为 1这样 4.2V 的电芯电压经过分压后降到约 1.34V100k / (100k 47k) × 4.2V ≈ 1.34V完全落在 3.3V ADC 参考电压范围以内还留了余量。电阻务必选 1% 精度的薄膜电阻这里的精度会直接影响均衡判断的准确性我在后面踩坑章节会专门讲。2.2 MP2642GR-Z 的输出参数设置与电感电容选择MP2642GR-Z 在这套系统里的输入直接接整组电池也就是 BAT 和 BAT- 之间。它的输入电压范围覆盖 4.5V 到 19V所以无论是充满后的 8.4V 还是低压告警时的 6.0V都能正常工作。我设计的输出电压是 4.1V之所以不设成 4.2V是避免均衡时意外把电芯顶到过压保护值4.1V 这个值对 4.2V 满充的锂电芯来说既能保证明显的充电电流又留有安全裕度。输出电压由反馈电阻分压决定按 MP2642GR-Z 内部基准大概 0.8V 计算想要输出 4.1V反馈上电阻和下电阻的比例大约是 4.125 倍。我用了 41.2kΩ 和 10kΩ 的组合实测输出 4.08V误差在可接受范围。开关频率属于器件内部固定参数在 500kHz 量级所以我选了 10uH 的功率电感饱和电流要大于 2A确保在 1A 均衡电流下不会磁饱和输入侧放一个 22uF 陶瓷电容加一个 0.1uF 高频去耦电容输出侧用一个 22uF 陶瓷电容负责稳定输出。这里有个容易忽略的细节MP2642GR-Z 的 EN 使能脚必须由 PIC18F4550 的 GPIO 控制不能直接接高电平。因为均衡器不是一直工作的只有检测到压差超过阈值时才需要开启平时保持关断可以减少电池组的静态功耗。实测关断状态下整板静态电流不到 0.5mA对备用电源来说完全可以接受。2.3 选通开关阵列与互锁逻辑MP2642GR-Z 的输出只有一路但两个电芯都要能充电所以需要用 MOS 管做一个二选一的选通阵列。我用了两个逻辑电平 P 沟道 MOS 管分别控制“输出端到 B1 正极”和“输出端到 B2 正极”这两条通路。P 沟道 MOS 的接法是源极接 MP2642GR-Z 输出漏极接对应的电芯正极栅极通过一个三极管由单片机 GPIO 控制。GPIO 拉高时三极管导通P-MOS 栅极被拉低开关导通GPIO 拉低时开关截止。用 P-MOS 而不是 N-MOS 的原因在于N-MOS 高边驱动需要自举电路比较麻烦P-MOS 的驱动逻辑在低压系统里更直接。互锁逻辑是这个环节的重中之重。两路选通开关绝对不允许同时导通否则 MP2642GR-Z 的输出会同时连接到两节电芯相当于人为制造了一个半压节点轻则均衡失效重则损坏器件。我在硬件设计上做了双保险软件里通过状态机保证同一时刻只有一个 GPIO 输出高电平硬件上又把两路驱动信号做成交叉互斥即使单片机死机或者程序跑飞也不会出现两路同时导通的情况。2.4 均衡电流限制初级用电阻进阶用电流环MP2642GR-Z 的输出电压设定为 4.1V但电芯电压通常在 3.7V 到 4.0V 之间如果不加任何限流措施均衡瞬间的充电电流会很高可能直接触发降压器的过流保护或者对低压电芯造成冲击。我的初版方案比较简单在输出通路上串了一个 0.5Ω、1W 的功率电阻。假设被充电电芯电压 3.8V均衡电流理论峰值约为 (4.1V - 3.8V) / 0.5Ω 0.6A这个电流等级对 2.5Ah 的电芯足够温和。缺点也很明显电阻上的压降和功率损耗都不小均衡效率大概只有八成。如果想做得更讲究可以利用 MP2642GR-Z 的 COMP 引脚搭一个恒流环在输出回路串一个 0.05Ω 采样电阻用运放把采样电压放大后反馈到 COMP 端当电流超过设定值 0.8A 时自动拉低输出电压形成一个精准的恒流限制。这个方案效率更高但运放环路调试需要多花一些时间。对于初次尝试的开发者我建议先把电阻限流版本跑通再考虑升级电流环。3. 固件状态机的实现从 ADC 滤波到迟滞均衡的控制策略3.1 电压采样的精度处理平均滤波与两点校准PIC18F4550 的 ADC 是 10 位分辨率参考电压如果用 3.3V理论分辨率约 3.2mV。考虑到差分采样电路的衰减系数约 0.32折算到电芯侧的分辨率大约是 10mV。这个精度对于判断“压差是否超过 50mV”是够用的但如果直接把单次采样结果拿去用波动会比较大有可能导致均衡器频繁启停。我的处理方法是每 200ms 采样一轮每轮连续采样 10 次后取平均值。10 次平均能把大部分白噪声滤掉实测电压读数稳定在 ±5mV 以内足够可靠。如果能做到两点校准就更好了用高精度万用表实测电芯电压程序里记录两个点的偏移量然后线性修正每个电芯的采样结果。这个“实测校准 软件修正”的流程可以抵消分压电阻、运放偏置电压带来的系统性误差操作也不复杂。下面是一段典型的采样与滤波代码用 XC8 编译器编写#define ADC_REF_VOLTAGE 3.30f #define DIVIDER_RATIO 3.13f // 根据实际分压电阻标定 uint16_t adc_read_avg(uint8_t channel, uint8_t times) { uint32_t sum 0; uint8_t i; for (i 0; i times; i) { ADCON0 (ADCON0 0xC3) | (channel 2); GODONE 1; while (GODONE); sum (ADRESH 8) | ADRESL; __delay_ms(2); } return (uint16_t)(sum / times); } float get_cell_voltage_mv(uint8_t cell) { uint16_t adc; float mv; if (cell 0) { adc adc_read_avg(0, 10); // 通道0采样第一节 } else { adc adc_read_avg(1, 10); // 通道1采样第二节 } mv (float)adc * ADC_REF_VOLTAGE / 1023.0f * DIVIDER_RATIO * 1000.0f; return mv; }3.2 均衡状态机空闲、采样、路径选择与执行我把均衡逻辑实现成了一个简单的状态机四个状态分别是空闲、测量、均衡中、停止。每次进入测量状态都会重新读取两节电芯电压计算压差然后判断是否满足启动条件。启动条件有两个压差大于 50mV并且系统处于空闲状态。所谓空闲状态是备用电源系统没有在放电、充电器也没有在充电。这个判断可以通过一个外部引脚接收主机控制器的状态信号也可以简化成检测整组电流小于某个阈值。之所以强调空闲时才均衡是因为均衡和充放电同时进行可能产生环流也会干扰对压差状态的判断。当第二节电芯电压明显偏低时状态机进入均衡中打开对应的选通开关然后使能 MP2642GR-Z第一节电压偏低时走另一条路径。这里有一段核心逻辑代码展示了互锁判断typedef enum { BAL_IDLE, BAL_MEASURE, BAL_RUN, BAL_STOP } bal_state_t; bal_state_t bal_state BAL_IDLE; uint8_t target_cell 0; // 0:B1, 1:B2 uint16_t bal_timer 0; void balance_task(void) { int16_t v1 (int16_t)get_cell_voltage_mv(0); int16_t v2 (int16_t)get_cell_voltage_mv(1); int16_t diff v1 v2 ? (v1 - v2) : (v2 - v1); switch (bal_state) { case BAL_IDLE: if (diff BAL_START_MV system_is_idle()) { target_cell (v1 v2) ? 1 : 0; bal_state BAL_RUN; bal_timer 0; } break; case BAL_RUN: if (target_cell 0) { SWITCH_B1_ON(); // 内部先关闭B2通路 SWITCH_B2_OFF(); } else { SWITCH_B2_ON(); SWITCH_B1_OFF(); } BUCK_ENABLE(); bal_timer; // 每200ms执行一次本任务 if (diff BAL_STOP_MV || bal_timer BAL_TIMEOUT_TICKS) { BUCK_DISABLE(); SWITCH_B1_OFF(); SWITCH_B2_OFF(); bal_state BAL_IDLE; } break; } }注意代码里给 SWITCH_B1_ON() 和 SWITCH_B2_ON() 的实现做了隐含约束任何一路的 ON 操作都必须先确保另一路是 OFF。我在调试时遇到过只写“打开A路”没写“关闭B路”的低级错误导致两路同时导通所以在这个版本里把互锁动作直接写进了宏定义。3.3 迟滞区间、超时保护与安全边界均衡器和温控器类似如果没有迟滞区间会在启动阈值附近反复震荡。我用的启动阈值是 50mV停止阈值是 15mV中间这 35mV 的差值就是迟滞带。它的作用是一旦进入均衡状态只有压差真正压到 15mV 以下才停止而不是压差刚降到 48mV 就反复开关。实测下来迟滞带能让整个均衡过程变得平滑也减少了 MOS 管和降压器的开关次数。超时保护同样重要。我把最长均衡时间设置为 30 分钟超时后无论压差是否达到目标都会强制停止并记录一个均衡超时标志。这个标志可以用于诊断比如某节电芯电压持续偏低且长时间均衡无效很可能说明这节电芯已经有内阻增大或自放电异常的问题需要在主控制器上报警处理。此外我还加了几个基础保护阈值单节电芯电压超过 4.25V 触发过压告警并禁止均衡低于 3.0V 触发欠压告警。这两个保护不替代真正的电池保护板但可以在均衡器层面避免意外过充。整个保护逻辑用表格整理如下项目阈值动作均衡启动压差50mV进入均衡状态均衡停止压差15mV退出均衡状态单节过压保护4.25V禁止均衡并告警单节欠压保护3.00V禁止均衡并告警均衡超时30分钟强制停止并记录标志均衡电流上限0.8A受电阻限制硬件限流4. 实测数据与调试踩坑哪些问题会让均衡彻底失效4.1 从 120mV 到 15mV一次完整的均衡过程实测拿到初版电路后我在两节 18650 电芯上做了一轮完整测试。测试前先把第一节电芯人为充到 4.01V第二节电芯只充到 3.89V初始压差 120mV。系统上电后PIC18F4550 检测到压差超过 50mV判断系统空闲于是打开通往第二节电芯的选通开关使能 MP2642GR-Z开始均衡。实测均衡电流大约 0.55A这比理论值稍低主要是 P-MOS 导通电阻和线路阻抗加上 0.5Ω 限流电阻共同作用的结果。前 5 分钟压差下降很快从 120mV 降到约 60mV之后下降速度放慢因为随着低压电芯电压上升充电压差在缩小充电电流自然减小。整个均衡过程大约持续 14 分钟最终压差稳定在 15mV状态机正常退出均衡。期间用热电偶贴在 MOS 管和电感上测温温度最高约 47℃在可接受范围。这个速度比被动均衡快一个数量级。如果是传统 60mA 被动均衡120mV 压差可能要烧好几个小时电阻才能把高压电芯的能量放掉而且电池组全程都在发热。4.2 分压电阻误差大于压差阈值采样精度的坑第一次打样时我图省事用了 5% 精度的分压电阻结果发现两路差分采样的电压偏低偏高各不相同。最典型的现象是明明用万用表实测两节电芯都是 3.90V系统却显示它们差了 70mV于是均衡器在没有压差的情况下强行启动给其中一节电芯充了十几分钟电直到万用表实测出现真实的 40mV 压差才停止。这就是采样精度超过均衡判断阈值造成的假性失衡。换用 1% 精度电阻后问题明显缓解但我还是建议做软件校准。具体做法是先将两节充满到完全相同的电压用高精度万用表记录实际值然后在程序里分别记录两个通道的偏移之后每次采样都减去这个偏移。校准一次之后两路采样误差可以控制在 ±3mV 以内这个精度对均衡控制来说绰绰有余。另一个容易被忽略的问题是运放的输入偏置电流。普通运放的偏置电流如果经过高阻值分压电阻会产生不小的额外误差。我后来把输入分压电阻从 100kΩ 降到 47kΩ运放选偏置电流较小的型号采样误差又降了一截。如果你手头有仪表放大器用它做差分采样效果会更好但成本会高一些。4.3 输出电容反灌、EN 时序与 MOS 互锁三个硬件层面的教训调试过程中我踩过三个比较深的坑值得单独拿出来说。第一个坑是输出电容反灌。MP2642GR-Z 关闭后输出端陶瓷电容上还留着 4.1V 左右的残压。如果此时选通开关先关闭、后关断 buck残压会通过 MOS 管的体二极管倒灌进电池。虽然不会损坏电池但会白白消耗一部分能量而且在反复开关时会造成不必要的损耗。解决方法是关断顺序一定先断开选通开关延时几毫秒等输出电容放电后再关断 buck 使能。我在代码里用了一个简单的关断子程序确保顺序执行。第二个坑更隐蔽。有一次我把选通开关的驱动信号线接反了结果 B1 通路和 B2 通路同时处于半导通状态MP2642GR-Z 的输出等于被两个电芯的电压拉成中间值电流直接从低压电芯灌入高压电芯整机嗡嗡作响测量板子才发现选通 MOS 已经发烫。从那以后我在 PCB 上把两路驱动信号做成物理隔离并且在软件里加入了“状态确认”逻辑每一路开关动作之后回读 GPIO 状态确认没有同时导通才继续执行。第三个坑是 EN 引脚的驱动力不足。PIC18F4550 的 GPIO 带载能力有限而 MP2642GR-Z 的 EN 引脚如果电流需求偏高直接连接 GPIO 可能导致电平被拉低、无法稳定开启。解决方法是加一级三极管缓冲或者用推挽输出结构。这里提醒所有做类似方案的开发者查阅数据手册时留意一下使能引脚的输入电流参数不要默认 GPIO 一定能直接推动它。4.4 这套方案的扩展方向从两串到多串、从离线到在线两串方案跑通之后扩展的思路就很清楚了。结构上每个两串均衡模块可以看成一个基础单元四个单元串联就是 8 节电池组每个单元分别采样、分别均衡单元之间用隔离通信接口连接。PIC18F4550 自带的 USB 模块还可以把每节电池电压、均衡状态、温度数据上传到上位机形成一套可以远端监控的储能系统。更进一步的优化方向是动态调整输出电压。固定 4.1V 输出的局限在于如果低压电芯电压已经接近 4.0V均衡电流会变得非常小效率降低。可以用单片机输出一路 PWM通过二阶 RC 滤波后去微调 MP2642GR-Z 的反馈电压基准让输出电压始终比目标电芯电压高 0.3V 左右这样不管电芯处于什么荷电状态均衡器都能维持较大的搬运电流。不过我建议先把固定输出电压版本用熟再考虑动态调整因为每多一个反馈环节就多一个稳定性问题要处理。我在实际测试中还发现均衡器和充电器最好有联动逻辑充电器工作的最后阶段应停止均衡让两节电芯自然充满到接近一致放电结束后如果压差超过阈值再启动均衡弥补短板。这样安排既能充分利用充电器自身的恒流恒压能力又能避免两套系统“打架”。最终整个系统的容量利用率、循环寿命和备用切换可靠性都有了明显提升这也是我为什么把这类方案推荐给做储能和备用电源的朋友。