4、执行器故障诊断:电机电流与转速异常检测、PWM信号回读校验、基于模型的推力估算与故障判别

执行器,说白了就是电机和螺旋桨。飞控说“你转”,它就得转。但现实很骨感——电机卡死、桨叶断裂、电调烧毁,这些我都见过。有一次在试飞现场,四轴刚离地半米,突然一个电机停转,飞机直接侧翻。后来查原因,是电调输出MOS管击穿了。从那以后,我对执行器故障诊断这块,就格外上心。

这一节,我们重点聊三个方向:电机电流与转速异常检测PWM信号回读校验、以及基于模型的推力估算与故障判别。这三板斧用好了,大部分执行器故障都能在酿成大祸前被揪出来。

4.1 电机电流与转速异常检测

电机出问题,最直接的反映就是电流和转速。正常飞行时,电流和油门指令是强相关的。如果油门推上去了,电流却上不去,或者电流飙升但转速没变化,那肯定有问题。

电流检测怎么做?

我习惯在电调输入端串联一个采样电阻,或者用霍尔电流传感器。飞控以100Hz左右的频率读取电流值。关键不是看绝对值,而是看变化趋势。

核心判据:

  • 电流过低异常: 给定高油门,但电流远低于预期值。可能原因:电机断相、电调MOS管开路、供电线路接触不良。
  • 电流过高异常: 电流超过额定值1.5倍以上,且持续。可能原因:电机轴承卡死、桨叶打到异物、电调短路。
  • 电流波动异常: 电流在短时间内剧烈抖动。可能原因:电调驱动波形异常、电机内部绕组短路。

转速检测怎么做?

无刷电机没有电刷,转速信号得靠反电动势检测,或者用专用的转速传感器。大部分飞控用的是电调反馈的eRPM信号。我建议把转速和油门指令做归一化处理,然后看偏差。

举个例子:

// 伪代码:转速异常检测
float throttle_cmd = 0.7;  // 70%油门
float expected_rpm = throttle_cmd * MAX_RPM;  // 假设线性关系
float actual_rpm = get_motor_rpm();

float deviation = fabs(actual_rpm - expected_rpm) / MAX_RPM;

if (deviation > 0.15) {  // 偏差超过15%
    if (actual_rpm < expected_rpm) {
        flag_motor_stall = 1;  // 电机堵转或负载过大
    } else {
        flag_motor_runaway = 1; // 电机飞车,可能桨叶脱落
    }
}

我的经验: 转速偏差阈值不能设得太死。不同桨叶、不同电池电压下,同样的油门对应的转速能差10%以上。我一般会做一个自适应阈值——根据当前电池电压和温度,动态调整偏差门限。

4.2 PWM信号回读校验

飞控给电调发PWM信号,但电调真的收到了吗?信号在传输过程中有没有被干扰?电调内部有没有正确解析?这些问题,靠PWM回读就能解决。

原理很简单: 飞控的PWM输出引脚,同时接一个输入捕获通道。发完信号后,立刻回读实际输出的PWM波形。对比“期望值”和“回读值”,如果差异超过一个脉宽(比如5μs),就认为信号链路有问题。

我曾经遇到过一个案例:飞控输出1500μs的PWM,但回读发现只有1200μs。查了半天,是PCB走线上有一个过孔虚焊,导致信号反射。如果没有回读校验,这种间歇性故障根本抓不到。

注意: PWM回读不能只做一次。我建议在每个控制周期(比如4ms)都做一次回读,连续3次异常才触发报警。这样可以避免偶发干扰导致的误报。

回读校验的典型流程:

  1. 设置定时器输出比较,产生PWM。
  2. 同时设置同一引脚的输入捕获模式,捕获PWM的高电平脉宽。
  3. 读取捕获值,与期望值做差。
  4. 如果差值超过阈值,计数器加1;否则清零。
  5. 计数器达到3,触发PWM异常报警。
// 伪代码:PWM回读校验
uint16_t expected_pulse = 1500;  // 期望脉宽,单位μs
uint16_t actual_pulse = capture_read();

int16_t error = (int16_t)expected_pulse - (int16_t)actual_pulse;

if (abs(error) > 5) {  // 误差超过5μs
    pwm_error_count++;
    if (pwm_error_count >= 3) {
        pwm_fault_flag = 1;
        // 执行安全动作:比如切换到备用PWM通道
    }
} else {
    pwm_error_count = 0;
}

4.3 基于模型的推力估算与故障判别

电流和转速是直接测量,但有时候我们更关心的是——电机到底产生了多少推力?推力不足,飞机就掉高;推力不对称,飞机就偏航。直接测推力不现实,但我们可以用模型估算。

推力模型长什么样?

对于固定桨距的螺旋桨,推力T和转速n的关系近似为:

T = k * ρ * D^4 * n^2

其中k是桨叶系数,ρ是空气密度,D是桨叶直径。在实际飞控中,我们通常简化成:

T_estimated = K_t * rpm^2

K_t是推力系数,可以通过实验标定得到。

故障判别逻辑:

有了估算推力,我们就可以和期望推力做比较。期望推力来自控制器的输出——比如PID控制器算出来需要50%的推力,那我们就期望电机产生50%的推力。

故障类型 现象 判别依据
推力不足 估算推力 < 期望推力 × 0.7 电机效率下降,可能轴承磨损或磁钢退磁
推力过剩 估算推力 > 期望推力 × 1.3 桨叶螺距异常或电机转速失控
推力不对称 同侧电机推力差 > 15% 某个电机故障,导致飞机偏航或倾斜

我个人习惯的做法: 把推力估算和电流、转速检测结合起来。比如,电流正常但推力不足,那可能是桨叶效率问题;电流偏高但推力正常,那可能是电机发热导致效率下降。三个维度交叉验证,诊断准确率能到95%以上。

避坑指南:

我曾经在标定K_t系数时犯过一个错误——只在地面静态条件下标定。结果上天后,由于气流影响,推力估算偏差很大。后来我改成在悬停、前飞、爬升等多个工况下标定,取平均值。嗯,这个细节很重要,大家一定要注意。

另外,空气密度ρ会随温度和海拔变化。如果你在高原飞行,记得修正密度参数。否则模型算出来的推力会偏大,导致误判为“推力不足”。

总结一下:执行器故障诊断,核心就是多源信息融合。电流、转速、PWM回读、推力估算,每个信号都有盲区,但组合起来就能覆盖绝大部分故障场景。下一节我们会聊传感器故障诊断,那又是另一套思路了。