首页 / 资讯中心 / 文章详情

基于MP2642GR-Z与PIC18LF45K42的串联电池主动均衡系统设计

基于MP2642GR-Z与PIC18LF45K42的串联电池主动均衡系统设计 ★ FEATURED ARTICLE
那是一个再普通不过的下午一块给小型储能和备用电源系统用的两串电池管理板充完电放了不到两天带一个传感器负载电压就掉得让人怀疑人生。拆开一量两节串联的18650一节4.08V另一节3.66V——差了四百毫伏。原因不复杂串联电池天生存在个体差异如果只依赖充电器统一充满不均衡不会消失只会随着循环次数的增加越来越严重。这个项目的出发点就是用MP2642GR-Z做能量转移的核心用PIC18LF45K42做电压感知和控制调度实现对两个串联电池单元的主动均衡。这篇文章把从电路架构、采样设计、固件状态到实测数据的过程完整写出来。如果你正在搞储能BMS、2S备用电源管理板或者只是好奇“主动均衡到底怎么落地”这篇可以直接当参考框架抄作业。1. 先搞清楚串联电池失衡的根因以及主动均衡为什么比被动放电强1.1 两节电池为什么会“走散”很多人的第一反应是“电池本来就是新的怎么会不一致”。但哪怕同一批次、同一容量的电池出厂时的内阻、自放电率、活性物质分布都有分散性。串联回路里电流虽然处处相等可两节电池对同样的电流响应并不一样——内阻大的那节放电时电压跌落更严重自放电率高的那节静置时电压掉得更快。备用电源场景更特殊系统很多时候处于“充满—静置—随机带载”的循环。静置期间自放电高的电池电压持续缓慢下降一旦启动负载整组输出能力被这个短板直接卡死。再叠加温度梯度——比如某节电池恰好靠近板上的发热器件它的老化和容量衰减速度会明显更快。时间一长落后的电池不仅拖垮整组容量还有过放损坏的风险。1.2 被动均衡的账算起来并不划算市面上很多成品板子用的是被动均衡检测到某一节电压偏高就在它上面并联一个小功率电阻通过放电把能量烧掉直到电压降下来。原理简单可靠但代价全在“浪费”两个字上。算一笔具体账假设压差ΔV300mV电池容量2Ah。粗略估算要转移掉的能量大约是0.6Wh。如果均衡放电电流限制在100mA电阻上的功耗接近0.4W把0.6Wh烧完需要约89分钟。这期间板子上多了一个正在烧烤的热源能量被白白消耗而且压差越大、电池容量越大被动均衡需要的时间越长。在储能系统里这种把电量变成热量的做法怎么看都不划算。1.3 主动均衡的本质是“搬运”而不是“烧掉”主动均衡的思路就完全不一样用功率变换电路把高电压电池的能量取出来经过电压转换直接送进低电压电池。也就是说高电池少掉的能量低电池刚好补上整个系统并没有损失多少总能量。效率做到80%以上发热小、均衡时间也短。对于两节串联的拓扑其实不需要很复杂的结构一个可被单片机控制的DC-DC功率级加上一组方向切换开关就能完成两个方向的能量搬运。这也是MP2642GR-Z在这个项目里承担的核心角色。2. 系统设计与选型MP2642GR-Z 负责搬运能量PIC18LF45K42 负责感知和调度2.1 整个板子的模块地图在画原理图之前先把系统拆成六个功能块后续做起来思路会清楚很多模块核心器件/电路职责功率级MP2642GR-Z 电感电容完成电压变换实现能量从高电池到低电池的转移采样网络分压电阻 RC滤波把两节电池电压、温度变换为MCU可读的信号控制核心PIC18LF45K42多通道ADC采样、均衡调度、保护逻辑、状态指示方向切换MOS开关矩阵决定能量从左往右搬还是从右往左搬辅助电源LDO 3.3V给MCU和逻辑电路供电指示与调试LED、串口运行状态显示和调试输出2.2 MP2642GR-Z 在均衡系统里到底是什么角色很多人一看到“均衡”就以为要专门的均衡芯片其实不是。MP2642GR-Z 在这里的定位是一颗可被外部控制的开关电源功率级。按数据手册搭好外围——电感、输入输出电容、反馈网络——它就构成了一路可调的DC-DC变换器。PIC通过PWM调节占空比、通过GPIO控制使能就能驱动它工作。实际运行时我把它的输入接在当前电压较高的电池侧输出接在电压较低的电池侧。MP2642GR-Z就像一个临时工不停地把能量从电压高的那边搬出来经过电压转换之后灌到电压低的那边。输出电流的大小由PIC设定。这里有个关键点这颗芯片并不需要知道“谁是高谁是低”它就是按PIC给的指令执行变换方向逻辑完全由单片机和开关矩阵决定。2.3 选PIC18LF45K42的几个理由控制核心选型时我对比过好几颗8位和32位单片机最后定下PIC18LF45K42主要看中以下几个方面12位ADC电池均衡对电压精度要求高12位起步才够用。ADC2硬件计算模块支持自动累加和平均可以省掉CPU反复处理采样数据的负担。CLC可配置逻辑单元可以用纯硬件逻辑做MOS开关互锁即使单片机程序跑飞开关也不会直通短路。外设引脚选择PPS引脚分配灵活画PCB的时候不用为了IO位置硬挪走线。内置EEPROM分压电阻的校准系数可以掉电保存不用外挂存储。1.8V-3.6V宽工作电压配合3.3V LDO供电电池电压降到比较低时单片机还能正常工作。2.4 双向均衡的方向切换逻辑既然有两节电池能量搬运就存在两个方向CELL1电压高时从CELL1取电给CELL2充电。CELL2电压高时从CELL2取电给CELL1充电。我用了四颗MOS管构成开关矩阵。简单来说就是通过S1/S2把功率级的输入端接到哪一侧通过S3/S4把输出端接到哪一侧均衡方向输入侧连接输出侧连接开关状态CELL1 → CELL2BATT 与中点M中点M 与 GNDS1/S2导通S3/S4截止CELL2 → CELL1中点M 与 GNDBATT 与中点MS3/S4导通S1/S2截止方向切换不能随意执行必须先关断PWM、等功率级内部的电感能量完全泄放再切换MOS最后重新软启动。否则在切换瞬间开关管有一个“还在导通”和“已经导通”重叠的窗口两节电池可能通过开关矩阵直接短路炸管就是这样来的。3. 硬件设计要点采样网络、功率路径与关键保护3.1 电池电压采集从分压电阻到ADC通道的细节两节串联电池的节点关系是CELL1在上CELL2在下中间节点叫M点。CELL2的电压就是M点对GND的电压CELL1的电压是BATT对M点的电压。我用了两个分压网络把高压映射到MCU的ADC输入范围CELL1分压BATT → 100kΩ → ADC_CH0 → 100kΩ → M点CELL2分压M点 → 100kΩ → ADC_CH1 → 100kΩ → GND以单节电池4.2V满电为例分压后约2.1V低于PIC18LF45K42内部FVR参考电压2.5V可以直连ADC引脚。12位分辨率下理论上大约0.6mV一个码实际因为噪声和参考波动有效分辨率在3-5mV级别对均衡来说够用。分压电阻阻值的选择也有讲究。阻值太小静态漏电太大阻值太大ADC输入阻抗会引入采样误差。100kΩ对100kΩ是一个折中。这里我特意用了1%精度的电阻但仍然建议做校准——后面调试章节会细说为什么。实际测量中两个分压通道之间存在系统偏差可能是电阻精度、PCB漏电流或者走线压降造成的。我在固件里留了校准系数用精密万用表实测两节电池电压后把比例修正常数写进EEPROM。3.2 功率路径MP2642GR-Z 的外围配置功率级外围按最经典的升降压配置搭建关键元器件如下输出电感10μH功率电感注意饱和电流要大于设计均衡电流。我按峰值1.5A选型。输入电容22μF陶瓷电容X7R耐压16V放在BATT和GND之间。输出电容22μF陶瓷电容同样选低ESR。反馈网络按数据手册推荐配置决定输出电压的上下限同时留出PIC可调节的反馈接口。均衡启动瞬间有一个容易被忽略的问题如果输出端电容已经放空MP2642GR-Z刚使能时会瞬间从输入端抽取大电流造成输入电压跌落。PIC如果检测到电压跌落可能误判为“电池欠压”而启动保护。解决方法是软启动——PIC控制功率级使能后的PWM占空比从零开始在一个斜坡时间内缓慢升高限制启动电流冲击。3.3 MOS开关矩阵与硬件互锁方向切换开关矩阵选MOS管时关注三个参数导通电阻Rds(on)要尽量小耐压要高于电池组最高电压门极电容别太大免得驱动慢。我选的是逻辑电平驱动的低压MOSRds(on)在10mΩ上下。重点要说的是互锁设计。两节串联电池加上一个功率级最怕的就是方向切换时形成“BATT直接对GND”的短路路径。我把PIC的两路方向控制信号送进CLC可配置逻辑单元用组合逻辑实现互锁保证S1/S2和S3/S4两组开关不可能同时导通。即使单片机死机、程序跑飞CLC在硬件层面仍然保持互锁关系这是防止炸板的重要防线。软件上再补一刀每次切换方向之前先让功率级停止工作延时至少500μs确保电感电流降到零。3.4 控制核心供电和地线规划PIC18LF45K42需要3.3V供电我直接从电池组总电压经过一个超低静态电流的LDO获取。这样可以保证均衡过程中MCU供电稳定不会受单节电池电压波动影响。地线规划是这个项目PCB设计里最容易被低估的一环。均衡电流在功率路径上流动时即使只有几十毫欧的寄生电阻也会产生几十毫伏的压差。如果采样电路的地线走在这条路径上ADC的参考地就会“抖动”测出来的电压值自然不准。我做了两个动作采样分压电阻的地线单独走信号地GND与功率地PGND在电池负极单点汇合所有大电流回路铺铜加宽减小寄生电阻。3.5 PCB布局的几个实操建议采样走线务必远离SW开关节点开关节点的dV/dt会通过寄生电容耦合到高阻采样线上。分压电阻尽量靠近MCU引脚但采样取电点要用开尔文接法直接从电池端子和中点M引出。电感放在远离ADC参考引脚和模拟采样走线的一侧。功率环路输入电容、功率级、输出电容尽量收紧减少回路面积可以降低辐射和振铃。4. 固件设计采样策略、均衡状态机与异常保护4.1 ADC采样策略多通道、多帧、滑动平均固件设计里采样策略直接决定了均衡会不会误判。我的做法是用定时器每隔200ms触发一轮采样每一轮里依次测CELL1电压、CELL2电压和NTC温度。每次切换ADC通道后都要留出足够的采样电容充电时间具体时间参考ADC模块的ACQ设置我按12μs配置确保读到的是稳定值。对同一个通道连续采样8次用ADC2硬件累加求平均。再维护一个最近10轮平均值的滑动窗口取均值作为参与均衡判据的“滤波后电压”。这样即使备用电源系统在均衡过程中突然带载瞬间的电压跌落也不会让状态机误动作。要特别提醒的是判断压差跨越阈值时不能只凭一次采样。我的代码里要求“连续4轮采样都满足条件”才切换状态也就是约0.8秒的确认时间把瞬态抖动隔离掉。4.2 均衡判据与阈值设定阈值设置得是否合理直接决定均衡系统好不好用。我的经验如下启动阈值压差大于50mV才启动均衡。设太小会被采样误差淹没导致无意义的均衡动作。停止阈值压差小于15mV停止均衡。这里带迟滞避免当压差在阈值附近抖来抖去时反复启动停止。强均衡/弱均衡设定两档输出电流。压差大于150mV用强均衡电流约0.6A压差在50-150mV区间用弱均衡电流约0.2A。接近收敛时降低电流可以降低过冲风险。4.3 核心状态机IDLE、EQ_START、EQ_RUN、EQ_STOP、FAULT固件整体是个状态机比用一堆散落的if/else清晰得多状态进入条件动作退出条件IDLE上电初始化完成定期采样两节电压和温度LED慢闪压差50mV且持续4轮发现异常则进FAULTEQ_START压差超阈值确认均衡方向配置MOS开关PWM软启动斜坡稳定运行约100ms后进EQ_RUNEQ_RUN软启动完成持续采样按压差大小调整均衡电流档位ΔV15mV进EQ_STOP超时30分钟进FAULTEQ_STOP均衡收敛关闭PWM断开所有MOS开关等待功率级泄放延时500ms后回IDLEFAULT过压/欠压/过温/超时立即关闭功率级和开关矩阵点亮故障LED串口输出错误码人工复位或异常消失后延时复位均衡超时是一个容易被忽略但很重要的保护。我设了30分钟上限如果均衡过程中压差长时间不收敛说明可能有采样故障或者功率级没正常工作继续耗下去只会让低电池被充冒烟。4.4 安全保护不能只靠充电器IC因为做的是备用电源和储能场景我额外加了几层保护单节过压保护任一电池电压超过4.30V立即关闭均衡并报警。单节欠压保护任一电池电压低于3.00V禁止均衡启动提示对整组充电。NTC过温保护电池温度超过55℃时降额超过60℃直接停止均衡。看门狗PIC的独立看门狗定时器开启防止程序跑死后功率级失控。4.5 关键代码骨架均衡状态机的主循环用C实现核心结构大概是这样void eq_task(void) { switch (eq_state) { case IDLE: read_voltages(); if (delta_v EQ_START_TH check_persistent()) { eq_direction (v_cell1 v_cell2) ? DIR_1_TO_2 : DIR_2_TO_1; set_direction(eq_direction); pwm_softstart_begin(); eq_state EQ_START; } break; case EQ_START: if (softstart_ready()) { eq_state EQ_RUN; } break; case EQ_RUN: read_voltages(); if (delta_v EQ_STOP_TH) { pwm_stop(); relay_disable_all(); eq_state EQ_STOP; } else if (eq_over_time()) { fault_set(FAULT_TIMEOUT); } break; case EQ_STOP: if (time_after_ms(500)) { eq_state IDLE; } break; case FAULT: pwm_stop(); relay_disable_all(); led_fault_on(); break; } }真实固件里还会有ADC中断、EEPROM读取、沿串口打印调试信息等内容骨架的意义是先把逻辑边界定死避免后面越改越乱。5. 实测记录均衡曲线、效率与调试中的真实踩坑5.1 测试平台怎么搭我把两块18650电池稍微“人为制造”出压差CELL1充电到4.10VCELL2放电到3.72V压差380mV。然后把均衡板接上串入电流表用数据记录间隔1秒采集电压数据。环境温度25℃。5.2 均衡过程实测数据在一次完整均衡测试中记录的关键数据如下时间(min)CELL1电压(V)CELL2电压(V)压差(mV)均衡电流(A)04.103.723800.6254.063.782800.55104.023.841800.45153.983.89900.30203.943.92200.12233.933.9210停止整个均衡过程约23分钟转移的总电荷量大约0.22Ah按平均电压3.9V估算转移能量超过0.85Wh。如果换成被动均衡这些能量全部变成电阻上的热量还得多花几倍时间。两节电池最终停在3.93V和3.92V附近压差进入15mV以内状态机正常触发停止。值得注意的是均衡过程中CELL2电压并没有超过4.0V说明能量转移曲线是比较平稳的。如果低电池被快速充到过压说明转移电流太大或停止阈值设得太宽需要回头检查参数。5.3 调试中踩过的几个真实问题坑一分压电阻不对称导致的“假压差”最先调试时两节电池明明量出来只差5mV板子却报了50mV压差并启动均衡。排查后发现是两路分压电阻精度偏差叠加的结果CELL1分压的总阻值和CELL2分压的总阻值差了约1.2%在4V输入下直接产生了近50mV的误差。这个坑的解决方法是电阻改用0.1%精度同时保留EEPROM校准系数上电后用万用表实测电压做一次两点校准。坑二使能瞬间的电压跌落被误判成欠压有一次均衡启动后立刻报FAULT现象是“启动就失败”。用示波器抓输入侧电压波形发现MP2642GR-Z使能的瞬间输入端电压从4.0V跌到3.4V左右持续了几十毫秒。原因就是输出电容完全放空启动瞬间冲击电流过大。处理方式分为两层硬件上预留预充电路固件上把PWM改成斜坡软启动让占空比从5%慢慢爬到目标值。改完以后输入电压跌落控制在200mV以内误报消失。坑三方向切换时的直通风险第一次手动验证CELL2向CELL1均衡的方向时观察到输入电流尖峰偏高。虽然CLC已经做了逻辑互锁但我在软件里直接用两行赋值语句切换方向MOS门极驱动需要时间存在“旧开关还没完全关断新开关已经开始导通”的重叠窗口。后来在软件里加了三段式切换先停止PWM、延时等待电感电流归零、再切换方向、再重新软启动。这个顺序已经写进了上面的状态机。坑四地线噪声让ADC采样跳动均衡运行期间串口打印的电压值在几十毫伏范围内乱跳但用万用表量电池两端是稳定的。用示波器看ADC引脚发现采样时刻正好落在开关噪声的峰谷上。解决方法是把ADC采样触发和PWM开关频率同步错开在PWM关闭的窗口内启动ADC转换并且在硬件上把模拟地独立出来。这两条做完后采样跳动从±30mV降到±5mV以内。5.4 效率分析与改进方向实测整体均衡效率约81%。损耗主要来自三部分电感的DCR损耗、MOS管的导通损耗、开关切换损耗。其中MOS管导通损耗占了接近一半因为四颗开关串联在功率回路上每一颗的压降都要计入。后续改进方向包括换用更低Rds(on)的MOS、将开关频率提高后减小电感体积、优化死区时间降低开关损耗。另一个值得做的改动是增加“静置期间的涓流均衡”。备用电源系统大部分时间处于待机状态如果压差不大但持续存在可以用弱均衡电流慢慢搬。我的状态机预留了这个档位实际测试中弱均衡电流150mA时板子温升可以忽略不计。最后再分享一个小技巧整个过程做下来我的体会是主动均衡的关键不在功率级本身而在采样精度和方向切换的时序管理。你可以在运放、MOS和电感的选型上花很多钱但如果说实话绝大多数调试时间都花在“测量结果到底可不可信”上面。先校准电压采样再谈均衡逻辑顺序反了会把你带进死胡同。这个项目目前只针对两节串联单元后续如果要扩到4串或者更多串可以在同一方案上增加开关矩阵的通道数用一颗MCU轮流对相邻单元做能量搬运。另外均衡过程的数据通过UART上报给上位机之后可以看到每节电池的长期趋势对预判电池老化也很有用。希望能给正在做类似项目的你一些参考。
阅读完成 · 觉得有帮助?
咨询建站