多节锂电池包监测器设计:从AFE选型到保护逻辑与固件实现

📅 2026/8/27 1:50:17
多节锂电池包监测器设计:从AFE选型到保护逻辑与固件实现
锂电池做得越久越明白一个道理凡是多节串联的电池包安全从来不取决于“总电压是多少”而取决于“最差的那一串电芯现在是什么状态”。这个电池包监测器Battery Pack Monitor项目目标就是给多节锂离子电池组加一道全天候的守护网把每一串电芯的电压、整包电流、关键温度都实时盯住在过充、过放、过流、短路、高温等异常发生的时候及时切断回路同时承担电池均衡和状态上报的工作。做这类项目的人通常分两种一种是量产BMS的硬件工程师关心AFE选型和量产校准另一种是自己在做储能箱、电动工具、两轮车、机器人底盘电池的DIY玩家手里可能已经有一堆电池就差一个靠谱的保护板。这篇文章介于两者之间我把这个项目的需求拆解、硬件设计、保护逻辑、固件实现、实测踩坑都过一遍里面有具体参数、有计算过程、也有我实际试错的记录。如果你想自己做一块多节锂电保护板或者想搞懂厂家的BMS为什么这样设计这篇文章可以直接当参考。1. 项目定位这个电池包监测器到底在“护”什么1.1 串联成组的电芯真正要盯的是“最差的那一串”多节锂离子电池成组最常见的方式是串联升压。比如10串三元锂电标称电压是36V满电电压大约42V12串磷酸铁锂标称电压是38.4V满电电压大约43.8V。串联之后充电器和负载只看整包总电压但电芯的实际状态是逐串分布的。举个例子10串三元电池如果其中一串已经衰减到3.8V其他几串为了凑足42V的总电压可能已经被充到4.3V以上。只看总电压你会觉得一切正常实际上某一串早就过充了。过充的后果大家心里都有数轻则鼓包重则热失控。反过来放电时如果某一串电压掉得特别快整包也会因为这一串触发欠压保护其他还能继续放电的电芯只能陪着休息。所以这个项目的第一个设计原则就是绝不只看总电压必须逐串采集单体电压。这也是Battery Pack Monitor和普通电压表、普通保护板的最大区别。监测器要在每个采样周期内把所有电芯的单体电压全部读一遍任何一串越线都按既定策略处理。1.2 保护不是一刀切而是分级响应很多人对电池保护的想象就是“出问题就断电”实际项目里完全不是这么粗暴。长期用过电动工具或者电动车的人应该遇到过电钻一堵转就断电重启一下又好了电动车急加速时偶尔断一下电松油门再踩又恢复正常。这就是保护逻辑在起作用而不是故障。这个项目的保护动作分成几级警告级参数越过了安全门限但还没到立即切断的程度主控记录事件、点亮指示灯或上报上位机让用户知道电池状态需要关注。限流级比如温度偏高不需要停机但要把允许的充放电电流降下来避免继续升温。很多储能系统用的就是这种策略。单边切断级充电时发现某串过压只断开充电MOS放电回路保持通畅用户还能继续用完剩余电量放电时发现欠压只断开放电MOS充电器还能正常接入充电。全断加锁存级比如内短路检测到、短路保护触发、多个故障叠加这时候需要彻底断开充放电回路并且必须有外部干预才能恢复。这样分级设计背后逻辑是减少不必要的停机同时保证安全。如果每次过流都直接锁死用户拔掉电池重新激活体验会很差但如果是短路或者内短路就该锁死不能自动恢复因为很可能是电芯内部已经出问题了。1.3 适用对象与设计目标我手里这个项目监测对象是12串磷酸铁锂实际方案也可以兼容三元或14串以内的其他体系只需要改阈值参数。整体设计目标我列一下后面所有参数和测试都围绕这几个指标展开单体电压采样误差±5mV以内过流保护响应时间≤1ms短路保护响应时间≤100µs持续放电电流30A峰值60A10s被动均衡电流约60mA静态功耗休眠模式下≤100µA如果你做的电池包电流更大或者串数更多选型和布局思路是一样的只是器件承受能力要跟着升级。2. 硬件设计选型、布线、散热的几个硬道理2.1 电池监测前端AFE选型的核心指标项目里最核心的芯片是电池监测前端也就是AFEAnalog Front End。它不是普通单片机而是一个专门为多节串联电池设计的模拟采集芯片内部集成了多通道ADC、电平转换、保护比较器、均衡开关驱动和通信接口。常见的AFE有TI的BQ769系列、ADI的LTC6804/LTC6811、以及一些国产型号。为什么不能直接用单片机的ADC去测每串电压因为串联电池组里每一串电芯的地电位都在往上飘。以12串磷酸铁锂为例最高一串的负极已经接近40V远超单片机ADC的输入范围。如果做电阻分压网络逐串取电压分压电阻的精度、温漂、阻值匹配都很难做到±5mV的采样误差。AFE内部解决了电平移位和高压输入的问题所有电芯电压都被处理到同一个低压域再由ADC测量这是专用方案的核心价值。AFE选型要看的核心参数包括支持的最大串数6串、10串、14串、16串等要在项目需求上留余量。ADC分辨率与采样精度现在主流是14bit到16bit配合内部基准标称精度可以做到±1mV到±5mV实际板级还要看布线。是否内置库伦计/电流检测有些AFE带独立的电流ADC和库伦计通道对SOC估算很有帮助。均衡驱动能力决定外部均衡电阻能跑多大电流。通信接口I2C或SPI决定主控连接线程。保护比较器是否支持硬件级过压/欠压/过流快速比较这决定异常情况下保护动作到底由硬件直接触发还是靠软件轮询触发。比如BQ76940系列支持9到15串内置库伦计控制逻辑和电荷泵可以直接驱动高边N-MOS。如果做12串磷酸铁锂这颗芯片很合适。如果做的是14串三元ADI侧的LTC6811同样是很成熟的选择不过它更偏向车规级、采集精度高外围配置也更复杂。自己做项目建议优先选有评估板和参考资料最多的一颗调试周期能省一半。2.2 采样通道与均衡网络怎么搭AFE选完之后外围电路决定实际性能。首先是每一串电芯到AFE输入引脚之间的滤波网络。常规做法是每串采样线串一个电阻并一个对地电容构成RC低通滤波器抑制采样线上的高频噪声。RC参数的选择有点讲究。电阻太大会影响采样稳定时间电容太大会让电压跟随变慢。我实际用的方案是 R100Ω、C0.1µF截止频率约16kHz既能滤掉开关电源纹波又不会让电压通道响应太慢。如果系统里大电流路径的开关频率很低比如只有几百Hz的PWM那RC要适当放大否则采出来的电压会跟着PWM抖动保护误动作率直线上升。均衡网络是另一个重点。被动均衡的原理很简单在电压偏高的电芯上并联一个电阻把这串多余的电量以热量形式放掉。均衡电阻的阻值不能太小也不能太大。太小均衡电流大、发热严重太大均衡电流小起不到明显效果。以我用的47Ω电阻为例磷酸铁锂电芯电压约3.3V时均衡电流约3.3 / 47 ≈ 70mA。这个电流对容量100Ah以上的储能电池来说很慢但对5Ah-20Ah的电池包已经够用。如果用100Ω电流降到33mA均衡一晚也搬不了多少容量差如果用10Ω电流高达330mAAFE内部均衡开关不一定扛得住电阻本体也会烫到没法摸。这里有一笔热账一定要算单颗均衡电阻的功耗 PI²R。70mA电流流过47Ω电阻功耗约0.23W。如果同时有8串在做均衡总功耗约1.84W集中在PCB的小区域内铜箔必须要加宽并打散热过孔。否则实际测下来均衡半小时后温度能上到80℃以上AFE自己的温度传感器会把故障误报为电池过温。采样线走线也必须遵守开尔文连接原则每串的电压采样点要从电芯极耳独立引出不要在放电大电流的母排或MOS管引脚上取点。大电流路径上存在毫欧级电阻几十安电流流过就可能产生几十毫伏压降这部分电压会叠加到采样电压里造成严重的测量偏移。2.3 高压侧供电、隔离和MOS驱动的取舍AFE的供电一般可以直接从电池组最高正极取内部通过LDO稳压给自身和主控供电。好处是电池只要有电板子就跑得起来不用额外接电源缺点是整板地电位会跟随电压浮动通信和主控之间存在共模电压差。所以设计上必须考虑信号隔离或者把AFE放在高压的地域、主控放在低压侧之间用数字隔离器连接。我这次使用了独立的数字隔离器隔开主控和AFE之间的I2C信号。隔离不仅是为了安全也解决了我在调试中遇到的通信误码问题。没有隔离的时候MOS开关瞬间带来强烈的dv/dt干扰会直接把I2C波形打乱主控偶尔读到错误的电压数据。加上隔离之后这条链路明显干净了。MOS管驱动部分同样需要留意。如果保护MOS放在低边驱动电路简单但电池负载的负极端和整个系统共地会断开很多设备不允许低压负端浮空。所以我采用了高边保护方案AFE内部集成了电荷泵可以提供高于电池电压的驱动电压让高边N-MOS稳定导通。电荷泵的电容要靠近芯片放置走线短否则MOS导通压降会偏高大电流下发热非常明显。3. 保护逻辑与参数配置安全策略的核心细节3.1 三组关键阈值该怎么定保护阈值是整个项目的灵魂定错一个都可能出大问题。我按电芯体系分了组这里给出一份可参考的初始参数保护项三元锂10串磷酸铁锂12串恢复条件单体过充电压4.25V3.65V回落到保护值以下50mV单体过放电压2.60V2.40V充电恢复充电过流10A可设10A可设断开充电MOS后延迟恢复放电过流60A60A断开放电MOS后延迟恢复短路电流100A100A必须手动复位充电过温45℃45℃降到40℃以下放电低温-10℃-10℃升到-5℃以上这些数值不能照抄要根据电芯规格书来定。比如有些磷酸铁锂电芯允许充电到3.75V那就别用3.65V做硬保护有些三元材料耐压高可以把过充保护放到4.3V但恢复阈值和警告阈值要留够迟滞。短路电流阈值怎么定一般是按“电池组最大瞬时放电能力”来算。比如电芯内阻约5mΩ12串加上连接阻抗短路瞬间电流很可能到几百安甚至上千安。采样电阻和AFE的量程有限短路保护其实很难靠“精确测量电流值”来触发更多是靠硬件比较器检测采样电阻上的压降是否超过设定值。所以短路阈值通常不是一个绝对电流而是“采样电阻压降阈值”设计时要根据采样电阻的阻值和放大器的增益反推。另一个很重要的点阈值要分级。比如放电过流分成两级一级是持续过流60A/1s一级是瞬时过流80A/200ms。电机启动、工具堵转等场景瞬时电流很大但时间很短如果按持续过流一刀切正常使用也会狂触发保护。做了分级之后短暂的启动大电流可以被允许持续异常才被切断。3.2 状态机设计从“出问题”到“恢复”的完整路径保护逻辑不能写成一堆if-else堆在一起必须用状态机管理否则故障恢复的时候会乱套。我这次的状态机包含四个状态正常运行、充电故障、放电故障、深度休眠。正常状态下主控周期读取电压、电流、温度任何一项越限都会触发对应故障状态。以过充为例当任意一串电芯电压超过3.65V磷酸铁锂采样结果连续确认2秒后系统断开充电MOS进入充电故障状态。在这里为什么是连续确认2秒而不是立刻动作为了抗干扰。充电电压的纹波或者脉冲负载引起的瞬时电压尖峰如果一超过阈值就切断整个系统会频繁抖动。退出充电故障状态的条件也必须明确所有串电压都不高于3.55V而且充电电流低于0.5A该状态维持10秒以上才允许重新合上充电MOS。要求充电电流低于0.5A是为了确认充电器已经脱离如果在充电器还在输出大电流的时候强行合上MOS会产生明显的浪涌冲击。我额外增加了故障计数机制。比如某个过压事件软件只记录当前一次如果24小时内同一串电芯反复触发过充3次我就判断这串电芯老化严重直接把状态从可恢复切换成永久锁存。这个逻辑在电动工具电池、共享电动车电池上特别有用因为用户不会在意一次偶然的保护但如果同一节电芯问题反复出现就说明电池包本身已经不适合继续使用了。3.3 被动均衡的启动条件与执行节奏均衡策略直接决定电池组的一致性一致性差整组电池寿命就会迅速缩短。这个项目的均衡逻辑分两种场景第一种是充电均衡在充电接近末段时启动。锂电池在恒流充电后期电压会逐步走高此时表现最高的电芯最先进入平台区其他电芯则还在追赶。如果放任不管最高那串会比别的串先到达满充截止电压系统只能为了它停掉整组充电结果就是其他串永远充不满。充电均衡的启动条件设置为单体电压高于平均电压20mV以上且该串电压超过3.4V磷酸铁锂启动对应的均衡电阻。第二种是静置均衡在电池组存放或轻载时进行。电池组静置时电压差异主要是自放电率不同造成的几天到几周的静置就能拉开几十毫伏差距。静置均衡会把阈值设得更严格比如平均电压差10mV就启动但允许的最长均衡时间要控制住避免过度均衡引发新的不一致。这里有一个非常容易踩的坑均衡电阻开启后会把对应电芯的电压拉低。如果你在均衡开启的同一时间去做电压采样读到的数值会偏高或偏低取决于采样点相对于均衡电阻的位置。我采用的方案是“先采样、再均衡、结束时也先关均衡、等电压稳定再采样”。更精细一点可以用PWM方式做均衡开启均衡、等待采样窗口结束、再关闭均衡避免电压读取和均衡动作互相干扰。4. 固件实现与校准把采样值变成可信数据4.1 AFE通信与数据解析AFE和主控之间通常用I2C或SPI通信。我以I2C接口的AFE为例主控上电后做以下动作先复位AFE然后配置各个保护阈值寄存器、启用需要的ADC通道、设置均衡控制方式最后进入循环读取模式。读取一个完整采样周期的伪代码大概是这样的uint16_t cell_voltage_raw[14]; // 触发电压ADC转换 afe_trigger_voltage_conversion(); // 等待转换完成量测寄存器对应位会置位 while (!afe_conversion_complete()) { // 超时保护 } // 依次读取每串电压 for (int i 0; i cell_count; i) { cell_voltage_raw[i] afe_read_register(CELL_VOLTAGE_BASE_REG i * 2); cell_voltage_mv[i] (uint32_t)cell_voltage_raw[i] * LSB_VALUE / 1000; }LSB_VALUE就是AFE的电压分辨率。比如某颗AFE的参考电压是3.0VADC位数是16bit那么LSB约是3.0 / 65536 ≈ 45.8µV。但实际有效分辨率受噪声影响很难达到理论值。真正要关注的是AFE datasheet里标称的“采样精度”通常用“±mV”表示这才是你校准后能达到的底子。AFE内部的保护比较器和软件读到的电压是两条路线。硬件保护比较器独立运行比如过压比较器一旦监测到某串电压超过设定值不用主控参与就会直接拉低保护输出软件轮询则提供状态上报和更复杂的逻辑判断。项目里两者配合使用硬件级保护负责快和稳软件级保护负责复杂策略和恢复管理。4.2 主控任务划分与低功耗处理固件任务的实时性分配很重要我就踩过把保护逻辑写进主循环里导致响应慢半拍的坑。主循环里跑显示刷新、按键扫描这些耗时操作等轮到保护逻辑执行时几百毫秒都过去了这对过流保护来说是不可接受的。最终我按固定时间片拆任务1ms中断电流采样过流和短路判断短路保护必须由硬件比较器加中断双重触发不能只靠软件。10ms周期电压采样、温度采样触发电压转换并读取数据。100ms周期运行完整状态机判断是否进入或退出故障状态处理均衡逻辑。1s周期SOC估算、充电器连接检测、故障记录存储、通信上报。这样设计之后过流保护动作时间从软件轮询的“看运气”变成了确定性的毫秒级。短路保护则完全依赖硬件比较器MCU只在事件发生后负责锁存和状态更新。低功耗考虑电池组静置时整机不应该持续跑着全速采样。我设计成每30分钟唤醒一次完成一次完整的状态巡检如果发现所有参数正常继续休眠如果发现电压异常或充电器接入信号立即唤醒进入正常工作状态。AFE本身也有sleep模式在休眠时关掉ADC和均衡只保留基本监测整套系统静态功耗可以压到100µA以内。4.3 量产校准怎么做才能保证一致性所有AFE出厂时都有基准偏差再加上板级采样电阻的误差同一个电压源接到不同板卡上读出来的值可能差十几毫伏。如果目标是±5mV的采样精度校准流程必须有。校准的原理很简单ADC读数是原始值x真实电压是y线性关系 y a*x b。a是增益校正系数b是偏置校正系数。校准的目标就是为每个采样通道求出自己的a和b。操作流程是用高精度可编程电源或校准过的电源给电池包灌入两个已知电压。比如对磷酸铁锂先设2.5V读一遍各通道的ADC值再设3.6V再读一遍。然后按下式计算gain (V_high - V_low) / (ADC_high - ADC_low) offset V_high - gain * ADC_high把这两组数存到Flash里运行时代入换算即可。如果条件允许还可以在校准流程里加入多个电压点做最小二乘拟合消除ADC非线性带来的误差。电流校准方式类似用电子负载拉一个已知电流记录电流ADC输出算出电流通道的增益和偏置。注意校准的电压点一定要覆盖实际工作范围的两端不要在4.0V校准一下、3.0V校准一下就去推导2.5V的误差那样外推误差会变大。每个通道都要单独校准不要只校一个通道然后复制到所有通道因为PCB走线、焊点、电阻误差各有差异。5. 实测验证与踩坑记录最容易翻车的地方5.1 必做的三类保护测试板子画完、固件烧完心里没底不敢直接上电池我习惯先用低压模拟平台做验证。三组测试是必须做的第一组是电压保护测试。用可编程电源串联进某一串电芯位置模拟该串电压偏高或偏低。比如把第5串的电压从3.3V慢慢往上抬观察监测器是不是在设置阈值附近触发过充保护同时记录触发时刻的电压值。这个测试能同时验证采样精度和保护阈值。第二组是过流保护测试。用电子负载设置阶梯电流观察过流保护实际响应时间。这里面有个细节电子负载本身有响应速度限制很可能电池电压还没掉电子负载已经先把电流拉起来了。更准确的做法是使用功率MOS管模拟负载短路用示波器电流探头测MCU输出关断信号和MOS管实际关断波形的时间差。第三组是短路保护测试。这个最刺激也最需要注意安全。短路时电流上升速度非常快保护MOS能否在100µs内关断直接决定电芯有没有机会过放。实测时一定要用接触器或空气开关作为远端短路开关不要把两根线直接怼上去否则你连安全手套都来不及戴。5.2 现场实测数据长什么样我这里记录了一组12串磷酸铁锂电池包的实测数据用的是上述测试方法测试项设定阈值实测触发值动作时间单体过充保护3.65V3.652V2.2s软件延迟单体欠压保护2.40V2.401V3.1s软件延迟放电过流保护1级60A61.2A1.2ms放电过流保护2级80A82A320µs短路保护硬件比较器采样电阻压降触发85µs电压保护和电流保护这两组数据看起来还行但短路那组让我头疼了一阵子。问题在于虽然MOS在85µs内关了但关断瞬间电池侧电感储能导致Vds尖峰非常高接近MOS耐压极限。后来在高边MOS漏源之间加了TVS管吸收尖峰同时把驱动电阻调小让关断速度不要太激进才把尖峰压下去。保护速度和电压尖峰之间永远是一个折中不是越快越好。5.3 踩坑实录采样误差、散热和开机冲击这个项目做完之后回看有三个坑最值得写出来。第一个是采样误差漂移。第一版PCB打样回来静态校准已经做到±3mV以内但一跑大电流读到的第3串电压明显偏高电流越大偏得越离谱。查了一天发现是第3串的采样线走线从大电流母排下方穿过母排上的铜箔虽然只是几毫欧但在60A电流下压降0.1V都不奇怪这个压降通过寄生耦合进了高频采样回路。解决办法是采样线远离功率走线必要的时候加屏蔽地线隔离。这件事让我意识到采样精度不只是芯片参数决定的PCB布局的影响可能比芯片本身还大。第二个是均衡发热。设计的时候算了单个电阻0.23W觉得问题不大实际连续均衡8小时之后均衡电阻区域的PCB板温到了78℃AFE内部的温度传感器都开始报高温警告了。后来我重新画了铜箔均衡电阻下面加了一片单独的铺铜并打了一排过孔连接到背面大面积地铜散热效果立竿见影板温降到50℃左右。如果你也做长时间均衡散热设计一定要从第一版就考虑进去。第三个是MOS重新合上瞬间的电流冲击。故障恢复后系统重新合上放电MOS如果此时负载还在并且电池电压高于负载母线电压瞬间有一个很快的电流浪涌。第一次测试时这个浪涌直接把采样电阻两端的差分电压打到了一个超高值系统误判为短路又立刻断开了。后来我加了对负载侧的预充电容和预充电阻电路合MOS之前先通过RC缓慢给母线电容充电等母线电压接近电池电压后再完全合上MOS才彻底解决。6. 常见问题速查与最后建议6.1 常见问题速查表现象可能原因处理办法单体电压读数始终为0采样线断开、AFE引脚虚焊、RC滤波电容短路先用万用表测电芯到芯片引脚的连接再检查焊接所有通道电压整体偏高或偏低基准电压偏差、校准系数丢失或错误重新校准恢复默认校准值均衡开启后电压读数明显跳变均衡电阻与采样点耦合、采样发生在均衡间隙改为先采样后均衡对采样时序做强制分时充电MOS无法合上充电器没有正确接入、充电检测电压不足、电荷泵电容失效检查充电器到电池正负极的压差替换电荷泵电容保护恢复后反复触发迟滞量过小、滤时间太短、噪声耦合进采样增大恢复迟滞窗口提高连续确认时间通信偶发错误隔离器供电不稳、线路过长、SPI速率过高隔离器电源加电容降低通信速率缩短走线短路保护后MOS烧毁Vds尖峰过高、保护速度过快加TVS吸收、调整驱动电阻、检查MOS耐压余量6.2 给正在做同类项目的人几点建议第一先买一套AFE原厂评估板再决定自己铺板。评估板能帮你把软件、调试环境、参考参数先跑通然后再按参考设计画自己的板子。直接在自制板上调驱动遇到问题很难判断是硬件问题还是配置问题。第二阈值参数一定从规格书出发再结合实测修正。不要只看电芯标称参数还要看厂家的温度特性曲线。我遇到过标称可以充电到3.65V的电芯冬天低温充电时电压平台整体偏低如果阈值还是按标准值设很容易提前误报过压。第三所有调试接口都保留到最后一版。至少保留一个SWD调试口、一个串口日志口还有AFE的测试点。量产或最终版可以不焊但调试阶段这些接口救过我很多次。第四也是最重要的一点永远不要为了测试方便而绕过保护。我在做短路测试时一度想临时调高阈值让保护更容易触发结果那次操作差点烧掉采样电阻。电池监测器这个项目设计上的容错空间可以大但测试态度不能有一丝投机。