2、故障模式分析:传感器故障、执行器故障、通信故障

各位同学,咱们接着聊。上一章我们把故障诊断的整体框架搭起来了,这一章我带你深入看看那些最让人头疼的故障模式。说白了,飞控系统在天上飞,任何一个环节出问题,后果都可能很严重。我个人习惯是把故障分成三大类:传感器、执行器、通信。咱们一个一个来拆解。

2.1 传感器故障:飞控的“眼睛”瞎了怎么办?

传感器是飞控感知世界的唯一途径。它要是出了问题,飞控就成了盲人骑瞎马。常见的传感器故障有三种:漂移、卡死、数据中断。

2.1.1 漂移故障

漂移,就是传感器的输出值慢慢偏离真实值。比如陀螺仪的零偏随着温度变化慢慢跑掉。嗯,这里要注意,漂移不是瞬间发生的,它像温水煮青蛙。

我在项目中遇到过一次,某款IMU在高温环境下,加速度计的Z轴输出从1g慢慢漂到了1.15g。飞控以为飞机在上升,就开始收油门。结果飞机越飞越低,差点炸机。后来我查了数据手册,发现那个IMU的温度补偿系数没配好。

漂移的典型特征:

  • 误差随时间缓慢累积
  • 短时间内难以察觉
  • 通常由温度、老化引起

诊断方法:我个人习惯用“滑动窗口均值对比法”。取最近100ms的数据均值,和历史均值做差。如果差值超过阈值,且持续增长,基本可以判定为漂移。

2.1.2 卡死故障

卡死,就是传感器的输出值突然固定在一个数值上,再也不变了。这比漂移更危险,因为飞控会以为飞机状态稳定,实际上可能已经失控了。

我曾经调试一架六旋翼时,气压计突然卡死在101.3kPa。飞控以为高度没变,实际上飞机已经掉到地上了。嗯,那次教训很深刻。

卡死的判断逻辑其实很简单:

// 伪代码:卡死检测
if (abs(sensor_value - last_value) < DEAD_THRESHOLD) {
    dead_counter++;
    if (dead_counter > DEAD_FRAME_NUM) {
        // 判定为卡死
        fault_flag = SENSOR_STUCK;
    }
} else {
    dead_counter = 0;
}

你想想看,如果连续100个采样周期数据都不变,那肯定是有问题的。正常传感器总有噪声,不可能纹丝不动。

2.1.3 数据中断

数据中断,就是传感器突然不输出数据了。可能是线断了、芯片挂了、或者通信接口出了问题。这是最直观的故障,但也是最难处理的——因为飞控不知道发生了什么。

故障类型 典型表现 检测方法 我的处理建议
漂移 数据缓慢偏离 滑动窗口均值对比 启用备用传感器,或进行在线校准
卡死 数据固定不变 相邻采样差值检测 切换冗余传感器,或进入降级模式
数据中断 无数据输出 看门狗超时检测 立即切换,并触发紧急保护

警告:数据中断是最危险的故障之一。因为飞控在失去数据后,会使用最后一次有效值进行推算,误差会迅速累积。我建议在检测到中断后,立即切换到冗余传感器,不要等待。

2.2 执行器故障:电机和桨叶的“罢工”

执行器是飞控的“手脚”。传感器坏了,飞控还能靠冗余数据撑着。执行器坏了,飞机直接失去控制力。常见的执行器故障有电机堵转和桨叶损坏。

2.2.1 电机堵转

电机堵转,就是电机转不动了。可能是轴承卡死、异物卡住、或者电调烧了。堵转时电流会急剧增大,如果不及时处理,电调会烧毁。

我记得有一次做四旋翼拉力测试,一个电机被线缆缠住。飞控还在拼命给油门,结果那个电调直接冒烟了。从那以后,我都在代码里加了堵转检测。

堵转检测的核心是“电流-转速”关系:

// 堵转检测逻辑
if (motor_speed < SPEED_THRESHOLD && motor_current > CURRENT_THRESHOLD) {
    // 转速低但电流大,大概率堵转
    stall_counter++;
    if (stall_counter > STALL_FRAME_NUM) {
        // 确认堵转,立即降低油门
        set_motor_throttle(motor_id, 0);
        fault_flag = MOTOR_STALL;
    }
}

小技巧:我建议在堵转检测中加一个“反推验证”。先降低油门,如果电流下降但转速不恢复,那基本就是机械卡死了。如果电流和转速都下降,可能是电调问题。

2.2.2 桨叶损坏

桨叶损坏,比如桨尖断裂、桨叶变形。这会导致拉力下降、振动增大。飞控为了维持姿态,会加大其他电机的输出,导致系统失衡。

桨叶损坏的典型表现:

  • 振动值突然增大(IMU的加速度计数据会明显抖动)
  • 某个电机的PWM输出异常偏高
  • 飞机出现无法消除的偏航

我曾经遇到过一架六旋翼,起飞后一直往左偏。飞控一直在调右舵,但就是调不回来。落地一看,右边一个桨叶缺了指甲盖大小的一块。嗯,有时候问题就这么简单。

2.3 通信故障:CAN和I2C总线的“沉默”

通信总线是飞控的“神经网络”。传感器数据、执行器指令都靠它传输。总线一旦出问题,整个系统就瘫痪了。常见的通信故障有CAN总线异常和I2C总线异常。

2.3.1 CAN总线故障

CAN总线在飞控中很常见,尤其是多传感器、多执行器的系统。CAN总线故障主要有:

  • 总线关闭:某个节点错误太多,被总线自动隔离
  • 位填充错误:时钟不同步导致数据错位
  • 仲裁丢失:多个节点同时发送,优先级低的被覆盖

我个人习惯在CAN总线上加一个“心跳包”。每个节点每隔10ms发送一次心跳。如果连续3次收不到某个节点的心跳,就判定该节点离线。

// CAN心跳检测
typedef struct {
    uint8_t node_id;
    uint32_t last_heartbeat_ms;
    uint8_t missed_count;
} can_node_t;

void can_heartbeat_check(can_node_t *node) {
    uint32_t now = get_system_ms();
    if ((now - node->last_heartbeat_ms) > HEARTBEAT_TIMEOUT_MS) {
        node->missed_count++;
        if (node->missed_count >= 3) {
            // 节点离线,触发故障处理
            can_node_offline(node->node_id);
        }
    } else {
        node->missed_count = 0;
    }
}

关键点:CAN总线的故障恢复很重要。我建议在检测到总线关闭后,先复位CAN控制器,然后重新初始化。如果连续复位3次都失败,那就只能降级运行了。

2.3.2 I2C总线故障

I2C总线在飞控中常用于连接IMU、气压计、磁力计等。I2C的故障比较隐蔽,常见的有:

  • SCL/SDA线被拉低:某个从机故障,把总线锁死了
  • 地址冲突:两个设备用了同一个I2C地址
  • 时钟拉伸:从机拉低时钟线,导致主机等待超时

我记得有一次调试,I2C总线总是莫名其妙地卡住。用示波器一看,SCL线一直被拉低。查了半天,发现是磁力计的I2C接口短路了。嗯,硬件问题有时候就是这么让人抓狂。

I2C故障的检测方法:

  • 每次通信后检查ACK信号
  • 设置超时时间(建议5ms以内)
  • 如果连续3次通信失败,尝试复位I2C总线

注意:I2C总线复位时,要确保所有从机都释放总线。我建议在复位前,先发送9个时钟脉冲,让从机退出异常状态。这是很多工程师容易忽略的细节。

好了,这一章的内容就到这里。传感器、执行器、通信,这三类故障基本覆盖了飞控系统90%以上的问题。下一章我会讲具体的故障诊断算法,包括卡尔曼滤波的残差检测、多传感器投票机制等。到时候咱们再细聊。