日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

SBUS协议:SBUS解析与合成

發(fā)布時(shí)間:2023/12/20 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 SBUS协议:SBUS解析与合成 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
在說協(xié)議之前,我想強(qiáng)調(diào)一點(diǎn):信號(hào)要取反,硬件取反!!!!!至于為什么強(qiáng)調(diào),我會(huì)在后面解釋,你們先記住。

SBUS協(xié)議:使用的是串口的通訊,直接可以用串口發(fā)出,但有幾點(diǎn)仍需要注意:
1.串口配置:100k波特率,8位數(shù)據(jù)位(在stm32中要選擇9位),偶校驗(yàn)(EVEN),2位停止位,無控流,25個(gè)字節(jié),
2.協(xié)議格式:(8字節(jié))
[startbyte] [data1][data2]…[data22][flags][endbyte]
startbyte=0x0f;
endbyte=0x00;
flags標(biāo)志位我沒有用到;
data1…data22:對(duì)應(yīng)16個(gè)通道(ch1-ch16),每個(gè)通道11bit(228=1611=176);
數(shù)據(jù)范圍在0-2047之間,基本上是1102~1927,中值為1500;

ch1的11位=data2的低3位+data1的8位;
例如:data1=00110110,data2=11001111;
這時(shí)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發(fā)時(shí),需要取反,并且是硬件取反,軟件取反是無效的(我在這個(gè)上面栽了跟頭);硬件取反的電路圖我貼上了,(這時(shí)轉(zhuǎn)自 雪域Sky的狼窩 的博客;網(wǎng)址http://www.360doc.com/content/16/0818/08/35267583_584012245.shtml)

4.接下來要說的是它的間隔問題:它分兩種模式(我記得是叫高速模式和普通模式)
高速模式:每隔7ms一幀數(shù)據(jù),因?yàn)閮蓭拈g隔只有超過3ms,才會(huì)被接受;
而根據(jù)波特率計(jì)算一下,發(fā)送25字節(jié)需要的時(shí)間+3~4ms=7ms
普通模式:每隔14ms一幀數(shù)據(jù);

5.數(shù)據(jù)的解析跟合并我都下載了px4的源碼,寫成.c格式,
詳細(xì)代碼,我已經(jīng)上傳到我的博客下載頁上,有興趣的小伙伴,可以去下載一下;

#include "Sbus.h" #include "bsp_usart1.h" #include "string.h"uint16_t values[16]={0};void sbus_out(uint16_t num_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 = (unsigned short)(((values[i] - SBUS_SCALE_OFFSET) / SBUS_SCALE_FACTOR) + .5f);if (value > 0x07ff){value = 0x07ff;}while (offset >= 8){++byteindex;offset -= 8;}oframe[byteindex] |= (value << (offset)) & 0xff;oframe[byteindex + 1] |= (value >> (8 - offset)) & 0xff;oframe[byteindex + 2] |= (value >> (16 - offset)) & 0xff;offset += 11;}for (i=0;i<25;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;const struct sbus_bit_pick *decode;for (channel = 0; channel < 16; channel++) {value1 = 0;for (pick = 0; pick < 3; pick++) {decode = &sbus_decoder[channel][pick];if (decode->mask != 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];}} }

合成函數(shù):
void sbus_out(uint16_t num_values);//參數(shù)為通道數(shù);
values[16]就是對(duì)應(yīng)的16個(gè)通道;
解析函數(shù):
void sbus_decode(unsigned char *frame);
//frame為25個(gè)u8位數(shù)據(jù);

看大家有幾個(gè)問題,統(tǒng)一回答一下:
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
#define SBUS_SCALE_FACTOR ((SBUS_TARGET_MAX - SBUS_TARGET_MIN)/(SBUS_RANGE_MAX-SBUS_RANGE_MIN))//0.625f
#define SBUS_SCALE_OFFSET (int)(SBUS_TARGET_MIN - (SBUS_SCALE_FACTOR * SBUS_RANGE_MIN + 0.5f)) //874.5f

2.下載頁是多少:
https://download.csdn.net/download/peach_orange/9667070
需要下載積分,沒有積分的兄弟給我發(fā)個(gè)郵件,我郵件給你:
pantaojiacheng@163.com

3.flags標(biāo)志位的具體作用:
flags標(biāo)志位是用來檢測(cè)控制器與px4是否斷開的標(biāo)志位。
flags=1:控制器與接收器保持連接
flags=0:控制器與接收器斷開(失控),px4會(huì)控制電機(jī)停轉(zhuǎn)。
炸過一次機(jī),就是因?yàn)檫b控器與接收器之間斷開連接了,結(jié)果這一位沒有設(shè)置,導(dǎo)致四軸一直按照最后一次指令在飛。

總結(jié)

以上是生活随笔為你收集整理的SBUS协议:SBUS解析与合成的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。