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

歡迎訪問(wèn) 生活随笔!

生活随笔

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

编程问答

关于SBUS信号在单片机中的一些个人理解

發(fā)布時(shí)間:2023/12/20 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 关于SBUS信号在单片机中的一些个人理解 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

最近一直在弄關(guān)于SBUS的編碼與解碼這方面的內(nèi)容,雖然網(wǎng)上資料很多,但是網(wǎng)上資料太雜,我找的一些資料可能是我理解的問(wèn)題,所以我摒棄了一些騷操作,對(duì)于一些單片機(jī)學(xué)得不精的人來(lái)說(shuō),有些地方是值得注意的。

對(duì)于SBUS的探索,首先我個(gè)人是使用51芯片的遙控器通過(guò)NRF24L01發(fā)送遙控器PWM模擬量到一塊STM32F030的接收機(jī),在接收機(jī)內(nèi)進(jìn)行PWM轉(zhuǎn)SBUS的操作,之后通過(guò)串口發(fā)送出SBUS信號(hào),用F4飛控來(lái)連接串口發(fā)送出來(lái)的SBUS信號(hào),并檢驗(yàn)信號(hào)是否正確。(雖然這樣挺麻煩的,但是檢驗(yàn)起來(lái)很方便)

1.九位數(shù)據(jù)位、偶校驗(yàn)

SBUS本質(zhì)是一種串口通信協(xié)議,采用100K的波特率,8位數(shù)據(jù)位,兩位停止位,偶效驗(yàn),即8E2的串口通信。

這里對(duì)于單片機(jī)學(xué)得不精的人來(lái)說(shuō)特別容易搞混,波特率100000,兩位停止位沒(méi)什么問(wèn)題。問(wèn)題在于8位數(shù)據(jù)位,偶校驗(yàn),這段話在單片機(jī)中卻需要這樣子表達(dá)9位數(shù)據(jù)位、偶校驗(yàn)對(duì)沒(méi)有錯(cuò)是9位數(shù)據(jù)位、偶校驗(yàn)。剛開(kāi)始編碼的時(shí)候我就一直卡在了這里,F4的飛控一直識(shí)別不了我編碼的SBUS信號(hào)。原因如下:

/*? 如果需要8位數(shù)據(jù),無(wú)奇偶校驗(yàn),則數(shù)據(jù)長(zhǎng)度=8

??????? 如果需要8位數(shù)據(jù),有奇偶校驗(yàn),則數(shù)據(jù)長(zhǎng)度=9*/

所以,關(guān)于串口端的設(shè)置,代碼如下:?

USART_InitTypeDef USART_InitStructure;USART_InitStructure.USART_BaudRate = 100000;?????????????????????? //設(shè)定傳輸速率USART_InitStructure.USART_WordLength = USART_WordLength_9b;??????? //設(shè)定傳輸數(shù)據(jù)位數(shù)USART_InitStructure.USART_StopBits = USART_StopBits_2;???????????? //設(shè)定停止位個(gè)數(shù)——2位USART_InitStructure.USART_Parity = USART_Parity_Even ;?????????????? //偶校驗(yàn)USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//不用流量控制USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;??? //使用接收和發(fā)送功能USART_Init(USART1, &USART_InitStructure);????????????????????????? //初始化USART1USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);???????????????????? //使能USART1接收中斷USART_Cmd(USART1, ENABLE);???????????????????????????????????????? //使能USART1

2.SBUS采用負(fù)邏輯

所以需要硬件取反才能識(shí)別出來(lái),軟件取反試過(guò)通過(guò)示波器觀察與硬件取反并不是一致的(起始電平),具體解決方法和原因我沒(méi)深查。所以需要輸出SBUS信號(hào)必須硬件取反

電路如下,三極管使用8050就行

3.SBUS的兩種工作模式

????? 高速模式:每4ms發(fā)送一次

????? 低速模式:每14ms發(fā)送一次

?? 就是說(shuō)每間隔4或者14ms這個(gè)串口就發(fā)送25個(gè)字節(jié)的數(shù)據(jù),高低速模式并不影響F4飛控對(duì)于SBUS信號(hào)的識(shí)別,所以只需設(shè)置多一個(gè)定時(shí)器定時(shí)發(fā)送SBUS信號(hào)即可。

100K的波特率不是標(biāo)準(zhǔn)波特率可以用單片機(jī)讀取。我用F4飛控來(lái)識(shí)別單片機(jī)發(fā)出的SBUS信號(hào)之后在電腦端通過(guò)Betaflight Configurator來(lái)觀察SBUS信號(hào)情況,能很直觀的反映出SBUS信號(hào)是否正常

4.SBUS編碼

幀格式【參考https://mbed.org/users/Digixx/notebook/futaba-s-bus-controlled-by-mbed/ 】

每幀25個(gè)字節(jié),關(guān)于每幀的幀格式,我的理解就是第一幀為識(shí)別幀固定為:0x0F,然后最后兩幀都為0x00

編碼代碼如下:

uint8_t sbus_data[25]={0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}; uint16_t ChValue[16]//通道數(shù)據(jù),即遙控器發(fā)送過(guò)來(lái)的PWM //PWM轉(zhuǎn)SBUS// SBUS headersbus_data[0] = 0x0F;// 16 ChValue of 11 bit datasbus_data[1]? = (unsigned char) ((ChValue[0] & 0x07FF));sbus_data[2]? = (unsigned char) ((ChValue[0] & 0x07FF)>>8?? | (ChValue[1] & 0x07FF)<<3);sbus_data[3]? = (unsigned char) ((ChValue[1] & 0x07FF)>>5?? | (ChValue[2] & 0x07FF)<<6);sbus_data[4]? = (unsigned char) ((ChValue[2] & 0x07FF)>>2);sbus_data[5]? = (unsigned char) ((ChValue[2] & 0x07FF)>>10? | (ChValue[3] & 0x07FF)<<1);sbus_data[6]? = (unsigned char) ((ChValue[3] & 0x07FF)>>7?? | (ChValue[4] & 0x07FF)<<4);sbus_data[7]? = (unsigned char) ((ChValue[4] & 0x07FF)>>4?? | (ChValue[5] & 0x07FF)<<7);sbus_data[8]? = (unsigned char) ((ChValue[5] & 0x07FF)>>1);sbus_data[9]? = (unsigned char) ((ChValue[5] & 0x07FF)>>9?? | (ChValue[6] & 0x07FF)<<2);sbus_data[10] = (unsigned char) ((ChValue[6] & 0x07FF)>>6?? | (ChValue[7] & 0x07FF)<<5);sbus_data[11] = (unsigned char) ((ChValue[7] & 0x07FF)>>3);sbus_data[12] = (unsigned char) ((ChValue[8] & 0x07FF));sbus_data[13] = (unsigned char) ((ChValue[8] & 0x07FF)>>8?? | (ChValue[9] & 0x07FF)<<3);sbus_data[14] = (unsigned char) ((ChValue[9] & 0x07FF)>>5?? | (ChValue[10] & 0x07FF)<<6);?sbus_data[15] = (unsigned char) ((ChValue[10] & 0x07FF)>>2);sbus_data[16] = (unsigned char) ((ChValue[10] & 0x07FF)>>10 | (ChValue[11] & 0x07FF)<<1);sbus_data[17] = (unsigned char) ((ChValue[11] & 0x07FF)>>7? | (ChValue[12] & 0x07FF)<<4);sbus_data[18] = (unsigned char) ((ChValue[12] & 0x07FF)>>4? | (ChValue[13] & 0x07FF)<<7);sbus_data[19] = (unsigned char) ((ChValue[13] & 0x07FF)>>1);sbus_data[20] = (unsigned char) ((ChValue[13] & 0x07FF)>>9? | (ChValue[14] & 0x07FF)<<2);sbus_data[21] = (unsigned char) ((ChValue[14] & 0x07FF)>>6? | (ChValue[15] & 0x07FF)<<5);sbus_data[22] = (unsigned char) ((ChValue[15] & 0x07FF)>>3);// flagssbus_data[23] = 0x00;// footer sbus_data[24] = 0X00;

對(duì)于編碼之后校驗(yàn)的方面,我是通過(guò)編碼之后串口發(fā)送出去,用F4飛控來(lái)接收發(fā)送出來(lái)的SBUS信號(hào),然后通過(guò)Betaflight Configurator來(lái)觀察SBUS信號(hào)是否規(guī)范

5.SBUS解碼

解碼代碼,經(jīng)過(guò)修改并驗(yàn)證后,SBUS信號(hào)發(fā)出后,用硬件取反接回單片機(jī),接收配置上面有說(shuō)過(guò),值得注意的就是接收的數(shù)組不一定是從第一位開(kāi)始的,所以需要簡(jiǎn)單處理一下接收到的數(shù)據(jù)。檢驗(yàn)的說(shuō)固定遙控器發(fā)送的PWM值,然后發(fā)送過(guò)來(lái)解碼驗(yàn)證看是否一樣即可。解碼代碼如下:

u16 buffer[25],channels[16];channels[0]? = ((buffer[1]??? |buffer[2]<<8)???????????????? & 0x07FF);channels[1]? = ((buffer[2]>>3 |buffer[3]<<5)???????????????? & 0x07FF);channels[2]? = ((buffer[3]>>6 |buffer[4]<<2 |buffer[5]<<10)? & 0x07FF);channels[3]? = ((buffer[5]>>1 |buffer[6]<<7)???????????????? & 0x07FF);channels[4]? = ((buffer[6]>>4 |buffer[7]<<4)???????????????? & 0x07FF);channels[5]? = ((buffer[7]>>7 |buffer[8]<<1 |buffer[9]<<9)?? & 0x07FF);channels[6]? = ((buffer[9]>>2 |buffer[10]<<6)??????????????? & 0x07FF);channels[7]? = ((buffer[10]>>5|buffer[11]<<3)??????????????? & 0x07FF);channels[8]? = ((buffer[12]?? |buffer[13]<<8)??????????????? & 0x07FF);channels[9]? = ((buffer[13]>>3|buffer[14]<<5)??????????????? & 0x07FF);channels[10] = ((buffer[14]>>6|buffer[15]<<2|buffer[16]<<10) & 0x07FF);channels[11] = ((buffer[16]>>1|buffer[17]<<7)??????????????? & 0x07FF);channels[12] = ((buffer[17]>>4|buffer[18]<<4)??????????????? & 0x07FF);channels[13] = ((buffer[18]>>7|buffer[19]<<1|buffer[20]<<9)? & 0x07FF);channels[14] = ((buffer[20]>>2|buffer[21]<<6)??????????????? & 0x07FF);channels[15] = ((buffer[21]>>5|buffer[22]<<3)??????????????? & 0x07FF);

感謝來(lái)自wsptr【https://blog.csdn.net/wsptr/article/details/53795458】

以及?Bluish White【https://blog.csdn.net/qq_31232793/article/details/80244211】

總結(jié)

以上是生活随笔為你收集整理的关于SBUS信号在单片机中的一些个人理解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

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