航模遥控器解码
标签:飞行器 DIY 遥控器
nicekwell 发布于 2016-12-24 22:13
这是在做什么?
这是在解码航模遥控器接收机输出的信号,转换成纯数字信号输出。
航模遥控器接收机的输出的PWM信号有一套标准的协议,航模上面的舵机、有刷电调、无刷电调都是受这种PWM信号控制的。
有关PPM信号和航模遥控器接收机输出的PWM信号的介绍可以参考:http://nicekwell.net/blog/20161223/ppmxin-hao-jie-shao.html,这里介绍如何提取接收机的PWM信号,做一个航模遥控器的解码器。
为什么要解码?
因为有时候航模那端想要按照自己的想法编程,同时又希望能够使用航模遥控器这个方便的工具。
总之航模遥控器是个好东西,如果能够把航模遥控器信号转换成数字信号,就可以方便地把它输出给arduino或者树莓派等设备,无论用它做什么也是极好的。
Step 1: 关于遥控器和接收机
关于此遥控器和接收机的特性可以参考:http://nicekwell.net/blog/20161223/wft07he-wfr07de-gong-neng-he-shi-yong.html
几个必要说明:
- 我使用的是美国手(左边油门)遥控器,后面的功能介绍都是基于美国手遥控器。
对于各个通道信号解码来说并不关心各个通道的意义,解码后每个通道的作用由你自己后续的程序决定。 - 对于航模的多通道遥控器,通常有 直升机 和 固定翼 两种模式,在直升机模式下各个通道会相互关联,在固定翼模式下各个通道独立。
解码的目的是在接收端还原遥控器的操作,所以选择各个通道独立操作的固定翼模式,以下所有操作都在固定翼模式下。 - CH1、CH2、CH3、CH4、CH6可连续变化,通过示波器测量分辨率是20us,所以单片机在采样时精度20us即可。
各个通道功能如上面图片所示。
Step 2: 硬件
【单片机】STC12C5A60S2
【晶振】24MHz
注:此晶振可产生精确地定时器中断,方便监测各个通道,但串口波特率会有0.16%的误差,不会影响使用。
【引脚连接】
CH1:P1.6
CH2:P1.5
CH3:P1.4
CH4:P1.3
CH5:P1.2
CH6:P1.1
CH7:P1.0
TXD:P3.1
Step 3: 输出协议
解码后的信号通过串口输出。
【波特率】115200
实测发送一个字节大约需要13us,这样算的话一帧发送8字节大约需要104us。
这里测量的13us是程序把一字节数据送入缓存,并等待发送完成标志所用的时间,不是实际串口的工作时间。
【数据格式】
每个周期内,当采集完7个通道的高电平后(最长约14ms)会立刻通过串口发送7个通道的数据信息。
每个周期的数据为一帧,一帧数据有8个字节:
第一字节固定为0x01,标志一帧数据开始。(后面7个字节不可能为这个值)
后面7个字节依次表示CH1到CH7的脉宽,单位是10us。如输出150表示脉宽为1500us。
注:
1、接收机输出的脉宽范围大约在1000us~2000us之间,所以7个脉宽的数据范围大约在100~200之间。
2、解码后输出的数据单位是10us,但实际接收机输出的精度是20us,单片机程序也是按照20us的精度采样的。
对于此接收机,不会出现信号丢失的情况,当遇到遥控器信号丢失时,接收机会输出预先设定好的信号,对于解码器来说不能区分当前遥控器信号是否丢失。