☰
两串锂电池BMS有源均衡模块设计:电荷泵电路与软件控制策略
2026/10/16 1:26:38 网站建设 项目流程

1. 项目背景与方案选型:为什么两串电池也要认真做均衡

串联电池组的均衡问题,做电源和BMS的都不会陌生。电芯在出厂时电压、内阻、容量看似一致,但只要进入成组使用,温度场分布、自放电率、充放电倍率这些差异就会慢慢被放大。对储能系统和备用电源来说,这种不一致带来的后果尤其明显:可用容量被最差的那串电芯锁死,充电时高压的那一串率先到达截止电压,放电时低压的那一串率先触发欠压保护,整个系统明明还有余量,却已经不能工作。时间一长,部分电芯还可能因为过充或过放出现不可逆的损坏,维修成本完全压过当初省下的那点电芯成本。

这次设计的均衡模块,针对的正是两节串联电池单元,功率部分用了一颗 MP2642GR-Z,控制部分用 PIC18F65K40。整体方案一句话就能说清:MP2642GR-Z 负责在两个电芯之间搬运电荷,把电压高的那一串的能量转移给电压低的那一串,PIC18F65K40 负责采集两串电压、判断均衡方向、控制均衡启停,并向上位机或保护板报告状态。两个角色分工明确,硬件上不复杂,但落地时要考虑的问题并不少。

两串电池的均衡,很多人的第一反应是“只有两节,压差能有多大,被动均衡拉一下不就行了”。这个想法在消费电子里通常够用,但在储能和备用电源场景里需要重新审视。后备电源往往长期处于浮充状态,电解液里的副反应持续发生,自放电差异会缓慢但稳定地把两串电压拉开;储能系统则是长周期深度充放,充放电转换瞬间的电流冲击加上不同电芯的内阻差异,会让瞬态压差频繁出现。这些场景对均衡的“持续工作能力”和“热控制能力”要求比普通两串设备高得多,这也正是我把方案定位成有源均衡而不是简单的耗能均衡的原因。

这套方案的适合人群也比较明确:正在做两串锂电BMS、便携储能电池包、UPS后备电池均衡模块的开发者。如果你对 PIC18F 系列基础外设比较熟,那软件部分可以直接当模板用;如果你还不太熟,也可以照葫芦画瓢理解整体流程。

1.1 不均衡是怎么被放大的:从制造差异到工况差异

先说说为什么均衡不是“可选功能”而是“必须功能”。把两节标称3.6V、容量2600mAh的电芯串联,理想状态下它们应该同步充放电,但实际出厂时同批次电芯的容量也往往有1%~2%的偏差,内阻偏差更是常见。并联成组时会自然均压,但在串联成组里,偏差不但不会被抹平,还会随着循环次数累积。

更麻烦的是工况差异。物理上靠近发热源或者靠近外壳散热位置的电芯,温度可能差出3℃到5℃,而锂电在不同温度下的自放电率差异非常明显。一个典型的备用电源场景:系统常年挂在54V母线边上浮充,两串单元各自被浮充到类似电压,但实际上内部状态不同,一旦进入放电,容量低的那节先掉电,等到下一次充电,又是它先满,循环往复,压差越来越难控制。

在储能系统里还有一个容易被忽略的因素:跳变负载。电流在几十毫秒内从0A跳到10A或者反向切换,两串电芯的内阻假如差了5mΩ,瞬间就会出现50mV左右的电压差。这种动态压差如果直接作为均衡判据,控制器很容易误动作或者频繁启停,所以软件上必须做滤波和延迟确认,这个后面详细讲。

1.2 MP2642GR-Z 与 PIC18F65K40 的选型逻辑

均衡电路可以分成两类,一类是耗能型,本质是把高电压电芯的能量通过电阻或者三极管放掉;另一类是能量转移型,也就是有源均衡,用开关器件加储能元件把电荷从高电压侧搬到低电压侧。MP2642GR-Z 属于后者,它内部集成了功率开关和驱动逻辑,外围只需要少量电容电阻就能完成电荷泵式的能量搬运,好处是均衡电流可以做得比较大,损耗转化成热量而不是白白放掉,压差收敛快,发热集中在小面积功率器件上,便于热管理。

选择 PIC18F65K40 作为控制核心,主要看中几点。首先是它自带的 ADC 模块具备多通道扫描和内部固定参考电压,做两串电压采样不需要外接专门的采样前端;其次是它的定时器资源和 PWM 输出足够支撑均衡控制、通信调度和看门狗;再有就是它内部有可配置逻辑单元 CLC,可以用纯硬件方式实现某些保护联动,响应速度比软件判断快很多。

这两颗芯片的组合还有一个现实优势:MP2642GR-Z 把最考验模拟设计功力的功率级做进去了,MCU 侧处理的都是低速采样和逻辑控制,整体对研发和调试人员的要求被压到了合理水平。如果全用分立器件搭一个电荷泵均衡,光是 MOS 驱动、死区控制、电流采样环路就够折腾好几个版本;用专用芯片加 MCU 的组合,一次布板成功率明显高得多。

不过要提醒一点,MP2642GR-Z 的均衡能力边界、使能电平和电流设定方式,不同批次或者不同厂家的参考设计可能有差异,下面的描述按典型电荷泵均衡芯片的通用应用方式来展开,具体管脚参数务必以你手上那颗芯片的数据手册为准。

2. 硬件设计实战:均衡功率级与采样系统的搭建细节

硬件设计是这套方案的骨架,多数问题其实都出现在电源回路和采样回路的互相干扰上。均衡功率级在工作时,开关节点上会有高频方波,地平面上的噪声也不小;而电池电压采样又是毫伏级别的小信号,两者放在同一块板子上,处理不好就是灾难。这一部分把功率级和采样系统分开来讲,最后再强调布局原则。

2.1 功率级外围参数与均衡电流设定

MP2642GR-Z 这类电荷泵型均衡芯片的典型工作方式,是在两个电芯之间交替连接一个开关电容网络。第一个相位里,高压电芯给电容充电;第二个相位里,电容通过开关网络放电给低压电芯。电荷就这样逐周期搬运过去,电流方向始终是确定的,不会有耗能均衡那种“一边发热、一边亏电”的问题。

外围设计上首先要关注均衡电流设定。很多均衡芯片通过一个电阻设定参考电流,具体公式各芯片型号不同,常见形式是 I = Vref / Riset。举个例子,如果芯片手册给出的设定参考电压是0.5V,你希望均衡电流控制在250mA,那设定电阻就是 R = 0.5 / 0.25 = 2Ω,选标准阻值2Ω,再根据实际电流微调。这个电流值的选择要考虑均衡速度和发热的平衡:150mA的均衡电流足够在半小时内把典型50mV的压差拉回,但连续工作时芯片温度会明显上升,250mA以上就必须在Layout阶段预留散热铜箔面积。

电荷泵的开关电容也不能随便选。通常选择低ESR的X7R陶瓷电容,容值在1uF到10uF之间,ESR太高了均衡效率会掉得很难看。电容耐压要按最高电压的1.5倍以上选,两串锂电最高8.4V,至少用16V耐压。MLCC在直流偏压下容量会衰减,这也是很多工程师第一次调试发现实际均衡电流只有计算值一半的原因,有条件的话选额定电压更高的规格,把偏压衰减余量留出来。

输入去耦同样不可马虎。芯片的电源引脚边上要放一个10uF和一个100nF电容,紧贴引脚摆放,走线短而粗。开关节点的布线要尽量短,避免形成环形天线增加EMI,但也不要为了短而把走线拉到采样电路上面。PGND和AGND建议采用单点连接,功率地回到主电容的负极,采样地回到芯片的参考地,两边只在一点汇合。

2.2 电压采样链路:精度、分压与滤波

PIC18F65K40 内部的 ADC 常规分辨率是10位,对于电池均衡来说,这个精度做“判定方向”和“粗略收敛”够用,但要做高精度的压差停止判定就比较勉强。所以采样链路要做几件事:分压衰减、低通滤波、提高有效分辨率。

分压网络是本设计的重点之一。以单串电池最高4.2V、ADC参考电压3.3V为例,直接采样显然超量程。选用300kΩ与100kΩ组成4:1分压,4.2V时ADC输入约1.05V,3.0V时约0.75V,留出足够的线性区间。分压电阻的精度建议选1%甚至0.1%温漂低至25ppm/℃的规格,因为两串的分压比只要差出0.5%,产生的误差就是几十毫伏,会把真正的压差信号完全淹没。这一步往往是两串采样最常见也是最隐蔽的坑。

分压之后还要接一个RC低通。典型取值是100Ω电阻加100nF电容到地,截止频率约16kHz,既不影响低频采样,又能滤掉电荷泵开关频率附近的噪声。如果布局上采样线不得不穿过功率区,可以再加一级1kΩ与1uF的滤波,代价是采样建立时间变长,软件里要等足够时间再启动ADC转换。

软件层面的精度提升有两个方向。一是过采样:对同一通道连续采16次甚至64次做平均,能有效压低随机噪声,等效分辨率大概能提升2~3位;二是利用 PIC18F 的固定参考电压模块FVR,将ADC参考电压从电源轨改为稳定的内部基准,避免充电电流导致电源线上出现缓慢漂移,把参考波动错当成了电芯压差。

保护电路方面,采样线进入单片机引脚之前建议串联一个1kΩ级别的限流电阻,防止电芯接线插反或者线缆被拉扯时产生的过压损坏MCU。同时,在每节电芯的采样引脚对地加一个肖特基钳位到电源轨,成本低但对瞬态保护很有效。

2.3 板级布局的几条硬性原则

这块板子的布局直接决定了调试时的心情。总结几条踩过坑之后的硬原则:

  • 均衡功率芯片、开关电容、储能电容和输入输出滤波电容组成一个最小功率回路,这个回路的包围面积要尽量小,走线宽不低于0.5mm,顶层底层之间用多个过孔连接。
  • 采样电阻网络和RC滤波必须靠近MCU放置,不要放在功率芯片附近;采样地单独走一条短走线回到MCU的模拟地脚。
  • 使能控制信号(如果芯片有EN引脚)串联一个1kΩ电阻,防止MCU消化不良或者上电瞬间电平不确定。
  • 散热铜箔连到芯片散热焊盘时,不要直接挖空底层大片地,需要用规则排列的过孔把顶层热量导到底层,否则热阻反而增大。

这些原则听起来都很基础,但实际项目里最容易在改版时被破坏。我见过因为把采样电阻挪到功率芯片脚边省了几毫米走线,结果电压读数来回跳了20mV以上的案例,最后只能飞线救火。

3. 软件状态机与均衡策略:怎么判断“该不该均衡”和“该停在哪”

硬件只是把能力做出来,真正决定均衡效果的是软件策略。均衡控制本质上是一个带滞回的低速闭环:采两串电压,算差值,决定开还是关,开哪个方向,什么时候停。这个逻辑如果处理不好,常见的问题有均衡开关太频繁、压差永远收敛不到目标、系统待机功耗偏高。下面讲讲实际用下来的策略和代码结构。

3.1 状态机设计与滞回判定

软件整体可以采用一个简单的状态机:空闲态、采样判定态、均衡运行态、均衡停止过渡态和故障态。空闲状态下MCU以较低频率醒来,比如每200ms一轮,先读两节电压,滤波后计算压差。如果压差超过启动阈值,就进入均衡运行态;在运行态中,如果压差已经收敛到低于停止阈值,或者均衡持续时间超过保护上限,就停止均衡。

阈值必须设置滞回,这一点很重要。假如启动阈值是30mV,停止阈值也写成30mV,那压差在阈值附近波动时均衡就会反复启动和停止,功率芯片和电池都要被这种振荡搞坏。合理的做法是启动阈值30mV、停止阈值10mV,中间留20mV的滞回区间,让均衡动作一旦启动就有足够的持续时间把压差真正压下来。

启动方向判断也要细心:电压高的那节放能,电压低的那节收能。如果V1高于V2,就控制MP2642GR-Z把能量从电芯1转移到电芯2;反过来则相反。这一步看似简单,但在接线接反或者采样通道编错的情况下,很容易整反,所以程序里最好加一个方向自检:启动均衡后观察几十秒,如果压差不仅没缩小反而变大,立即停止并上报错误。

下面是核心状态机的示意代码。寄存器级别的操作按实际芯片头文件替换,这里关键是流程结构。

#define BAL_ON_THRESHOLD_MV 30 #define BAL_OFF_THRESHOLD_MV 10 #define BAL_TIMEOUT_SEC 3600 typedef enum { ST_IDLE, ST_BAL_RUNNING, ST_FAULT } bal_state_t; static bal_state_t state = ST_IDLE; static uint16_t bal_start_time; void bms_control_loop(void) { int16_t diff_mv = read_cell_voltage_mv(1) - read_cell_voltage_mv(2); switch (state) { case ST_IDLE: if (diff_mv > BAL_ON_THRESHOLD_MV) { start_balancing(BAL_DIR_1_TO_2); bal_start_time = system_uptime_sec(); state = ST_BAL_RUNNING; } else if (-diff_mv > BAL_ON_THRESHOLD_MV) { start_balancing(BAL_DIR_2_TO_1); bal_start_time = system_uptime_sec(); state = ST_BAL_RUNNING; } break; case ST_BAL_RUNNING: if (ABS(diff_mv) < BAL_OFF_THRESHOLD_MV) { stop_balancing(); state = ST_IDLE; } else if (system_uptime_sec() - bal_start_time > BAL_TIMEOUT_SEC) { stop_balancing(); report_bal_error(ERR_BAL_TIMEOUT); state = ST_IDLE; // 或者进入故障态由上层决定 } break; default: break; } }

这段代码里有一个值得讨论的点:为什么停止阈值取10mV而不是0mV?因为采样链路无论怎么做都有噪声和偏移,真实世界也没有两节电芯能完全一致。如果程序非要等到压差为0才停止,结果可能是永远停不下来。10mV的停止阈值配合合理滤波,在实际系统中可以在十几分钟到半小时内把40到80mV的初始压差收敛到一个满意区间。

3.2 ADC采样与滤波:避免拿噪声当压差

采样处理在均衡策略里的戏份比很多人想象中重要。电芯电压不是稳定的直流,充放电脉动、功率级开关噪声、地线反弹都会叠加在采样信号上。如果滤波做得不够,错误的数据喂给状态机,轻则均衡方向抖动,重则直接误判。

我常用的采样流程是:每个通道连续采样16次,每次间隔几毫秒,然后排序取中值。中值滤波对尖峰脉冲噪声的抑制能力比平均值好得多,尤其是在均衡功率级开启的瞬间,开关噪声很容易打出一个尖刺。取完中值之后再叠一层滑动平均,把最后几次的滤波结果做指数加权,让输出平滑。

下面是一个参考的采样函数骨架:

uint16_t read_cell_voltage_raw(uint8_t cell) { uint16_t samples[16]; adc_select_channel(cell); for (uint8_t i = 0; i < 16; i++) { adc_start_conversion(); while (!adc_is_conversion_done()) ; samples[i] = adc_get_result(); delay_ms(2); // 错开开关噪声周期 } return median16(samples); }

还有一个细节容易被忽略:采样时机。如果系统里存在负载切换,比如储能系统里接触器吸合或者逆变器启动,电流突变会造成电池极化电压的瞬态变化,这种变化不是真实的不均衡,但采样会读到很大的压差。一个实用的办法是在采样前通过单片机的ADC中断或GPIO检测负载切换信号,切换发生后等待50ms以上再开始采样;如果没有这个信号,至少要在软件里保证均衡启停动作和采样在时间上错开,不要让功率级刚开机就去采样。

3.3 均衡过程的监控:温度降额与故障上报

连续的均衡运行会产生热量,尤其是均衡电流设定在250mA以上时,芯片和电容的温度都会上升。软件可以留一路NTC测温,接在PIC18F65K40的ADC通道上用来监测均衡芯片表面温度。当温度超过45℃时降低均衡电流或者按一定占空比间歇均衡,例如运行3秒停1秒,超过60℃时直接停止均衡。这个措施对储能系统尤其重要,因为电池舱可能本身是封闭环境,温度积聚比开放式机架严重得多。

故障处理方面,需要覆盖几个典型异常:压差超时未收敛、采样值超出合理范围、均衡方向反效、以及通讯超时。PIC18F65K40 的窗口看门狗 WDT 建议打开,并且把均衡状态帧写入一个标志变量,主循环每个周期刷新,任何一次死循环或异常挂起都能被复位拉回。故障信息通过预留的UART接口上报,在调试阶段非常有用,也能在最终产品里作为远程运维的诊断数据。

这里还要补一个关于MCU内部资源的小建议:能用硬件实现的保护最好不要依赖主循环轮询。PIC18F系列的可配置逻辑单元可以用来做硬件信号联动,比如当某个紧急故障引脚拉低时,不经过主循环直接切断均衡使能,响应时间是微秒级的,而主循环哪怕再快也要几十微秒到几百微秒。对均衡电源这类涉及功率器件的设计,这种硬联动值得花一点时间去了解。

4. 联调测试与问题排查实录:一次完整的均衡模块调试过程

调试这套均衡模块,我习惯把它分成两个阶段:先用稳压源和电子负载搭建一个“假电池”环境,验证硬件和软件的基本行为;再换上真实电芯做长时间充放电循环验证。假电池环境的好处是可控、可重复、不会因为电芯本身的状态波动干扰判断。

4.1 测试平台与基础联调

测试平台需要的东西很常规:一台可编程直流电源,一台电子负载,一台数字示波器,一支红外点温计或者热成像仪,再加上万用表。示波器探头建议配一支100:1衰减探头或者差分探头,因为均衡系统是浮地的,直接用地线夹子去测开关节点容易短路。

基础联调的第一步是只供电、不启动均衡。先把两节仿真电池的电压都设定在3.6V,用万用表在采样点测量MCU读到的电压值,软件读数和万用表读数误差应该控制在20mV以内。如果偏差过大,优先检查分压电阻的实测值和ADC参考电压是否准确。单片机内部参考电压通常有初始误差,程序里要做单点校准,用一个精密电源输出的已知电压反推增益和偏移,再补偿。

第二步是模拟不平衡。把第一节仿真电池电压调到3.72V,第二节保持在3.60V,压差约120mV。此时观察软件是否在200ms以内进入均衡状态,示波器上应该能看到开关节点出现稳定方波,均衡电流在设定值附近。这个过程如果发现均衡电流只有设定值的一半,不用急着怀疑芯片,优先检查开关电容容量是否因为直流偏压衰减太多,以及设定电阻是否选错封装导致功率下降。

4.2 均衡过程的实测数据观察

用某次具体调试记录来说明:初始条件下两节电池电压分别为3.724V和3.602V,压差122mV。均衡启动后,设定电流为200mA,环境温度25℃。记录结果大致如表所示:

时间点电压1电压2压差芯片温度备注
0min3.724V3.602V122mV27℃均衡启动
5min3.716V3.612V104mV36℃收敛正常
10min3.705V3.621V84mV40℃温度上升明显
20min3.690V3.635V55mV43℃温度趋于平稳
30min3.676V3.651V25mV44℃接近停止阈值
35min3.668V3.655V13mV43℃触发停止,进入空闲

从数据能看到几个值得注意的现象。第一,均衡过程中高电压电芯的电压在下降,低电压电芯的电压在上升,两个变化速率接近,说明电荷转移的方向和比例是对的。第二,压差收敛速率前期快后期慢,这是因为压差本身就是电荷转移的驱动力,压差越小,电荷泵的有效工作电压越低,电流自然下降。第三,芯片温度从27℃升到44℃左右,整体可控,但如果是夏天密闭环境,温度可能超过50℃,软件温度降额这时就会介入。

为了验证均衡方向的正确性,一次测试中我还故意把采样通道号交换,模拟软件接反的场景。结果显示压差不仅没收敛反而从60mV扩大到100mV以上,软件的超时保护和方向自检随即触发,均衡被切断。这个测试证明保护和自检逻辑是有效的,建议大家在正式打样前也做一次这种“破坏性测试”,不要只在理想条件下验证。

4.3 常见问题速查与避坑清单

调试过程中遇到过的问题以及对应的排查思路,整理成一张速查表,方便以后直接翻阅:

现象可能原因排查方法与解决思路
均衡电流明显偏小开关电容容量因直流偏压衰减、设定电阻偏大更换更高额定电压的电容,实测设定电阻阻值,调整Riset
压差读数来回跳动20mV以上采样走线靠近功率回路,RC滤波不足检查布局,加重滤波电容,开启中值+滑动平均滤波
均衡启动后压差反而变大采样通道顺序接反、均衡方向逻辑反了核对通道映射,做方向自检测试
均衡停止后很快又启动停止阈值和启动阈值没有滞回启动和停止阈值至少拉开15~20mV
系统待机电流偏高MCU没有进入低功耗模式,采样电路持续工作空闲态拉长唤醒周期,采样完成立即进入睡眠,关闭不需要的外设
芯片局部过热铜箔散热面积不足,均衡电流设置过高增加底层散热铜箔和过孔阵列,降低设定电流或间歇均衡
电压读数整体偏高或偏低ADC参考电压偏差、分压电阻精度不足使用内置FVR稳定基准,做软件单点校准,替换高精度电阻

这些坑基本都是在实际项目里真实踩过的,很多问题的根源可以追溯到Layout和滤波,而不是芯片本身。调试到后期我养成一个习惯:任何读数异常发生,先用断电后的万用表实测去和MCU读数比对,把“测量系统不准”和“真实电路异常”先分开,再往下追。

5. 从两串到更多串:这套方案的扩展与个人经验总结

写到这里,均衡模块的核心设计已经讲完了。最后聊聊在实际工程里那些没法写进原理图的东西,也算是给后续做类似项目的人一点参考。

个人体会最深的一点是:两串均衡的软件逻辑看着比十几串简单太多,但实际上小型化BMS系统的调试周期一点都不会短。因为系统规模小,大家往往会低估热设计和采样干扰的影响,等到样机跑起来才发现均衡电路一启动,MCU读数就开始飘。设计阶段多花半小时规划采样回路和功率回路的隔离,比后期在软件里堆滤波算法要划算得多。

这套方案后续扩展思路也比较明确。如果要把两串扩展成更多串,可以让每一组两串均衡单元独立工作,由一个上位MCU通过UART或者I2C总线统一管理。每个单元的PIC18F65K40只负责本地两串的均衡和故障检测,上报聚合数据即可,这种模块化方案比做一个庞大的单板均衡系统在维护和生产上更灵活。均衡算法也可以从“压差均衡”升级成“SOC均衡”,只不过需要额外采集电流并做开路电压估算,算法复杂度会上一个台阶,但对于储能场景的实际收益会更大。

最后给一个许多调试过程中最后才注意到的小建议:产品化的均衡模块在出厂前最好做一次全温区老化,尤其要放在接近工作温度上限的环境里跑几个小时均衡。很多故障在常温测试时根本不会出现,只有温度上来之后电阻漂移、焊点应力、热噪声这些问题才会现出原形。别省这一步。

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

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

立即咨询