4. I/O通道配置与电气匹配

说到故障注入的硬件实现,很多朋友第一反应就是“用软件改寄存器不就行了?”
嗯,这话对了一半。软件注入确实快,但它只能模拟芯片内部能感知的故障。
真实世界里,传感器线缆被磨破、接插件氧化、电源受到大功率设备干扰——这些物理层面的故障,软件根本模拟不了。

所以,我们得靠硬件来干这个脏活累活。
今天我就把三种最常用的硬件故障注入手段掰开揉碎了讲:继电器矩阵、可编程电阻、电流/电压偏置电路。


4.1 继电器矩阵:最暴力的开路/短路注入器

继电器矩阵说白了就是一堆开关,能快速把信号线断开、短接、或者接到别的电平上去。
我最早接触这个,是在做汽车BCM(车身控制器)测试的时候。那会儿需要模拟线束在不同温度下的接触不良,手动拔插插头拔到手抽筋……后来搭了个8×8的继电器矩阵,一键搞定。

4.1.1 典型拓扑结构

一个单通道的继电器故障注入节点,通常包含三个继电器:

继电器编号 功能 常态 注入状态
K1 串联通路 闭合 断开(模拟开路)
K2 对电源短接 断开 闭合(模拟对VCC短路)
K3 对地短接 断开 闭合(模拟对GND短路)

这三个继电器组合起来,能模拟出线束最常见的四种故障:正常、开路、对电源短路、对地短路。

关键参数: 继电器触点电阻要小于50mΩ,否则会影响正常信号质量。切换寿命至少10万次,不然测到一半继电器挂了,你都不知道是DUT坏了还是注入设备坏了。

4.1.2 矩阵扩展与隔离

当被测信号超过几十路时,单点继电器就不够用了。这时候需要构建交叉矩阵。
我习惯用“M×N”的架构:M路输入,N路故障源(VCC、GND、悬空、PWM干扰源等)。

举个例子,一个16×4的矩阵:

  • 16路被测信号线
  • 4种故障源(VCC、GND、开路、方波干扰)
  • 通过译码电路选通,任意一路信号都能接到任意一种故障源上
避坑指南: 我曾经在矩阵里用过普通信号继电器,结果高频CAN总线信号被继电器寄生电容搞变形了。后来换成了高频继电器(寄生电容<2pF),问题才解决。高频信号通道,继电器选型一定要看带宽。

4.2 可编程电阻:模拟线束老化与接触不良

开路和短路只是故障的极端情况。更多时候,故障是“半死不活”的——比如线束端子氧化,接触电阻从10mΩ慢慢涨到10Ω。
这种渐变故障,继电器搞不定,得靠可编程电阻。

4.2.1 实现方案对比

方案 精度 分辨率 功率 成本
数字电位器 ±20% 8~10bit 低(<0.1W) 低
电阻网络+MOSFET ±1% 12~16bit 中(1~5W) 中
精密电阻+继电器 ±0.1% 取决于档位 高(>10W) 高

我个人最常用的是电阻网络+MOSFET方案。它兼顾了精度和功率,而且切换速度比继电器快得多(微秒级 vs 毫秒级)。

4.2.2 典型电路:R-2R阶梯网络

用R-2R网络配合MOSFET开关,可以构建一个数控电阻:

// 伪代码:设置可编程电阻值
// 假设R=1kΩ,8位控制字
uint8_t set_resistance(float target_ohm) {
    // 将目标电阻值映射到0-255
    uint8_t code = (uint8_t)(target_ohm / 1.0); 
    // 输出到MOSFET驱动寄存器
    REG_DAC_RESISTOR = code;
    return code;
}

实际项目中,我会用16位的DAC配合精密运放,实现1Ω~100kΩ的连续可调范围,步进0.1Ω。

经验之谈: 可编程电阻的寄生电感很容易被忽略。我遇到过用长导线连接可编程电阻到DUT,结果在1MHz以上的PWM信号中,导线电感产生了振铃。解决方案是把可编程电阻模块直接做到DUT接口板上,缩短走线。

4.3 电流/电压偏置电路:模拟传感器漂移与电源扰动

继电器和可编程电阻搞定了通断和阻抗,但还有一种故障很隐蔽——信号偏置。
比如,一个0~5V的模拟传感器,正常输出2.5V。因为电源纹波或者地偏移,输出变成了2.6V。这种微小偏移,软件自检很难发现,但系统精度已经下降了。

4.3.1 电压偏置注入

电压偏置的核心是一个加法电路:

  • 用精密运放搭建同相加法器
  • 一路输入是原始信号
  • 另一路输入是DAC产生的偏置电压
  • 输出 = 原始信号 + 偏置电压

关键指标:

  • 偏置精度:±1mV以内
  • 带宽:至少是信号带宽的3倍
  • 输出阻抗:<1Ω,避免负载效应

4.3.2 电流偏置注入

电流偏置常用于4~20mA的工业传感器回路。
我做过一个项目,需要模拟传感器在长距离传输时受到的共模干扰。做法是在回路中串联一个压控电流源:

// 电流偏置控制示例
// 目标:在4~20mA回路中叠加±2mA的偏置
float set_current_bias(float bias_ma) {
    // 限制范围
    if(bias_ma > 2.0) bias_ma = 2.0;
    if(bias_ma < -2.0) bias_ma = -2.0;
    // 转换为DAC电压 (0~5V对应-2~+2mA)
    float dac_voltage = (bias_ma + 2.0) * 5.0 / 4.0;
    DAC_write(dac_voltage);
    return bias_ma;
}
注意: 电流偏置注入时,必须保证注入电路不破坏回路的整体供电。我曾经因为没加隔离,导致偏置电流倒灌进PLC的模拟量模块,烧了一个通道。从那以后,所有偏置电路都加了隔离运放。

4.4 三种硬件的协同工作

实际测试中,这三种硬件不是孤立使用的。我画了一张图,展示它们如何组成一个完整的故障注入系统:

故障注入硬件系统架构图 故障注入硬件系统架构 主控单元 (MCU/FPGA) 继电器矩阵 开路/短路注入 可编程电阻 阻抗渐变模拟 偏置电路 电压/电流偏移 故障注入输出 → 被测设备 (DUT) 说明: 三种硬件可独立工作,也可组合注入复杂故障(如:继电器开路 + 偏置电压叠加)。 主控单元通过SPI/I2C总线统一控制,实现毫秒级故障切换。 图:故障注入硬件系统架构

你看,主控单元通过SPI或I2C总线,统一调度三个模块。测试用例可以这样写:

  • 第0~5秒:正常状态(继电器闭合,电阻=0Ω,偏置=0V)
  • 第5~10秒:模拟线束老化(可编程电阻从0.1Ω渐变到10Ω)
  • 第10~12秒:模拟电源干扰(偏置电路叠加100mV/100Hz的纹波)
  • 第12~15秒:模拟线束断裂(继电器断开)
核心思路: 故障注入不是越复杂越好,而是要贴近真实物理失效模式。你设计的故障场景,必须能在实际现场找到对应原因。否则就是自嗨式测试。

4.5 硬件设计的几个血泪教训

最后,分享几个我在硬件故障注入设计中踩过的坑:

  1. 继电器触点弹跳:机械继电器闭合时有3~5ms的弹跳时间。如果DUT在这个时间段采样,会误判为故障。解决方案是加软件去抖,或者用固态继电器。
  2. 可编程电阻的温漂:MOSFET的导通电阻随温度变化很大。我试过在40℃环境下,设定10Ω变成了15Ω。后来加了温度补偿查表,才稳住。
  3. 偏置电路的共模抑制:加法电路的共模抑制比(CMRR)很关键。如果CMRR不够,偏置电压会随着原始信号变化,导致注入量不准。选运放时,CMRR至少要80dB以上。
  4. 接地回路:故障注入设备和DUT之间,很容易形成地环路。我吃过一次亏,注入设备的地和DUT的地之间有0.5V压差,导致所有测量值都偏了。后来所有信号通道都加了隔离。

嗯,硬件故障注入的设计,说白了就是在可控的范围内,模拟不可控的物理世界。
继电器矩阵、可编程电阻、偏置电路,这三板斧用好了,能覆盖90%以上的硬件故障场景。
剩下的10%,就得靠你根据具体项目去定制了。