单片机提取GR3E接收机信号
为什么要提取接收机信号?因为有时候航模那端想要按照自己的想法编程,同时又希望能够使用航模遥控器这个方便的工具。
总之如果能够把航模遥控器信号转换成数字信号,无论用它做什么也是极好的~
工程放在github上:https://github.com/nicekwell/GR3E_decode
也可以直接下载此工程。
完成后的效果视频:
以下是一些重要的说明,在工程的README中有更详细的介绍。
硬件
【单片机】STC12C5A60S2
【晶振】24MHz
注:此晶振可产生精确地定时器中断,方便监测各个通道,但串口波特率会有0.16%的误差,不会影响使用。
【引脚连接】
CH1:P1.2
CH2:P1.1
CH3:P1.0
TXD:P3.1
输出格式
【波特率】115200
实测发送一个字节大约需要13us,这样算的话一帧发送4字节大约需要50us。
这里测量的13us是程序把一字节数据送入缓存,并等待发送完成标志所用的时间,不是实际串口的工作时间。
【数据格式】
每个周期内,当采集完三个通道的高电平后(最长约6ms)会立刻通过串口发送3个通道的数据信息。
每个周期的数据为一帧,一帧数据有4个字节:
第一字节固定为0x01,标志一帧数据开始。(后面三个字节不可能为这个值)
后面三个字节依次表示CH1、CH2、CH3的脉宽,单位是10us。如输出150表示脉宽为1500us。
注:
1、接收机输出的脉宽范围大约在1000us~2000us之间,所以三个脉宽的数据范围大约在100~200之间。
2、解码后输出的数据单位是10us,但实际接收机输出的精度是20us,单片机程序也是按照20us的精度采样的。
以上是接收机正常工作的数据输出格式,当接收机接收不到信号时,模块持续输出0x02。
程序结构介绍
两个进程:定时器中断和主循环。
定时器20us一次中断,有两个状态:
1、信号采集中:
1、采集各个通道高电平时间。
2、判断当前所有通道是否采集完成(所有通道信号结束后,所有通道都会输出低电平。
如果连续100us(5个周期)检测到所有通道都是低电平,则认为一帧信号结束,此时对采集到的信号进行判断:
如果所有通道脉宽大于500us,则认为数据有效,通知主进程发送数据,并进入状态2。
否则认为数据有问题,通知主循环发送“信号丢失”信号,并进入状2。
2、本周期信号已结束,等待下一周期:
任意通道采集到高电平则进入状态1。
主循环进程只干一件事,等待定时器进程发送指令,接收到指令后发送数据。
但主循环会忽略第一帧数据,因为第一帧数据可能采集不完整。
本站所有文章欢迎转载,但请保留作者信息和原文地址。