在说协议之前,我想强调一件事。 信号取反,硬件取反! 呃! 呃! 呃! 呃! 关于为什么要强调,稍后会说明。 首先请记住。 SBUS协议:使用串行端口的通信,可以直接通过串行端口进行呼叫,但有几点需要注意。
1 .串行端口布局: 100k波特率、8位数据位(stm32中选择9位)、偶数检验)、2位停止位、无控制流、25字节、
2 .协议格式: (8字节)
[ start byte ] [ data1 ] [ data2]…[ data 22 ] [ flags ] [ end byte ]
startbyte=0x0f;
endbyte=0x00;
flags标志位我没有使用;
数据1…数据223-3360与16信道(ch1-ch16 )相对应,并且每信道11比特(228=1611=176 );
数据范围在0-2047之间,基本上在1102~1927,中间值为1500。
ch111比特=data2的低位3比特data1的8比特;
例如,data1=00110110、data2=11001111;
在这种情况下ch1=111 00110110=1846; 通道1的值为1846
ch2=data3后6位data2的前5位;
ch3=data5后1位的data4的8位的data3的前2位;
ch4=4 7;
ch5=7 4;
ch6=2 8 1;
ch7=5 6;
ch8=8 3;
ch9=6 5;
ch10=1 8 2;
ch11=4 7;
ch12=7 4;
ch13=2 8 1;
ch14=5 6;
ch15=8 3;
ch16=6 5;
3 .我接下来要谈的是我首先提出的相反问题
用stm32发送到px4时,需要取反。 另外,还需要采取硬件相反的措施。 取反软件是无效的。 (我被这个绊倒了。 )贴上了硬件相反的电路图。 (此时,我从雪域Sky狼窝的博客转开了; URL 3358 www.360doc.com/content/16/0818/08/35267583 _ 584012245.shtml )
4 .接下来要说的是其间隔的问题。 那个可以分为两种模式。 (我记得曾被称为高速模式和普通模式。
高速模式:每7ms一帧的数据。 因为两帧的间隔不超过3ms是不能接受的;
根据波特率计算,25字节发送所需的时间为3~4ms=7ms
正常模式:每14ms一帧数据;
5 .分析并合并数据我下载了px4的源代码,写成了. c格式。
详细的代码上传到了博客的下载页面。 感兴趣的伙伴,可以下载看看;
# include ‘ sbus.h ‘ # include ‘ bsp _ usar t1.h ‘ # include ‘ string.h ‘ uint 16 _ tvalues [ 16 ]={0}; void sbus _ out (uint 16 _ tnum _ values ) {int i=0; uint16_t value=0; uint8_t byteindex=1; uint8_t offset=0; uint8_t oframe[25]={ 0 }; memset(oframe,0,25 ); oframe[0]=0x0f; oframe[24]=0x00; for(I=0; (i num_values ) ) i 16; I ) value=(unsignedshort ) ) (values[i] – SBUS_SCALE_OFFSET )/SBUS_SCALE_FACTOR ).5f ); if(value0x07ff ) {value=0x07ff; }while(offset=8) { byteindex; 偏移-=8; } of rame [ byte index ]|=(value (offset ) )0xff; of rame [ byte index1]|=(value (8- offset ) )0xff; of rame [ byte index2]|=(value (16-offset ) )0xff; offset =11; (for ) I=0; i25; I ) while(usart_getflagstatus ) usarT1,USART_FLAG_TC )==RESET; usart_senddata(usarT1,(uint16_t ) oframe[i]; } void sbus _ decode (unsigned char * frame ) {unsigned int pick=0,channel=0,value1=0,piece=0; conststructsbus _ bit _ pick * decode; for (信道=0; 信道16信道(value1=0; for (挑库=0; pick 3; pick ({ decode=sbus _ decoder [ channel ] [ pick ]; if (解码掩码!=0) {piece=frame[1 decode-byte]; piece=decode-rshift; piece=decode-mask; piece=decode-lshift; piece=0x07ff; value1 |=piece; }values[channel]=(uint16_t ) value1 * SBUS_SCALE_FACTOR .5f ) SBUS_SCALE_OFFSET; if(channel==1) values [ channel ]=3029-values [ channel ]; }}合成函数:
void sbus _ out (uint 16 _ tnum _ values; //参数是通道数;
values[16]是所对应的16个信道;
分析函数:
void sbus _ decode (unsigned char * frame );
//frame是25个u8位数据
大家有几个问题,试着统一回答吧:
1 .宏观的定义具体是多少:
#define SBUS_FRAME_SIZE 25
#define SBUS_RANGE_MIN 200.0f
#define SBUS_RANGE_MAX 1800.0f
#define SBUS_TARGET_MIN 1000.0f
#define SBUS_TARGET_MAX 2000.0f
#definesbus_scale_factor () sbus _ target _ max-sbus _ target _ min )//(sbus _ range _ max-sbus _ ranu rang )
#definesbus_scale_offset(int ) sbus _ target _ min-(sbus _ scale _ factor * sbus _ range _ min 0.5f ) ) /
2 .下载页面多少钱:
3359 download.csdn.net/download/peach _ orange/9667070
需要下载积分。 没有积分的兄弟会给我发邮件。 邮件发给你:
pantaojiacheng@163.com
3.flags标志位的具体作用:
flags标志位是用于检测控制器和px4是否断开的标志位。
flags=1:控制器保持与接收器连接
flags=0:当控制器和接收器断开(失控)时,px4控制电机停止。
曾经炸毁过一次,是因为遥控器和接收机之间被切断了,结果没有设置这个方法,四轴按照最后的指令飞行。