一、简介
如图所示为一款航模遥控器和它的接收机。遥控器的工作原理不是家用电器那种红外遥控器,而是基于2.4G频段的射频通信。
现在需要通过接收机解析航模遥控器通道值用于自行控制的场合。那么就需要了解接收机这个模块。目前航模接收机有PWM、PPM、SBUS传输协议。
PWM
PWM是最原始的方式。PWM信号就是指脉宽可调的固定周期信号(就是改变占空比,这个都很熟悉吧)。将接收机的各个PWM输出接到各个电机上后,遥控器从某个通道的最低位到最高位的过程就对应不同占空比的PWM信号,作用于电机。
对于这个PWM的固定周期,不同厂家接收机设计的不一样。我目前见过的有14ms到25ms。
然后这个脉宽可调的范围是1ms~2ms,也就是说遥控器0位时,接收机输出的PWM信号的脉宽为1ms,满位时为2ms。
PPM
由于每个接收机的PWM输出口只能传输一个通道的值,造成接收机体积太大,接口太多,因此诞生了PPM编码。PPM是把多路PWM波压缩到一路中的编码方式,PPM信号的周期一般是20ms(当然按理来说不同厂家设计的不一样,也是14ms到25ms为一个周期,不过我没用过PPM,不确定)。然后每个周期内,用一系列高电平脉冲之间的间隔时间表示每一路PWM波的脉宽,见下图
SBUS
简单说,SBUS信号就是一种特殊的UART信号,基于负电平逻辑设计。相比于普通UART信号,SBUS信号经过硬件取反后可以直接用UART控制器处理,注意必须要进行硬件取反,软件取反不行。同时,由于是非标准波特率,如果用非标准波特率去接收数据容易错误。因此市面上有一个单独的模块,用于电平取反以及波特率调制。
解决了硬件上的读取问题后,接下来就是了解SBUS的软件协议。
一帧数据如下所示,共25个字节。其中第一个字节为帧开始,最后一个直接为帧结束。data1-data22是22个字节、176bit,每个通道值用11bit表示,即存储了16个通道值。
[0x0f][data1][data2]…[data22][flags][0x00]
解析过程如下:
if(sbus_rx_sta==1)
{
sbus.ch[0] =((sbus_rx_buf[2]<<8) + (sbus_rx_buf[1])) & 0x07ff;
sbus.ch[1] =((sbus_rx_buf[3]<<5) + (sbus_rx_buf[2]>>3)) & 0x07ff;
sbus.ch[2] =((sbus_rx_buf[5]<<10) + (sbus_rx_buf[4]<<2) + (sbus_rx_buf[3]>>6)) & 0x07ff;
sbus.ch[3] =((sbus_rx_buf[6]<<7) + (sbus_rx_buf[5]>>1)) & 0x07ff;
sbus.ch[4] =((sbus_rx_buf[7]<<4) + (sbus_rx_buf[6]>>4)) & 0x07ff;
sbus.ch[5] =((sbus_rx_buf[9]<<9) + (sbus_rx_buf[8]<<1) + (sbus_rx_buf[7]>>7)) & 0x07ff;
sbus.ch[6] =((sbus_rx_buf[10]<<6) + (sbus_rx_buf[9]>>2)) & 0x07ff;
sbus.ch[7] =((sbus_rx_buf[11]<<3) + (sbus_rx_buf[10]>>5)) & 0x07ff;
sbus.ch[8] =((sbus_rx_buf[13]<<8) + (sbus_rx_buf[12])) & 0x07ff;
sbus.ch[9] =((sbus_rx_buf[14]<<5) + (sbus_rx_buf[13]>>3)) & 0x07ff;
sbus.ch[10]=((sbus_rx_buf[16]<<10) + (sbus_rx_buf[15]<<2) + (sbus_rx_buf[14]>>6)) & 0x07ff;
sbus.ch[11]=((sbus_rx_buf[17]<<7) + (sbus_rx_buf[16]>>1)) & 0x07ff;
sbus.ch[12]=((sbus_rx_buf[18]<<4) + (sbus_rx_buf[17]>>4)) & 0x07ff;
sbus.ch[13]=((sbus_rx_buf[20]<<9) + (sbus_rx_buf[19]<<1) + (sbus_rx_buf[18]>>7)) & 0x07ff;
sbus.ch[14]=((sbus_rx_buf[21]<<6) + (sbus_rx_buf[20]>>2)) & 0x07ff;
sbus.ch[15]=((sbus_rx_buf[22]<<3) + (sbus_rx_buf[21]>>5)) & 0x07ff;
}