3、RC输入与通道映射:RC输入原理、通道映射配置、PWM信号解析

好,咱们进入第三讲。这一讲要聊的是飞控的“耳朵”——RC输入。说白了,就是遥控器怎么跟飞控“说话”,飞控又怎么听懂这些话。

很多新手朋友一上来就急着调PID,结果发现飞机解锁不了,或者舵机乱抖。查到最后,往往是RC输入没配好。我刚开始玩Pixhawk时也犯过这错,折腾了一下午,最后发现是接收机线序插反了。嗯,从那以后,我再也不敢小看这一章了。

核心一句话:飞控不认识你的摇杆,它只认识PWM脉宽。通道映射就是给这些脉宽“贴标签”。

3.1 RC输入原理:信号怎么从遥控器到飞控?

遥控器发射2.4G射频信号,接收机收到后,解码成PWM信号,再通过一根三芯线(信号、正极、地)传给飞控。飞控的STM32芯片用定时器捕获功能,测量每个通道的高电平时间,也就是脉宽。

标准脉宽范围是1000~2000微秒(μs)。中位值是1500μs。你想想看,摇杆居中时,信号线就是1.5ms高电平,8.5ms低电平,周期20ms。

为什么会是1000~2000?这是航模界几十年的老规矩。我见过一些工业级遥控器能输出800~2200μs,但ArduPilot默认只认1000~2000。超出这个范围,飞控会报错,甚至直接切到失控保护。

信号状态 脉宽(μs) 对应摇杆位置
最小值 1000 最低 / 最左 / 最下
中位值 1500 居中
最大值 2000 最高 / 最右 / 最上
失控保护触发 < 975 或 > 2025 信号丢失或接收机故障

个人习惯:我每次装机,都会在Mission Planner的“无线电校准”页面先看一眼原始脉宽值。如果摇杆打到底只有1980μs,我会在参数里把RCx_MAX调到1980,而不是硬用2000。这样能避免“满舵却飞不快”的尴尬。

3.2 通道映射配置:给每个通道“上户口”

接收机有多个通道,但飞控不知道哪个通道是油门,哪个是副翼。通道映射就是干这个的。

ArduPilot里,映射关系由参数RCMAP_ROLL、RCMAP_PITCH、RCMAP_THROTTLE、RCMAP_YAW控制。默认值是1、2、3、4,对应接收机的第1到第4通道。

但市面上的接收机通道顺序五花八门。Futaba是1副翼、2升降、3油门、4方向。Spektrum是1油门、2副翼、3升降、4方向。你如果不改映射,插上Spektrum接收机,推油门时飞控会以为是副翼在动。

我记得有一次帮朋友调一架穿越机,他用的ELRS接收机,默认通道顺序是1油门、2方向、3副翼、4升降。我按习惯把RCMAP_THROTTLE设成1,结果解锁后一推油门,飞机原地自旋。查了半小时,才发现是映射没改对。

避坑指南:千万不要在Mission Planner里直接改RCMAP参数后不重启。参数写入后,必须断电重启飞控,新映射才会生效。我曾经连续改了三遍没重启,还以为是飞控坏了。

除了主通道,还有辅助通道。比如第5通道通常用来切飞行模式,第6通道控制云台俯仰。这些通过RC5_OPTION、RC6_OPTION等参数来定义功能。

3.3 PWM信号解析:飞控内部是怎么“读”信号的?

飞控的RC输入接口,本质上是一个定时器输入捕获引脚。STM32的定时器可以测量两次上升沿之间的时间,或者一次上升沿到下降沿的时间。ArduPilot用的是后者——测量高电平持续时间。

代码层面,这个逻辑在AP_RCProtocol和AP_HAL的底层驱动里。我简化一下核心流程:

// 伪代码:PWM输入捕获中断服务函数
void TIMx_IRQHandler(void) {
    if (捕获到上升沿) {
        记录当前计数器值 start_time;
        配置为下降沿捕获;
    } else if (捕获到下降沿) {
        uint32_t pulse_width = 当前计数器值 - start_time;
        // pulse_width 就是脉宽,单位取决于定时器时钟
        // 存入对应通道的 ring buffer
        rc_input_buffer[channel] = pulse_width;
        配置为上升沿捕获;
    }
}

ArduPilot的主循环(以400Hz运行)会从ring buffer里取出最新的脉宽值,经过滤波、异常值剔除,再换算成-1到+1之间的归一化值,供姿态控制器使用。

这里有个细节:PWM信号是有抖动的。接收机本身有噪声,电机转动也会产生电磁干扰。所以ArduPilot内部做了个“死区”处理——如果当前脉宽跟上一次相差不到4μs,就忽略这次变化。这个死区值由参数RC_DEAD_ZONE控制,默认是4。

我建议:如果你用的是高精度遥控器(比如FrSky R9系列),可以把RC_DEAD_ZONE降到2,手感会更细腻。如果是廉价接收机,保持4甚至调到6更稳妥,否则飞控会误判摇杆抖动为有效输入。

3.4 知识体系总览

下面这张图把RC输入到通道映射的完整链路画出来了。你可以把它当作本章的“地图”。

RC输入与通道映射知识体系 RC输入与通道映射知识体系 遥控器 + 接收机 PWM信号线(信号/正极/地) STM32定时器输入捕获 AP_RCProtocol 解析 + 死区滤波 RCMAP 参数映射到 Roll/Pitch/Thr/Yaw 关键参数 RCMAP_ROLL = 1 RCMAP_PITCH = 2 RCMAP_THROTTLE = 3 RCMAP_YAW = 4 常见问题 通道顺序不匹配 脉宽超出范围 死区设置过小 信号线接触不良

3.5 实战:在Mission Planner里完成通道映射

纸上谈兵没意思,咱们直接上手操作。假设你用的是Pixhawk + Spektrum接收机。

  1. 连接硬件:接收机第1通道接飞控RC IN的CH1,第2接CH2,以此类推。注意信号线(白色/黄色)朝里,正极(红色)在中间,地线(黑色/棕色)朝外。
  2. 打开Mission Planner:进“初始设置” → “必要硬件” → “无线电校准”。
  3. 观察原始值:拨动每个摇杆,看对应的通道数值变化。Spektrum接收机第1通道是油门,但飞控默认第1通道是副翼。你会发现推油门时,Roll那栏在动。
  4. 修改映射:进“配置/调试” → “全部参数表”,搜索RCMAP_THROTTLE,把值从3改成1。同理,RCMAP_ROLL改成2,RCMAP_PITCH改成3,RCMAP_YAW保持4。
  5. 断电重启:拔掉USB线,等5秒再插上。重新进无线电校准页面,确认推油门时Throttle那栏在动。

注意:改完RCMAP参数后,一定要重新校准遥控器行程。因为映射变了,飞控对“最小值”和“最大值”的认知也变了。不校准的话,解锁时可能报“RC not calibrated”错误。

3.6 常见问题与排查思路

我整理了几个RC输入环节最常踩的坑,你遇到了可以直接对照排查。

现象 可能原因 排查方法
Mission Planner里RC值全为0 信号线没插好 / 接收机没上电 检查线序,用万用表测接收机正极是否有5V
某个通道数值不动 通道映射错误 / 接收机该通道损坏 交换两根信号线,看故障是否跟着通道走
数值跳动超过±10μs 电磁干扰 / 接收机天线位置不佳 把接收机远离电调和电机,检查天线是否被碳纤维遮挡
解锁后油门推到底只有50%动力 RCx_MAX设置过小 / 遥控器行程没校准 重新做无线电校准,确保最大值达到2000μs