公司动态

BMS硬件保护与诊断:BQ796xx芯片的OVUV/OTUT自检与ADC冗余测量实践

📅 2026/7/28 8:23:36
BMS硬件保护与诊断:BQ796xx芯片的OVUV/OTUT自检与ADC冗余测量实践
1. 项目概述为什么硬件保护与诊断是BMS的“生命线”在电动汽车和储能系统的电池管理系统BMS开发中我们工程师最怕听到的两个字就是“失效”。电芯的过压、欠压、过温、欠温任何一个保护环节的漏报或误报轻则导致系统停机、用户体验受损重则可能引发热失控造成不可挽回的安全事故。因此一套独立于软件、在硬件层面直接响应的保护电路以及能够验证这套电路自身是否“健康”的诊断机制就成了BMS设计中不容妥协的底线。这不仅仅是功能实现更是满足ASIL-D等高功能安全等级要求的基石。德州仪器TI的BQ796xx系列电池监控芯片正是这一设计哲学的集大成者。它不仅仅提供了高精度的电压、温度采集更内置了一套堪称“武装到牙齿”的硬件保护与诊断子系统。很多初次接触该系列芯片的工程师可能会把注意力集中在ADC精度、通信拓扑上而忽略了数据手册中关于“Protector”和“Diagnostic”的章节。殊不知这些才是确保芯片在车辆全生命周期内可靠工作的核心。本文将深入BQ796xx的硬件保护与诊断世界抛开枯燥的寄存器列表从工程实践的角度拆解其OVUV过压/欠压、OTUT过温/欠温保护器的自检逻辑以及通过双ADC比对实现的多种诊断手段。我会结合自己踩过的坑和调试经验告诉你这些功能如何配置、如何解读结果以及在实际项目中如何将它们融入系统级的健康管理策略。2. 硬件保护器不只是比较器更是可自检的“安全卫士”BQ796xx的硬件保护器并非简单的模拟比较器。它是一个集成了配置锁存、周期性自检和故障报告的数字-模拟混合系统。理解其架构是正确使用的前提。2.1 OVUV与OTUT保护器的工作原理与配置锁存OVUV保护器监控所有电芯电压通道VC而OTUT保护器监控所有GPIO配置为温度采集的通道。其核心是一个高速、高精度的窗口比较器。当你通过寄存器设置好OV、UV、OT、UT的阈值后并不是比较器实时读取这些寄存器值。芯片内部有一个关键动作配置锁存Latch。当你使能保护器例如设置OVUV_GO1时芯片会将相关的阈值寄存器、模式寄存器、有效通道数NUM_CELL等配置信息一次性锁存到专用的硬件保护器模块中。此后保护器将完全基于这些被“冻结”的硬件配置独立运行与软件寄存器的后续更改脱钩。这样做的核心目的是防止软件跑飞或通信干扰意外修改保护阈值确保保护逻辑的确定性。只有重新使能保护器新的配置才会被再次锁存。实操心得这是一个极易忽略的细节。调试时你修改了OV_THRESH寄存器但发现保护点没变先检查是否重新发送了OVUV_GO1命令来触发重新锁存。同样在系统初始化流程中必须在配置完所有保护参数后最后一步才发送GO命令。2.2 保护器的核心诊断奇偶校验、DAC验证与BIST既然保护器依赖锁存的配置那么如何确保这些被锁存的配置在长达数万小时的工作中不发生比特翻转或硬件退化呢BQ796xx提供了三层递进的诊断机制。2.2.1 奇偶校验配置的“守门员”这是最基础也是持续进行的诊断。芯片会在后台周期性地检查锁存在硬件保护器中的配置数据奇偶性。如果检测到奇偶错误说明锁存的配置可能已损坏。检查内容OV/UV阈值、OT/UT阈值。OVUV/OTUT工作模式如轮询模式、单通道模式。有效电芯数量NUM_CELL及GPIO配置。故障标志OVUV奇偶错误FAULT_PROT1[VPARITY_FAIL]置1。OTUT奇偶错误FAULT_PROT1[TPARITY_FAIL]置1。工程意义奇偶校验错误属于系统性、持续性的故障一旦发生通常意味着硬件存在潜在问题。在功能安全分析中这类故障需要被归类为潜在故障并触发系统降级或进入安全状态。在实际代码中需要定期如每100ms轮询这两个标志位。2.2.2 DAC验证阈值是否“言行一致”奇偶校验通过了只能说明“数据没变坏”但无法证明“数据是对的”更无法证明“比较器能正确响应这个数据”。DAC验证就是为了解决第一个问题锁存的阈值其对应的模拟电压值是否正确芯片内部有一个精密的数模转换器DAC用于生成OV/UV/OT/UT的比较基准电压。诊断时这个DAC的输出可以被切换到辅助ADCAUX ADC的输入由主机MCU读取测量值。操作流程锁定通道通过OVUV_CTRL[OVUV_LOCK3:0]或OTUT_CTRL[OTUT_LOCK2:0]将保护器锁定到某一个特定通道例如电芯1或GPIO1。切换模式将保护器模式设置为单通道运行模式并重启OVUV_GO1。读取测量主机从AUX ADC的特定寄存器中读取DAC电压值。计算验证将读取的ADC码值反向计算为电压与理论值0.8 * 设定的阈值电压进行比较。通常允许一个很小的误差范围例如±5mV。关键限制进行DAC验证时被锁定的通道绝对不能处于真实的故障状态例如电芯电压确实超过了OV阈值。否则DAC的输出会被钳位或影响导致测量值不准。诊断前务必确认系统状态。测量到的DAC电压是设定值的0.8倍这是芯片内部设计的固定比例在计算比较时务必注意。踩坑记录曾经在电池包静置时进行DAC验证一切正常但在带载测试时验证失败。后来发现大电流导致电芯端电压瞬间波动触发了临时的OV条件影响了DAC验证。解决方案是在诊断流程开始前增加一个“电压/温度稳定区间检查”确保被诊断通道远离触发阈值至少100mV。2.2.3 内置自检全路径的“消防演习”这是最彻底、最强大的诊断——内置自检BIST。它不再是静态检查而是动态地模拟故障检验从传感器输入到故障标志输出包括NFAULT引脚的整条信号链是否完好。可以把它想象成一次不通知的“消防演习”。OVUV Protector BIST 流程详解BIST启动设置OVUV_MODE[1:0]0b10(BIST模式)然后发送OVUV_GO1。比较器阈值测试BIST引擎会在内部生成两个测试电压一个略高于锁存的OV阈值一个略低于锁存的UV阈值。它检查OV比较器是否对“高于阈值”的电压正确触发输出高以及UV比较器是否对“低于阈值”的电压正确触发。故障标志FAULT_PROT2[OVCOMP_FAIL]或[UVCOMP_FAIL]。UV故障路径测试对每一个激活的电芯通道BIST会内部断开该通道到OVUV多路复用器MUX的输入模拟一个“开路”条件这必然会导致该通道被检测为欠压UV。然后BIST引擎检查对应的FAULT_UV寄存器位是否被正确置1以及NFAULT引脚如果使能是否被正确拉低有效。测试完一个通道后BIST会复位该故障位解除NFAULT再测试下一个通道。故障标志FAULT_PROT2[VPATH_FAIL]。OV故障路径测试BIST引擎直接向FAULT_OV寄存器的每一位依次写入1检查该位是否能被置位并同时检查NFAULT引脚是否响应。故障标志同样标记为FAULT_PROT2[VPATH_FAIL]。BIST完成测试结束后OVUV比较器会被关闭。主机需要重新发送命令OVUV_MODE[1:0]0b01, OVUV_GO1来启动正常的轮询保护模式。OTUT Protector BIST流程类似只是对象换成了GPIO温度通道通过内部上拉GPIO口来模拟UT欠温条件进行测试。BIST实操的黄金法则环境净化启动BIST前必须用MASK寄存器屏蔽所有与OVUV/OTUT无关的故障。确保所有电芯电压远离OV/UV阈值至少100mV所有GPIO温度远离OT/UT阈值。任何预先存在的真实故障都会导致BIST中止BIST_ABORT位置1。观察NFAULT如果使能了NFAULT引脚在BIST运行期间你会观察到该引脚高速闪烁Toggling。这是验证故障输出物理链路完好的最直观方法。故障定位技巧如果BIST失败且[VPATH_FAIL]或[TPATH_FAIL]被置位但不知道具体是哪个通道出了问题可以启用“无复位”选项DIAG_PROT_CTRL[PROT_BIST_NO_RST]1重新运行BIST。在此模式下BIST不会在测试每个通道后复位故障寄存器。运行后查看FAULT_OV/FAULT_UV/FAULT_OT/FAULT_UT寄存器仍然保持置1的位对应的就是故障通道。表硬件保护器诊断功能对比与使用场景诊断功能检测目标执行方式关键寄存器/标志位典型执行周期工程意义奇偶校验锁存配置数据的完整性后台自动、周期性FAULT_PROT1[V/TPARITY_FAIL]持续进行防御存储单元软错误满足安全标准对内存完整性的要求。DAC验证锁存阈值对应的模拟电压准确性主机MCU主动触发AUX ADC测量值上电初始化、定期维护如每24小时确保保护阈值的模拟基准无偏差校准系统。BIST整个保护路径比较器、逻辑、输出的功能性主机MCU主动触发FAULT_PROT2[OV/UV/OT/UTCOMP_FAIL],[V/TPATH_FAIL],[BIST_ABORT]上电自检、关键操作前如充电开始最全面的功能验证证明保护电路“随时能工作”是安全案例的核心证据。3. 基于ADC比较的诊断用冗余测量验证系统可信度除了保护器自身的BISTBQ796xx还提供了一套基于主辅ADCMain/AUX ADC比较的诊断方法。其核心思想是冗余测量用两套独立的测量路径对同一个物理量进行测量通过比较结果的一致性来判断任一路径是否失效。这是诊断模拟前端AFE功能完整性的关键。3.1 电芯电压测量一致性检查这是最常用的诊断。主ADC和辅ADC拥有相同的前端滤波器抗混叠滤波等。通过将同一个VC通道同时切换到两个ADC进行测量并比较结果。配置要点锁定通道通过ADC_CTRL2[AUX_CELL_SEL4:0]锁定要诊断的单个或多个辅ADC测量通道。双ADC运行确保主ADC和辅ADC都已使能并处于连续转换模式。设置阈值通过DIAG_COMP_CTRL1[VCCB_THR4:0]设置可接受的差值阈值。这个值需要根据你的系统噪声水平和精度要求来设定通常为几个mV到十几mV。启动比较设置DIAG_COMP_CTRL3[COMP_ADC_SEL2:0]0b001(电芯电压检查) 并发送[COMP_ADC_GO]1。结果获取比较完成后ADC_STAT2[DRDY_VCCB]1。主机读取FAULT_COMP_VCCB1/2寄存器每一位对应一个电芯通道。如果某位为0表示该通道主辅ADC差值在阈值内为1则表示超出阈值可能存在故障。诊断值读取如果配置为单通道锁定模式用于比较的辅ADC测量值会存放在DIAG_AUX_HI/LO寄存器中主ADC值在DIAG_MAIN_HI/LO中。这对于调试和精度分析极有帮助。避坑指南对齐问题默认情况下辅ADC的CELL1时隙与主ADC的CELL1时隙对齐。对于高串数电芯这会导致主辅ADC对高层通道的采样时间差较大可能因电芯电压瞬变而引入比较误差。可以通过ADC_CONF1[AUX_CELL_ALIGN]设置为与主ADC Cell8时隙对齐来减少高层通道的采样延迟差。滤波与稳定ADC_CONF1[AUX_SETTLE1:0]设置辅ADC的建立时间需要在诊断速度和噪声滤波之间权衡。对于高噪声环境需要更长的建立时间。无效条件文档中明确列出了会导致比较中止的条件如选择了无效的通道、与平衡检测BBVC冲突、ADC未使能等。触发中止时FAULT_COMP_MISC[COMP_ADC_ABORT]会置位。务必在代码中检查此位否则可能误判为所有通道诊断通过。3.2 温度测量与平衡FET诊断温度测量检查的原理与电压检查完全一致只是对象换成了GPIO通道。通过ADC_CTRL3[AUX_GPIO_SEL3:0]选择GPIO通道设置DIAG_COMP_CTRL2[GPIO_THR2:0]阈值然后启动比较COMP_ADC_SEL2:0]0b101。结果在FAULT_COMP_GPIO寄存器中。平衡FET诊断则是一种巧妙的功能性测试。其原理是打开某个电芯的平衡FETCBn此时该FET导通其导通压降非常小。通过主ADC测量电芯电压VCn - VCn-1同时通过辅ADC测量CB引脚间的电压CBn - CBn-1。在FET正常导通的情况下CB间的电压应远小于电芯电压的一半。操作流程暂停所有正在进行的电芯平衡。通过DIAG_CBFET_CTRL1/2寄存器选择要测试的FET注意规则最多同时打开8个且不能有超过2个连续。锁定对应的辅ADC通道 (AUX_CELL_SEL)。发送DIAG_COMP_CTRL3[CBFET_CTRL_GO]1来打开选中的诊断FET。等待足够的dV/dt时间让电压稳定。启动ADC比较 (COMP_ADC_SEL2:0]0b100)。芯片内部执行判断AUXCELL测量值 0.5 * VCELL测量值。读取FAULT_COMP_CBFET1/2寄存器获取结果。关闭诊断FET清除DIAG_CBFET寄存器并再次发送CBFET_CTRL_GO1或退出平衡暂停状态。核心价值这个诊断不仅能发现FET完全开路烧毁的硬故障还能间接检测到FET导通电阻异常增大老化的潜在故障因为这会使得CB间电压升高可能超过阈值。3.3 开线检测预防“失联”的致命故障VC电压采集或CB平衡引脚与电池模组之间的连接线如果开路BMS将无法感知该电芯的真实状态这是极其危险的。BQ796xx的开线检测通过在引脚上注入/拉出一个小电流观察电压变化来实现。物理原理对于VC1~VC16和CB1~CB16引脚芯片内部连接一个**电流沉Current Sink**到地。对于VC0和CB0引脚内部连接一个**电流源Current Source**到AVDD。当使能开线检测电流时如果外部连线完好电池模组的内阻和外部滤波电容会维持引脚电压基本不变。如果外部连线开路引脚悬空。对于VC1~VC16/CB1~CB16电流沉会缓慢拉低外部电容上的电压对于VC0/CB0电流源会缓慢拉高电压。这个电压变化会被ADC捕捉到。诊断流程配置开线检测阈值DIAG_COMP_CTRL2[OW_THR3:0]。使能电流沉/源DIAG_COMP_CTRL3[OW_SNK1:0]。关键等待等待足够的时间dV/dt时间让开路点上的电压变化达到可检测的程度。这个时间由外部差分电容Cvc通常22nF或10nF和注入电流典型值几个µA决定通常需要几十到几百毫秒。等待时间不足是开线检测失败的最常见原因。启动ADC比较对于VC开线COMP_ADC_SEL2:0]0b010对于CB开线0b011。芯片比较所有激活通道的电压主ADC测VC辅ADC测CB是否低于对于电流沉或高于对于电流源设定的阈值。读取FAULT_COMP_VCOW1/2或FAULT_COMP_CBOW1/2寄存器。务必关闭电流沉/源。设计考量开线检测的可靠性高度依赖外部RC滤波网络的设计。RC时间常数太大会延长检测所需的等待时间太小则可能无法有效滤除噪声导致误触发。需要在系统响应时间和噪声免疫力之间取得平衡。4. 数字后处理与持续后台诊断除了上述需要主机触发的诊断BQ796xx还有一些在后台默默运行的持续诊断。后置ADC数字低通滤波器诊断主ADC测量值在送入VCELL寄存器前会经过一个数字低通滤波器LPF以平滑噪声。芯片内部为每个通道的LPF都复制了一个“诊断用LPF”。在后台真实的ADC数据会同时送入主LPF和诊断LPF并持续比较两者的输出。一旦发现不一致FAULT_COMP_MISC[LPF_FAIL]就会被置位。这个诊断是全自动、持续进行的只要主ADC在运行。更巧妙的是芯片还提供了诊断LPF自身的自检功能。通过设置DIAG_COMP_CTRL4[LPF_FAULT_INJ]1并重启主ADC芯片会向诊断LPF注入一个错误强制触发一次LPF_FAIL。如果这个标志位能被正确置位说明故障检测逻辑本身是工作的。测试完成后将该位清零即可。这是一个典型的“故障注入”测试用于验证诊断电路的有效性是满足ISO 26262等标准中“诊断覆盖率”要求的重要手段。5. 系统集成与诊断策略实践了解了这些诊断功能后如何将它们有机地整合到BMS软件中形成一套完整的健康监控策略1. 分层诊断策略上电自检系统上电后在进入正常监控模式前应依次执行保护器DAC验证 - 保护器BIST - ADC比较检查电压、温度。这是最全面的检查确保硬件从“沉睡”中醒来后一切正常。周期性诊断在系统运行时以较低频率如每小时一次执行ADC一致性检查、开线检测。以更高频率如每10秒轮询奇偶校验、LPF诊断等后台标志位。事件触发诊断在关键操作前后执行例如充电开始前执行一次保护器BIST和平衡FET诊断车辆高压上电前执行一次开线检测。2. 故障响应与处理分级响应不是所有诊断失败都要立刻关断系统。例如单个通道的ADC一致性轻微超差可以记录并标记该通道数据“降级”同时提高该通道的诊断频率。如果保护器BIST失败或奇偶校验错误则必须立即进入安全状态断开接触器。信息记录所有诊断结果和故障标志都应连同时间戳、系统状态电压、温度、电流一起存入非易失性存储器。这对于售后分析和功能安全审计至关重要。3. 资源与时间权衡诊断耗时BIST和开线检测耗时较长可能几十毫秒在此期间保护功能可能被暂停或处于特殊模式。需要评估这段时间内的风险必要时在诊断期间启用软件备份监控。计算开销频繁读取和比较ADC诊断值会增加MCU负担。可以考虑在FPGA或专用安全芯片中实现部分比较逻辑或使用BQ796xx提供的直接故障寄存器来减轻MCU负载。最后一点个人体会BQ796xx的硬件诊断功能非常强大但“拥有功能”和“正确使用功能”是两回事。在项目初期就应将诊断流程的设计纳入整体架构编写详尽的诊断需求规范并在HIL硬件在环测试中充分验证各种故障注入场景下的诊断响应。这些工作看似繁琐但它们是构建一个真正可靠、符合功能安全要求的BMS的必经之路。当你看到这些诊断机制在测试中成功捕捉到人为注入的故障时你对系统安全的信心会大大增强。