基于STM32單片機(jī)的機(jī)械手控制系統(tǒng)_第1頁(yè)
基于STM32單片機(jī)的機(jī)械手控制系統(tǒng)_第2頁(yè)
基于STM32單片機(jī)的機(jī)械手控制系統(tǒng)_第3頁(yè)
基于STM32單片機(jī)的機(jī)械手控制系統(tǒng)_第4頁(yè)
基于STM32單片機(jī)的機(jī)械手控制系統(tǒng)_第5頁(yè)
已閱讀5頁(yè),還剩51頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

基于STM32單片機(jī)的機(jī)械手控制系統(tǒng)

[4]。C語(yǔ)言也是有逐漸發(fā)展的過(guò)程,從最開(kāi)始的B語(yǔ)言一直發(fā)展,在70年代由丹尼斯·里奇將B語(yǔ)言進(jìn)化改為C語(yǔ)言。剛開(kāi)始C語(yǔ)言運(yùn)用于A(yíng)T&T的多用戶(hù)、UNIX相關(guān)操作系統(tǒng),通過(guò)相應(yīng)的演變過(guò)程,UNIX成為一個(gè)不需要匯編語(yǔ)言就可以獨(dú)立運(yùn)行的系統(tǒng)。隨著發(fā)展直到80年代初期的時(shí)候?qū)語(yǔ)言進(jìn)行相應(yīng)的標(biāo)準(zhǔn)化,在單片機(jī)應(yīng)用程序中逐漸的得到了普及與運(yùn)用。C語(yǔ)言是編程語(yǔ)言的一種基礎(chǔ),在C語(yǔ)言上發(fā)展了很多面向?qū)ο蠡恼Z(yǔ)言,掌握C語(yǔ)言對(duì)于學(xué)習(xí)其它語(yǔ)言具有很多好處。單片機(jī)只能識(shí)別機(jī)器語(yǔ)言,只能識(shí)別二進(jìn)制數(shù)據(jù)。采用C語(yǔ)言的編程非常快捷,是最接近人類(lèi)語(yǔ)言的編程語(yǔ)言,大大的加快了開(kāi)發(fā)的進(jìn)度,開(kāi)發(fā)完成之后只需要編譯軟件編譯通過(guò)就可以生成單片機(jī)的執(zhí)行文件,程序既可以正常的運(yùn)行。編程軟件具有很強(qiáng)大的功能,簡(jiǎn)潔整齊的編程界面讓程序開(kāi)發(fā)變得更加一目了然,當(dāng)編寫(xiě)程序具有C語(yǔ)言的語(yǔ)法錯(cuò)誤的時(shí)候,編譯器可以報(bào)警錯(cuò)誤之處,只有改正正確才可以繼續(xù)編譯程序,方便了開(kāi)發(fā)人員對(duì)于錯(cuò)誤的查找。針對(duì)不同硬件使用了兩種編程軟件,分別為KeiluVision4與天問(wèn)Block編程軟件。首先是建立一個(gè)新的工程文件。建立界面如下圖的所示的4-1所示。圖4-1工程建立圖該軟件有很多豐富的功能,可以實(shí)現(xiàn)程序錯(cuò)誤檢查、程序編譯、文件轉(zhuǎn)化、程序的錯(cuò)誤查詢(xún)等多種功能,讓單片機(jī)編程變得更加智能簡(jiǎn)潔。程序編寫(xiě)界面如圖所示。圖4-2PWM舵機(jī)程序編寫(xiě)界面圖4-3手柄遙控程序編寫(xiě)界面圖4-4W25Q64存儲(chǔ)器程序編寫(xiě)界面圖4-5紅外傳感相關(guān)程序編寫(xiě)界面對(duì)于語(yǔ)音模塊,這里使用了天問(wèn)Block進(jìn)行編程,該軟件不僅可以字符編程,而且還可以圖形編程,這樣大大的降低了新手編程的難度。下圖對(duì)語(yǔ)音模塊的編程。圖4-6語(yǔ)音模塊程序編寫(xiě)界面圖4-7蜂鳴器程序編寫(xiě)界面在每一次完成部分的程序編寫(xiě)之后都要運(yùn)行編譯下程序,看看程序是否可以順利的編譯通過(guò),點(diǎn)擊編譯按鈕如圖中箭頭所指。圖4-8編譯成功界面目標(biāo)中的文件由LIB創(chuàng)建庫(kù)文件,然后連接定位.ABS文件,最后轉(zhuǎn)換為單片機(jī)可以運(yùn)行的HEX文件,這個(gè)工程可以自動(dòng)的完成鏈接功能,讓程序開(kāi)發(fā)更加的簡(jiǎn)單。程序下載界面如圖中的4-9所示。圖4-9程序下載界面語(yǔ)音模塊使用天問(wèn)Block編程完成后進(jìn)行最后的編譯下載,如下圖所示。圖4-10天問(wèn)Block編譯下載圖4.2機(jī)械手控制系統(tǒng)軟件設(shè)計(jì)框圖主函數(shù)的執(zhí)行從main開(kāi)始進(jìn)入執(zhí)行,首先需要對(duì)傳感器或者寄存器進(jìn)行初始化完成,然后進(jìn)入到主循環(huán)while(1)中執(zhí)行循環(huán)程序。根據(jù)采集到的子程序匯總的數(shù)據(jù)進(jìn)行邏輯功能輸出的判斷,同時(shí)顯示相關(guān)的數(shù)據(jù)信息。當(dāng)完成所有滿(mǎn)足執(zhí)行條件的子函數(shù)調(diào)用之后,程序繼續(xù)從while(1)的開(kāi)始處開(kāi)始循環(huán)執(zhí)行。本文基于STM32單片機(jī)機(jī)械手控制系統(tǒng)的軟件設(shè)計(jì)流程圖如圖4-11所示。圖4-11機(jī)械手設(shè)計(jì)流程圖本文設(shè)計(jì)的手臂旨在實(shí)現(xiàn)從左/右、上/下、夾緊/松開(kāi)物體的操作和控制。機(jī)械臂檢測(cè)到工件從原點(diǎn)水平移動(dòng)到平面A,然后到達(dá)了設(shè)定位置,接著機(jī)械手實(shí)現(xiàn)夾取物品的功能,過(guò)2秒時(shí)間機(jī)械手便可以上升,到達(dá)上設(shè)定位置,機(jī)械手向右進(jìn)行移動(dòng),此時(shí)到達(dá)了平面B后進(jìn)行下降的動(dòng)作,到達(dá)低設(shè)定位置機(jī)械手開(kāi)始松開(kāi),松開(kāi)時(shí)間過(guò)2秒鐘。松開(kāi)后再上升左移返回到原點(diǎn)。這便是機(jī)械手的自動(dòng)運(yùn)行。4.3手動(dòng)子程序設(shè)計(jì)本文設(shè)計(jì)機(jī)械手共有6個(gè)自由度,下面設(shè)計(jì)讓機(jī)械手和它的手臂實(shí)現(xiàn)旋轉(zhuǎn)、夾取、松開(kāi)和移動(dòng)的手動(dòng)控制功能。第一部分是控制機(jī)械手臂。通過(guò)按“L”左方向鍵來(lái)控制底部的電機(jī)進(jìn)行水平后退操作,讓機(jī)械手臂以底部電機(jī)為中心進(jìn)行逆時(shí)針旋轉(zhuǎn),而右鍵則可以控制機(jī)械手臂進(jìn)行順時(shí)針旋轉(zhuǎn)。這樣便可以讓機(jī)械手臂實(shí)現(xiàn)以底部電機(jī)為圓心水平旋轉(zhuǎn)功能,這也就是對(duì)機(jī)械手臂的第一個(gè)軸進(jìn)行控制。通過(guò)按“L”上下方向鍵來(lái)控制第二個(gè)舵機(jī)進(jìn)行前后的垂直操作,同樣讓機(jī)械手臂以第二個(gè)電機(jī)為中心進(jìn)行前后的旋轉(zhuǎn),這樣便可以實(shí)現(xiàn)機(jī)械手以第二個(gè)電機(jī)為中心的垂直旋轉(zhuǎn)功能,同樣這也是對(duì)機(jī)械手臂的第二個(gè)軸進(jìn)行控制。接著,通過(guò)“R”上下方向鍵可以實(shí)現(xiàn)機(jī)械手臂第三軸的垂直控制,而左右方向鍵則可以實(shí)現(xiàn)對(duì)機(jī)械手臂第四軸的垂直控制功能。第二部分是控制機(jī)械手。通過(guò)“1”號(hào)按鍵來(lái)控制第五個(gè)電機(jī)來(lái)實(shí)現(xiàn)機(jī)械手的旋轉(zhuǎn)功能,而“2”號(hào)按鍵來(lái)控制第六個(gè)電機(jī)來(lái)實(shí)現(xiàn)機(jī)械手的夾取,松開(kāi)功能。另外START按鍵為待機(jī)激活,SELECT可以實(shí)現(xiàn)機(jī)械手的一鍵復(fù)位功能。MODE切換紅綠燈模式,紅燈模式下遙感無(wú)法使用,再按下MODE為正常情況下紅綠燈并存模式,此時(shí)遙感可控制1-4軸電機(jī)。最后通過(guò)機(jī)械手與它的手臂來(lái)進(jìn)行配合實(shí)現(xiàn)機(jī)械手的旋轉(zhuǎn)、夾取、松開(kāi)和移動(dòng)的功能。手動(dòng)流程如4-12,4-13所示。圖4-12手動(dòng)流程圖圖4-13手柄按鍵

第5章系統(tǒng)調(diào)試與測(cè)試5.1調(diào)試準(zhǔn)備在硬件焊接完成之后需要對(duì)電路整體進(jìn)行檢查測(cè)試,當(dāng)測(cè)試完成確認(rèn)沒(méi)有錯(cuò)誤之后才會(huì)給電路通電,測(cè)試的一般步驟如下所示。(1)查看整體電路是否正常,接著查看硬件是否有明顯損壞,按照實(shí)物實(shí)際的連接與原理圖中的線(xiàn)路對(duì)應(yīng),檢查器件的引腳周?chē)c原理圖上的是否一致。(2)檢測(cè)實(shí)物整體焊接的情況,用萬(wàn)用表測(cè)量一下電路輸入的阻抗,因?yàn)樘摵?,漏焊?huì)導(dǎo)致電路出現(xiàn)短路的問(wèn)題。一旦電源出現(xiàn)了短路的問(wèn)題,會(huì)導(dǎo)致電源的燒毀或者導(dǎo)致單片機(jī)系統(tǒng)中的器件燒毀。(3)檢查實(shí)物元器件的安裝情況,這里主要檢查具有正負(fù)極的元器件,然后再次檢查下元件的完整情況,缺少一部分元件會(huì)導(dǎo)致實(shí)物功能無(wú)法實(shí)現(xiàn),嚴(yán)重情況下通電會(huì)出現(xiàn)因缺少元件而照成其它元件損毀的情況。(4)硬件電路的調(diào)試過(guò)程中,第一步需要確定測(cè)試點(diǎn),找好點(diǎn)位進(jìn)行測(cè)試記錄。第二步是搭建工作臺(tái),選擇適合的儀表實(shí)現(xiàn)測(cè)量,萬(wàn)用表是比較常見(jiàn)的儀器,可以實(shí)現(xiàn)測(cè)量與檢查功能。第三步是確定調(diào)試的順序,電子電路中的信號(hào)都是按照一個(gè)方向運(yùn)行,從采集到處理到輸出控制順序依次去測(cè)試相關(guān)的電子電路。最后一個(gè)步驟是完成實(shí)物的整體硬件調(diào)試,完成程序的下載,觀(guān)察電路的運(yùn)行狀態(tài)。系統(tǒng)調(diào)試之前需要對(duì)電路進(jìn)行檢測(cè),根據(jù)電路原理圖與實(shí)物進(jìn)行對(duì)照。檢查單片機(jī)的最小系統(tǒng),確認(rèn)引腳功能,按照各個(gè)模塊的電路圖與實(shí)際焊接的實(shí)物進(jìn)行對(duì)照,檢查是否存在導(dǎo)線(xiàn)虛焊或者鏈接錯(cuò)誤的情況,確認(rèn)無(wú)誤之后進(jìn)行短路測(cè)量,查看VCC與GND是否處于短路狀態(tài)。測(cè)量各個(gè)模塊部分的供電電壓是否在正常的范圍內(nèi),可以通過(guò)萬(wàn)用表實(shí)現(xiàn)電壓數(shù)值的測(cè)量,也可以實(shí)現(xiàn)導(dǎo)通狀態(tài)的測(cè)量。在完成硬件電路檢測(cè)之后,可以進(jìn)行程序的下載,將HEX單片機(jī)可執(zhí)行文件下載到單片機(jī)中,確保程序的正確下載,然后進(jìn)行通電觀(guān)察是否正確,當(dāng)數(shù)據(jù)或者狀態(tài)正確時(shí)候可以進(jìn)入最后的調(diào)試階段,通過(guò)調(diào)試各個(gè)步驟檢測(cè)是否完成系統(tǒng)的設(shè)計(jì)功能。5.2系統(tǒng)測(cè)試程序的編寫(xiě)時(shí)按照模塊化的功能去實(shí)現(xiàn),通過(guò)測(cè)試可以看到各個(gè)功能模塊的工作狀態(tài),通過(guò)對(duì)各個(gè)模塊的測(cè)試可以找出具體模塊的錯(cuò)誤或者不當(dāng)之處。在測(cè)試時(shí)候已經(jīng)保證了電路的原理是按照電路圖的確定,只需要先找軟件的問(wèn)題,這樣可以加快各個(gè)功能模塊的測(cè)試與開(kāi)發(fā)進(jìn)度,將各個(gè)功能模塊分別寫(xiě)入到單片機(jī)進(jìn)行對(duì)應(yīng)的測(cè)試,通過(guò)測(cè)試現(xiàn)象得出結(jié)論。單片機(jī)單獨(dú)測(cè)試對(duì)于該實(shí)物是沒(méi)有任何意義的,所以接下來(lái)的測(cè)試都需要配合其它為了實(shí)現(xiàn)功能的模塊來(lái)一起測(cè)試,這樣才能更好的檢測(cè)實(shí)物功能是否存在問(wèn)題。最先開(kāi)始依舊是檢測(cè)硬件的完整性,確保實(shí)現(xiàn)功能的元器件都已安裝完畢,接著便可以對(duì)要實(shí)現(xiàn)的功能來(lái)一一測(cè)試。首先便是安裝部分,共分為5步:(1)首先第一部分便是組裝機(jī)械手上半部分,該部分需要4個(gè)舵機(jī)和機(jī)械抓以及支架材料組成,組裝完畢在每個(gè)舵機(jī)接口處引出舵機(jī)延長(zhǎng)線(xiàn)。這部分可實(shí)現(xiàn)機(jī)械手三到六軸控制。機(jī)械手上半部分圖如圖5-1。圖5-1機(jī)械手上半部分圖(2)其次第二部分就是安裝機(jī)械手云臺(tái)支架部分,該部分由2個(gè)舵機(jī)以及云臺(tái)支架,大軸承等組成,這里第二部分主要實(shí)現(xiàn)機(jī)械手一軸與二軸的運(yùn)動(dòng)的控制。該部分如圖5-2。圖5-2機(jī)械手云臺(tái)支架圖(3)STM32單片機(jī)和存儲(chǔ)器焊接在核心板中,核心板與控制板焊接在一起組成32控制板,再將手柄信號(hào)接收器安裝至32控制板下方,紅外感應(yīng)裝置固定至大底板中。圖5-3手柄接收器圖5-4紅外感應(yīng)模塊圖5-5焊接芯片圖(4)將控制板安裝至大底板上,舵機(jī)延長(zhǎng)線(xiàn)按順序插入32控制板,紅外感應(yīng),語(yǔ)音模塊,手柄接收器插入32控制板對(duì)應(yīng)位置。圖5-6接線(xiàn)入控制板圖(5)將整體安裝完畢,等待功能測(cè)試。圖5-7安裝完畢圖接著便是對(duì)主要功能進(jìn)行測(cè)試:(1)外接3A適配器來(lái)提供電源,測(cè)試紅外感應(yīng)是否能夠運(yùn)行。圖5-8適配器圖5-9紅外感應(yīng)到物品后的動(dòng)作(2)測(cè)試語(yǔ)音模塊。圖5-10語(yǔ)音模塊接收指令后動(dòng)作(3)測(cè)試手動(dòng)控制。圖5-11手動(dòng)控制機(jī)械手最后這里主要介紹系統(tǒng)的測(cè)試結(jié)果,從硬件開(kāi)始進(jìn)行測(cè)試,檢查硬件電路的原理與實(shí)物是否是一致的,首先是對(duì)外部電源能否正常工作的測(cè)試,如圖5-8,外接電源顯示藍(lán)燈亮起,證明在正常工作;接著是對(duì)紅外感應(yīng)的測(cè)試,物品進(jìn)入紅外感應(yīng)范圍后輸出信號(hào),機(jī)械手按設(shè)定好的程序進(jìn)行運(yùn)行,如圖5-9,接著是對(duì)語(yǔ)音模塊來(lái)進(jìn)行測(cè)試,當(dāng)喊出喚醒語(yǔ)音模塊的關(guān)鍵詞后,語(yǔ)音模塊開(kāi)始工作,接著說(shuō)出設(shè)定好的語(yǔ)音指令關(guān)鍵詞,語(yǔ)音模塊發(fā)出信號(hào),機(jī)械手完成了對(duì)應(yīng)的動(dòng)作,如圖5-10,語(yǔ)音指令見(jiàn)附錄。最后便是手動(dòng)控制測(cè)試,通過(guò)SP2手柄與它的信號(hào)接收器來(lái)完成對(duì)機(jī)械手的動(dòng)作控制,如圖5-11。完成這些測(cè)試后,得出實(shí)物滿(mǎn)足了設(shè)計(jì)需求的功能。

第6章總結(jié)與展望6.1總結(jié)本次設(shè)計(jì)的基于STM32單片機(jī)的機(jī)械手控制系統(tǒng),首先從開(kāi)始的資料收集開(kāi)始做起,通過(guò)收集相關(guān)的內(nèi)容資料作為參考,確定自己的任務(wù)功能之后開(kāi)始設(shè)計(jì)整體思路與整體框架。然后進(jìn)行整體的電路設(shè)計(jì),完成整體的原理圖。根據(jù)原理圖實(shí)現(xiàn)實(shí)物設(shè)備的焊接,從而完成實(shí)物的整體制作,為下一步的程序調(diào)試做準(zhǔn)備。在焊接硬件時(shí)候遇到了虛焊問(wèn)題,通過(guò)萬(wàn)用表檢查電路最后保證了硬件焊接的正確性。通過(guò)編寫(xiě)各個(gè)模塊程序,然后下載到單片機(jī)中進(jìn)行測(cè)試,保證每一個(gè)功能都可以正常的運(yùn)行。最后整合成完整的程序,增加邏輯控制實(shí)現(xiàn)目標(biāo)功能。在調(diào)試程序的時(shí)候遇到顯示模塊不顯示,查找電路時(shí)候也沒(méi)有發(fā)現(xiàn)電路焊接有問(wèn)題,確定是程序的問(wèn)題,查找顯示相關(guān)的程序控制,最后發(fā)現(xiàn)是程序沒(méi)有進(jìn)行顯示的初始化設(shè)置,修改程序之后問(wèn)題得到了解決。本次設(shè)計(jì)在硬件設(shè)計(jì)與軟件設(shè)計(jì)中都遇到了不同的問(wèn)題,在細(xì)心查找下遇到的問(wèn)題與困難都很好的解決了。本次完成了整體的目標(biāo)功能,完成系統(tǒng)包括硬件、軟件、整體測(cè)試的全部工作,完成了任務(wù)目標(biāo),實(shí)現(xiàn)了課題的需求效果。由于本次設(shè)計(jì)開(kāi)發(fā)的系統(tǒng)時(shí)間有限,在設(shè)備進(jìn)入實(shí)際應(yīng)用中可能存在一些硬件的匹配或者程序的匹配問(wèn)題,但是隨著智能化與物聯(lián)網(wǎng)話(huà)的逐漸發(fā)展與技術(shù)的更新,基于STM32單片機(jī)的機(jī)械手控制系統(tǒng)的應(yīng)用會(huì)變得更加的廣泛,在實(shí)際應(yīng)用中也會(huì)越來(lái)越穩(wěn)定可靠。6.2不足與展望本次設(shè)計(jì)的機(jī)械手系統(tǒng),通過(guò)傳感器與電機(jī)實(shí)現(xiàn)了目標(biāo)的要求功能,但是在一些結(jié)構(gòu)設(shè)計(jì)上還有很多的優(yōu)化,比如機(jī)械臂的轉(zhuǎn)動(dòng)角度,后續(xù)如果可以對(duì)機(jī)械手進(jìn)行完善,主要的地方還要有主要程序的優(yōu)化,讓機(jī)械手控制的更加絲滑,反應(yīng)的時(shí)間更加的迅速,做到精準(zhǔn),在機(jī)械結(jié)構(gòu)上進(jìn)行升級(jí),實(shí)現(xiàn)手的樣式更加完善,實(shí)現(xiàn)類(lèi)似仿真手的動(dòng)作控制,同樣在材料上也可以升級(jí),讓機(jī)械手保持更加耐用的同時(shí),材料的價(jià)格也可以更加的實(shí)惠一些。這些都是日后可以更加精細(xì)的研究方向。

參考文獻(xiàn)張仔龍,王利強(qiáng).機(jī)械手發(fā)展現(xiàn)狀與趨勢(shì)[J].機(jī)械研究與應(yīng)用,2022,35(06):219-225.DOI:10.16576/j.ISSN.1007-4414.2022.06.063.侯進(jìn)旺.基于單片機(jī)的機(jī)械手控制系統(tǒng)設(shè)計(jì)[J].科技通報(bào),2016,32(007):108-112.方龍,陳丹,肖獻(xiàn)保.基于單片機(jī)的機(jī)械手臂控制系統(tǒng)設(shè)計(jì)[J].廣西輕工業(yè),2008,24(008):89-90.李巖,李雪斌,宋家興.C語(yǔ)言的發(fā)展特點(diǎn)及其應(yīng)用[J].藝術(shù)科技,2016,29(09):94.高紅紅,馬保吉,楊恒,李志超.六自由度上料機(jī)械手控制系統(tǒng)的設(shè)計(jì)與測(cè)試[J].儀表技術(shù)與傳感器,2022(01):57-61.王偉,彭細(xì)華,周來(lái).一種多自由度教學(xué)搬運(yùn)機(jī)械手的控制程序[J].電子技術(shù),2020,49(08):34-35.何英杰,劉娟秀,梁飛.一種移動(dòng)便捷式心電采集系統(tǒng)的設(shè)計(jì)[J].電腦知識(shí)與技術(shù),2022,18(24):115-118.DOI:10.14004/ki.ckt.2022.1470.張勇.六自由度機(jī)械手參數(shù)化建模及運(yùn)動(dòng)仿真[J].機(jī)械管理開(kāi)發(fā),2023,38(04):4-6.DOI:10.16525/14-1134/th.2023.04.002.折小榮.基于單片機(jī)控制的管道施工機(jī)械手控制系統(tǒng)研究[J].數(shù)字技術(shù)與應(yīng)用,2015,000(009):13.耶曉東.基于單片機(jī)的簡(jiǎn)易機(jī)械手的設(shè)計(jì)[J].微計(jì)算機(jī)信息,2009,25(014):230-231.沈孝芹,張蔚波,于復(fù)生,等.基于單片機(jī)控制的氣動(dòng)搬運(yùn)機(jī)械手的研制[J].液壓與氣動(dòng),2008,000(008):14-15.李世強(qiáng),王霞.工業(yè)機(jī)械手自動(dòng)化控制系統(tǒng)設(shè)計(jì)[J].自動(dòng)化技術(shù)與應(yīng)用,2022,41(10):1-3+14.徐巍,朱懷志,鐘宇超,余成成.基于NSGA-Ⅱ的熱壓系統(tǒng)上下料機(jī)械手結(jié)構(gòu)優(yōu)化設(shè)計(jì)[J].現(xiàn)代制造工程,2023(05):65-73.DOI:10.16731/ki.1671-3133.2023.05.010.賈繼鵬,趙芳琴.工控技術(shù)在機(jī)械手控制系統(tǒng)中的應(yīng)用與分析[J].設(shè)備管理與維修,2022,(18):106-107.王一帆,趙琛,袁夢(mèng)揚(yáng),關(guān)光.六自由度機(jī)械手控制系統(tǒng)設(shè)計(jì)與仿真[J].數(shù)字技術(shù)與應(yīng)用,2022,40(08):194-199.國(guó)內(nèi)機(jī)械行業(yè)——機(jī)械手應(yīng)用與技術(shù)發(fā)展概況(上)[J].科技簡(jiǎn)報(bào),1975(07):12-15.吳云龍,程武山.基于STM32的語(yǔ)音識(shí)別機(jī)械手智能系統(tǒng)設(shè)計(jì)[J].單片機(jī)與嵌入式系統(tǒng)應(yīng)用,2020,20(01):37-41.郭棟.基于八軸噴涂機(jī)械手臂示教運(yùn)動(dòng)控制研究[D].濟(jì)南大學(xué),2021.DOI:10.27166/ki.gsdcc.2021.000467.蔡展標(biāo),許生鴻.舵機(jī)機(jī)械手控制器設(shè)計(jì)[J].嘉應(yīng)學(xué)院學(xué)報(bào),2018,36(08):45-52.魯力,楊紅軍,田龍陽(yáng),戢紹庭,陳家林.基于STM32控制的小型機(jī)械手的研究[J].武漢輕工大學(xué)學(xué)報(bào),2022,41(04):59-63.Hernandez-BarrazaLuis,Kalil-KhanAhmed,YeowRayeChen-Hua.Abioinspiredmodularsoftroboticarm[J].EngineeringResearchExpress,2023,5(1).MondiniValeria,KoblerReinmarJosef,SburleaAndreeaIoana,Müller-PutzGernotR.Continuouslow-frequencyEEGdecodingofarmmovementforclosed-loop,naturalcontrolofaroboticarm.[J].Journalofneuralengineering,2020,17(4).AlirezaIzadbakhsh,PayamKheirkhahan.OntheVoltage-basedControlofRobotManipulatorsRevisited[J].InternationalJournalofControl,AutomationandSystems,2018,16(4).AnhTuanVo,ThanhNguyenTruong,HeeJunKang.AModifiedAdaptivePrescribedPerformanceControlMethodforMotionControlProblemsofRoboticManipulators[J].IJMERR,2022,11(12).GirenkoD.S.ZhidkovV.N,KimN.V.AccuracyofNeuralNetworkManipulatorControl[J].RussianEngineeringResearch,2022,42(9):202.

附錄設(shè)計(jì)原理圖1設(shè)計(jì)原理圖2語(yǔ)音模塊語(yǔ)音指令喚醒詞:小星小星關(guān)鍵詞:前夾取==$DGT:1-7,1!左夾取==$DGT:16-23,1!右?jiàn)A取==$DGT:8-15,1!左轉(zhuǎn)==#000P2300T1500!右轉(zhuǎn)==#000P0700T1500!居中==#000P1500T1000!爪子張開(kāi)==#005P1200T1000!爪子閉合==#005P1800T1000!彎曲=={#001P1500T1000!#002P1500T1000!#003P1500T1000?。绷?={#001P1800T1000!#002P2000T1000!#003P2000T1000?。龣C(jī)械手程序#include"z_rcc.h" //配置時(shí)鐘文件#include"z_gpio.h" //配置IO口文件#include"z_global.h" //存放全局變量#include"z_delay.h" //存放延時(shí)函數(shù)#include"z_type.h" //存放類(lèi)型定義#include"z_usart.h" //存放串口功能文件#include"z_timer.h" //存放定時(shí)器功能文件#include"z_ps2.h" //存放索尼手柄#include"z_w25q64.h" //存儲(chǔ)芯片的操作#include"z_sensor.h" //傳感器初始化#include"z_adc.h" //ADC初始化#include<stdio.h> //標(biāo)準(zhǔn)庫(kù)文件#include<string.h> //標(biāo)準(zhǔn)庫(kù)文件#include<math.h> //標(biāo)準(zhǔn)庫(kù)文件#defineMODULE"Jibot1-32"/* 全局變量定義*/inti; //常用的一個(gè)臨時(shí)變量intdo_start_index; //動(dòng)作組執(zhí)行起始序號(hào)intdo_times; //動(dòng)作組執(zhí)行執(zhí)行次數(shù)intgroup_num_start; //動(dòng)作組執(zhí)行起始序號(hào)intgroup_num_end; //動(dòng)作組執(zhí)行終止序號(hào)intgroup_num_times; //動(dòng)作組執(zhí)行起始變量//u32dj_record_time=1000;//學(xué)習(xí)時(shí)間默認(rèn)1000u8needSaveFlag=0; //偏差保存標(biāo)志u32bias_systick_ms_bak=0;//偏差保存標(biāo)志時(shí)間u32action_time=0;u8psx_buf[9]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};//存儲(chǔ)手柄的數(shù)據(jù) constchar*pre_cmd_set_red[PSX_BUTTON_NUM]={//紅燈模式下按鍵的配置 "<PS2_RED01:#005P0600T2000!^#005PDST!>", //L2 "<PS2_RED02:#005P2400T2000!^#005PDST!>", //R2 "<PS2_RED03:#004P0600T2000!^#004PDST!>", //L1 "<PS2_RED04:#004P2400T2000!^#004PDST!>", //R1 "<PS2_RED05:#002P2400T2000!^#002PDST!>", //RU "<PS2_RED06:#003P2400T2000!^#003PDST!>", //RR "<PS2_RED07:#002P0600T2000!^#002PDST!>", //RD "<PS2_RED08:#003P0600T2000!^#003PDST!>", //RL "<PS2_RED09:$DJR!>", //SE "<PS2_RED10:>", //AL "<PS2_RED11:>", //AR "<PS2_RED12:$DJR!>", //ST "<PS2_RED13:#001P0600T2000!^#001PDST!>", //LU "<PS2_RED14:#000P0600T2000!^#000PDST!>", //LR "<PS2_RED15:#001P2400T2000!^#001PDST!>", //LD "<PS2_RED16:#000P2400T2000!^#000PDST!>", //LL };constchar*pre_cmd_set_grn[PSX_BUTTON_NUM]={//紅綠燈模式下按鍵的配置 "<PS2_RED01:#005P0600T2000!^#005PDST!>", //L2 "<PS2_RED02:#005P2400T2000!^#005PDST!>", //R2 "<PS2_RED03:#004P0600T2000!^#004PDST!>", //L1 "<PS2_RED04:#004P2400T2000!^#004PDST!>", //R1 "<PS2_RED05:#002P2400T2000!^#002PDST!>", //RU "<PS2_RED06:#003P2400T2000!^#003PDST!>", //RR "<PS2_RED07:#002P0600T2000!^#002PDST!>", //RD "<PS2_RED08:#003P0600T2000!^#003PDST!>", //RL "<PS2_RED09:$DJR!>", //SE "<PS2_RED10:>", //AL "<PS2_RED11:>", //AR "<PS2_RED12:$DJR!>", //ST "<PS2_RED13:#001P0600T2000!^#001PDST!>", //LU "<PS2_RED14:#000P0600T2000!^#000PDST!>", //LR "<PS2_RED15:#001P2400T2000!^#001PDST!>", //LD "<PS2_RED16:#000P2400T2000!^#000PDST!>", //LL };/**程序從這里執(zhí)行 *這個(gè)啟動(dòng)代碼完成時(shí)鐘配置使用外部晶振作為STM32的運(yùn)行時(shí)鐘并倍頻到72M*/intmain(void){ setup_rcc(); //初始化時(shí)鐘 setup_global(); //初始化全局變量 setup_gpio(); //初始化IO口 setup_nled(); //初始化工作指示燈 setup_beep(); //初始化定時(shí)器 setup_djio(); //初始化舵機(jī)IO口 setup_w25q64(); //初始化存儲(chǔ)器W25Q64 setup_ps2(); //初始化PS2手柄 setup_uart1(); //初始化串口1用于下載動(dòng)作組 setup_uart3(); //初始化串口3用于底板總線(xiàn)、lora setup_systick(); //初始化滴答時(shí)鐘,1S增加一次millis()的值 setup_others(); //初始化其他 setup_dj_timer(); //初始化定時(shí)器2處理舵機(jī)PWM輸出 setup_sensor(); //初始化傳感器 setup_start(); //初始化啟動(dòng)信號(hào) setup_interrupt();//初始化總中斷 while(1){ loop_nled(); //循環(huán)執(zhí)行工作指示燈,500ms跳動(dòng)一次和聲音公用一個(gè)IO口這里在聲音功能啟用的時(shí)候就關(guān)閉nled loop_uart(); //串口數(shù)據(jù)接收處理 loop_action(); //動(dòng)作組批量執(zhí)行 loop_ps2_data();//循環(huán)讀取PS2手柄數(shù)據(jù) loop_ps2_button();//處理手柄上的按鈕 loop_ps2_car(); //處理電機(jī)搖桿控制 loop_monitor();//定時(shí)保存一些變量 }}///* 初始化函數(shù)實(shí)現(xiàn)*/voidsetup_rcc(void){//初始化時(shí)鐘 tb_rcc_init(); //時(shí)鐘初始化}voidsetup_global(void){//初始化全局變量 tb_global_init(); }voidsetup_gpio(void){//初始化IO口 tb_gpio_init(); }voidsetup_nled(void){//初始化工作指示燈 nled_init(); nled_off(); //工作指示燈關(guān)閉}voidsetup_beep(void){//初始化定時(shí)器蜂鳴器 beep_init(); beep_off(); //關(guān)閉蜂鳴器} voidsetup_djio(void){//初始化舵機(jī)IO口 dj_io_init(); } voidsetup_w25q64(void){//初始化存儲(chǔ)器W25Q64 spiFlahsOn(1); w25x_init(); //動(dòng)作組存儲(chǔ)芯片初始化 w25x_read((u8*)(&eeprom_info),W25Q64_INFO_ADDR_SAVE_STR,sizeof(eeprom_info));//讀取全局變量 if(eeprom_info.version!=VERSION){//判斷版本是否是當(dāng)前版本 eeprom_info.version=VERSION; //復(fù)制當(dāng)前版本 eeprom_info.dj_record_num=0; //學(xué)習(xí)動(dòng)作組變量賦值0 } if(eeprom_info.dj_bias_pwm[DJ_NUM]!=FLAG_VERIFY){ for(i=0;i<DJ_NUM;i++){ eeprom_info.dj_bias_pwm[i]=0; } eeprom_info.dj_bias_pwm[DJ_NUM]=FLAG_VERIFY; } for(i=0;i<DJ_NUM;i++){ duoji_doing[i].aim=1500+eeprom_info.dj_bias_pwm[i]; duoji_doing[i].cur=1500+eeprom_info.dj_bias_pwm[i]; duoji_doing[i].inc=0; } spiFlahsOn(0);} voidsetup_adc(void){//初始化ADC采集使用DMA初始化 ADC_init();}voidsetup_ps2(void){//初始化PS2手柄 PSX_init(); }voidsetup_dj_timer(void){//初始化定時(shí)器2處理舵機(jī)PWM輸出 TIM2_Int_Init(20000,71); }voidsetup_uart1(void){//串口1初始化 tb_usart1_init(115200); //串口1打開(kāi) uart1_open(); //串口發(fā)送測(cè)試字符 uart1_send_str((u8*)"uart1checkok!");}//初始化串口2voidsetup_uart2(void){ //串口2初始化 tb_usart2_init(115200); //串口2打開(kāi) uart2_open(); //串口發(fā)送測(cè)試字符 uart2_send_str((u8*)"uart2checkok!");} //初始化串口3voidsetup_uart3(void){ //串口3初始化 tb_usart3_init(115200); //串口3打開(kāi) uart3_open(); //串口發(fā)送測(cè)試字符 uart3_send_str((u8*)"uart3checkok!"); //總線(xiàn)輸出復(fù)位總線(xiàn)舵機(jī)串口3即為總線(xiàn)串口 zx_uart_send_str((u8*)"#255P1500T2000!");} //初始化滴答時(shí)鐘,1S增加一次millis()的值voidsetup_systick(void){ //系統(tǒng)滴答時(shí)鐘初始化 SysTick_Int_Init();} //初始化啟動(dòng)信號(hào)voidsetup_start(void){ //蜂鳴器LED名叫閃爍示意系統(tǒng)啟動(dòng) beep_on();nled_on();tb_delay_ms(100);beep_off();nled_off();tb_delay_ms(100); beep_on();nled_on();tb_delay_ms(100);beep_off();nled_off();tb_delay_ms(100); beep_on();nled_on();tb_delay_ms(100);beep_off();nled_off();tb_delay_ms(100);} //初始化其他voidsetup_others(void){ //將偏差帶入初始值 for(i=0;i<DJ_NUM;i++){ duoji_doing[i].aim=1500+eeprom_info.dj_bias_pwm[i]; duoji_doing[i].cur=duoji_doing[i].aim; duoji_doing[i].inc=0; } //執(zhí)行預(yù)存命令{G0000#000P1500T1000!#000P1500T1000!} if(eeprom_info.pre_cmd[PRE_CMD_SIZE]==FLAG_VERIFY){ strcpy((char*)uart_receive_buf,(char*)eeprom_info.pre_cmd); if(eeprom_info.pre_cmd[0]=='$'){ parse_cmd(eeprom_info.pre_cmd); }else{ for(i=16;i<strlen((char*)uart_receive_buf);i+=15){ uart_receive_buf[i]='0'; uart_receive_buf[i+1]='0'; uart_receive_buf[i+2]='0'; uart_receive_buf[i+3]='0'; } parse_action(uart_receive_buf); } }}//初始化總中斷voidsetup_interrupt(void){ //總中斷打開(kāi) tb_interrupt_open();} /////* 主循環(huán)函數(shù)實(shí)現(xiàn)*///循環(huán)執(zhí)行工作指示燈,500ms跳動(dòng)一次voidloop_nled(void){ staticu32time_count=0; staticu8flag=0; if(millis()-time_count>1000){ time_count=millis(); if(flag){ nled_on(); }else{ nled_off(); } flag=~flag; }} //串口數(shù)據(jù)接收處理voidloop_uart(void){ if(uart1_get_ok){ if(uart1_mode==1){ //命令模式 parse_cmd(uart_receive_buf); }elseif(uart1_mode==2){ //單個(gè)舵機(jī)調(diào)試 parse_action(uart_receive_buf); }elseif(uart1_mode==3){ //多路舵機(jī)調(diào)試 parse_action(uart_receive_buf); }elseif(uart1_mode==4){ //存儲(chǔ)模式 save_action(uart_receive_buf); } uart1_mode=0; uart1_get_ok=0; uart1_open(); } return;} //動(dòng)作組批量執(zhí)行voidloop_action(void){ staticlonglongsystick_ms_bak=0; //通過(guò)判斷舵機(jī)是否全部執(zhí)行完畢并且是執(zhí)行動(dòng)作組group_do_ok尚未結(jié)束的情況下進(jìn)入處理 if(group_do_ok==0){ if(millis()-systick_ms_bak>action_time){ systick_ms_bak=millis(); if(group_num_times!=0&&do_times==0){//循環(huán)次數(shù)不等于0,執(zhí)行次數(shù)現(xiàn)在為0,則執(zhí)行完畢 group_do_ok=1; uart1_send_str((u8*)"@GroupDone!"); return;//返回跳出本函數(shù) } //調(diào)用do_start_index個(gè)動(dòng)作 do_group_once(do_start_index); if(group_num_start<group_num_end){// if(do_start_index==group_num_end){ do_start_index=group_num_start;//賦值起始動(dòng)作序號(hào)到變量中,便于循環(huán)使用 if(group_num_times!=0){ do_times--; } return; } do_start_index++; }else{ if(do_start_index==group_num_end){ do_start_index=group_num_start; if(group_num_times!=0){ do_times--; } return; } do_start_index--; } } }else{action_time=10; }}//循環(huán)讀取PS2手柄數(shù)據(jù)voidloop_ps2_data(void){ staticu32systick_ms_bak=0; //每20ms處理1次 if(millis()-systick_ms_bak<50){ return; } systick_ms_bak=millis(); //讀寫(xiě)手柄數(shù)據(jù) psx_write_read(psx_buf); #if0 //測(cè)試手柄數(shù)據(jù),1為打開(kāi)0為關(guān)閉 sprintf((char*)cmd_return,"0x%02x,0x%02x,0x%02x,0x%02x,0x%02x,0x%02x,0x%02x,0x%02x,0x%02x\r\n", (int)psx_buf[0],(int)psx_buf[1],(int)psx_buf[2],(int)psx_buf[3], (int)psx_buf[4],(int)psx_buf[5],(int)psx_buf[6],(int)psx_buf[7],(int)psx_buf[8]); uart1_send_str(cmd_return);#endif return;} //處理手柄上的按鈕voidloop_ps2_button(void){ staticunsignedcharpsx_button_bak[2]={0}; //對(duì)比兩次獲取的按鍵值是否相同,相同就不處理,不相同則處理 if((psx_button_bak[0]==psx_buf[3]) &&(psx_button_bak[1]==psx_buf[4])){ }else{ //處理buf3和buf4兩個(gè)字節(jié),這兩個(gè)字節(jié)存儲(chǔ)這手柄16個(gè)按鍵的狀態(tài) parse_psx_buf(psx_buf+3,psx_buf[1]); psx_button_bak[0]=psx_buf[3]; psx_button_bak[1]=psx_buf[4]; } return;} ////軟件復(fù)位函數(shù),調(diào)用后單片機(jī)自動(dòng)復(fù)位voidsoft_reset(void){ __set_FAULTMASK(1); NVIC_SystemReset();}//處理手柄按鍵字符,buf為字符數(shù)組,mode是指模式主要是紅燈和綠燈模式voidparse_psx_buf(unsignedchar*buf,unsignedcharmode){ u8i,pos=0; staticu16bak=0xffff,temp,temp2; temp=(buf[0]<<8)+buf[1]; if(bak!=temp){ temp2=temp; temp&=bak; for(i=0;i<16;i++){//16個(gè)按鍵一次輪詢(xún) if((1<<i)&temp){ }else{ if((1<<i)&bak){ //press表示按鍵按下了 memset(uart_receive_buf,0,sizeof(uart_receive_buf)); if(mode==PS2_LED_RED){ memcpy((char*)uart_receive_buf,(char*)pre_cmd_set_red[i],strlen(pre_cmd_set_red[i])); }elseif(mode==PS2_LED_GRN){ memcpy((char*)uart_receive_buf,(char*)pre_cmd_set_grn[i],strlen(pre_cmd_set_grn[i])); }elsecontinue; //zx_uart_send_str(uart_receive_buf); pos=str_contain_str(uart_receive_buf,(u8*)"^"); if(pos)uart_receive_buf[pos-1]='\0'; if(str_contain_str(uart_receive_buf,(u8*)"$")){ uart1_close(); uart1_get_ok=0; strcpy((char*)cmd_return,(char*)uart_receive_buf+11); strcpy((char*)uart_receive_buf,(char*)cmd_return); uart1_get_ok=1; uart1_open(); uart1_mode=1; }elseif(str_contain_str(uart_receive_buf,(u8*)"#")){ uart1_close(); uart1_get_ok=0; strcpy((char*)cmd_return,(char*)uart_receive_buf+11); strcpy((char*)uart_receive_buf,(char*)cmd_return); uart1_get_ok=1; uart1_open(); uart1_mode=2; } bak=0xffff; }else{//release表示按鍵松開(kāi)了 memset(uart_receive_buf,0,sizeof(uart_receive_buf)); if(mode==PS2_LED_RED){ memcpy((char*)uart_receive_buf,(char*)pre_cmd_set_red[i],strlen(pre_cmd_set_red[i])); }elseif(mode==PS2_LED_GRN){ memcpy((char*)uart_receive_buf,(char*)pre_cmd_set_grn[i],strlen(pre_cmd_set_grn[i])); }elsecontinue; pos=str_contain_str(uart_receive_buf,(u8*)"^"); if(pos){ if(str_contain_str(uart_receive_buf+pos,(u8*)"$")){ //uart1_close(); //uart1_get_ok=0; strcpy((char*)cmd_return,(char*)uart_receive_buf+pos); cmd_return[strlen((char*)cmd_return)-1]='\0'; strcpy((char*)uart_receive_buf,(char*)cmd_return); parse_cmd(uart_receive_buf); //uart1_get_ok=1; //uart1_mode=1; }elseif(str_contain_str(uart_receive_buf+pos,(u8*)"#")){ //uart1_close(); //uart1_get_ok=0; strcpy((char*)cmd_return,(char*)uart_receive_buf+pos); cmd_return[strlen((char*)cmd_return)-1]='\0'; strcpy((char*)uart_receive_buf,(char*)cmd_return); parse_action(uart_receive_buf); //uart1_get_ok=1; //uart1_mode=2; } //uart1_send_str(uart_receive_buf); } } } } bak=temp2; beep_on();mdelay(10);beep_off(); } return;}/*//動(dòng)作組保存函數(shù)//只有用<>包含的字符串才能在此函數(shù)中進(jìn)行解析voidsave_action(u8*str){ s32action_index=0; //預(yù)存命令處理 spiFlahsOn(1); if(str[1]=='$'&&str[2]=='!'){ eeprom_info.pre_cmd[PRE_CMD_SIZE]=0; rewrite_eeprom(); uart1_send_str((u8*)"@CLEARPRE_CMDOK!"); return; }elseif(str[1]=='$'){ if(sscanf((char*)str,"<$DGT:%d-%d,%d!>",&group_num_start,&group_num_end,&group_num_times)){ if(group_num_start==group_num_end){ w25x_read(eeprom_info.pre_cmd,group_num_start*ACTION_SIZE,ACTION_SIZE); }else{ memset(eeprom_info.pre_cmd,0,sizeof(eeprom_info.pre_cmd)); strcpy((char*)eeprom_info.pre_cmd,(char*)str+1); eeprom_info.pre_cmd[strlen((char*)str)-2]='\0'; } eeprom_info.pre_cmd[PRE_CMD_SIZE]=FLAG_VERIFY; rewrite_eeprom(); //uart1_send_str(eeprom_info.pre_cmd); uart1_send_str((u8*)"@SETPRE_CMDOK!"); } return; } //獲取動(dòng)作的組號(hào)如果不正確,或是第6個(gè)字符不是#則認(rèn)為字符串錯(cuò)誤 action_index=get_action_index(str); //<G0000#000P1500T1000!> if((action_index==-1)||str[6]!='#'){ uart1_send_str((u8*)"E"); return; } //把尖括號(hào)替換成大括號(hào)直接存儲(chǔ)到存儲(chǔ)芯片里面去,則在執(zhí)行動(dòng)作組的時(shí)候直接拿出來(lái)解析就可以了 replace_char(str,'<','{'); replace_char(str,'>','}'); if((action_index*ACTION_SIZE%4096)==0){w25x_erase_sector(action_index*ACTION_SIZE/4096);} w25x_write(str,action_index*ACTION_SIZE,strlen((char*)str)+1);// memset(str,0,sizeof((char*)str));// w25x_read(str,action_index*ACTION_SIZE,ACTION_SIZE);// uart1_send_str(str); //反饋一個(gè)A告訴上位機(jī)我已經(jīng)接收到了 uart1_send_str((u8*)"A"); uart3_send_str((u8*)"A"); spiFlahsOn(0); return; }//獲取動(dòng)作組的組號(hào),字符串中有組號(hào)返回組號(hào),否則返回-1intget_action_index(u8*str){ u16index=0; //uart_send_str(str); while(*str){ if(*str=='G'){ str++; while((*str!='#')&&(*str!='$')){ index=index*10+*str-'0'; str++; } returnindex; }else{ str++; } } return-1;}//打印存儲(chǔ)在芯片里的動(dòng)作組,從串口1中發(fā)送出來(lái)$CGP:x-y!這個(gè)命令調(diào)用voidprint_group(intstart,intend){ spiFlahsOn(1); if(start>end){ int_exchange(&start,&end); } for(;start<=end;start++){ memset(uart_receive_buf,0,sizeof(uart_receive_buf)); w25x_read(uart_receive_buf,start*ACTION_SIZE,ACTION_SIZE); uart1_send_str(uart_receive_buf); uart1_send_str((u8*)"\r\n"); uart3_send_str(uart_receive_buf); uart3_send_str((u8*)"\r\n"); } spiFlahsOn(0);}//兩個(gè)int變量交換voidint_exchange(int*int1,int*int2){ intint_temp; int_temp=*int1; *int1=*int2; *int2=int_temp;}//獲取最大時(shí)間intgetMaxTime(u8*str){inti=0,max_time=0,tmp_time=0;while(str[i]){if(str[i]=='T'){tmp_time=(str[i+1]-'0')*1000+(str[i+2]-'0')*100+(str[i+3]-'0')*10+(str[i+4]-'0');if(tmp_time>max_time)max_time=tmp_time;i=i+4;continue;}i++;}returnmax_time;}//執(zhí)行動(dòng)作組1次//參數(shù)是動(dòng)作組序號(hào)voiddo_group_once(intgroup_num){ spiFlahsOn(1); //將uart_receive_buf清零 memset(uart_receive_buf,0,sizeof(uart_receive_buf)); //從存儲(chǔ)芯片中讀取第group_num個(gè)動(dòng)作組 w25x_read(uart_receive_buf,group_num*ACTION_SIZE,ACTION_SIZE-1); //獲取最大的組時(shí)間 action_time=getMaxTime(uart_receive_buf); //把讀取出來(lái)的動(dòng)作組傳遞到parse_action執(zhí)行 parse_action(uart_receive_buf); spiFlahsOn(0);}//處理#000P1500T1000!類(lèi)似的字符串voidparse_action(u8*uart_receive_buf){ u16index,time,i=0; intbias; floatpwm; floataim_temp; zx_uart_send_str(uart_receive_buf); if(uart_receive_buf[0]=='#'&&uart_receive_buf[4]=='P'&&uart_receive_buf[5]=='S'&&uart_receive_buf[6]=='C'&&uart_receive_buf[7]=='K'&&uart_receive_buf[12]=='!'){ index=(uart_receive_buf[1]-'0')*100+(uart_receive_buf[2]-'0')*10+(uart_receive_buf[3]-'0'); bias=(uart_receive_buf[9]-'0')*100+(uart_receive_buf[10]-'0')*10+(uart_receive_buf[11]-'0'); if((bias>=-500)&&(bias<=500)&&(index<DJ_NUM)){ if(uart_receive_buf[8]=='+'){ }elseif(uart_receive_buf[8]=='-'){ bias=-bias; } aim_temp=duoji_doing[index].cur-eeprom_info.dj_bias_pwm[index]+bias; eeprom_info.dj_bias_pwm[index]=bi

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論