基于stm32和富斯遥控器的SBUS波形分析和通讯实现
基于stm32和富斯遙控器的SBUS波形分析和通訊實(shí)現(xiàn)
- 簡(jiǎn)介
- 軟件環(huán)境和硬件搭建
- 軟件環(huán)境
- 硬件搭建
- SBUS協(xié)議
- SBUS協(xié)議
- SBUS波形分析
- 程序部分
- 程序流程
- 核心程序
- 總結(jié)
簡(jiǎn)介
最近一個(gè)小項(xiàng)目用到了富斯的遙控器(使用的SBUS協(xié)議),目的是實(shí)現(xiàn)通過(guò)遙控器的各個(gè)通道對(duì)小車進(jìn)行簡(jiǎn)單控制(移動(dòng)、燈光、不同工作模式等),一點(diǎn)小經(jīng)驗(yàn)和大家分享下。SBUS網(wǎng)上的資料很多,本篇更偏向于新人對(duì)SBUS的快速理解和直接應(yīng)用,對(duì)一些不太常用的細(xì)則不再進(jìn)行介紹。
因?yàn)槭堑谝淮问褂肧BUS協(xié)議,根據(jù)個(gè)人習(xí)慣在學(xué)習(xí)通訊協(xié)議時(shí)喜歡對(duì)照著實(shí)際波形理解,如果有朋友對(duì)硬件有簡(jiǎn)單了解,建議接觸新的通訊協(xié)議時(shí)也用示波器配合實(shí)際波形來(lái)學(xué)習(xí),能發(fā)現(xiàn)很多細(xì)節(jié)。當(dāng)然這個(gè)不是必須的,僅是個(gè)人建議而已,實(shí)際波形我也會(huì)貼出供感興趣的朋友參考。
其他細(xì)節(jié)如有疏漏還請(qǐng)各位指出,共同進(jìn)步。
軟件環(huán)境和硬件搭建
軟件環(huán)境
編譯軟件:KEIL MDK
庫(kù):STM32標(biāo)準(zhǔn)庫(kù)
單片機(jī)I/O使用:PC11(串口USART4 RX端,TX端不接即可)
單片機(jī)外設(shè)使用:USART4(接收遙控?cái)?shù)據(jù))、TIM3(定時(shí)驗(yàn)證數(shù)據(jù)正確性)
硬件搭建
發(fā)射裝置:富斯遙控器FS-I6S
接收裝置:接收機(jī)IA10B
MCU控制板:STM32F407電路板
外接電路:簡(jiǎn)單的三極管反向電路(必須)
發(fā)射裝置和接收裝置之間只要是SBUS通訊方式,不同型號(hào)理論來(lái)說(shuō)影響不大,程序可以通用。
因?yàn)橹恍枰玫絾纹瑱C(jī)的串口(為了驗(yàn)證數(shù)據(jù)的正確性筆者多用了個(gè)定時(shí)器TIM3),所以只是實(shí)現(xiàn)通訊的話電路要求比較簡(jiǎn)單,只要能正常工作并帶有串口外設(shè)的單片機(jī)板即可,比如某寶上賣的STM32F103最小系統(tǒng)板。
由于SBUS邏輯電平和常用的串口通訊極性剛好相反,所以需要搭建一個(gè)簡(jiǎn)單的三極管反向電路,電路參考下圖。
遙控器需要配置為SBUS輸出模式:
接收機(jī)接線如下:
綠線為信號(hào)線-----接三極管反向電路的輸入端(Single)
黃線為電源+線-----接5V電源
藍(lán)線為電源地線 -----接電源GND
總體連接如下:
SBUS協(xié)議
SBUS協(xié)議
SBUS協(xié)議其實(shí)就是串口通訊(USART)的應(yīng)用層協(xié)議,它的本質(zhì)還是USART通訊。可以粗暴理解為一幀SBUS數(shù)據(jù)是由連續(xù)發(fā)送或接收25個(gè)字節(jié)(即25次)的串口數(shù)據(jù)構(gòu)成,第一個(gè)字節(jié)固定為0x0F,最后一個(gè)字節(jié)固定為0x00,中間23個(gè)字節(jié)和起來(lái)構(gòu)成了所需數(shù)據(jù)。所以使用它在程序上還是使用串口,只不過(guò)在串口配置上必須按照以下參數(shù)配置:
串口波特率為100000,數(shù)據(jù)位為8位,2個(gè)停止位,偶校驗(yàn),無(wú)硬件控流。
Sbus的編碼方式為每11位為一個(gè)數(shù)據(jù),除去第一個(gè)字節(jié)和第25個(gè)字節(jié),需要把中間23個(gè)字節(jié)的常規(guī)8位數(shù)據(jù)合在一起,并按每11位為一組的格式進(jìn)行解析處理。具體解析方法網(wǎng)上教程較多,不再贅述。如果不想了解具體解析方法,可直接引用下文的解析函數(shù)得出解析后的結(jié)果即可。
SBUS波形分析
位長(zhǎng)度:
SBUS的波特率固定為100K,所以每傳輸一位的時(shí)間為:1/100K=10us,
隨機(jī)用示波器抓取了一位,實(shí)測(cè)結(jié)果略微有誤差為11.7us,在接受范圍內(nèi)。
字節(jié)長(zhǎng)度:
SBUS一幀由25次串口接收或發(fā)送構(gòu)成(25個(gè)字節(jié)),每次串口發(fā)送有12位組成:1個(gè)起始位+8個(gè)數(shù)據(jù)位+1個(gè)偶校驗(yàn)位+2個(gè)停止位。下圖為截取一幀SBUS前幾個(gè)數(shù)據(jù)字節(jié)波形。由于發(fā)送順序遵循LSB(低位優(yōu)先)原則,所以需要注意每個(gè)字節(jié)高位和低位的波形和實(shí)際結(jié)果顛倒的。如波形第一個(gè)字節(jié)為0xF0,實(shí)際數(shù)據(jù)為0x0F。
幀長(zhǎng)度
SBUS一幀由25個(gè)字節(jié)構(gòu)成,每個(gè)字節(jié)12位,每位長(zhǎng)度10us,總長(zhǎng)度=10us12位25個(gè)字節(jié)=3000us(糾正:圖中3000us單位錯(cuò)打成了3000ms)。
幀間隔
SBUS兩幀間間隔約4.68ms,如果要求不能漏掉任何一幀,則需要注意其他程序處理時(shí)間必須在4.68ms內(nèi),不能影響一下幀的接收。
程序部分
程序流程
程序執(zhí)行流程:上電-----配置外設(shè)(USART4、TIM3,默認(rèn)使能都為關(guān)閉狀態(tài),TIM3定時(shí)3ms)-----等待PC11出現(xiàn)持續(xù)一段時(shí)間的高電平后使能USART4,等待接收第一個(gè)字節(jié)(等待的持續(xù)高電平即為兩幀間的高電平間隔部分,確保能從第一個(gè)字節(jié)接收)-----當(dāng)串口收到數(shù)據(jù)后使能TIM3-----當(dāng)TIM3時(shí)間到后關(guān)閉TIM3和USART4判斷串口是否是剛好收到25個(gè)字節(jié)-----是則執(zhí)行解析函數(shù),不是則為接收錯(cuò)誤-----重新等待持續(xù)的高電平。
Created with Rapha?l 2.2.0上電初始化USAER4、TIM3讀取PC11電平是否出現(xiàn)持續(xù)的高電平?使能USART4,等待接收第一個(gè)字節(jié)收到第一個(gè)字節(jié)則使能TIM3TIM3時(shí)間滿后(3ms)判斷是否完整收到25個(gè)字節(jié)對(duì)收到的數(shù)據(jù)進(jìn)行解析yesnoyesno核心程序
程序是基于STM32F407的,如果是103可能在系統(tǒng)頭文件名上報(bào)錯(cuò)和USART配置時(shí)會(huì)有點(diǎn)小差別。
USART4配置及其中斷函數(shù):
一定要注意因?yàn)橛幸粋€(gè)偶校驗(yàn)位,數(shù)據(jù)長(zhǎng)度要寫為9:
USART_InitStructure.USART_WordLength = USART_WordLength_9b。
中斷內(nèi)的函數(shù)功能為:進(jìn)中斷開(kāi)TIM3定時(shí)器,把收到的串口數(shù)據(jù)進(jìn)行保存。
TIM3配置及其中斷函數(shù):
TIM3時(shí)間在實(shí)際應(yīng)用時(shí)是3ms進(jìn)定時(shí)器中斷,理論上3ms能剛好把一幀SBUS(25個(gè)字節(jié))接收完畢。因?yàn)槭且呀?jīng)接收到第一個(gè)串口數(shù)據(jù)后才開(kāi)的定時(shí)器,后續(xù)只會(huì)有24個(gè)字節(jié)的時(shí)間,所以實(shí)際上定時(shí)器3ms時(shí)間還留有一個(gè)字節(jié)的時(shí)間裕量。
TIM3的中斷函數(shù)功能:即為判斷串口是否正確接收了一幀SBUS(25個(gè)字節(jié))數(shù)據(jù),是則進(jìn)行數(shù)據(jù)解析函數(shù)SbusDataParsing(u8 buf[]) ;,不是則錯(cuò)誤位RecErr_Flag+1。
解析函數(shù):
SbusDataParsing(u8 buf[])為解析函數(shù),如果TIM3判斷正確接收了25個(gè)字節(jié)的數(shù)據(jù),則把串口接收到的25個(gè)數(shù)據(jù)放入buf[]數(shù)組內(nèi),執(zhí)行完的數(shù)組結(jié)果ch[]就是我們需要的最終結(jié)果。
主函數(shù):
主函數(shù)的主要功能:上電配置串口USART4和定時(shí)器TIM3,然后while循環(huán)檢查串口USART4的RX引腳PC11是否出現(xiàn)連續(xù)的高電平。每次while循環(huán)一次檢測(cè)是高則WaitRec_cnt+1,是低則清0,直到出現(xiàn)一段連續(xù)的高電平就表明進(jìn)入了兩幀SBUS中間的幀間隔中,再開(kāi)啟串口確保能從第一個(gè)字節(jié)開(kāi)始接收。實(shí)際的WaitRec_cnt時(shí)間不用特別精確但需要大家進(jìn)行調(diào)試,不同單片機(jī)主頻不同,執(zhí)行while的時(shí)間也不同。STM32F407主頻168M,WaitRec_cnt執(zhí)行到3000時(shí)大概700多us。同時(shí)需要自行考慮持續(xù)多久開(kāi)啟串口中斷比較好,不要影響到其他程序的運(yùn)行。
其他.h文件
sbus.h
usart.h
#ifndef __UART_H #define __UART_H #include "stdio.h" #include "sys.h" void Uart4_Init(u32 bound); void Uart1_Init(u32 bound); #endiftim.h
#ifndef __TIMER_H #define __TIMER_H #include "sys.h"void TIM3_Init(u16 arr,u16 psc);#endif總結(jié)
至此,整個(gè)SBUS的通訊已經(jīng)完成,通訊的最終結(jié)果存放在CH[]數(shù)組里以方便調(diào)用。遙控器上不同的搖桿和撥動(dòng)開(kāi)關(guān)對(duì)應(yīng)不同的CH[]通道,sbus.h里也有進(jìn)行宏定義以便大家進(jìn)行遙控的按鈕和CH[]通道的對(duì)應(yīng):
如
實(shí)際就是遙控器右邊搖桿水平撥動(dòng)時(shí)對(duì)應(yīng)的是ch[0]中的值的變化。不撥動(dòng)時(shí)ch[0]值是1033,右搖桿撥到最左邊時(shí)ch[0]是242,最右邊時(shí)ch[0]是1804.不同的遙控器中間值和最大最小值會(huì)有小范圍的偏差,一般不會(huì)超過(guò)幾十。其他搖桿和按鍵的對(duì)應(yīng)關(guān)系請(qǐng)自行體會(huì)。也可以去B站看實(shí)際控制遙控器對(duì)應(yīng)的CH[]變化,不過(guò)是16進(jìn)制的看著不是很方便:
https://www.bilibili.com/video/BV1Kv411k7fQ
最后附一張剛買的一個(gè)遙控器的初始值調(diào)試結(jié)果的截圖:
總結(jié)
以上是生活随笔為你收集整理的基于stm32和富斯遥控器的SBUS波形分析和通讯实现的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: VS_VERSION_INFO信息的读取
- 下一篇: Python已知经纬度求两点距离