生活随笔
收集整理的這篇文章主要介紹了
SBUS使用
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
第一次接觸S-BUS協議,踩了好多坑,在此記錄一下。本人用的是stm32F429 + 普通航模遙控器(某寶上一大堆),用來遙控繼電器,管腳自定義。
S-BUS協議
S-BUS其實是一種串口通信協議,采用100000的波特率,數據位點8bits,停止位點2bits,偶效驗,即8E2的串口通信。但是S-BUS采用的是反向電平傳輸,也就是說,在S-BUS的發送端高低電平是反向的,協議中的所有高電平都被轉換成低電平,協議中的所有低電平都被轉換成高電平。所以在S-BUS的接收端需要增加一個高低電平反向器來進行電平反轉。附上網上最流行的反相電路(可以自己買一個反相模塊,3RMB左右)
實際可行的電路,設計參考Pix Racer
圖為 Pix Racer 原理圖
引腳功能描述
- SBUS_INV -》SBUS輸出使能
- RC_INPUT -》外部SBUS/PPM信號
- FMU_RC_INPUT -》MCU串口RX/PWM引腳
- FMU_RC_OUTPUT -》MCU串口TX/PWM引腳
這里使用異或門電路,當SBUS_INV為高電平時,1Y/2Y的輸出電平與1B/2B的輸出電平相反; 當SBUS_INV為低電平時,1Y/2Y的輸出電平與1B/2B的輸出電平相同。因此可在代碼中設置SBUS_INV腳的電平來配置串口轉SBUS協議。
此外,在STM32中,若將 FMU_RC_INPUT、FMU_RC_OUTPUT 引腳接到可復用為串口和PWM通道的引腳上時,可在代碼中設置引腳復用,從而使INPUT兼容SBUS、串口、PWM、PPM等多種通信協議。
改進
原工程中將2Y引腳串聯470R電阻后接到 RC_INPUT 腳,這里可以將2Y腳另外接到一個RC_OUTPUT腳上,從而可以實現多種協議的同時輸入輸出功能。
此外,如果使用兩個單路異或門電路可配置兩個使能引腳,繼而可以實現同時輸入輸出不同協議的飛控信號。
需要注意的是S-BUS中用11bits來表示一個遙控器通道的數值,22個字節就可以表示16通道(8 × 22 = 11 ×16)。11個bit可以表示的數值范圍為0~2047。每幀25個字節,排列如下:
[start byte] [data0] [data1] [data2] [data3] ... [data10] [flag] [end byte]
附上網上最流行的解說圖,簡單來說就是
start byte = 0x0F
CH1 = [data0]的8位 + [data1]的低3位
CH2 = [data1]的高5位 + [data2]的低6位
... ...
end byte = 0x00
以此類推,如果還沒明白可以參見視頻,小姐姐講的很明白呢!
stm32解析S-BUS協議
利用stm32開發板解析S-BUS協議最重要有兩點:
串口配置為100000波特率,8位數據位(stm32編程選9位),2位停止位,無硬件流控對收到的25字節數據解碼(包括數據頭0x0F)
#define SIZE_BUFF (100)//S-BUS協議中遙控器通道數值范圍//S-BUS解析函數
int sbus_read_parse(int _fd, uint16_t *val){//讀取遙控器通道數據uint8_t _buf[SIZE_BUFF];int len = read(_fd, _buf, SIZE_BUFF);if (len < 0){return -1;}//略過協議包頭、包尾、長度判斷過程//按11bits解析遙控器通道val[0] = ((buff[ind + 1] | buff[ind + 2] << 8) & 0x07FF);val[1] = ((buff[ind + 2] >> 3 | buff[ind + 3] << 5) & 0x07FF);val[2] = ((buff[ind + 3] >> 6 | buff[ind + 4] << 2 | buff[ind + 5] << 10) & 0x07FF);val[3] = ((buff[ind + 5] >> 1 | buff[ind + 6] << 7) & 0x07FF);val[4] = ((buff[ind + 6] >> 4 | buff[ind + 7] << 4) & 0x07FF);val[5] = ((buff[ind + 7] >> 7 | buff[ind + 8] << 1 | buff[ind + 9] << 9) & 0x07FF);val[6] = ((buff[ind + 9] >> 2 | buff[ind + 10] << 6) & 0x07FF);val[7] = ((buff[ind + 10] >> 5 | buff[ind + 11] << 3) & 0x07FF);val[8] = ((buff[ind + 12] | buff[ind + 13] << 8) & 0x07FF);val[9] = ((buff[ind + 13] >> 3 | buff[ind + 14] << 5) & 0x07FF);val[10] = ((buff[ind + 14] >> 6 | buff[ind + 15] << 2 | buff[ind + 16] << 10) & 0x07FF);val[11] = ((buff[ind + 16] >> 1 | buff[ind + 17] << 7) & 0x07FF);val[12] = ((buff[ind + 17] >> 4 | buff[ind + 18] << 4) & 0x07FF);val[13] = ((buff[ind + 18] >> 7 | buff[ind + 19] << 1 | buff[ind + 20] << 9) & 0x07FF);val[14] = ((buff[ind + 20] >> 2 | buff[ind + 21] << 6) & 0x07FF);val[15] = ((buff[ind + 21] >> 5 | buff[ind + 22] << 3) & 0x07FF);return 0;
}
總結
以上是生活随笔為你收集整理的SBUS使用的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。