我依然堅持,任何一次自己的心有感觸都要及時的記錄下來,這樣你的努力才是真正的努力。
這兩天一直在用STM32調試CDS5516舵機,其實很簡單,但是卻花了将近兩天的時間,過程之曲折我就不說了,先總結一下怎麼用32調試CDS5516舵機吧!
首先,要明确,CDS5516舵機是一個可程式設計的數字舵機,要實作對他的控制,就要通過序列槽線,發一系列的指令包,通過應答來判斷所發指令是否正确,由于是單線通信,是以必須要在發送完指令包之後立馬轉換為接收模式,采用STM32的話有兩種方法,可以實作,1、将序列槽的TX和RX連接配接起來,通過使能發送使能和接收使能,來實作。2、利用單線的半雙工模式通信,也就是隻用TX線,在發送完之後,TX線被釋放,可以接收(實際上就是内部将TX和RX線連接配接起來了)。(注意:在此進行單線測試的時候,若發送用的USART1那麼接收中斷不能再使用USART1的接收中斷)
以上隻是準備工作,然後就可以連接配接舵機進行調試了,在調試的時候,我用的STM32的USART1的TX口,TX口必須加上3.3V,4.7K左右的上拉電阻,才能保證發出的資料包的正确。而舵機的工作電壓範圍是6.8-14V,我用了11.3V的電池對舵機進行供電,當你拿到一個CDS5516的舵機的時候,你可能并不知道該舵機的ID号是多少,那麼你就可以采用廣播發送的模式,将ID号設定為已知,具體設定方法手冊中有詳細說明,
我在查閱資料的時候,見到有人問關于通信的波特率的問題,在預設情況下,CDS5516舵機的通信波特率應該是1MHZ,我也是試出來的,因為隻有幾個固定設定的比特率的值在設定後再掉電是不會消失的,而其他的掉電之後會消失,是以,在此推薦各位能試一試。在設定完ID号的時候,可以通過檢視應答包來确定是否設定成功,該步驟很重要,因為如果這一步完成,那麼你的調試基本可以算是完成了百分之99,,,所有的指令包,在手冊裡都能詳細的查到,在此提醒一下各位,如果你是仿照手冊中的某一個例子,改了ID号或者是其他的希望實作同樣的功能,那麼請你一定要記得修該最後的校驗和該數值,樓主在一開始調試的時候,就沒注意到這一點,照本宣科,結果浪費了很多時間。由于我對舵機的要求比較簡單,隻實作舵機能夠按照我設定的角度進行旋轉,是以沒有在進行其他的測試,但是已經實作這些功能的話,其他的應該也是不成問題的。樓主使用的正點原子戰艦的闆子進行調試的,下面将兩個主要的代碼進行粘貼,供大家參考:
void Set_Num_1(void) //設定舵機的ID号為1
{
USART1->CR1 &= ~0x4;
USART1_Send_Char(0xFF);
USART1_Send_Char(0XFF);
USART1_Send_Char(0XFE);
USART1_Send_Char(0X04);
USART1_Send_Char(0X03);
USART1_Send_Char(0X03);
USART1_Send_Char(0X01);
USART1_Send_Char(0XF6);
USART1->CR1 |= 0x4;
delay_ms(2);
}
void Set_Num_Speed(u8 id,u32 arg) //設定舵機旋轉的目标角度
{
static u8 i = 0;
u8 sum = 0x00;
uint8_t dat[] = {0xFF,0xFF,0,5,0x03,0x1E,0,0,0xFF}; //定義一個資料包
dat[2] = id; //設定ID号
dat[6] = (arg*0x3FF/300)&0xFF; //設定目标角度的低位元組
dat[7] = (arg*0x3FF/300)>>8; //設定目标角度的高位元組
for(i=2;i<8;i++)
{
sum+=dat[i]; //計算校驗和
}
dat[8] = ~sum;
for(i=0;i<9;i++)
{
USART1_Send_Char(dat[i]); //将資料包發出
}
}
以上兩個函數基本算是舵機調試的主要函數了,希望能幫到各位。
*************************************************************
*************************************************************
*************************************************************
這兩天的調試,讓我想了很多,這樣一個并不是很難的調試卻花費了我兩天的時間,而且還是在小夥伴@xkwy的幫助下(在此感謝xkwy,希望以後的某一天他能看到)其中的原因确實值得我深思。
1、面對一個新的東西,不知道該從何下手。。。或許這也是我最大的一個問題了,對于這次的調試,手頭的資料隻有一份技術手冊,在剛開始調試的時候,自己就已經打起了退堂鼓,以前也是這樣。無論是從最開始的準備工作,還是在之後的調試中,面對一個問題,心裡就心煩意亂,把大量的時間和精力都花在了抱怨和一次次徒勞無功的測試上,沒有想問題的根本處在哪裡。其實看别人,才會發現,别人也是在這樣的情況下,對照着手冊, 一點點的進行。這一點自己确實做得還很不到位。
2、第二個最大的問題,就是”懶!“,在調試的過程當中,首先準備工作就沒有做好,連接配接收應答包的準備工作都沒有做好,那麼又何談區解決問題呢?除此之外,對于可能出現問題的地方,總是嫌麻煩,然後将問題規避掉,直接測試,期待最後的正确的結果,現在想想,這樣的機率是有多麼的低啊,把可能出問題的部分全都規避掉,然後對于不正确的結果又無可奈何,最後,隻能讓自己越加煩躁,看來,自己的心急氣躁也不是沒有原因的。
3、對于手冊,總是不能認真的看,無論是面對什麼樣的新的問題,自己最希望的就是能從網上直接找到例程,然後看别人怎麼弄,照葫蘆畫瓢,在這樣的心裡下,往往最可能的就是忽略了身邊最有用的參考資料-技術手冊。在以後的道路上,會面對各種各樣的新的器件,問題,不可能都從網上找到資料,那麼這時候,如果自己沒有這種從手冊出發,解決問題的能力,無疑自己未來的發展也就這樣了。
4、基本功不夠紮實,作為一個以嵌入式開發為目标的開發者來說,對于晶片硬體的了解太少了,甚至連最基本的底層程式也是”書到用時方恨少“,比如這次單純的使用序列槽1已經不足以滿足需求,我想過使用序列槽2,可是在這樣時間比較緊的情況下,我還有那麼多時間區進行序列槽2調試嗎?或許有人說,序列槽2跟1差不多,直接用啊,,,但是我想說,對于一個沒有用的東西來說,在時間緊,任務多的情況下,已然沒有時間再去搞了,及時它比較簡單,而且平時對于各個外設的使用沒有總結,不知道有何差別,又如何快速熟練的使用呢?這個問題确實值得注意……
以上就是我在這兩天的調試中所總結的自己的問題,學習不能像蜻蜓點水一樣,否則,真正到用的時候就該傻眼了,希望大家看了之後能夠吸取我的教訓,在生活中就注意這些問題。 同時,以上總結也是我自己個人最自己的總結,帶有強烈的主管色彩,希望大家看看就好,有什麼問題,歡迎留言……加油,小火把!