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次异常才触发报警。这样可以避免偶发干扰导致的误报。
回读校验的典型流程:
- 设置定时器输出比较,产生PWM。
- 同时设置同一引脚的输入捕获模式,捕获PWM的高电平脉宽。
- 读取捕获值,与期望值做差。
- 如果差值超过阈值,计数器加1;否则清零。
- 计数器达到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回读、推力估算,每个信号都有盲区,但组合起来就能覆盖绝大部分故障场景。下一节我们会聊传感器故障诊断,那又是另一套思路了。