☰
双串电池有源均衡设计:MP2642与PIC18F47K40实现
2026/10/16 1:28:46 网站建设 项目流程

两节串联电池的均衡,在储能和备用电源系统里算是入门级但也最容易翻车的功能。你去看很多BMS方案,重点都在多节串联,七八串、十几串,好像两串没什么好讲;真正自己搭过就会发现,两节电池之间那几十毫伏压差,会让后备供电时间短一截,还会把充电上限和放电下限都卡死。更麻烦的是,一旦长期不处理,容量差会被反复放大,最后只能整组更换。

这次要聊的方案,是用 MP2642GR-Z 和 PIC18F47K40 配合起来,做一套针对“两个串联电池单元”的有源均衡模块。MP2642GR-Z 负责功率级的电流路径切换,PIC18F47K40 负责电压采集、均衡决策、保护逻辑和数据上报。整套东西不复杂,但真正要在储能柜或备用电源箱里长期跑,需要注意的点非常多。

不同基础的人看这篇东西,得到的东西不太一样:如果你只做过被动均衡,可以重点看如何把均衡电流从电阻发热变成电荷搬移;如果你已经在用专用 BMS 芯片,可以重点看 MCU 是怎么兜底做差异化算法的;如果你是刚入门,建议先把第 1 节和第 3 节的数学关系看明白,再动手搭电路。

1. 项目定位与方案选型

1.1 串联电池为什么总是不一致

很多人以为电池出厂一致就可以了,实际上偏差从生产那一刻就存在。同一批电芯的生产工艺只能保证容量散差在一个区间内,比如 ±2%,但内阻、自放电率、极化特性都会有差异。更扎心的是,这些差异会随着使用放大。

举个简单例子:1 号电池可用容量 5Ah,2 号电池 4.7Ah,相差 6%。放电时,2 号会率先到达截止电压 2.8V,系统为了保护它只能切断负载,此时 1 号最多还剩 5%~8% 的电量没用完。充电时反过来,2 号先充到 4.2V,如果继续充它就会过压,系统又要提前结束充电,1 号只能充到 95% 左右。两边都不舒服。

备用电源场景还有另一个放大器:温度。电池模块里如果有其他发热源,或者散热风道不对称,靠发热源近的那节电池温度更高,充放电效率不一样,压差在浮充阶段会表现为长期慢漂移。储能场景则有脉冲负载,瞬间大电流会同时放大内阻差异,让两端电压在几十毫秒内差出几十毫伏。

1.2 均衡策略怎么选

一般有被动均衡和主动均衡两种思路。被动均衡就是给每节电池并联一个放电电阻,电压高的那节放掉一部分电,让整组电压对齐。优点是便宜简单,缺点是能量变成热量,电流稍微大一点就要做大散热板,而且越到低压阶段均衡效率越差。

主动均衡则把能量从高电压单元搬到低电压单元。按搬运动路又分成电感式、变压器式、电容式,工程上常用电感和开关电容。主动均衡的均衡电流可以做得比被动均衡大,发热也小,缺点是控制复杂。但这里有个关键的工程选择:如果把功率开关和驱动力全部交给专用芯片,控制复杂度就能降下来。

MP2642GR-Z 的价值就在这里。它把开关逻辑、驱动、电流路径保护和故障检测集中在一个封装里,MCU 只需要决定“要不要均衡”和“往哪个方向均衡”,不需要去精确计算哪个管子、哪个电感、什么死区时间。PIC18F47K40 的任务就变成:采样、比较、发状态、看故障、上报。

1.3 系统职责划分

我搭的这套系统按功能分三层。最底层是电池组,两节串联,中间引出中点;中间层是 MP2642GR-Z 为核心的功率级,它从高/低电池之间搬移电荷;最上层是 PIC18F47K40,它监控每一节电池电压、环境温度,通过滞回算法决策均衡启停。

三者之间只有几根信号线:PIC 输出均衡使能 EN 和方向 DIR 给 MP2642,MP2642 反馈 FAULT 信号给 PIC。PIC 的 UART/I2C 接口再接上位机或总控板,把节电压、温度、均衡电流积分值和故障状态发出去。

这样一个架构的好处是解耦。MCU 挂了,MP2642 还能通过硬件保护把均衡路径关断;MP2642 出现异常,PIC 也能通过 FAULT 中断尽快锁存故障。调试时不用拿着示波器同时去追控制信号和功率波形,先单独验证 PIC 输出逻辑,再验证 MP2642 功率级,最后联调,效率高很多。

再短的架构图可以这样描述:

电池组 V1/V2/Vmid ⇅ MP2642GR-Z 功率级 ←→ PIC18F47K40 (ADC/GPIO) ⇅ 储能电感与滤波

2. 核心器件选型与关键参数计算

2.1 MP2642GR-Z 在电路里到底干什么

先说结论:MP2642GR-Z 是一个双串电池均衡的前端功率控制器件。在标题所说的储能和备用电源系统里,它承担的是“执行层”工作——接收来自 MCU 的简单电平/脉宽命令,然后按照内部逻辑去驱动功率 MOSFET 动作,完成电池单元间的电荷转移。

这样设计有什么好处?如果是完全用分立器件搭主动均衡,至少需要 4 个功率 MOS 管、1 个驱动芯片、1 个电感,还要自己算死区。死区没算准,上下管直通,电感直接就冒烟了。用 MP2642,典型电路已经把这条关键路径搭好了,外部只需要按参考设计放好储能电感、输入电容、自举电容和采样电阻。

我在样板里看到的具体表现是:启动均衡后,MP2642 自身温度控制在合理范围内,电感发热才是主要热源。它把故障状态通过 FAULT 引脚输出,PIC 检测到低电平后可以先暂停均衡,再进一步判断是过流、过温还是输入欠压。

2.2 PIC18F47K40 的外设为什么够用

PIC18F47K40 是 8 位 MCU,但它的外设配置不像传统 8 位那么寒酸。我这边选定它主要看中四样资源:12 位 ADC、CLC 可配置逻辑单元、CWG 互补波形发生器,以及丰富的通信接口。

12 位 ADC 在 3.0~4.2V 锂电检测场景下,如果参考电压是 3.3V,一个 LSB 约 0.8mV,理论上足够测出均衡需要的毫伏级压差。更重要的是它的 ADC 支持累加计算,可以连续采集 256 次后自动求和,CPU 只等一个结果,做均值滤波的效率比很多普通 8 位 MCU 好很多。

CLC 和 CWG 则是硬件级的保险。均衡方向切换时,如果靠中断来阻止上下管同时导通,软件延迟是很大的风险;用 CLC 把比较器输出的故障信号直接并入 PWM 通道,故障发生后硬件自动封锁输出,比软件判断快几个数量级。这也是我会把 PIC18F47K40 放到这类电源场景里的原因。

2.3 均衡电流与电感参数的计算过程

均衡电流没必要做得太大,因为电池压差本来就小,能量搬运慢一点没关系,但要把发热和寿命平衡好。我这边把平均均衡电流定在 0.3~0.5A。

计算方法很简单,电感式均衡在一个开关周期里的平均电流,近似等于两节电池压差除以整个回路的直流电阻。假设压差 100mV,功率管导通阻抗加电感 DCR 加 PCB 走线一共 100mΩ,那理想电流就是 1A。实际还要考虑开关损耗和电压跌落,所以我会把预期值再降 30%,最后选 0.5A 附近。

电感参数用经典纹波公式估算:

$$\Delta I_L = \frac{V_{cell} \cdot D \cdot (1-D)}{f_{sw} \cdot L}$$

假设单体电压 3.7V,占空比 0.5,开关频率 100kHz,想控制纹波在 0.4A 以内,所需电感:

$$L = \frac{3.7 \times 0.5 \times 0.5}{100\text{k} \times 0.4} \approx 23\mu H$$

所以选 22µH 比较合适。电感饱和电流控制在 1.5A 以上,直流电阻 DCR 越低越好。下面是我用的关键参数汇总。

参数数值说明
电池节数2 串磷酸铁锂/三元均可
单体电压范围2.7~4.2V含均衡窗口
均衡启动压差30mV可配置
均衡停止压差10mV滞回下限
平均均衡电流0.5A功率级限流后
开关频率100kHzMP2642 外围决定
储能电感22µH/1.5ADCR<50mΩ
温度保护点55°CNTC 检测后 PIC 处理

看到这里你应该能理解,MP2642 解决的是“怎么把电流从高往低搬”,PIC 解决的是“什么时候搬、搬到多少为止、搬的过程中出了问题怎么办”。方向搞清楚,后面软硬件设计就有底了。

3. 硬件设计要点与实施细节

3.1 单体电压采样与误差预算

均衡的基础是电压判断,采样不准,后面的算法全是白搭。采样电路我用的是精密分压加 RC 滤波,没有上专用仪表放大器。原因很简单:双串系统共模电压低,PIC 的 ADC 耐压够,分压电阻选温漂小的精密电阻就能满足要求。

分压网络要同时量两个电压:BAT+ 到 MID 是第 1 节,MID 到 GND 是第 2 节。注意 MID 不是 GND,不能用单端方式简单测 BAT+ 再减去 MID,那样误差会叠加。我给两个通道都做了独立的 1kΩ/1kΩ 分压,再用 100nF 电容滤波到 ADC 引脚。

误差预算大概是这样:ADC 的 DNL/INL 按 ±2LSB 算约 1.6mV,0.1% 电阻在 4.2V 上的最大误差约 2.1mV,再加上参考电压漂移和 PCB 漏电流,最坏情况下总误差能到 6~8mV。这个量级对 30mV 启动阈值是够用的,但如果想让启动阈值压到 10mV 以下,就必须做两点校准,或者把分压电阻精度提高到 0.05%。

有一点特别提醒:分压电阻阻值不要选太高,因为 PIC 的 ADC 采样端有个采样电容,充电时间不够测出来的电压会偏低。高阻值省电但会拉长采样时间。我实际用 2kΩ 分压,采样时间设置到 6µs 以上,实测很稳定。

3.2 均衡控制回路的滞回逻辑

均衡不是越灵敏越好。我最早做过无滞回的版本,压差只要超过阈值就启动,降到阈值以下就停止,结果在临界区来回振荡,均衡开关动作一小时几十次,MP2642 和电感的温升反而比持续均衡还高。

后来改成滞回控制:压差大于 30mV 时允许均衡,压差降到 10mV 时停止均衡。中间这 20mV 死区就是系统稳定运行的安全带。均衡过程本来就很慢,电池电压也不会因为均衡在几秒内剧烈变化,10mV 的停止点不会导致明显过均衡。

这个逻辑放在 PIC 里用软件比较器实现。每 100ms 做一次刷新,每次刷新取 8 次采样平均值。方向判断也要注意:均衡方向只允许从电压高的那节搬到电压低的那节,所以每次启动前先比较 V1 和 V2,如果 V1 更高,控制 MP2642 做正向搬运;如果 V2 更高,就反相。

3.3 保护逻辑与上下电时序

我把保护分成两级。一级在 MP2642 内部,过流、过温会直接封锁功率级;一级在 PIC 这边,检测到单体过压 4.25V、欠压 2.7V、温度超过 55°C,就主动清除使能信号并进入故障状态。

上下电时序有一个容易被忽略的细节:不要在下电瞬间让均衡继续工作。电池系统在下电时会经历电池电压迅速回落,如果此时 MP2642 还在搬运电荷,可能出现瞬间大电流。我的做法是 PIC 检测到总电压低于阈值时,先停止 PWM 并等待至少 10 个开关周期再清理 GPIO,确保功率级完全关闭。

上电顺序反过来:先让 PIC 完成 ADC 初始化、自检、读到两节电压都正常,再打开 MP2642 的使能。这在备用电源系统中特别重要,因为系统上电瞬间,MP2642 尚在电源建立阶段状态不确定,贸然使能容易误动作。PIC 用 GPIO 控制 EN,上电默认输出低电平,软件跑通后再拉高,能完美避开这个问题。

4. 软件状态机与核心代码实现

4.1 主状态机的设计

PIC 里的代码核心不是某个高大上的算法,而是一个状态机。我把运行分成四个状态:INIT、RUN、BALANCE、FAULT。INIT 完成外设初始化和首次采样;RUN 是正常监控;BALANCE 是正在均衡;FAULT 是发生了保护。

状态之间按事件迁移,保持单一出口。这样做的最大好处是调试时能直接通过状态变量定位问题。比如说 MP2642 温度高,但 PIC 还在 BALANCE 状态,说明温度保护没有进中断或者 NTC 采样出错;如果状态机已经跳到 FAULT,那就说明保护链路是通的。

4.2 采样滤波与校准

采样我做了两步滤波。第一步是 ADC 级的中值滤波,连续采样 3 次,取中间值;第二步是在这基础上做滑动平均,队列长度 8。两步加一起,能同时滤掉尖脉冲和高频噪声。下面的代码是读取单节电压的核心片段。

uint16_t read_cell_adc(uint8_t ch) { uint16_t samples[3]; for (int i = 0; i < 3; i++) { ADC_SelectChannel(ch); ADC_StartConversion(); while (ADC_IsConversionComplete() == 0); samples[i] = ADC_GetResult(); } // 中值滤波 uint16_t tmp; if (samples[0] > samples[1]) { tmp = samples[0]; samples[0] = samples[1]; samples[1] = tmp; } if (samples[1] > samples[2]) { tmp = samples[1]; samples[1] = samples[2]; samples[2] = tmp; } if (samples[0] > samples[1]) { tmp = samples[0]; samples[0] = samples[1]; samples[1] = tmp; } return samples[1]; }

中值滤波只认中间值,不会被脉冲干扰带偏。接着滑动平均:

#define FILTER_LEN 8 static uint16_t filter_buf[FILTER_LEN]; static uint8_t filter_idx = 0; static uint32_t filter_sum = 0; uint16_t filter_add(uint16_t raw) { filter_sum -= filter_buf[filter_idx]; filter_buf[filter_idx] = raw; filter_sum += raw; filter_idx = (filter_idx + 1) % FILTER_LEN; return (uint16_t)(filter_sum / FILTER_LEN); }

校准也很重要。我用一个精密可调电源模拟每节电池,先记录高精度万用表读数,再让 PIC 采样回来,得到每个通道的 offset 和 gain,存到 PIC 的 Data EEPROM。校准一次,后面长期漂移会小很多。

4.3 均衡决策代码示例

均衡决策代码就藏在 RUN 状态里,每 100ms 被调度一次。逻辑是:如果当前不在 BALANCE 状态,且压差绝对值超过 30mV,则记录高/低电池序号,设置方向,进入 BALANCE 状态;如果当前在 BALANCE 状态,且压差降到 10mV 以下,则撤掉使能,回到 RUN。

void bal_control_run(void) { int16_t diff = (int16_t)v1 - (int16_t)v2; switch (bal_state) { case BAL_IDLE: if (diff > BAL_ON_TH) { set_bal_direction(DIR_1_TO_2); bal_timer = 0; bal_state = BAL_ACTIVE; mp2642_set_enable(1); } else if (diff < -BAL_ON_TH) { set_bal_direction(DIR_2_TO_1); bal_timer = 0; bal_state = BAL_ACTIVE; mp2642_set_enable(1); } break; case BAL_ACTIVE: if (abs(diff) < BAL_OFF_TH) { mp2642_set_enable(0); bal_state = BAL_IDLE; } if (bal_timer > BAL_MAX_TIME) { set_fault(FAULT_BAL_TIMEOUT); mp2642_set_enable(0); bal_state = FAULT; } break; default: break; } }

BAL_MAX_TIME 是个经验值。我用的是 15 分钟,如果均衡持续超过 15 分钟还没达到 10mV,说明不是简单压差问题,可能是电池内阻异常或者回路有接触电阻,最好停下来报故障而不是傻等。

4.4 故障处理与数据上报

故障我统一放在一个 16 位寄存器里,每一位对应一种故障类型。FAULT 状态里 PIC 会保存当前寄存器,并通过 UART 发送给总控。上报帧格式自己定义,帧头 + 状态字 + 两节电压 + 温度 + 校验,10 字节以内。备用电源系统一般已经有上位机协议,我把这部分做成结构化字段,方便对接。

故障后恢复策略也很重要。我做成手动清除加自动重试两种:如果是温度过高,温度降到 45°C 以下后自动清除;如果是均衡超时或通信异常,需要总控发清除指令。这样避免故障反复横跳造成接触器寿命损耗。

5. 常见问题与调试实录

5.1 问题排查速查表

调试阶段我把遇到的问题整理了一张表,按现象、原因、处理方式三条线走,对后来复现很有帮助。

现象可能原因处理方式
均衡启动后很快停止压差阈值太紧,或采样噪声大放宽滞回窗口,检查 RC 滤波是否虚焊
MP2642 发烫电感饱和或开关频率不对用示波器看电流波形,换饱和电流大的电感
电压采样波动超过 10mV采样时间不够或分压电阻过大减小分压电阻阻值,拉长 ACQ 时间
MID 点电压漂移MP2642 内部开关切换耦合到采样采样和均衡分时复用,均衡期间暂停采样
FAULT 一直拉低自举电容失效或电源不稳检查自举电容容量和放置距离
均衡时 UART 数据卡顿中断优先级没配好均衡不进入中断触发,只在 100ms 主循环处理

5.2 调试中踩过的三个坑

第一个坑是 ADC 采样时间。我开始用默认配置,采样结果跳得厉害,原因就是 PIC 的 ADC 采样电容还没充满。后来把采样时间提高到 6µs 以上,波动立刻从十几毫伏降到 1 毫伏以内。这不算什么高深知识,但最容易栽。

第二个坑是均衡期间采样干扰。MP2642 切换瞬间会在电池内阻上产生窄毛刺,虽然时间很短,但足以让 ADC 误采到一个“看起来像充满”的电压。我一开始没意识到,均衡越均衡越反向,后来加了“均衡期间采样窗口错开”的机制,才稳定下来:PIC 只在功率开关关断期做采样,或者干脆在均衡阶段让采样帧避开 PWM 周期。

第三个坑是散热。样板阶段我在 MP2642 底下打过孔,但孔排得太散,热传不走。后面改成在它正下方放一个 1 平方厘米的铺铜区,再打过孔到内层,温度直接降了 10°C。被动均衡和有源均衡都一样,发热不是消失了,只是搬走了,热管理别省。

5.3 实测数据与调参记录

最后放一组我调完后的实测数据。初始时两节电池压差 82mV,启动均衡后大约每隔 10 分钟记录一次。

时间(min)V1(mV)V2(mV)压差(mV)MP2642温度(°C)
0365235708234
10364235845842
20363535983747
30362836121648
4036223614845

从 82mV 拉到 10mV 以内,花了 40 分钟出头,中间 MP2642 最高温升到 48°C,还在安全范围。如果只做被动均衡,这么大压差要放几个小时,而且那部分能量全变成热。这就是有源均衡在实际系统里最直观的价值。

均衡速度主要受两个因素影响:压差越大,搬运越快;回路阻抗越大,搬运越慢。如果想进一步缩短时间,可以把平均均衡电流从 0.5A 提到 1A,注意电感和 MP2642 的温升要重新评估。如果追求的是长期浮充维护,0.3A 其实也够,只是启动时间会拉长,但系统热应力更小。

我个人实际搭下来的体会是:这类双串均衡系统,方案选型反而不是最难的点,最难的是把阈值、滤波、保护时机这些“软参数”调到跟你实际用的电芯匹配。数据手册只会给你一个范围,不会告诉你你的电芯在不同温度下自放电差异有多大。如果你也准备照着这个思路做,建议第一次调板先别急着接真实电池,用可调电源模拟两节电压,先把采样、滞回、故障链路全部验证完,再接电池跑长时间测试。

最后再分享一个小技巧:我后来在 PIC 的 Data EEPROM 里存了每节电池的静置电压基线。每次系统开机时,如果有条件先静置 5 分钟再启动均衡,就可以用开机电压和基线电压的差粗略估算自放电率,把自放电偏大的电池提前标记出来。这个做法不需要增加任何硬件成本,但对备用电源这类长期待机设备的维护价值非常大,两节电池也能做得比很多多串 BMS 更精细。

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

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

立即咨询