做过储能或备用电源的朋友,多数都见过这种画面:两节电芯串联,刚配对时压差只有几个毫伏,循环几十次后越拉越开,充电末端动不动就触发过压保护,可用容量也跟着缩水。我这次整理的是某备用电源项目里的2串主动均衡模块,主控用PIC18F57Q43,功率部分用MP2642GR-Z。先放结论:这套设计能把两节串联电池单元的电压差稳定压到10mV以内,在浮充和静置工况下都能自动工作,同时辅助电源的待机功耗和均衡发热都压得很低。文章会把方案选型、参数计算、状态机设计和调试中踩过的坑都拆开讲,适合正在做BMS从板、电池包维护或者想自己搭主动均衡器的人直接参考。
1. 为什么两节串联电池也要认真做均衡
1.1 不一致从哪里来
很多人觉得2串电池只有两个单体,均衡问题不严重,随便用一个电阻放电就行。实际不是这样。串联电池的不一致来源比很多人想的复杂,主要有四个:
- 电芯出厂容量和内阻存在离散性,哪怕同一批次也有差异;
- 电芯在电池包里的散热条件不同,靠近发热源的单体温度更高,极化程度不一样;
- 自放电率不同,静置几周后单体电压自然拉开;
- 充放电库仑效率不同,长期循环后单体可用容量逐渐分化。
在备用电源系统里还有第5个问题:系统长期处于浮充状态,充电电流很小,但浮充电压是加在整个电池组两端的。容量偏低的那节电芯会更快到达电压上限,其余电芯还没充满;管理系统如果只按总电压判断,就会把电池组长期维持在“过充边缘”或者“充不满”的状态。这个现象在磷酸铁锂上更明显,因为它的电压平台很平,电压差一点点,对应的SOC偏差可能很大。
这里要强调一个基础概念:均衡解决的是“串联中的不一致”,不是“给电池补电”。两节电池串联,电流完全相同,但因为容量和内阻不同,单体电压被拉到不同的水平。如果放任不管,每次充放电都在放大差异,最后必然提前触发保护。均衡的作用就是在这些差异还没有变成故障之前,把能量从高电压单体搬到低电压单体,让两个单体回到相近的工作点。
1.2 被动均衡为什么不顶用
被动均衡是大多数低端BMS的方案:在每节电池旁边并联一个放电电阻,检测到某节电压偏高就通过电阻把多余的能量以热量形式放掉。优点是电路简单、成本低,缺点也很突出:
- 能量被白白浪费,均衡电流越大发热越严重;
- 均衡电流受散热限制,通常只有几十毫安到一两百毫安,电压差要好久才能拉回来;
- 它只能“放高”,不能“补低”,低容量的那节电芯该缺电还是缺电;
- 在浮充状态下,被均衡的电池一边被放电,一边又被充电,系统可能长期处于动态平衡,但压差始终消不掉。
我把主动均衡和被动均衡做了一张对比,方便直观取舍:
| 对比项 | 被动均衡 | 主动均衡 |
|---|---|---|
| 能量去向 | 电阻发热 | 转移到低电压单体 |
| 均衡方向 | 只能放电 | 双向可搬移能量 |
| 均衡电流 | 受散热限制,偏小 | 受功率级设计限制,可做大 |
| 电压差收敛速度 | 慢 | 快 |
| 电路成本 | 低 | 略高 |
| 适用场景 | 电芯一致性好的小系统 | 储能、备用电源、长循环系统 |
这个项目选择主动均衡,不是因为参数上“主动”两个字更好看,而是备用电源的服役周期很长,被动均衡的持续发热和无效损耗在长期挂网场景下不可接受。
1.3 均衡的目标到底是什么
均衡的目标不是让电压严格相等,而是让单体SOC趋于一致。电压只是一个间接观测值。真正的均衡目标是:在充满时两个单体几乎同时到达截止电压,在放空时也几乎同时到达下限,让整个电池包放出最多能量,同时避免任何一节单体被过充或过放。
但是在实际2串系统中,我们不可能随时知道每个单体的准确SOC。工程上的常用做法是用端电压做主导判据,再结合充电状态、温度和静置时间做修正。例如在充电末端电压差能反映容量差异,在静置后电压差能反映自放电差异。这套设计里PIC18F57Q43的ADC采样精度、滤波策略和均衡阈值设定,都是围绕这个目标展开的。
这里要提醒一句:均衡不是万能药。如果两节电芯的容量差已经超过10%,靠均衡很难救回来,因为每次循环消耗的不一致电量远大于均衡搬移的电量。均衡电路能做的,是把正常老化范围内的小差异控制在合理区间。
2. 硬件分工:MP2642GR-Z负责能量,PIC18F57Q43负责决策
2.1 MP2642GR-Z在板上的真实角色
MP2642GR-Z是一颗集成同步开关的降压变换器,输入范围可以覆盖2串锂电池组的工作区间,非常适合在板级电源里使用。在这套均衡板里,它的第一职责不是直接搬移电池之间的能量,而是从电池组总电压取电,把电能转换成一个稳定的中间母线电压,给PIC18F57Q43、栅极驱动和信号调理电路供电。
很多初学者会把这块忽略掉:均衡板也是要耗电的。如果直接用LDO从8.4V降到3.3V,正常工作电流假设100mA,消耗的功率是0.5W左右,长期挂网一天就是12Wh,对备用电源来说是不可接受的损耗。MP2642GR-Z这类同步降压芯片的效率能到90%以上,在轻载时也能通过模式设置降低开关频率,把待机损耗降下来。
另一个考虑是均衡功率级的母线供电。主动均衡在启动瞬间会有脉冲电流,如果辅助电源输出能力不足,母线电压会被拉垮,导致MCU复位。MP2642GR-Z带限流和软启动,输出电容选择足够大之后,能够承受均衡功率短时抽载而不崩溃。实际试下来,均衡电流在0.5A级别时,5V母线跌落控制在100mV以内,已经能满足PIC工作。
除了给板级供电,MP2642GR-Z的输出电压精度也直接关系到采样基准稳定性。如果MCU的ADC参考直接取自3.3V,那么母线纹波会影响采样精度。所以我的做法是模拟部分单独使用一个低噪声LDO或者精密基准,数字部分用MP2642的输出;采样电路的地和功率地单点连接,避免均衡电流在地线上叠加压差。
2.2 PIC18F57Q43刚好踩中均衡控制的几个点
PIC18F57Q43是Microchip的8位MCU,但它不是那种“只能点个灯”的8位机。选它有几个具体原因:
- 12位ADC,带硬件过采样和平均值计算,对电压采样来说非常合适;
- 集成运算放大器和比较器,可以处理差分信号和过流快速关断;
- 可配置逻辑单元CLC,能把比较器输出和PWM使能信号做硬件组合,遇到故障时比中断响应快得多;
- PWM模块支持互补输出和死区插入,可以直接驱动半桥或者开关网络,省掉一路软件定时器。
在均衡控制中,MCU要做的事看起来简单:采两个电压、判断高低、打开对应的均衡通道。但难点在“采得准”和“关得快”。12位ADC让分辨率不再是瓶颈,关键是采样时序和滤波;CLC和比较器让故障封波不再依赖主循环的响应时间。这两个特性在短路、过流、管子直通等场景下非常救命。
我实际用下来,PIC18F57Q43的另一个优点是外设之间的互联很灵活。比如ADC转换完成后可以触发PWM同步启动,这样可以在开关噪声最小的时刻采样电流;CLC可以把几个故障源做“或”逻辑,任何一个触发都直接拉低PWM输出。这些用裸代码写虽然也能做,但外设硬件化之后,固件逻辑会清爽很多。
2.3 系统信号流与均衡路径
整个系统可以分成四个环节:
- 电池组:BAT+、MID、GND三根线,两个串联电池单元分别跨接在BAT+到MID和MID到GND之间;
- 辅助电源:MP2642GR-Z从电池组取电,输出稳定的Vbus给主控和驱动;
- 采样调理:两节单体电压通过分压和运放进入PIC18F57Q43的ADC,电池温度和母线电流也一并采集;
- 均衡功率级:PIC根据采样结果输出PWM和方向信号,经过栅极驱动控制开关网络,把一个单体中的能量搬移到另一个单体。
均衡路径是这样工作的:假设上电池电压高、下电池电压低,PIC会把功率级配置成“从上电池取电,向下电池充电”;反过来则配置成“从下电池取电,向上电池充电”。因为这两个方向都需要能量转换,所以功率级用的是带耦合电感/高频变压器的电荷搬移结构,不是简单的非隔离Buck,这样才能避免普通降压转换器共地带来的方向限制。MP2642GR-Z在这个环节里为整个功率级提供稳定的母线电压,不直接串在电池间,这也是它能长期稳定工作的原因之一。
3. 关键电路设计与参数计算
3.1 单体电压采集,精度决定均衡成败
电压采样是主动均衡的地基。PIC18F57Q43的ADC虽然分辨率够,但电路设计不好,采到的数据一样是垃圾。2串电池的采样点分别是BAT+、MID和GND,两个单体电压分别是:
- Vtop = V(BAT+) - V(MID)
- Vbot = V(MID) - V(GND)
如果用两个独立分压电阻分别把BAT+和MID降到ADC可接受的范围,再在软件里做减法,误差会很大,因为分压电阻的误差会叠加。正确的做法有两种:
一种是直接使用PIC18F57Q43内置运放做差分采样,把BAT+和MID接成差分输入,运放输出直接进ADC。这种方式共模抑制比好,适合对精度要求高的方案。
另一种更简单:先用精密电阻分压,再用软件各自采样,最后做差值。这种方式成本低,但需要选择0.1%精度的电阻,并且在出厂时做两点校准。
我采用的方案是差分采样加单点校准。给个具体计算例子:假设2串磷酸铁锂,单体最高充电电压3.65V,ADC参考电压2.048V。如果直接用运放比例1:1,输入超出参考范围,需要加衰减。取衰减系数0.5,则3.65V对应的ADC输入是1.825V,在0到2.048V的89%量程位置,留有足够的余量。
采样之后的软件处理同样重要。PIC18F57Q43的ADC有硬件平均功能,可以连续转换多次后取平均,比软件里做sum再除更省CPU。我习惯每个通道采16次,剔除最大和最小各2个之后取平均值。采样周期放在PWM的固定相位,避开开关管动作瞬间,这个细节能让采样噪声小一个数量级。
校准这一块不能省。每个板的电阻和运放都存在失调,上电后先对已知电压做一次自校准,把增益和失调系数存到数据EEPROM里;之后每次上报电压都先用校准系数修正。实测能稳定做到5mV以内的误差,这个精度对均衡阈值来说足够。
3.2 均衡电流怎么选,计算公式和例子
均衡电流是主动均衡器最重要的设计参数。选大了,发热和开关应力大;选小了,压差半天拉不回来。通常按电池容量的0.05C到0.1C来定,具体还要看均衡功率级的散热能力和MCU能提供的PWM控制精度。
以50Ah磷酸铁锂电池组为例,0.05C对应的均衡电流是2.5A,但对一个小型均衡板来说,2.5A意味着要处理更大的电感电流和开关损耗,板子体积会变大很多。实际设计时我建议把目标电流定在0.5A到1A之间,性价比最高。
均衡时间可以用简单公式估算:
T = ΔAh / (Ibal × η)
其中ΔAh是两个单体需要拉齐的容量差,Ibal是均衡电流,η是能量转换效率。举例:两节电芯容量差为3%,即50Ah × 3% = 1.5Ah;均衡电流取1A,效率按85%计算,理论均衡时间大约是1.76小时。如果均衡电流取0.5A,时间翻倍到3.5小时。对于备用电源这种允许长时间在线工作的场景,0.5A已经够用,关键是把阈值和关断条件做好。
均衡电流还会影响MP2642GR-Z的母线功率预算。假设单体平均电压3.2V,均衡电流1A,功率级输出功率就是3.2W,加上损耗大约需要3.8W。如果母线电压是5V,平均输入电流约0.76A,MP2642GR-Z需要有余量。所以我在实际板上把均衡电流限定在0.8A,既保证收敛速度又让母线电压稳定。
3.3 功率级和开关网络的设计要点
均衡功率级是整个硬件里最容易出问题的地方。这里用一个耦合电感和四个功率MOS组成方向可切换的电荷搬移电路,PWM由PIC18F57Q43输出,方向和通道选择由GPIO控制。工作流程可以理解为:先把高电压单体连接到电感一端,让电感储存能量;再把电感切换到低电压单体那一端,让储存的能量灌进去。PWM频率决定单次搬移的能量,占空比决定平均电流。
MOS管选型有几个硬指标:漏源击穿电压要大于电池组最大电压的两倍以上,留足尖峰裕量;导通电阻尽量低,比如20mΩ以下;栅极电荷Qg不能太大,否则驱动电路顶不住。2串电池组电压不高,但开关节点会有振铃,实际测试时尖峰可能高达十几伏,MOS耐压建议至少30V,40V更安全。
栅极驱动建议用半桥驱动芯片,或者PIC18F57Q43的互补PWM加外部驱动器。GPIO直接驱动功率MOS只在电流很小的时候可行,均衡电流0.5A以上时,开关损耗和驱动能力都不够。死区时间要按驱动芯片的传播延迟来设,我一般从100ns起步,通过示波器观察有没有直通电流尖峰再微调。
电感选型也很关键。耦合电感或者带中间抽头的功率电感,饱和电流要大于峰值均衡电流。假设均衡电流0.8A,纹波30%,峰值就是0.92A,电感饱和电流至少要1.5倍,我选了2A以上饱和电流的型号。电感值要结合开关频率算,频率太低会听到啸叫,频率太高开关损耗变大。20kHz到50kHz是实用区间,能避开音频段又不会太烫。
功率级的PCB布线要把电流回路尽量短,开关节点用大铜皮散热,电流采样电阻要尽量靠近电感。这里有一个常见误区:很多人把电流采样电阻放在电池负极回路里,结果采样电压包含了负载电流和地线压降,均衡电流控制就不准了。正确做法是把采样电阻放在电感储能回路的公共端,用差分方式采样。
3.4 恒流闭环:别指望纯软件慢慢调
均衡功率级需要限制平均电流,否则一个占空比过冲就会让电感饱和甚至烧管。实现恒流有两条路:
一条是模拟环路:用运放把采样电阻上的电压和MCU给出的目标电压比较,输出直接控制PWM占空比或者限流引脚。响应快,但需要额外器件。
另一条是数字环路:MCU每个周期读电流采样值,用PID或者简单的PI调节占空比。灵活性高,但采样频率受ADC转换时间限制,环路带宽做不高,容易振荡。
这套设计里我做了折中:用PIC18F57Q43的内部比较器做过流快速关断,软件PI做平均电流控制。比较器参考电压由DAC给定,一旦电流超过设定值,CLC立刻封锁PWM输出,封锁时间持续到下一个PWM周期;软件在周期中断里根据平均电流调整占空比。实测动态响应能控制在几十微秒级别,完全能满足均衡场景。
软件PI的参数不能照搬电源环路的经验。均衡负载本质上是电池,电池端电压变化很慢,电流环带宽低一点问题不大。我用的PI周期是1ms,比例系数调小,积分系数慢慢靠近,先把过冲调掉再提高收敛速度。调试时用示波器勾住电流采样波形,如果看到低频振荡或者尖峰脉冲,先怀疑PI参数,再怀疑采样噪声。
4. 固件状态机与调试流程
4.1 状态机设计:从休眠到故障
均衡控制不建议把所有逻辑都写在一个大循环里,状态机会清晰得多。我整理了五个状态:
| 状态 | 进入条件 | 动作 |
|---|---|---|
| STANDBY | 压差小于关断阈值、系统休眠或均衡超时 | 关闭PWM,进入低功耗等待 |
| SAMPLE | 周期性定时唤醒 | 采集电压、温度,做滤波和校准 |
| EQ_TO_LOW | 上电池电压比下电池高出门限 | 方向1:把能量搬到下电池 |
| EQ_TO_HIGH | 下电池电压比上电池高出门限 | 方向2:把能量搬到上电池 |
| FAULT | 过流、过温、采样异常、均衡超时 | 封锁PWM,保存故障码,等待复位 |
状态切换要有滞回。比如开启阈值是10mV,关断阈值是2mV,这样可以避免电压在临界点附近抖动导致反复开启和关闭。另外还要加一个最小均衡时间:每次均衡至少持续30秒,否则有可能是采样噪声引起的误动作,记录结果没有意义。
这里给一段状态机的框架代码,Microchip的X8系列编译器可以直接用:
typedef enum { STATE_STANDBY, STATE_SAMPLE, STATE_EQ_TO_LOW, STATE_EQ_TO_HIGH, STATE_FAULT } bal_state_t; void balancer_task(void) { switch (state) { case STATE_SAMPLE: vtop = adc_read_filtered(CH_TOP); vbot = adc_read_filtered(CH_BOT); delta = vtop - vbot; if (delta > EQ_ON_THRESHOLD) { state = STATE_EQ_TO_LOW; } else if (delta < -EQ_ON_THRESHOLD) { state = STATE_EQ_TO_HIGH; } else { state = STATE_STANDBY; } break; case STATE_EQ_TO_LOW: set_direction(DIR_TOP_TO_BOT); pwm_enable(true); if (delta < EQ_OFF_THRESHOLD) { pwm_enable(false); state = STATE_SAMPLE; } break; // 其余状态类似 } }实际产品的均衡逻辑比这个复杂,比如均衡过程中充电电流变化、开关充电状态、静置状态等都会影响阈值。但状态机的骨架就是这样,先把条件列清楚,再往里加策略会容易很多。
4.2 滤波和抗干扰
均衡板最头疼的问题不是算法,而是采样和不稳定。PWM开关动作会产生很强的dv/dt和di/dt,如果采样时序没对齐,ADC读数会在真实电压附近来回跳。我的处理方式有三层:
第一层是硬件RC滤波,在每个采样点都对地接一个100nF电容,和分压电阻组成低通滤波。截止频率不能太低,否则电压变化响应太慢。
第二层是ADC内部平均。PIC18F57Q43支持多次转换取平均,这比软件平均更硬核,因为它是硬件完成的,不占CPU时间。
第三层是采样相位对齐。PWM周期中断时启动ADC采样,此时开关管已经进入稳定状态,采样到的电压最接近真实值。这个技巧在均衡电流较大的时候效果很明显。
还有一个容易被忽略的点:均衡开启前后,电池端电压会有明显变化。因为电池有内阻,均衡电流流过内阻会在端电压上叠加一个压降。如果直接用开启后的端电压判断均衡是否到位,容易误判。我的做法是在均衡启动前记录一次静态电压,均衡关闭后再等几秒,用新的静态电压做下次判断。
4.3 实际调试步骤和测量点位
调试一定要分步骤来,不要一次把功率部分和采样部分都打开。我的顺序是:
- 先只焊MCU和辅助电源,烧录一个最简单的采集程序,用万用表核对PIC18F57Q43读取的两个单体电压。误差控制在5mV以内,再进入下一步;
- 断开功率MOS的驱动电阻,用可编程电源模拟两个单体,设置一个固定压差,手动给一个很小的PWM占空比,用示波器看开关节点和电感电流有没有异常;
- 打开软件PI闭环,从小电流开始跑,观察电流是否稳定。电流波形出现振铃就先降PI增益;
- 把可编程电源换成真实电芯,先做静置均衡测试,再做浮充均衡测试,记录电压差收敛曲线;
- 最后测试故障保护,人为短路过流采样电阻,确认PWM能在规定时间内封波。
示波器测量点要选好。电压基准点建议统一放在电池组的负极GND,不要这里夹负极、那里夹中点,否则看到的地线噪声会让你怀疑人生。测开关节点时探头要短地线,用弹簧地针,不然高频振铃全是假的。
调试过程中还要注意MP2642GR-Z母线的动态响应。均衡启动瞬间母线会掉压,如果示波器看到MCU复位或PWM异常,先加大母线电容,再看MP2642的环路补偿。这类问题多半不是主控的问题,而是电源瞬态响应不够。
5. 常见问题与排查速查
5.1 采样值跳变导致误均衡
现象:没有开启均衡的时候,两个单体电压显示一直在小幅跳动,偶尔超过阈值,均衡反复启停。
原因分析:分压电阻等效阻抗太高,ADC采样时间不够,采样电容没有充满;或者采样时序正好赶上PWM开关动作。
排查步骤:先用万用表量ADC引脚的电压,如果万用表读数是稳定的,而MCU读数是跳变的,问题出在采样保持电路。解决方法是降低分压电阻值、打开ADC的采样时间延长功能、加OPA缓冲器。如果PWM已经开启,把采样点移到PWM周期中开关动作之后的时段。
5.2 均衡开启后压差不收敛
现象:均衡状态正常开启,PWM有输出,电流采样也有值,但运行很久后两个单体电压差没有明显变小。
原因分析:方向反了,能量从低电压单体搬到了高电压单体;或者电感饱和,电流看起来很大但实际没有有效搬移;又或者母线电压被拉垮,功率级实际工作在临界状态。
排查步骤:先确认方向设置和接线一致。用示波器看开关节点波形,再对比目标方向。如果是电感磁芯饱和导致效率骤降,换一个饱和电流更大的电感。如果是母线跌落,检查MP2642GR-Z的输出电容和限流设置。
5.3 MOS管异常发热与炸管
现象:均衡电流不大,但某个MOS温度很高,甚至上电瞬间炸管。
原因分析:第一种是死区时间不够,上下桥臂直通;第二种是PWM初始化阶段GPIO电平不确定,导致MOS默认导通;第三种是栅极驱动回路回路面积太大,开关振铃严重。
排查步骤:用示波器A通道测高边MOS栅极,B通道测低边MOS栅极,观察有没有同时为高的时刻。必要时增加死区时间。固件初始化时要把PWM引脚先设置为确定电平,再释放输出使能。PCB上栅极驱动电阻要靠近MOS栅极,驱动回路的环路面积尽量小。
5.4 备用电源长期挂网的功耗与可靠性
现象:系统待机功耗偏高,或者均衡板长期工作后出现偶发复位。
原因分析:辅助电源空载功耗没有优化到最低;均衡停止后母线仍然满负荷;MCU没有进入低功耗模式;或者长期挂网时MP2642GR-Z的输入电压波动导致过压/欠压保护。
排查步骤:在待机状态下测量电池组输出总电流,逐项断开负载定位功耗来源。均衡结束后把功率级输出关断,PIC进入休眠,用定时器周期唤醒采样。唤醒后不要立刻做均衡动作,先等1到2秒让母线稳定,再重新采集电压。备用电源的一个经验准则是:待机功耗低于1mA对电池寿命的影响基本可忽略,超过就要认真找原因了。
我把这个项目里常见的问题整理成一张速查表,调试时可以快速定位:
| 现象 | 可能原因 | 解决方向 |
|---|---|---|
| 电压读数跳动 | 分压电阻过大、采样相位不对 | 降低电阻、延长采样时间、采样对齐PWM |
| 均衡不收敛 | 方向反、电感饱和 | 核对方向、更换电感 |
| PWM输出但电流小 | 母线跌落、电流采样偏位 | 加大母线电容、检查采样电阻位置 |
| MOS发热 | 死区不足、驱动不良 | 增加死区、优化栅极驱动 |
| 待机功耗高 | 辅助电源空载耗流、未休眠 | 降低母线空载功耗、MCU休眠 |
| 偶发复位 | 母线瞬态跌落、地线干扰 | 加大输出电容、单点接地 |
最后再分享一个真实体会:均衡电流不是越大越好。我第一次调试这个项目时,把均衡电流设到2A,想着越快越好,结果电感发热、开关噪声、采样干扰全部爆发,电压差反而没有明显改善。后来把电流压到0.8A,留足母线和散热裕量,再配合浮充末端的策略,电池组压差稳定维持在10mV以内。2串系统虽然简单,但它把电压采样、驱动时序、状态机、功率预算这些BMS核心问题都完整地练了一遍。后面如果想扩展到更多串电池,用这套思路做轮询均衡或者分布式均衡模块,基本不需要推翻重来。