1. 两个串联单元为什么会失衡,以及均衡到底在干什么
1.1 串联电池组里最容易被放大的问题:电芯不一致
很多做储能、备用电源的朋友一开始都会把注意力放在电池保护上,过充、过放、过流都做了,结果系统还是时不时出毛病:充电提前跳满、放电容量跑不到标称值、SOC显示一跳好几个百分点。追到最后,十有八九是串联电池单元之间的电压差捅出来的娄子。
两个电芯串联,标称电压7.4V或者8.4V,听起来简单,但它和单节电池最大的区别在于:放电回路里流过的电流是同一个,可每节电池能放出的电量却不一样。电芯在生产时存在材料批次差异,使用中又面临不同位置的温度差异、内阻差异、自放电率差异,这些东西叠加起来,就会让两节电池的实际可用电量逐渐拉开差距。差距一旦形成,充电时电压高的一节先到保护电压,低压的一节还没充满;放电时电压低的一节先到截止电压,高压的一节还有很多余量,整个电池组就被最弱的那节电芯卡住了脖子。
在备用电源或者储能系统里,这种问题更明显,因为电池大多数时间处于静置或者小倍率浮充状态,长期微小的自放电差异也会被累积放大。如果不做均衡,电池容量衰减速度几乎肉眼可见。
1.2 均衡的本质:让每节电池的电压和容量重新对齐
均衡的核心目标不是把两节电池的电压强行拉成绝对相等,而是让它们在工作过程中保持靠近,尤其是接近满电状态时,避免某一节提前进入过压保护。常见的做法有两种:被动均衡和主动均衡。
被动均衡的思路很直接,检测到某节电池电压比另一节高,就通过并联在它两端的电阻把多余的能量以热的形式放掉。它好处是电路简单、成本低,坏处是能量直接被烧掉,均衡电流一大发热就很明显,而且均衡速度慢。在能量密度敏感、散热条件差的小型储能设备里,被动均衡并不是理想方案。
主动均衡则是把能量从高电压单元搬到低电压单元,用电感、电容或者DCDC变换器做能量搬运。它不浪费能量,只做转移,均衡电流可以做得比较大,速度也快得多。代价是电路结构复杂一些、要有MCU参与控制,但在一套本来就带主控的BMS系统里,这种代价通常是可以接受的。
1.3 我为什么选了这个组合:DCDC功率级加一颗带ADCC的MCU
做两个串联单元的主动均衡,正好落在了一个很有意思的硬件组合里:用一颗同步降压转换芯片做功率级,再用一颗自带高分辨率ADC和运放的单片机做控制和采样。我在这个项目里选的是MP2642GR-Z作为功率级,PIC18F57Q43作为主控。
MP2642GR-Z本身是一颗同步降压转换芯片,输入耐压能覆盖两节串联锂电池的最高电压,输出电流能力足以支撑几百毫安到安培级的均衡电流,而且芯片内部集成同步整流管,外围元件少、效率高,非常适合被改造成一个受控的能量搬移电源。PIC18F57Q43则提供了12位ADC、可配置运放、多路PWM和丰富定时器,采样电压、计算差值、输出脉宽调制信号这些工作靠一颗芯片就能全部完成。配合起来,均衡器就是一个带软件闭环的高效电源。
2. 硬件搭档拆解:MP2642GR-Z和PIC18F57Q43各自扮演的角色
2.1 MP2642GR-Z作为功率级的几个关键点
很多人一听到均衡器,第一反应是找一颗专门的电池均衡芯片。专用芯片当然省事,但它通常绑定了固定的均衡策略和均衡通路,灵活性有限。用通用DCDC芯片的好处是,策略完全掌握在自己手里,均衡电流、开关时机都可以按项目实际情况调。
MP2642GR-Z这颗芯片在这个项目里的定位是可控的电流源。它本身是电压型降压芯片,我们可以利用它的反馈引脚、使能引脚和软启动引脚,把它的输出电压或者输出电流限制在MCU设定的目标值上。
实际中我是通过PIC18F57Q43产生PWM,经过RC低通滤波得到模拟电平,再去控制这颗芯片的反馈参考网络,以此间接设定均衡电流。也可以更简单,直接把MP2642GR-Z配置成固定电压源,通过限流电阻或者电流采样闭环的方式把电流限制住。对于两节电芯之间0.3A到1A的均衡电流来说,这种方案非常成熟。
需要注意,MP2642GR-Z的开关频率、电感和输出电容的搭配需要按数据手册来。均衡电路对纹波要求不像后端供电那么苛刻,但也不能随意乱配,否则轻载时容易进入脉冲模式,电流输出忽大忽小,软件闭环就不好做了。我实际取的是接近数据手册推荐值的电感和输出电容组合,并把芯片设置在连续导通模式下运行,让均衡电流保持平稳。
2.2 PIC18F57Q43承担采、算、控三件事
PIC18F57Q43这颗MCU的定位也很清晰,就是“采、算、控”。
先说采样。均衡控制的前提是知道两节电池各自电压多少。PIC18F57Q43内部集成的12位ADCC模块可以分别采样两个单元的分压点,分辨率能做到大概1mV左右,对于均衡门限4mV、10mV甚至20mV这些档位来说绰绰有余。而且这颗MCU的ADC还支持多通道扫描和累加平均,非常适合做采集滤波。
然后是计算。MCU需要把采样值换算成真实电压,再判断差值是否超过启动阈值、是否进入稳定区、是否需要停止均衡。这些逻辑用状态机来写非常清晰,不需要跑系统,裸机轮询就能做得很好。
最后是控制。PIC18F57Q43有多路PWM模块,我用了其中一路作为DCDC芯片的设定基准,另一路作为保护或者通讯用途。它的PWM分辨率足够精细,哪怕只用来做低速调节,也不会出现电流控制步进太粗的问题。另外这颗MCU还带运放模块,我直接用内部运放做电流采样信号放大,省掉了一颗外部运放,原理图上少好几个元件。
2.3 这套组合真正划算的地方在哪里
用通用DCDC加MCU做均衡,最大的收益其实不是成本,而是灵活性。储能和备用电源产品的规格经常变化,今天做两节串联,明天可能做四节串联;今天均衡电流要0.3A,明天客户要求1A。专用均衡芯片遇到这种变化往往要换料,而DCDC加MCU的方案只需要改一下固件参数,功率级可能连动都不用动。
另外,这颗MCU承担了均衡控制之外还能顺手干别的活,比如和BMS主控通讯、上报均衡状态、记录历史数据。在一个产品里少一颗芯片,对整机成本和调试工作量都是实打实的优化。PIC18F57Q43虽然定位不算高,但外设覆盖能力已经让我不需要再外挂专门的采集芯片。
3. 实际电路拓扑与关键设计细节
3.1 双节串联下的能量搬移通路
我按常规两节串联的结构来搭:下节叫CELL1,上节叫CELL2,串联中点引出。主动均衡的最终目的是让CELL1和CELL2的电压接近,能量从高的一节流向低的一节。
如果只做单向均衡,也就是永远从CELL2往CELL1搬,那CELL2一旦比CELL1低就没办法处理。所以我在功率级前端加了一组换向开关,用两个MOS管或者一个小型双刀继电器,根据MCU判断的结果决定DCDC输入端接哪节电池、输出端接哪节电池。
MP2642GR-Z在这里工作于降压模式,输入来自电压较高的电池单元,输出经过电流采样后灌入较低的电池单元。由于两节电池电压差一般不会超过几百毫伏到一两伏,DCDC的负载其实很轻,它的效率在这个区间也能保持在一个比较好水平。
做换向开关时需要特别注意公共地的问题。两节电池串联,中点电位和系统地之间是有关系的,开关导通路径必须避免把电池正负极直接短路。我在原理图设计时用四颗MOS管搭成了两个单刀双掷结构,MCU的IO口通过驱动芯片控制栅极,保证在任何时刻都只有一条搬移路径导通。
3.2 采样网络怎么搭才不会被均衡电流干扰
电压采样看似简单,实际里有不少坑。直接拿MCU的ADC去采电池正极对地电压是不行的,因为两节串联电池的电平都悬浮在系统地上,必须先做电阻分压,把电压降到ADC输入范围内。
我用的分压方案是:CELL1直接采它对系统地的电压,CELL2则先采样CELL2正极对地电压,再减去CELL1的电压,换算得到CELL2两端电压。也可以选择采样串联中点对地的电压,再用差分方式计算。为了保证测量精度,分压电阻我选了精度1%的金属膜电阻,电阻值尽量选大一些,减小对电池的静态消耗,但也不能太大,否则ADC输入阻抗会拉低采样点电压,造成读数偏低。
更关键的是,采样点必须远离均衡电流的路径。我把电压采样点直接接在电池端子和均衡功率输入的交汇点之前,而不是接在DCDC输入电容后面,因为功率路径上流过均衡电流时会产生压降,如果采样点取在负载侧,测到的就不是电池真实电压了。第一次搭板时我没注意这个细节,均衡一启动电压读数就跳十几毫伏,后来把采样走线重新调整后才稳定下来。
3.3 电流采样和闭环调节
电流采样我用的是低边采样电阻加运放放大的方案。采样电阻放在DCDC输出回路上,两端压差经过PIC18F57Q43的内部运放放大后送入ADC。由于均衡电流最大也就1A级别,采样电阻功率选0.25W就够,阻值几十毫欧即可。放大倍率按ADC量程和满量程电流计算,留出一点余量防止过采样。
闭环调节我写在固件里,用软件PID做电流环。目标电流由均衡策略给出,实际电流由ADC每50ms采样一次,PID输出控制PWM的占空比,PWM经过RC滤波后调整MP2642GR-Z的参考电压。整个环路的带宽不用太高,毕竟均衡本身是个慢过程,太高了反而容易把采样噪声放大,导致均衡电流来回抖。
3.4 安全和保护元件不能省
做储能、备用电源相关的东西,安全永远是第一位的。我在功率输入和输出两端都加了慢断保险丝,防止万一MOS驱动失效导致电池正负极直通。均衡启动时通过软启动斜坡逐步提高电流,避免瞬间大电流冲击电池和DCDC芯片。MCU侧除了看门狗,还做了ADV值超范围保护,一旦采样电压异常就直接把所有MOS和DCDC使能关掉。
4. 固件状态机与均衡控制逻辑的实现思路
4.1 状态机设计:让均衡器知道自己每一步该干什么
我把整个均衡控制做成了五个状态:空闲、采样、判断、均衡、保护。这样逻辑清晰,也方便调试时通过串口打印当前状态。
空闲状态下,MCU所有输出关闭,仅保留电压采样和阈值判断。采样状态下,连续采样两节电池电压,做一轮软件滤波,更新电压平均值。判断状态会根据最新电压差和电池状态决定是否进入均衡,均衡状态下启用DCDC和换向开关,周期性地刷新目标电流。一旦检测到电压超范围、电流过流或者通信超时,就立刻进入保护状态,关闭全部输出,记录故障标志。
状态机里最容易被忽略的是状态切换的防抖。电池电压不是绝对静止的,负载波动、自恢复反应都会让电压出现短时抖动。如果电压一超过阈值就启动均衡,很可能均衡刚启动,电压差又掉回去了,来回切换会非常伤MOS和电池。我的做法是,连续多次采样都超过启动阈值才进入均衡,退出时也用滞回判断,启动阈值和停止阈值之间留10到20mV的间隔。
4.2 ADCC采样、均值滤波和校准补偿
PIC18F57Q43内部的12位ADC采样速度完全可以满足这个项目的需求。我把两个电压采样通道每通道连续采样16次取平均值,消除大部分白噪声和开关纹波。虽然均衡电流回路本身是低纹波的,但PWM调节产生的微小波动还是会耦合到采样线上,过采样平均是成本最低的办法。
校准补偿我也做了。分压电阻虽然是1%精度,但两节电池的采样链路电阻值并不完全一致,会带来固定偏差。我在装配完成后用电台表测量两节电池的实际电压,和MCU读到的ADC值做对比,生成两个通道的增益和偏置校准系数,烧录在Flash里。这个步骤投入小、收益大,校准后电压测量的最大误差能控制在5mV以内。
4.3 控制判断逻辑怎么写
均衡判断的核心就是两个指标:电压差和电压区间。电压差决定要不要动作,电压区间决定是否允许动作。
例如,当两节电池电压差超过20mV,且两节电压都在2.5V到4.3V的安全区间内时,进入均衡态。目标是把电压差拉到10mV以下,然后停止均衡。滞回值的存在可以防止临界点来回跳动。如果某一节电池电压已经接近过压保护值,均衡方向只能是从这一节往另一节搬能量;如果一节在低位,就先判断是否低位欠压,欠压则不做均衡,防止把本来就有问题的电池进一步拉低。
在大电流充电或者放电过程中,我也允许均衡工作,但会把目标电流压低一些,避免和主回路电流叠加后导致电池电压波动太大。
4.4 核心代码逻辑示意
下面是一段简化但结构完整的伪代码,展示判断与执行部分的思路:
typedef enum { IDLE, SAMPLE, JUDGE, BALANCE, FAULT } bal_state_t; volatile bal_state_t state = IDLE; volatile uint16_t cell1_filtered_mv; volatile uint16_t cell2_filtered_mv; void balance_task(void) { switch(state) { case IDLE: balance_output_enable(false); state = SAMPLE; break; case SAMPLE: cell1_filtered_mv = adc_average_filter(CELL1_CH); cell2_filtered_mv = adc_average_filter(CELL2_CH); state = JUDGE; break; case JUDGE: int32_t diff_mv = (int32_t)cell2_filtered_mv - cell1_filtered_mv; if (diff_mv > START_THRESHOLD_MV) { // CELL2 高,能量从 CELL2 搬到 CELL1 set_transfer_dir(DIR_CELL2_TO_CELL1); target_current_ma = BALANCE_CURRENT_MA; state = BALANCE; } else if (diff_mv < -START_THRESHOLD_MV) { // CELL1 高,能量从 CELL1 搬到 CELL2 set_transfer_dir(DIR_CELL1_TO_CELL2); target_current_ma = BALANCE_CURRENT_MA; state = BALANCE; } else { state = SAMPLE; } break; case BALANCE: if (voltage_diff_in_stop_zone()) { balance_output_enable(false); state = SAMPLE; } else if (software_pid_step(target_current_ma) != PID_OK) { state = FAULT; } else { balance_output_enable(true); } break; case FAULT: balance_output_enable(false); save_fault_flag(); break; } }实际工程里还需要把采样、PID计算、保护检查分别放到定时器中断或者主循环的不同时间槽里,避免相互阻塞。这里只给框架,让思路更直观。
4.5 固件里几个容易出问题的小地方
第一个是PWM初始化的顺序。上电时如果PWM输出先跑起来,DCDC芯片的使能还没有准备好,可能导致输出电压快速冲击电容。我习惯先配置IO和使能引脚为关闭状态,再初始化PWM,最后打开均衡输出。
第二个是基准电压选择。PIC18F57Q43的ADC可以使用内部基准,但内部基准在全温度范围下会有漂移。在储能场景里,环境温度可能在几十度范围内变化,电压采样误差会跟着漂。我对精度要求比较高的应用场景,用外部基准芯片或者板载精密基准分压做参考,实测稳定性好了不少。
第三个是看门狗。软件主循环和状态机误差不大,但一旦出现异常死循环,DCDC可能保持输出卡死,非常危险。我把看门狗独立开了一个定时器喂狗任务,任何一个状态执行超时都会触发复位,复位后默认所有输出关闭。
5. 实测数据、调试过程与常见坑
5.1 均衡效果的实测过程
我搭了完整电路做验证,电池用两节标称3.7V、容量2Ah的锂离子电芯串联,在人为制造出95mV电压差之后启动主动均衡,目标电流设定为0.5A。整个测试过程用高精度万用表和上位机同时记录电压变化。
测试结果显示,头5分钟电压差从95mV快速回落到58mV,下降速度比较明显;后面随着电压差缩小,回落的斜率变缓;大约22分钟后电压差稳定在12mV附近,进入滞回停止区间,均衡器自动退出。停止后静置半小时,电压差又缓慢回升到18mV,但幅度很小,属于电芯本身的电压回弹,不是均衡电路失效。
这个结果对于2Ah电芯来说基本符合预期。如果想要更快的均衡速度,可以把电流提高到1A,代价是热耗增加、DCDC和电池端子的温升更明显。对于储能系统来说,0.5A往往已经足够,因为不均衡是一个慢慢累积的过程,不需要追求过快的收敛。
5.2 调试中最折腾的三个问题
第一是采样线干扰导致的误判。最初我把采样线走得比较靠近DCDC电感,均衡电流一大,ADC读数就跟着跳,甚至出现超过30mV的假电压差。后面把采样走线改成双绞线,并远离电感区域,在ADC引脚加了RC滤波电容,问题才消失。后来我再做板子时,干脆把分压电阻和ADC输入电容放在一起,中间走线尽量缩短,这个经验分享给同样做电压采集的朋友。
第二是换向开关的导通时序。一开始换向时,我先打开目标方向的MOS,再关断原来方向的MOS,结果在切换瞬间两个方向的MOS同时导通了一段,相当于把DCDC输入输出短路了,触发了过一次流保护。后来的处理方式是先关闭所有MOS,延时5ms确保完全关断,再打开目标MOS,彻底避免直通。
第三是PWM到DCDC参考电压的响应曲线问题。RC滤波后的模拟控制电压和DCDC输出电流之间不是线性关系,在小电流区间尤其明显。我在固件里做了一个分段线性插值,用小电流段更密的校准表把非线性掰回来,均衡电流的稳定度提升很明显。
5.3 顺手整理了一张故障排查表
| 故障现象 | 可能原因 | 排查方向 |
|---|---|---|
| 均衡启动后电压差变大 | 换向方向反了 | 检查MOS开关逻辑和电压判断正负号 |
| ADC读数跳动超过20mV | 采样线受开关节点干扰 | 加滤波、调整走线、缩短采样路径 |
| 均衡电流比设定值低 | RC滤波电压和实际输出不匹配 | 重新做分段校准,或改用运放闭环 |
| MOS温度异常升高 | 开关频率与死区设置不对 | 检查驱动波形、驱动电阻和死区时间 |
| 电池电压采样偏低 | 分压电阻阻值过大加ADC负载 | 换大输入阻抗方式或增强运放跟随 |
5.4 关于均衡策略的进一步思考
两节电池的主动均衡做完之后,我顺手往四节方向扩展了一下思路。其实每一节之间的均衡还是同样的DCDC加换向开关,只是MCU需要管理更多通路,状态机也要从一对一的判断改成多对多的轮询。对于现在很多小型储能产品来说,先做两节串联验证方案,后面再扩展到更多节数,是一个投入产出比很高的路线。
在策略方面,还可以考虑结合电池充电状态来决定均衡时机。例如在充电末端电压上升快的阶段加大均衡电流,在静置期减小均衡电流。这样既能保证均衡效果,又能减少不必要的能量搬移。
6. 写在最后:做这套均衡器的一些体会
整个项目做下来,我最深的感受是,主动均衡的难点不在DCDC或者MCU单个器件上,而在于把功率级、采样网络、控制逻辑串成一个闭环,并且让这个闭环在异常情况下还能安全收尾。MP2642GR-Z和PIC18F57Q43这套组合胜在每一项都很常规,不依赖什么黑科技,但组合起来之后,均衡速度、效率和可维护性都要比传统被动方案舒服得多。
如果让我给后来人一个建议,那就是在做原理图之前,先把采样点、换向开关逻辑、保护条件这三件事想清楚。它们决定了后续调试的时间成本。我在这三个地方各踩过一次坑,加起来花掉的调试时间比写整套固件还要多。希望这篇文章能帮你少走这几段弯路。