1. 程式人生 > >STM32單線串列埠對匯流排舵機的控制

STM32單線串列埠對匯流排舵機的控制

1 匯流排舵機的介紹
匯流排伺服舵機即序列匯流排智慧舵機,實際上可以理解為數字舵機的衍生品,數字舵機與模擬舵機相比而言是控制系統設計上的顛覆,而匯流排伺服舵機對於舵機而言則是在功能和運用上的顛覆。舵機的運用方式實際上只能發揮出匯流排伺服舵機非常小的一部分功能。這款TS-315是通過單線的串列埠通訊對旋轉進行控制的,控制字串協議如下:



字串協議: #1P1500T100控制舵機旋轉,無返回 (1P是ID為1的舵機,中間的1500是引數,範圍是500-2500,控制舵機範圍,後面的引數100,表示舵機旋轉的時間引數,也就是速度,意思是舵機從當前角度達到命令中的1500的位置,所需要的時間為100ms,時間的範圍是1-50000,時間越大速度越慢,但是舵機的最快速度以實際舵機的引數而定)
#1PRAD讀取角度,返回格式 #001P1467   #1PULK釋放扭力,無返回 #1PID002改變ID (將1改成2,後面的引數必須為3位數,不夠補0),返回格式 #002P #1PBD1返回 #OK! 改變波特率(9600,19200,38400,115200,128000)  (舵機重啟之後才會生效) //1:9600 , 2:19200 , 3:38400 , 4:57600 , 5:115200 , 6:128000 #1PCSD將當前位置設定舵機的初始位置,返回 #OK!  (設定之後舵機上電之後會旋轉到設定的位置) #1PCLE(恢復出廠設定)(舵機重啟之後才會生效),返回 #OK! #1PMOD1,返回 #OK!
(最後的引數1表示工作模式,0:270度逆向,1:270度順向,2:180度逆向,3:180度順向,4:連續旋轉) 逆向和順向表示舵機的旋轉方向。逆向:脈衝訊號從500到2500,舵機逆時針旋轉。順向:脈衝訊號從500到2500,舵機順時針旋轉。 連續旋轉模式就是普通的360度舵機,連續旋轉的,無法控制角度,這個模式下控制舵機的命令#1P1500T100這樣的命令的作用就改變了,這個命令在這個模式下面的作用是: 中間的引數1500,範圍為500-2500,其中500-1500控制舵機的正轉,1500-2500控制舵機的反轉。越接近1500速度越慢,越遠離1500速度越快(即500和2500速度都是最快的,1500是停止) 最後的引數100,表示舵機旋轉的圈數,100就是100圈(存在一兩圈的誤差,正常!),如果這個引數改成50000,那就是無限旋轉。如果引數是49999,那就只會轉49999圈
上面的1P 表示編號為1的舵機,上面所有的命令最後都要帶回車換行符(0x0d 和 0x0a) 舵機的ID預設是1,ID為255是廣播,廣播命令對所有舵機都有效。預設波特率128000 2 STM32單線串列埠通訊 參考手冊裡面是這樣描述的,非常簡單單線半雙方模式通過設定USART_CR3暫存器的HDSEL位選擇。在這個模式裡,下面的位必須保持清零狀態:
● USART_CR2暫存器的LINEN和CLKEN位
● USART_CR3暫存器的SCEN和IREN位
USART可以配置成遵循單線半雙工協議。在單線半雙工模式下,TX和RX引腳在晶片內部互連。使用控制位”HALF DUPLEX SEL”(USART_CR3中的HDSEL位)選擇半雙工和全雙工通訊。
當HDSEL為’1’時
● RX不再被使用
● 當沒有資料傳輸時,TX總是被釋放。因此,它在空閒狀態的或接收狀態時表現為一個標準I/O口。這就意味該I/O在不被USART驅動時,必須配置成懸空輸入(或開漏的輸出高)。
除此以外,通訊與正常USART模式類似。由軟體來管理線上的衝突(例如通過使用一箇中央仲裁器)。特別的是,傳送從不會被硬體所阻礙。當TE位被設定時,只要資料一寫到資料暫存器上,傳送就繼續。 參考初始化原始碼如下 //初始化IO 串列埠2 //pclk2CLK2時鐘頻率(Mhz) //bound:波特率 void uart2_init(u32 pclk2,u32 bound) {                  u32        temp;                   temp=(pclk2*1000000+bound/2)/bound;        //得到[email protected]=0,採用四捨五入計算
        RCC->AHB1ENR|=1<<0;           //使能PORTA口時鐘           RCC->APB1ENR|=1<<17;          //使能串列埠2時鐘         GPIO_Set(GPIOA,PIN2|PIN3,GPIO_MODE_AF,GPIO_OTYPE_OD,GPIO_SPEED_50M,GPIO_PUPD_PU);//PA2,PA3,複用功能,上拉輸出         GPIO_AF_Set(GPIOA,2,7);        //PA2,AF7         GPIO_AF_Set(GPIOA,3,7);//PA3,AF7                     USART2->CR1=0;                         //清零CR1暫存器         USART2->BRR=temp/2;                 //波特率設定@OVER8=0 //下面5行程式碼是根據參考手冊設定暫存器,注意使能HDSEL放到最後         USART2->CR3&=0<<5;                //清SCEN         USART2->CR3&=0<<1;                //清IREN         USART2->CR2&=0<<11;                //清CLKEN         USART2->CR2&=0<<14;                //清LINEN         USART2->CR3|=1<<3;                //使能HDSEL         USART2->CR1|=0<<28;                 //設定M1=0         USART2->CR1|=0<<12;                 //設定M0=0&M1=0,選擇8位字長         USART2->CR1|=0<<15;         //設定OVER8=0,16倍過取樣         USART2->CR1|=1<<3;          //串列埠傳送使能 #if EN_USART2_RX                          //如果使能了接收         //使能接收中斷         USART2->CR1|=1<<2;          //串列埠接收使能         USART2->CR1|=1<<5;            //接收緩衝區非空中斷使能                            MY_NVIC_Init(0,0,USART2_IRQn,2);//組2,最低優先順序 #endif         USART2->CR1|=1<<0;          //串列埠使能
}
3資料讀取時的注意點 通過邏輯分析儀分析,命令傳送至舵機後,舵機給出了正確的反饋,但是由於舵機回饋資料的速度非常快,造成了丟包問題,資料總是無法正確傳送至微控制器,由於在單線模式,RXD一直接收TXD傳送的資料,致使真正需要的資料丟包,因而只需要修改程式即可修正,更改的程式只是判斷下是否是自己傳送的命令即可,若是,則不在接收,最後驗證,已經可以正確讀取舵機反饋值
u16 USART2_RX_STA=0;       //接收狀態標記          
void USART2_IRQHandler(void) {         u8 res;        #if SYSTEM_SUPPORT_OS                 //如果SYSTEM_SUPPORT_OS為真,則需要支援OS.         OSIntEnter();    #endif         if(USART2->ISR&(1<<5))//接收到資料         {                        res=USART2->RDR;                 //if(USART2->RDR!=USART2->TDR)                 {                         if((USART2_RX_STA&0x8000)==0)//接收未完成                         {                                 if(USART2_RX_STA&0x4000)//接收到了0x0d                                 {                                         if(res!=0x0a)USART2_RX_STA=0;//接收錯誤,重新開始                                                else if (USART2_RX_BUF[5]==0x44)USART2_RX_STA=0;        //防止丟包,禁止接收自己傳送出去的命名                                                                else                                         {                                                 USART2_RX_STA|=0x8000;        //接收完成了                                         }                                 }                                 else //還沒收到0X0D                                 {                                                if(res==0x0d)USART2_RX_STA|=0x4000;                                         else                                         {                                                 USART2_RX_BUF[USART2_RX_STA&0X3FFF]=res;                                                 USART2_RX_STA++;                                                 if(USART2_RX_STA>(USART2_REC_LEN-1))USART2_RX_STA=0;//接收資料錯誤,重新開始接收                                                   }                                                  }                         }                   }                        }

相關推薦

STM32單線串列匯流排控制

1 匯流排舵機的介紹匯流排伺服舵機即序列匯流排智慧舵機,實際上可以理解為數字舵機的衍生品,數字舵機與模擬舵機相比而言是控制系統設計上的顛覆,而匯流排伺服舵機對於舵機而言則是在功能和運用上的顛覆。舵機的運用方式實際上只能發揮出匯流排伺服舵機非常小的一部分功能。這款TS-315是通過單線的串列埠通訊對旋轉進行控

msp430F149串列UART結合控制板來控制機器人動作的模版

/*************************main()函式*********************/ #include <msp430x14x.h> #include"uart.h" #include"BoardConfig.h" void dela

基於Arduino和python的串列通訊和上位控制

 引言 經常的時候我們要實現兩個程式碼之間的通訊,比如說兩個不同不同人寫的程式碼要對接,例如將python指令控制Arduino控制元件的開關,此處使用串列埠通訊是非常方便的,下面筆者將結合自己踩過的坑來講述下自己的學習經歷。 首先是挑戰杯審報的一個專案,即採用機器學習模型分類資料,結合Ardu

STM32通過串列與上位通訊除錯

程式如下,採用串列埠DMA中斷方式接收上位機發送的資料,接受區長度為4個位元組,上位機也傳送4個位元組,按理說應該傳送一次進入一次中斷,但是我的會進入兩次中斷,且第一次中斷的資料是上次傳送的資料。 上位機發送的8687是ascii碼,一個碼是8位(一個位元組),8對應的16

STM32使用串列IDLE中斷的兩種接收不定長資料的方式

現在有很多資料處理都要用到不定長資料,而微控制器串列埠的RXNE中斷一次只能接收一個位元組的資料,沒有緩衝區,無法接收一幀多個數據,現提供兩種利用串列埠IDLE空閒中斷的方式接收一幀資料,方法如下: 方法1:實現思路:採用STM32F103的串列埠1,並配置成空閒中斷IDLE模式且使能DMA接收

STM32 UART串列驅動程式

文章原始地址: http://feotech.com/?p=56 示例1.通過UART1進行資料傳送 UART 1 的初始化 /** * @brief UART1 Initialise. * @param None. * @retval None. */ void UART

STM32串列除錯

在串列埠除錯過程中,usart1可以正常使用printf列印輸出,根據usart1修改來的usart3卻不能使用printf列印,最終找到原因,對比如下 //正確程式碼 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);//使能GPIOB時鐘 R

stm32新增串列除錯

MCU為stm32F103,選擇usart3作為輸出除錯口。 有三種實現方法: ////////////////////////////////////////// 方法一: 1、usart3.c #if 1 #pragma import(__use_no_semihosting

菜鳥江濤帶你學最小物聯網系統之模組篇(02)——STM32通過串列傳送AT指令控制ESP模組連線伺服器

接著上一篇繼續,這篇部落格我將帶大家使用STM32的串列埠來發送AT指令給ESP模組連線伺服器。當然目前測試使用的是區域網,自己的電腦當伺服器使用。使用TCP連線伺服器,STM32通過ESP12F模組透傳上傳溫溼度資料到伺服器。看下效果圖片 好了,看下主要的實現程式

STM32串列共用printf列印串列資料

(1)問題描述: 多串列埠共用printf函式,百度到的資料大部分是建議重新寫一個xx_printf(format, …)。但是使用起來還是不方便,就此問題而言加上一個判斷語句便可解決。 (2)解決方法: printf函式最後呼叫的是int

STM32串列傳送資料(字元,字串,數字.......)(重點)

#include "stm32f10x.h" #include <stdio.h>    //下面strlen函式需要此標頭檔案 #include "USART.h" /**********************************************

(STM32 A串列2)接收(STM32 B資料printf2),同時STM32 A使用串列1printf給電腦

一.遇到的問題: 1. 首先是想使用第二個串列埠,查了一下中文手冊,但是好像並沒有關於第二個串列埠配置的,於是就自己寫了一個 2. 在寫串列埠2的時候遇到的問題是如何使用printf()函式,才能不與第一個串列埠向衝突,找了一下百度,通過一個函式就可以搞

STM32串列(USB串列)下載程式的方法

一、 STM32串列埠下載程式步驟 1)安裝《CH340驅動(USB串列埠驅動)_XP_WIN7共用》 2)開啟串列埠下載軟體《STM32F4串列埠下載軟體(FLYMCU)》 3)開發板USB介

STM32 ISP串列燒錄 VB原始碼(二)關鍵程式碼

Option Explicit Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) Private Decla

STM32之TIM 控制PWM

頻率的計算為: F = TIM_CLK/{(ARR+1)*(PSC+1)} 如果有中斷函式就要配置中斷通道中之類的 配置相應TIM通道的GPIO複用引腳 時基結構體配置 輸出比較結構體配置(pwm輸出時使用) 輸出使能 /************高階定時器 TI

STM32串列通訊之printf重定向

在串列埠通訊中,常用的協議包括RS-232、RS-422和RS-485。 •RS-232:標準串列埠,最常用的一種序列通訊介面。有三種類型(A,B和C),它們分別採用不同的電壓來表示on和off。最被廣泛使用的是RS-232C,它將mark(on)位元的電壓定義為-3V到-12V之間,而將space(off)

GD32或者STM32串列燒寫軟體無法串列燒寫程式

最近在做M3系列的板子,由於在編譯程式時,HEX檔案太大,用st-link v2燒寫進去後,再次燒寫程式就無法識別,或者目標晶片非所選晶片,於是想用串列埠燒寫,我就用我平時除錯linux的RS232的

STM32模擬串列輸出偶有亂碼

因為晶片串列埠不夠用,只好用IO口模擬串列埠,在網上下載了個模擬串列埠的程式,可執行,但發現串列埠輸出隔幾個字元就會出現亂碼,主要部分程式碼如下: #define OI_TXD PAout(12) #define OI_RXD PAin(11) #define Buad

STM32串列空閒中斷

       空閒中斷是在檢測到在資料收受後,總線上在一個位元組的時間內沒有再接收到資料時發生。即串列埠的RXNE位被置位之後才開始檢測,檢測到空閒之後,串列埠的CR1暫存器的IDLE位被硬體置1,必須採用軟體將IDLE位清零才能避免反覆進入空閒中斷。具體的做法是先讀取U

MQTT 移植STM32+GPRS(串列透傳)(三)

昨天,去參觀了AWE(中國家電及消費電子博覽會),智慧家居,智慧插座、智慧LED燈、智慧攝像頭、智慧櫥櫃等等,大開眼界,原來這些別的公司的產品都正式投產了。還順便打聽了幾家提供雲服務的公司,他們一聽MQTT就說支援MQTT的協議,2家開發通訊模組的公司甚至直接可以提供支援