为什么要提取接收机信号?因为有时候航模那端想要按照自己的想法编程,同时又希望能够使用航模遥控器这个方便的工具。
总之如果能够把航模遥控器信号转换成数字信号,无论用它做什么也是极好的~

工程放在github上:https://github.com/nicekwell/WFR07_decode
也可以直接下载此工程。

完成后的效果视频:


  

  

以下是一些重要的说明,在工程的README中有更详细的介绍。

  

硬件

【单片机】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

输出格式

【波特率】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的精度采样的。

对于此接收机,不会出现信号丢失的情况,当遇到遥控器信号丢失时,接收机会输出预先设定好的信号,对于解码器来说不能区分当前遥控器信号是否丢失。

程序结构介绍

两个进程:定时器中断和主循环。

定时器20us一次中断,有两个状态:
1、信号采集中:
  1、采集各个通道高电平时间。
  2、判断当前所有通道是否采集完成(所有通道信号结束后,所有通道都会输出低电平。
    如果连续100us(5个周期)检测到所有通道都是低电平,则认为一帧信号结束,此时对采集到的信号进行判断:
      如果所有通道脉宽大于500us,则认为数据有效,通知主进程发送数据,并进入状态2。
2、本周期信号已结束,等待下一周期:
  任意通道采集到高电平则进入状态1。

主循环进程只干一件事,等待定时器进程发送指令,接收到指令后发送数据。
但主循环会忽略第一帧数据,因为第一帧数据可能采集不完整。


本站所有文章欢迎转载,但请保留作者信息和原文地址。

Comments