freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

六腳爬蟲(chóng)機(jī)器人的機(jī)械結(jié)構(gòu)以及控制程序的編寫(xiě)自動(dòng)化專(zhuān)業(yè)畢業(yè)設(shè)計(jì)畢業(yè)論文-資料下載頁(yè)

2024-11-29 11:16本頁(yè)面

【導(dǎo)讀】本文詳細(xì)介紹了六腳爬蟲(chóng)機(jī)器人的機(jī)械結(jié)構(gòu)以及控制程序的編寫(xiě)。實(shí)現(xiàn),自由度較高,穩(wěn)定性、靈活性較好。包括基本步態(tài)的編寫(xiě),以及傳感器的在機(jī)器人上。通過(guò)控制器對(duì)接收到的外界信號(hào)進(jìn)行處理,并控制機(jī)器人運(yùn)動(dòng)。

  

【正文】 意在有些教材中等號(hào)右邊為 EXTI0_IRQChannel,但在實(shí)際操作中,可能無(wú)法編譯,應(yīng)寫(xiě)成上面形式。如果是選用中斷線(xiàn) EXTI11,應(yīng)寫(xiě)作 EXTI15_10_IRQn; EXTI8 則為 EXTI9_5_IRQn。 ⑥為配置占先式優(yōu)先級(jí)(主優(yōu)先級(jí)):高占先式優(yōu)先級(jí)的中斷會(huì)打斷當(dāng)前的 28 主程序 /中斷程序運(yùn)行,即所謂的中斷嵌套。 優(yōu)先級(jí)數(shù)值越大,優(yōu)先級(jí)越低。 ⑦為配置副優(yōu)先級(jí)(子優(yōu)先級(jí)):在占先式優(yōu)先級(jí)相同的情況下。 在 低副優(yōu)先級(jí)中斷 運(yùn)行中, 高副優(yōu)先級(jí)的中斷要等待已被響應(yīng) 的低副優(yōu)先級(jí)中斷執(zhí)行結(jié)束后才能得到響應(yīng) — 非搶斷式響應(yīng) (不能嵌套 )。 但如果同時(shí)這兩個(gè)中斷同時(shí)到達(dá),則先執(zhí)行中斷優(yōu)先級(jí)高的,執(zhí)行完后,再執(zhí)行低優(yōu)先級(jí)中斷;如果兩個(gè)中斷的所有優(yōu)先級(jí)均一樣,則哪個(gè)中斷先到達(dá),就先執(zhí)行哪個(gè)中斷。 對(duì)于副優(yōu)先級(jí),數(shù)值越大,優(yōu)先級(jí)越低。 ( 3) 對(duì)中斷線(xiàn)進(jìn)行 I/O 口配置 從圖 中可知 ,每個(gè)中斷線(xiàn)對(duì)應(yīng) 5 個(gè) I/O 口,所以在使用前,一定要先進(jìn)行 I/O 口配置。仍以 EXTI0 為例,由開(kāi)發(fā)板原理圖可知, PA0 可直接配置為 EXTI0中斷,無(wú)需電路設(shè)計(jì)。如有需要,也可按照?qǐng)D 所示,配置其它中斷。 圖 PA0中斷線(xiàn)電路 配置程序?yàn)椋? void EXTI_Configuration(void) { EXTI_InitTypeDef EXTI_InitStructure。 GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource0)。 ① = EXTI_Line0。 ② = EXTI_Mode_Interrupt。 = EXTI_Trigger_Falling。 ③ = ENABLE。 29 EXTI_Init(amp。EXTI_InitStructure)。 } ①即表示選用 PA0 配置中斷; ②表示中斷線(xiàn)為 EXTI0。 ③ 表示下降沿觸發(fā)中斷 。 ( 4)配置中斷處理程序 外部中斷關(guān)鍵在于使用,下面為通過(guò) EXTI0 中斷來(lái)控制 LED 燈的程序: void EXTI0_IRQHandler(void) { if(EXTI_GetITStatus(EXTI_Line0)!= RESET) { ledflash()。 //LED 閃爍函數(shù),見(jiàn) EXTI_ClearITPendingBit(EXTI_Line0)。 //清除中斷屏蔽位 } } 只要改變 ledflash()行,即可在中斷產(chǎn)生時(shí),進(jìn)入不同的中斷處理程序。 由此多配置幾個(gè)中斷線(xiàn),并配合行走程序,便可設(shè)計(jì)一個(gè)手柄(或控制面板)來(lái)控制使機(jī)器人完成前進(jìn)后退等動(dòng)作。 在開(kāi)發(fā)板上還配備一個(gè) PC13 的中斷引腳,其電路圖與 PA0 一致,但是在調(diào)試過(guò)程中卻出現(xiàn)了 bug,無(wú)法調(diào)通,這就 是為什么在 節(jié)介紹 AFIO 時(shí)提到的需要使能 AFIO。雖然沒(méi)有進(jìn)行任何重映射,但程序中必須加入 AFIO 使能這一行,PC13 的中斷程序才能執(zhí)行。在調(diào)試過(guò)程中需要注意這一點(diǎn)。 系統(tǒng)時(shí)鐘 與定時(shí)器 設(shè)置與應(yīng)用 系統(tǒng)時(shí)鐘簡(jiǎn)介與應(yīng)用 CortexM3 的內(nèi)核中包含一個(gè) 4 位 的 遞減計(jì)數(shù)器 —— SysTick 時(shí)鐘 。當(dāng) 設(shè)定了 SysTick 的 初值并使能后,每經(jīng)過(guò) 1 個(gè)系統(tǒng)時(shí)鐘周期,計(jì)數(shù)值就減 1。 當(dāng) 計(jì)數(shù)到 0 時(shí), SysTick 計(jì)數(shù)器 便 自動(dòng)重裝初值并繼續(xù)計(jì)數(shù),同時(shí)內(nèi)部的 COUNTFLAG 標(biāo)志會(huì)置位 ,觸發(fā)中斷 (如果中斷使能情況下 )。 由此,可以利用 Systick 的上述特點(diǎn),來(lái)編寫(xiě) Delay()函數(shù),來(lái)實(shí)現(xiàn)精確延遲。 30 系統(tǒng)時(shí)鐘為 72MHz, SysTick 的最高頻率為 9MHz(最大為 HCLK / 8), 那么每次計(jì)數(shù)器減 1 所用的時(shí)間是 1/9M,計(jì)數(shù)器的初值如果是 9,那么每次計(jì)數(shù)器減到 0,時(shí)間經(jīng)過(guò) (1/9M) * 9= ,即 1μ s。 首先書(shū)寫(xiě)延遲的初始化程序: void delay_init(char SYSCLK) { SysTickCTRL amp。= 0xfffffffb。 ① fac_us = SYSCLK / 8。 ② fac_ms = (int)fac_us * 1000。 ③ fac_s = (int)fac_ms * 1000。 } ④ ①根據(jù) STK 控制寄存器知,將 0~2 位設(shè)置成 3,16 位設(shè)置為 1,則意味著:開(kāi)啟 Systick 功能、開(kāi)啟 Systick 中斷、使用 HCLK/8 作為 Systick 時(shí)鐘、上次讀取本寄存器后, Systick 已經(jīng)數(shù)到了 0; ②根據(jù)①選用的時(shí)鐘書(shū)寫(xiě),調(diào)用時(shí)應(yīng)寫(xiě)作 delay_init(72); ③、④可根據(jù) 需要書(shū)寫(xiě)。 然后書(shū)寫(xiě)延遲程序,以毫秒延遲為例: void delay_ms(int nms) { //毫秒級(jí)延遲 u32 temp。 SysTickLOAD = (u32)nms * fac_ms。 //load the time SysTickVAL = 0x00。 //clear the counter SysTickCTRL = 0x01 。 //start the counter do { temp = SysTickCTRL。 } while(temp amp。 0x01 amp。amp。 !(temp amp。 (116)))。//wait for the time SysTickCTRL = 0x00。 //close the counter SysTickVAL = 0X00。 //clear the counter } 該程序即是指當(dāng)計(jì)數(shù)到設(shè)定值后, Systick 的第 16 位控制位會(huì)自動(dòng)清零,從而使函數(shù)結(jié)束 ,停止計(jì)數(shù),達(dá)到精確延時(shí)的目的。 31 在實(shí)際應(yīng)用中,當(dāng)配置了延遲秒級(jí)的函數(shù)時(shí),同樣會(huì)出現(xiàn)問(wèn)題,可能是計(jì)數(shù)器溢出,無(wú)法延遲到設(shè)定值,此時(shí)不妨將原先的函數(shù)分多段書(shū)寫(xiě),例如如果需要延遲 10s,可以寫(xiě)兩行 delay_s(5)。 定時(shí)器配置 STM32F10x 處理器內(nèi)部有 4 個(gè)定時(shí)器,其中 TIM1 為高級(jí)控制定時(shí)器, TIMTIM3 和 TIM4 為 3 個(gè)獨(dú)立的通用定時(shí)器。 通用定時(shí)器是一個(gè)可編程預(yù)分頻器驅(qū)動(dòng)的 16 位自動(dòng)裝載計(jì)數(shù)器,適用于多種場(chǎng)合。通用定時(shí)器是完全獨(dú)立地,它們可以一起同步工作。 以配置 TIM2 為例,其程序 如下: void TIM2_Configuration(void) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure。 = 0xffff。 ① = 71。 ② = 0x0。 ③ = TIM_CounterMode_Up。 ④ TIM_TimeBaseInit(TIM2, amp。TIM_TimeBaseStructure)。 } ①為自動(dòng)重裝載寄存器周期的值(定時(shí)時(shí)間),累計(jì) 0xFFFF 個(gè)頻率后產(chǎn)生一個(gè)更新或中斷。 ②為時(shí)鐘預(yù)分頻數(shù),其與時(shí)鐘頻率的關(guān)系為:時(shí)鐘頻率 =72/(時(shí)鐘預(yù)分頻數(shù) +1) =1M; 則 71 代表計(jì)數(shù)周期為 1μ s; ③為時(shí)間分割值 ; ④設(shè)定定時(shí)器模式,程序中設(shè)定的為向上計(jì)數(shù)模式。 在 柔性力以及超聲波傳感器中將用到定時(shí)器,其調(diào)用函數(shù)為: time=TIM_GetCounter(TIM2)。 32 機(jī)器人行走 步態(tài)程序編寫(xiě) 行走步態(tài)簡(jiǎn)介 機(jī)器人步態(tài)有很多種,但最基本的步態(tài)包括:三腳步態(tài),四腳步態(tài)和波動(dòng)步態(tài)。顧名思義,這種步態(tài)的劃分是與同時(shí)落地的腳的個(gè)數(shù)有關(guān)的,分別為三個(gè)、四個(gè)以及一個(gè)。 在編寫(xiě)行走步態(tài)程序前,首先要建立幾個(gè)數(shù)組,儲(chǔ)存初始數(shù)據(jù)。如下: ① channelno[18]={0,1,2,3,4,5,6,7,8,31,30,29,28,27,26,25,24,23}。 ② initposi[18]={900,755,785,655,810,820,680,714,920,645,750,715,785,750, 755,890,825,815}。 //身體水平 ③ initposi1[18]={900,655,685,655,710,720,680,614,820,645,850,815,785,850, 855,890,925,915}。 //抬高身體 ④ initposi2[18]={900,855,885,655,910,920,680,814,1020,645,650,615,785,650, 655,890,725,715}。 //身體下沉 數(shù)組一是機(jī)器人六個(gè)腳從左至右,從前至后從上至下所對(duì)于的舵機(jī)號(hào)。下面三個(gè)數(shù)組則是機(jī)器人處于不同狀態(tài)時(shí)的舵機(jī)位置初始值,此時(shí)每個(gè)腳第一關(guān)節(jié)均與身體垂直。后續(xù)的所有舵機(jī)運(yùn)動(dòng)程序都要在上述各數(shù)組基礎(chǔ)上完成。 由于安裝的對(duì)稱(chēng)性,左右舵機(jī)實(shí)現(xiàn)向前后、向內(nèi)外所需輸入的值是正好相反的。 利用 PSCI 軟件,進(jìn)行步態(tài)規(guī)劃,得到表 值。 關(guān)節(jié)號(hào)(數(shù)組號(hào)) 初始 抬腿 前擺 下落 后擺 0( 0) 900 +0 150 +0 +150 1( 1) 755 +150 +0 150 +0 2( 2) 785 +150 向內(nèi) +0 150 +0 3( 6) 655 +0 150 +0 +150 4( 4) 810 +150 +0 150 +0 33 5( 5) 820 +150 +0 150 +0 6( 6) 680 +0 150 +0 +150 7( 7) 715 +150 +0 150 +0 8( 8) 920 +150 +0 150 +0 31( 9) 645 +0 +150 +0 150 30( 10) 750 150 +0 +150 +0 29( 11) 715 150 向內(nèi) +0 +150 +0 28( 12) 785 +0 +150 +0 150 27( 13) 750 150 +0 +150 +0 26( 14) 755 150 +0 +150 +0 25( 15) 890 +0 +150 +0 150 24( 16) 825 150 +0 +150 +0 23( 17) 815 150 +0 +150 +0 表 機(jī)器人行走舵機(jī)值 表 中,第一列每三個(gè)一組,分別對(duì)應(yīng)腳 6,括號(hào)中為使編程方便,提示的 channelno 數(shù)組號(hào)數(shù)。從表中就可清晰地看出,左右腳的舵機(jī)恰好是反向的。 為使編程方便,可以新建四個(gè)數(shù)組: raiseposi[18] 、 lowerposi[18] 、 forwardposi[18]、 backwardposi[18],用以存儲(chǔ)表后四列的值,可直接賦值,但為了程序可以拓展,可按下面的程序進(jìn)行賦值: void Calculateposi(void) { int i,j=0。 for(i=0。i18。i++) { j = channelno[i]。 switch(j) { case 0: case 3: 34 case 6: raiseposi[i] = initposi1[i]。 lowerposi[i] = initposi1[i]。 forwardposi[i] = initposi1[i]Stride。 backwardposi[i] = initposi1[i]+Stride。 break。 case 25: case 28: case 31: raiseposi[i] = initposi1[i]。 lowerposi[i] = initposi1[i]。 forwardposi[i] = initposi1[i]+Stride。 backwardposi[i] = initposi1[i]Stride。 break。 case 1: case 2: case 4: case 5: case 7: case 8: raiseposi[i] = initposi1[i]+Stride*2。 lowerposi[i] = initposi1[i]Stride*2。 forwardposi[i] = initposi1[i]。 backwardposi[i] = initposi1[i]。 break。 default: raiseposi[i] = initposi1[i]Stride*2。 35 lowerposi[i] = initposi1[i]+Stride*2。 forwardposi[i] = initposi1[i]。 backwardposi[i] = initposi1[i]。 break。 } }} 此程序較為簡(jiǎn)單,在此不再贅述。要提到的是,也可用 if 語(yǔ)句書(shū)寫(xiě),同時(shí)給函數(shù)提供數(shù)組變量,可使程序功能更為強(qiáng)大。 在此基礎(chǔ)上,便可開(kāi)始步態(tài)編程了。 三腳步態(tài) 三腳步態(tài)即三只腳落地,三只腳懸空運(yùn)動(dòng)。 按 圖 中所示, 以前進(jìn)程序?yàn)槔?,具體行走路徑為: 首先 , 5 腳抬起, 6 腳著地; 然后, 5 腳前邁; 再接著, 5 腳落地; 最后, 5 腳向后緩慢運(yùn)動(dòng),同時(shí) 6 腳抬起。 其中前三步所花時(shí)間與最后一步所花時(shí)間相等。如此往復(fù),機(jī)器人便能向前運(yùn)動(dòng)了。而機(jī)器人運(yùn)動(dòng)的原理與人行走是一致的,靠的是地面摩擦力,這就是為什么當(dāng)腳著地并向后運(yùn)動(dòng)時(shí),機(jī)器人卻向前運(yùn)動(dòng)。 對(duì)于后退,只要將步驟中的前邁改為后退,向后緩慢運(yùn)動(dòng)改為向前運(yùn)動(dòng)即可。 在編寫(xiě)三腳步態(tài)前,同樣先聲明幾個(gè)輔助數(shù)組,用以存儲(chǔ)舵機(jī)端口號(hào),簡(jiǎn)化編程,如下: tri135no[9] = {1,2,7,8,13,14,0,6,12}。 tri246no[9] = {4,5,10,11,16,17,3,9,15}。 數(shù)組不是直接存儲(chǔ)的舵機(jī)端口號(hào),而是對(duì)應(yīng)與 channelno[]數(shù)組的數(shù)組號(hào)。 下面是前進(jìn)程序的編寫(xiě): void triforward(int time) { int i,j,k,l=0。 36 for(i=0。itime。i++) { for(j=0。j6。j++) // 5腳上抬 { k=tri135no[j]。 //獲取數(shù)組序號(hào) l=channelno[k]。 //獲取端口號(hào) SendPacket(s, l, raiseposi[k])。 } delay_ms(Delayms)。 for(j=6。j9。j++) // 5腳前進(jìn) { k=tri135no[j]。 l=channelno[k]。 SendPacket(s, l, forwardposi[k])。 } delay_ms(Delayms)。 for(j=0。j6。j++) // 5腳下降至初位 { k=tri135no[j]。 l=channelno[k]。 SendPacket(s, l, initposi1[k])。 } delay_ms(Delayms)。 for(j=6。j9。j++) // 5腳后退至初位 { k=tri135no[j]。 l=channelno[k]。 SendPacket(s*3, l, backwardposi[k])。 } 注: 6腳與 5類(lèi)似,略去 。 }
點(diǎn)擊復(fù)制文檔內(nèi)容
公司管理相關(guān)推薦
文庫(kù)吧 www.dybbs8.com
備案圖鄂ICP備17016276號(hào)-1