基于SH367309的1-17串BMS保护板设计实战

发布时间:2026/8/31 15:28:01
基于SH367309的1-17串BMS保护板设计实战 简介本资源是一套面向嵌入式开发者与BMS初学者的锂电池保护板完整开发套件基于中颖SH367309电池管理芯片与STM32F030主控协同设计解决1–17串三元/磷酸铁锂电池的高精度采样、多重保护过压/欠压/过流/短路/温度及SOC估算等核心工程问题。压缩包共196个文件含47个.h头文件定义寄存器映射与功能接口、41个.c源文件涵盖TIM/RTC/USART/I2C/ADC/SPI等外设驱动及BMS逻辑层、27个.o目标文件与26个.d依赖文件辅以uvprojx工程配置、PDF原理图、AXF可执行镜像及上位机通信协议说明整体5.73MB结构规范便于移植与二次开发。已有405人学习下载配套电池盒硬件与RS485通讯上位机软件支持光敏检测、扩展IO及调试诊断功能是理解BMS软硬协同架构与低功耗电池管理实践的优质参考方案。 做BMS这件事我其实是先踩了坑才决定认真搞的。之前给一个18650电池组项目配保护板市面上现成方案要么串数固定死了要么均衡电流小得可怜想调整过充保护电压还得靠买的板子厂家改固件。折腾了几轮之后我意识到与其反复将就现成板子不如用一颗合适的保护IC自己做原理图和固件一劳永逸。最后选中了中颖SH367309就是因为它一颗芯片覆盖1到17串从电动工具的小电池包到储能模组都能用而且原生支持库仑计和被动均衡这对BMS来说太关键了。这篇文章就是把我的原理图设计思路、源码架构和调试过程完整记录下来给准备自己动手做锂电池保护板的人一个可以照着抄的作业。很多朋友一听到BMS就发怵觉得又要采集电压电流又要控制MOS还要写均衡算法复杂度很高。其实当你选对了主控和保护IC之后硬件设计可以简化成“把电芯采样线接对把MOS驱动接对把通信线引出来”这三件事剩下的大量保护逻辑都在芯片内部自动完成了。SH367309这颗IC的真正价值在于它把前端采样AFEAnalog Front End的大部分活承包了MCU只需要通过通信接口去读写寄存器就能掌握整组电池的状态。所以我的架构里其实没有再用额外的MCUSH367309本身就是带MCS-51内核的SoC一颗芯片就能跑协议栈和控制逻辑。这也是我选择它的另一层原因——物料清单简单一颗主控一颗IC就把BMS的核心干完了。1. 为什么是中颖SH367309一颗芯片覆盖1到17串的底气SH367309最吸引我的点不是单纯的“能检测电压”这么简单而是它把“检测”和“保护执行”真正做到了闭环。市面上很多AFE芯片只负责采样过压欠压保护还要靠外部MCU实时比较判断这就会引入一个很致命的问题如果MCU跑飞了或者卡死了保护动作就不执行了。SH367309的好处在于它内部有硬件比较器和独立的保护逻辑模块过充、过放、过流、短路这些最关键的保护是脱离固件独立工作的就算你在调试固件的途中芯片复位了保护功能也依然在线。这种“硬件兜底”的设计对锂电池安全性来说不是加分项而是必须项。另外一个让我下决心的点是它的测量精度。做BMS最烦的就是电芯电压采不准尤其是磷酸铁锂这种放电平台非常平的电池电压差个5mV可能就会导致SOC估算偏出好几个百分点。SH367309内置的ADC精度可以做到差不多±10mV以内经过校准后实测更稳而且采样通道可以自由配置分时采样16串电芯轮流读一遍的时间在毫秒级别完全够控制逻辑用了。配合内置的温度传感器通道和库仑计模块电压、电流、温度这三个核心物理量都能统一在同一颗芯片里解决不需要再去挂外置的电流采样放大器和温度采集芯片。串数跨度大也是我当时很看重的一个指标。1串到17串意味着同一个原理图设计只需要改几个采样点的连接方式和配置寄存器就能覆盖手机电池、电动工具、电动车、太阳能储能这些完全不同的应用场景。我甚至在后来的项目中把同一块板子通过跳线改成了7串和13串两种规格只需要调整采样电阻网络和重新烧录配置即可。这个灵活性让SH367309在打样阶段的试错成本变得非常低你可以在同一块PCB上验证多种电池组配置对前期研发来说是巨大的效率提升。2. 硬件设计核心原理图里的采样网络、MOS驱动与串数配置2.1 电芯采样输入的RC滤波网络不能乱选SH367309的每个电芯采样脚VCn都对应一个电芯的正极芯片内部会通过多路开关分时选通这些通道进行电压测量。但在实际电池组里电芯连接片的瞬间大电流冲击会导致严重的电压跌落和尖峰噪声尤其是MOS关断的那一瞬间回路电感会产生很大的反电动势这个尖峰如果不处理直接灌到采样脚里轻则测量值跳变重则直接打坏芯片引脚。我常用的做法是在每个VC采样脚串联一个1kΩ电阻再并一个0.1μF的陶瓷电容到底形成一阶低通滤波。这个时间常数大约100微秒而BMS的电压采样周期普遍在几毫秒到几十毫秒之间所以滤波不会拖慢采样速度但能有效滤掉高频尖峰。这里有个很多人容易忽视的细节电容选型一定要用C0G或X7R材质的陶瓷电容不要用高容量的X5R或钽电容因为X5R的容值会随着直流偏压下降导致实际滤波效果远低于设计值。我在第一版原理图里就吃了这个亏用了一颗10μF的X5R结果采样数值在低温下波动明显后来换成0.1μF C0G并联在靠近芯片引脚的位置才解决问题。同样的原则也适用于芯片的供电引脚。SH367309内部的稳压器给模拟部分供电时电源引脚旁边我放了三颗电容一颗1μF的MLCC做主要退耦一颗0.1μF放在最靠近引脚的位置滤高频再配一颗10μF的电解电容吸收低频纹波。稳压器输入端的REGIN脚也需要一颗至少4.7μF的电容因为芯片内部的电荷泵在驱动NMOS时会瞬间抽取较大的电流如果输入电容不够会导致供电电压跌落并触发芯片的欠压复位。2.2 MOS驱动电路NMOS半桥和自举电容的设计SH367309的充电和放电控制是通过控制外部的N沟道MOS管来实现的这也是它和很多需要P沟道MOS方案的差异点。N沟道MOS的导通电阻可以做得很低大电流下发热小这对动力电池应用很重要但代价是驱动电路更复杂——你需要一个高于电池正极的栅极电压才能让上桥臂充电MOS完全导通。芯片手册里推荐的做法是使用内置电荷泵配合外部自举电容来抬升栅极驱动电压。我在原理图里给DH和DL引脚各配了一颗100nF的自举电容使用的是X7R材质耐压至少25V。这里有个关键点自举电容到芯片引脚的走线一定要短而粗而且电容地端要直接回到芯片的地引脚不要和功率地混在一起走。我第一版PCB的DH引脚走线绕了一个圈结果在高边MOS开关瞬间驱动波形出现严重的振铃充电MOS的开通损耗明显增大板子发热严重。后来重新布局把自举电容放在芯片背面紧贴引脚的位置波形立刻干净了。驱动电阻的选择也直接影响开关速度和EMI。我的取值是4.7Ω到10Ω之间具体根据MOS管的栅极电荷量来匹配。栅极电阻太小开关速度太快电压电流变化率过高会产生严重的电磁干扰太大则开关损耗增加MOS管在过渡区停留时间变长发热上升。如果你没有条件测量波形建议从10Ω起步实测温升和振荡情况再逐步减小。还有个经验MOS管的雪崩耐量一定要留余量。锂电池组在断开大负载时母线电感会产生一个很高的电压尖峰如果这个尖峰超过MOS的漏源击穿电压MOS就会进入雪崩模式。虽然大部分MOS都能承受一定的雪崩能量但反复的雪崩冲击会加速老化。我在选型时习惯把MOS耐压选到最高电芯电压的2倍以上比如13串磷酸铁锂最高约54V我就选100V耐压的MOS管这样即使有尖峰也能兜住。2.3 串数配置用跳线和电阻网络实现1到17串复用很多人在第一次画SH367309原理图时会被“如何配置串数”这个问题卡住。其实芯片提供了REGIN电压检测、CFG引脚配置和寄存器设置三种途径配合来识别串数硬件上只需要在最高一串的采样点做好跳线预留即可。以我的设计为例PCB上从VC1一直到VC17都预留了焊盘同时最高串数采样点通过一个0Ω电阻连接到芯片的REGIN引脚。当电池组串数确定后只在对应的采样网络焊接电阻和电容其他串数的采样脚悬空即可。芯片在上电时会自动检测REGIN上的电压值判定当前接入的电池串数这个硬件自动识别机制非常方便也避免了我因为寄存器配置错误导致采样范围错误的问题。不过这里有个细节需要注意当你通过跳线改变串数时供电方案也要跟着调整。SH367309的VCC引脚供电范围是有限的如果你是低串数应用比如4到6串可以直接用电池组最高电压经过稳压管分压给VCC供电如果串数较高比如13串以上最好从电池组中间取电这样芯片的功耗不会集中在某节电芯上避免该电芯被过度放电。另外温度采样NTC最好紧贴电池组的中心位置放置这样测得的温度更能代表电池的实时工况。3. 源码架构从初始化到充放电保护的完整链路3.1 初始化流程里的那些坑SH367309的上电流程和普通MCU不太一样它需要等待内部稳压器稳定、ADC自校准完成、以及通信接口就绪。我在初始化代码里特意加了一个“等待芯片Ready”的循环轮询状态寄存器直到相应标志位被置位才继续执行。这个步骤很多人觉得多此一举但实际调试中发现如果不等待Ready就立刻去读ADC数据读到的往往是全0或者上一次的残留值这会直接导致保护逻辑误动作。初始化里另一个重要任务是配置保护阈值。SH367309有大量的寄存器用于设置过充电压、过放电压、过流档位和响应延时这些参数需要在初始化时一次性写入。我习惯先把所有阈值定义成宏放在一个独立的头文件里统一管理这样后续换电池型号时只需要改宏定义不需要在代码里到处找数字。比如我的磷酸铁锂方案里过充保护阈值宏是3.65V过放是2.5V恢复电压分别是3.4V和2.8V这些参数都是电芯厂家提供的规格数直接写进宏里干净又不容易出错。这里有一个很多人会忽略的点保护阈值写入后一定要等芯片内部EEPROM的写周期完成再执行后续操作。如果在写EEPROM过程中突然断电寄存器值可能会变成随机数下次上电后保护参数就乱了。我在代码里加了一个状态标志只有在确认写入完成之后才会点亮Ready LED否则就停在初始化阶段报警这样能在产线上第一时间发现坏板。3.2 主循环电压电流温度的采样与状态机流转主循环的结构我采用了经典的状态机模式状态包括初始化、待机、充电、放电、保护触发和休眠。每个状态之间的切换条件都对应一组具体的保护事件比如过压保护事件会把状态从“充电”踢到“保护触发”而在“保护触发”状态下需要电压回落到恢复阈值并且芯片设置的恢复延时结束才会回到“待机”或“放电”状态。电压和电流采样我是每20ms执行一次。这个周期是综合考量了实时性和功耗后的结果。太快的话MCU大部分时间都在跑ADC转换功耗高而且大量中断会干扰通信时序太慢的话又没法及时发现瞬时过流。20ms的周期足够捕捉到大多数异常工况同时让主循环空出大量的时间来处理通信和均衡逻辑。电流采样我直接用芯片内置的库仑计模块通过外部采样电阻两端的差分电压来计算电流大小再乘以时间累加计算出累计容量。温度采样在状态机里的优先级很高。我直接在芯片的NTC通道接了一个10kΩ的负温度系数热敏电阻通过ADC读到的电压值反查表得到当前温度。锂电池在低温下充电容易析锂所以当温度低于0℃时我会直接禁止充电流程只允许放电。同样当温度高于45℃时我会限流充电或者暂停充电避免电池热失控。这些温度阈值同样是宏定义方便根据不同电芯体系调整。3.3 均衡逻辑被动均衡不能只是简单开关SH367309内置被动均衡功能原理是通过内部的均衡MOS把电压较高的电芯通过外部均衡电阻放电直到其电压和其他电芯接近。很多人写均衡代码时就是很粗暴地“电压高于平均值就打开均衡”但实际使用中这种做法会在电芯老化后导致均衡时间过长甚至因为均衡电阻发热集中在某几节电芯上而加剧热不均匀。我的均衡实现加了一个“均衡门槛和回滞”的概念只有当最高电芯和最低电芯的压差大于30mV时才启动均衡当压差小于15mV时停止均衡。这个15mV的回滞可以防止均衡在临界点附近反复振荡避免均衡MOS频繁开关。同时我还限制了单节电芯的均衡时间每节电芯连续均衡不超过30分钟就需要休息5分钟这样可以控制均衡电阻的温升让整个电池包的温度场更均匀。均衡电流的大小则通过外部均衡电阻阻值来设定我常用的配置是50mA级别的均衡能力。对应电阻取330Ω左右这样在一个全均衡周期内不会产生过大的发热同时又能保证在不长的时间内把压差拉回来。如果你需要更大的均衡电流可以减小均衡电阻但要注意电阻的功率额定值1/2W的贴片电阻在50mA下产生的功耗约0.8W已经超过额定功率了所以我选了1W的2512封装电阻实测温升可以接受。3.4 通信协议自定义Modbus兼容接口和上位机联调对于需要上位机监控的场景我在固件里实现了一个精简版Modbus-RTU从站协议通过UART外接TTL转USB模块就能直接和电脑通信。寄存器地址表我按功能划分0x00到0x0F是电压组数据0x10到0x1F是保护状态标志0x20到0x2F是SOC和剩余容量数据0x30到0x3F是参数配置区。这样上位机只需要读寄存器就能拿到全部关键数据维护起来非常方便。串口波特率我用了9600这是Modbus-RTU很常见的速率兼容性好。数据帧采用标准的CRC16校验每帧8个数据字节。在调试阶段这个通信接口帮了大忙——我可以实时看到每一节电芯的电压曲线、电流积分值和保护状态的变化不需要每次修改固件都重新烧录才能观察。很多问题都是通过观察通信数据发现规律后再回过去改保护参数验证的。4. 从1串到17串同一块板子的参数调整和验证方法4.1 串数变化时的采样网络改变SH367309的最高串数支持到17串但不同串数下采样电阻网络的接入方式有些区别。对于7串以上的配置VC采样脚的输入阻抗较高可以直接通过RC网络连到电芯正极但如果做的是1到2串的小电池包电池电压很低采样信号的噪声占比就会变大这时候我会适当加大滤波电容的容值把时间常数拉长一些提高信噪比。串数改变后还有一个容易被忽略的地方REGIN引脚检测串数的分压电阻比例需要同步调整。我的做法是保留一组可选的电阻焊盘不同串数对应焊上不同阻值硬件上通过跳线短接来选择。这个工作虽然琐碎但做好之后产线上换串数规格就变得非常快——只需要改跳线和烧录对应的参数包即可PCB不需要重新设计。4.2 不同电芯体系的参数对照锂离子三元和磷酸铁锂的电压窗口差别很大对应的保护阈值也不同。我在代码里把两组参数都预置好了通过一个编译宏来切换。三元材料过充保护是4.25V过放是2.8V磷酸铁锂过充是3.65V过放是2.5V。均衡启动的压差门槛我记得也有区别铁锂本身的平台区很平均衡更敏感一些我设成了20mV。另外一个和电芯体系直接相关的是SOC估算算法。三元材料的开路电压OCV曲线在满电区间比较陡用电压法估算SOC相对准确磷酸铁锂的OCV曲线平台期很长电压法完全没有分辨力所以我加入了库仑积分——电流值每20ms累加一次同时定期用静置电压对SOC做校准。这个组合方案在三元和铁锂上都能做到5%以内的SOC误差和精度测试仪对比后效果不错。4.3 低压版与高压版的布局差异如果你打算把同一块板子同时覆盖低串数比如5串以下和高串数13串以上布局上要做一些调整。低压版对爬电距离要求不高走线可以紧凑一些高压版则要在电芯采样接插件、MOS散热焊盘和通信接口之间留足安全距离否则容易在潮湿环境下产生爬电打火。我的经验是高压版至少留1.5mm以上的爬电距离同时在PCB表面做开槽处理增加漏电路径这些设计对长期可靠性影响很大。5. 实板调试从示波器到老化测试的完整链路5.1 上电前的静态检查别急着插电池很多新手调试BMS板子时第一件事就是把电池组接上去这是非常危险的操作。我自己的流程是板子焊接完成后先用万用表二极管档测量VCC和地之间是否有短路再检查所有VC采样脚到地的阻抗是否正常然后才接上低压直流电源进行空载测试。空载测试通过后再逐步接入电池组第一次接入时一定串联一个限流电阻和电流表观察是否有异常大电流。如果是高压板比如13串以上我会先用可调电源模拟电池组电压从低到高逐步升高输入电压同时观察芯片的电流消耗是否正常。这样即使接错线也不会直接打坏芯片可以提前发现供电侧的硬件问题。5.2 关键波形测量MOS驱动、电流采样和通信时序接入电池组后第一件用示波器做的事是测量充电MOS和放电MOS的栅极驱动波形。正常波形应该是干净的方波上升沿和下降沿之间没有明显振铃。如果你看到波形上叠加了高频振荡多半是自举电容位置不对或者驱动电阻太小需要及时调整。电流采样波形也要测。当负载电流突变时电流采样电阻两端的电压应该能快速跟随如果你发现波形有严重的尖峰或滞后可能是采样走线太长或者滤波电容选得过大。SH367309的电流采样是差分输入采样走线一定要走成一对紧贴的差分线并在芯片引脚处并一个小电容滤共模噪声这样才能保证过流保护的响应精度。5.3 过流短路保护的实测记录保护功能的验证不能只看代码逻辑必须实打实做一次短路实验。我在MOS输出端并联了一个大功率电子负载设置短路模式用示波器记录从短路发生到MOS关断的整个过程。SH367309的短路保护响应时间在微秒级实测下来基本在200微秒以内完成关断这个速度对MOS来说是安全的浪涌能量不会超出器件的耐受范围。需要注意的是短路实验不能反复做太多次每次关断瞬间MOS要承受很大的电流应力。我的建议是同一块板子最多做3次短路测试如果每次都正常关断就说明驱动电路和保护逻辑是可靠的后续可以改用更小的电流应力来验证其他保护功能。5.4 老化测试和数据记录最后一步是老化测试。我会用一个可调直流电源给电池组充电同时用电子负载做放电循环整个过程持续8到12小时期间通过通信接口每5秒记录一次电压、电流、温度数据。测试结束后把这些数据导出来看看有没有出现异常跳变或者保护误触发的现象。老化测试里最常发现的问题是电芯压差在循环过程中逐步变大这说明均衡逻辑没有充分发挥作用。我会检查均衡条件是否太苛刻、均衡时间是否足够、均衡电流是否偏小这几个参数。通过几轮参数调整把均衡效果调到理想状态后这块板子的硬件和固件就基本算成熟了。6. 我踩过的坑和值得改进的地方第一个大坑就是采样电容的材质选择前面已经提到了。10μF的X5R电容在直流偏压下容值会严重缩水导致滤波效果名不副实采样值低温下漂移严重。这个问题从原理图层面很难发现只有经过高低温循环测试才暴露出来。现在我的备料清单里直接标明了C0G或X7R从源头杜绝这类问题。第二个坑是电荷泵电容的处理。芯片内部驱动NMOS需要电荷泵提供高压自举电容的值太小会让高边MOS导通不充分导通电阻增大大电流下发热严重。我最初照抄参考设计用了47nF满载测试时MOS温度高达80多度换成100nF后温度降到了60度以下差距非常明显。第三个坑和串数配置相关。首次做13串板子时我忘了调整REGIN引脚的采样分压电阻导致芯片识别串数错误采样电压范围完全不对。后来在代码初始化时加入了“读取REGIN电压并和配置串数做比对”的逻辑如果两者不匹配就直接报错这样能避免硬件配置错误导致的数据异常。另外布局上有一点我想提醒大家SH367309的GND引脚和功率地之间最好用单点连接不要铺成一片大面积地。否则MOS开关瞬间的电流冲击会在地平面上产生压降这个压降会耦合到模拟采样电路里造成电压测量值的周期性波动。我用0Ω电阻把模拟地和功率地连在一起实测噪声明显降低。还有一点值得说的就是PCB的静电防护。BMS板子在装配和使用过程中很容易被静电打到尤其是充电接口和通信接口这些裸露的金属触点。我在这些接口处加了TVS管和ESD保护器件保护芯片引脚不被静电打坏。虽然这增加了BOM成本但产线的维修率明显下降这笔投入是值得的。如果后续还想继续扩展我会考虑给这块BMS加蓝牙通信模块实现手机App查看电池状态。SH367309的串口接口可以直接和透传蓝牙模块对接固件里只需要扩展几个指令来处理App的查询请求即可硬件几乎不用改动。另一个方向是增加主动均衡电路通过储能电容或者电感来实现电芯间的能量转移这样可以做到更大电流的均衡尤其适合容量比较大的储能电池包。不过主动均衡的控制逻辑要复杂得多等有空我再专门写一篇。本文还有配套的精品资源点击获取

相关新闻