智能家居設(shè)計(jì)-智能掃地機(jī)器人-_第1頁
智能家居設(shè)計(jì)-智能掃地機(jī)器人-_第2頁
智能家居設(shè)計(jì)-智能掃地機(jī)器人-_第3頁
智能家居設(shè)計(jì)-智能掃地機(jī)器人-_第4頁
智能家居設(shè)計(jì)-智能掃地機(jī)器人-_第5頁
已閱讀5頁,還剩32頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、智能家居設(shè)計(jì)-智能掃地機(jī)器人智能家居設(shè)計(jì)-智能掃地機(jī)器人摘要智能掃地機(jī)器人是目前科技爭(zhēng)辯領(lǐng)域的大熱門項(xiàng)目,爭(zhēng)辯的成果是利用效率高的人工智能清掃代替以往效率低下而且時(shí)間成本高的手工勞動(dòng)。本論文以國(guó)內(nèi)外的路徑規(guī)劃算法為參考,以便捷的使用、低成本、良好的牢靠性等為論文的原則,最終設(shè)計(jì)一款符合市場(chǎng)的需求、有用性強(qiáng)的智能掃地機(jī)器人。智能掃地機(jī)器人要具有精確以及準(zhǔn)時(shí)的回避障礙物的力量這一功能。在此,本文利用了 STM32F407VET6 單片機(jī)作為把握器,通過 C610 無刷電機(jī)調(diào)速器對(duì)無刷電機(jī)把握,自行設(shè)計(jì)硬件電路,在數(shù)字 PID 算法的和隨機(jī)掩蓋法的把握策略下完成路徑清潔任務(wù)。本論文智能掃地機(jī)器人外配

2、4 個(gè)超聲波傳感器進(jìn)行避障測(cè)距,從而完成避障系統(tǒng)的設(shè)計(jì)。該論文智能掃地機(jī)器人結(jié)構(gòu)輕快,攜帶便利,能夠自主的完成清潔任務(wù),相較于市場(chǎng)上上千元的智能掃地機(jī)器人,本論文的智能掃地機(jī)器人顯得性價(jià)比更高。在人們?nèi)粘5木蛹疑钪心軌蚱鹬裢獗憬莸慕巧?,給人們帶來便利。關(guān)鍵詞:路徑規(guī)劃;機(jī)器人;傳感器;Intelligent home furnishing design intelligent sweeping robotAbstractIntelligent sweeping robot is a hot research project in the field of science and techn

3、ology. The research result is to replace the low efficiency and high time cost manual labor with high efficiency artificial intelligence sweeping. This paper takes the path planning algorithm at home and abroad as a reference, and takes convenient use, low cost,good reliability as the principle of t

4、he paper, and finally designs an intelligent sweeping robot which meets the market demand and has strong practicability.Intelligent sweeping robot should have the ability of avoiding obstacles accurately and timely. In this paper, stm32f407vet6single-chip microcomputer isused as the controller to co

5、ntrol the BLDCM through c610 BLDCM governor, and the hardware circuit is designed by ourselves. The path cleaning task is completed under the control strategy of digital PID algorithm and random covering method. In this paper, the intelligent sweeping robot is equipped with four ultrasonic sensors f

6、or obstacle avoidance ranging, so as to complete the design of obstacle avoidance system.Compared with thousands of intelligent sweeping robots in the market, the intelligent sweeping robot in this paper is more cost-effective. It can play a very convenient role in peoples daily home life and bring

7、convenience to people.Keywords:Path planning; robot; sensor;目錄 HYPERLINK l _TOC_250018 前言1 HYPERLINK l _TOC_250017 智能掃地機(jī)器人在國(guó)內(nèi)外的進(jìn)展1智能掃地機(jī)器人進(jìn)展前景與趨勢(shì)2設(shè)計(jì)任務(wù)與要求3 HYPERLINK l _TOC_250016 系統(tǒng)總體方案3 HYPERLINK l _TOC_250015 系統(tǒng)避障原理3 HYPERLINK l _TOC_250014 系統(tǒng)方案設(shè)計(jì)4 HYPERLINK l _TOC_250013 CAN 通信5 HYPERLINK l _TOC_2

8、50012 CAN 通信的介紹5 HYPERLINK l _TOC_250011 CAN 通信的原理5 HYPERLINK l _TOC_250010 CAN 通信的特點(diǎn)6系統(tǒng)硬件設(shè)計(jì)6電源電路設(shè)計(jì)6 HYPERLINK l _TOC_250009 傳感器的介紹7 HYPERLINK l _TOC_250008 超聲波傳感器的介紹7BIM088 的介紹8 HYPERLINK l _TOC_250007 軟件設(shè)計(jì)8 HYPERLINK l _TOC_250006 軟件開發(fā)環(huán)境的介紹8 HYPERLINK l _TOC_250005 PID 算法8 HYPERLINK l _TOC_250004

9、FreeRTOS 的介紹9 HYPERLINK l _TOC_250003 軟件的程序?qū)崿F(xiàn)9 HYPERLINK l _TOC_250002 5 結(jié)論12 HYPERLINK l _TOC_250001 參考文獻(xiàn)13致謝14 HYPERLINK l _TOC_250000 附錄15前言近年來,科學(xué)技術(shù)的高速進(jìn)展,人們的目光漸漸的移到人工智能方面的爭(zhēng)辯,也正由于這樣,智能機(jī)器人的爭(zhēng)辯也被人們?cè)絹碓降氖苤匾暎渲邪ㄖ悄軖叩貦C(jī)器人也正在漸漸的漸漸步入人們的日常生活中來。在現(xiàn)在的 21 世紀(jì)初,國(guó)內(nèi)的生活水平不斷的提高以及生活節(jié)奏不斷的加快,智能掃地機(jī)機(jī)器人原本只是在歐美市場(chǎng)上存在的,但是由于國(guó)內(nèi)需

10、求不斷的擴(kuò)大,開頭漸漸的涌入國(guó)內(nèi),也漸漸地被人們所接受;可以預(yù)見,智能掃地機(jī)器人將來會(huì)像電視機(jī)洗衣機(jī)等其他普一般通的家用電器一樣成為每個(gè)家庭的必備家用電器,智能掃地機(jī)器人也會(huì)朝著更加智能化的進(jìn)展,甚至?xí)诓痪玫膶頋u漸的代替人工清潔。在各種場(chǎng)所開頭融入智能掃地機(jī)器人的現(xiàn)在,市場(chǎng)上對(duì)其提出了性價(jià)比,使用便利,安全牢靠等的新要求,因此本論文設(shè)計(jì)一款符合理論而已有能迎合市場(chǎng)需要的智能掃地機(jī)器人有著重大的意義。智能掃地機(jī)器人在國(guó)內(nèi)外的進(jìn)展瑞典伊萊克斯三葉蟲專業(yè)家電制造商于 1997 年制造了第一代掃地機(jī)器人,他們將單滾刷及無邊刷的設(shè)計(jì)安裝在機(jī)器的后部,這臺(tái)第一代掃地機(jī)器人具有當(dāng)它沒有電能時(shí)可以自動(dòng)回充

11、的功能,而已還具有防止跌落的功能。不過它并不是十全十美,它當(dāng)時(shí)的運(yùn)算速度和反應(yīng)速度以及機(jī)器前行速度都相當(dāng)?shù)穆?,以至于清潔起來的效率什么低下。第一代的掃地機(jī)器人的厚度設(shè)計(jì)格外不合理,以至于它無法深化很多家具底部進(jìn)行清潔。第一代的掃地機(jī)器人的價(jià)格是格外的昂揚(yáng),令很多的消費(fèi)者望而卻步,所以第一代掃地機(jī)器人的關(guān)注熱度很低。2001 年誕生于英國(guó)黑科技公司 Dyson(戴森)的一款名為 DC06 的掃地機(jī)器人,由于其精致的造工,使用了眾多價(jià)格昂貴的傳感器和處理性能優(yōu)越的計(jì)算機(jī),即使這臺(tái)掃地機(jī)器人具有強(qiáng)大的清潔功能和精準(zhǔn)的探測(cè)功能,自始至終都不能夠推向市場(chǎng)面對(duì)大眾,上市的話或許估量要賣人民幣 20000

12、元。雖然第一代的產(chǎn)品的有著很大的不足,但是第一代的產(chǎn)品它也算是一種跨時(shí)代的產(chǎn)品,時(shí)至今日,第一代的掃地機(jī)器熱還影響著不少的現(xiàn)在的掃地機(jī)器人,而且第一代掃地機(jī)器人的部分技術(shù)至今而然沿用。從前只是一家設(shè)計(jì)天空探測(cè)、排爆、戰(zhàn)地救援、安保等不同機(jī)器人的一家美國(guó)科技公司 iRobot,這家公司在 2002 做出了一個(gè)大膽的打算,他們打算從軍用型機(jī)器人設(shè)計(jì)轉(zhuǎn)型到家用型機(jī)器人設(shè)計(jì)。于此,它們?cè)?2002 年設(shè)計(jì)生產(chǎn)出了第一臺(tái)自己的掃地機(jī)器人 Roomba,讓人萬萬沒想到的是,當(dāng)時(shí)只是生產(chǎn)了 15000 臺(tái)的 iRobot 通過發(fā)布會(huì)的成功舉辦,一下子把10000 多臺(tái)掃地機(jī)器人出售出去。發(fā)布會(huì)的成本也在示意

13、著他們市場(chǎng)的猛烈的需求,在這一年的圣誕節(jié)追加生產(chǎn)了50000 臺(tái)掃地機(jī)器人,并且都全部賣了出去,這一系列的成功,開啟了掃地機(jī)器人的進(jìn)展爆發(fā)的階段。2010 年誕生于美國(guó)加州硅谷的一家公司 Neato 的 Neato XV-11,是 Neato 公司制造的第一臺(tái)掃地機(jī)器人,這臺(tái)掃地機(jī)器人具有識(shí)別整個(gè)房子結(jié)構(gòu)的功能,而且還能用最短的時(shí)間和最短的路勁完成清潔任務(wù)。Neato 公司推出的這臺(tái)掃地機(jī)器人可謂具有劃時(shí)代的代表意義,象征著掃地機(jī)器人智能時(shí)代真正的開啟。2010 年至今,越來越多的公司進(jìn)入智能掃地機(jī)器人市場(chǎng),它們?yōu)橹悄軖叩貦C(jī)器人市場(chǎng)投入了大量的資源,也因此增大了行業(yè)間的競(jìng)爭(zhēng),大力推動(dòng)了智能掃地

14、機(jī)人的技術(shù)創(chuàng)新,到目前為止,國(guó)內(nèi)除了臺(tái)灣Proscenic 外,大陸蘇州怡凱電器推出的智能掃地機(jī)器人也取得良好的成果。智能掃地機(jī)器人的進(jìn)展前景與趨勢(shì)我們可以想象在不久的將來,我們的每個(gè)人的家庭都會(huì)擁有像智能掃地機(jī)器人這樣的一般的家電一樣的家庭必要幫手。智能掃地機(jī)器人在將來也會(huì)朝著越來越智能化的發(fā)展的道路前進(jìn),信任在不久的將來可以漸漸的代替人類來完成清潔工作,解放人類的雙手。智能掃地機(jī)器人漸漸進(jìn)入人們的眼瞼,在人群中受到廣泛的歡迎,但是智能掃地機(jī)器人在人們的使用過程中仍舊暴露出了很多的問題和缺陷。例如,會(huì)重復(fù)清掃同一個(gè)地方,掃地機(jī)器人高度過高,無法進(jìn)入桌底清掃,掃地機(jī)器人完成清潔任務(wù)需要消耗幾個(gè)

15、小時(shí)甚至跟多的時(shí)間,掃地機(jī)器人消耗完電池都沒能完成清潔任務(wù)等等問題。特殊是良好的路徑規(guī)劃方案缺少和價(jià)格普遍偏高這兩個(gè)問題更是阻礙了其進(jìn)一步 應(yīng)用。在智能掃地機(jī)器人步入人們的生活場(chǎng)所的同時(shí),設(shè)計(jì)一款性價(jià)比高、使用便攜、牢靠性高的智能掃地機(jī)器人具有重大的意義。設(shè)計(jì)任務(wù)掃地機(jī)器人在工作的環(huán)境當(dāng)中無時(shí)無刻要面對(duì)的是簡(jiǎn)單的環(huán)境,所以良好的路徑規(guī)劃算法是推斷一個(gè)掃地機(jī)器人的標(biāo)準(zhǔn)。本論文的掃地機(jī)器人主要解決高重復(fù)率、時(shí)效性低低、掩蓋率低的問題,所以在查找國(guó)內(nèi)外文獻(xiàn)的時(shí)候主要以如何解決重復(fù)率、時(shí)效性、掩蓋率的問題。分析了現(xiàn)有的智能機(jī)器人的各種的路徑規(guī)劃算法,分析了它們的優(yōu)點(diǎn)和缺點(diǎn),想到當(dāng)前市場(chǎng)上的智能掃地機(jī)器

16、人存在清掃隨機(jī)盲目、并沒有設(shè)計(jì)良好的路徑規(guī)劃的現(xiàn)象。所以打算從掃地機(jī)器人工作環(huán)境的實(shí)際狀況為著落點(diǎn),從掃地機(jī)器人的工作環(huán)境的總體和局部這兩個(gè)方面動(dòng)身,爭(zhēng)辯出一種有效牢靠的路徑規(guī)劃算法,不單單能夠?qū)δ壳耙延械穆窂揭?guī)劃算法取其精華去其糟粕,還能夠依據(jù)實(shí)際的工作環(huán)境的信息進(jìn)行更深層次的優(yōu)化。爭(zhēng)辯一種能夠?qū)φ系K物準(zhǔn)時(shí)精確牢靠的回避、推斷前方物體是障礙物還是墻壁、適應(yīng)各種障礙物的避障算法。爭(zhēng)辯了國(guó)內(nèi)外智能掃地機(jī)器人的機(jī)械結(jié)構(gòu)構(gòu)造,參考國(guó)內(nèi)外智能掃地機(jī)器人的設(shè)計(jì)原理和學(xué)習(xí)相關(guān)的設(shè)計(jì)理論。本論文要求基于STM32 單片機(jī)設(shè)計(jì)智能掃地機(jī)器人,協(xié)作外接多種傳感器接過數(shù)據(jù)處理和采集信息,設(shè)計(jì)硬件電路驅(qū)動(dòng)電機(jī)以使機(jī)

17、器人完成清潔任務(wù)。系統(tǒng)總體方案系統(tǒng)避障原理在智能掃地機(jī)器人的實(shí)際工作環(huán)境中,智能掃地機(jī)器人在完成它的清潔任務(wù)的過程當(dāng)中無疑要面對(duì)很多的障礙物,這個(gè)時(shí)候考驗(yàn)一個(gè)智能掃地機(jī)器人的力量的就看它能否順當(dāng)?shù)亩惚苷系K物,這是衡量機(jī)器的一個(gè)標(biāo)準(zhǔn)。但是這里也有一個(gè)難題需要處理,怎樣推斷前方消滅的是墻壁還是障礙物呢?智能掃地機(jī)器人在清潔工作的過程中遇到的障礙物的外形并不是都是一樣的, 所以我們把全部的障礙物統(tǒng)一認(rèn)為是規(guī)章的法規(guī)來處理。這項(xiàng)處理的功能建立在掃地機(jī)器人外部安裝的超聲波傳感器。掃地機(jī)器人身上共安裝了三個(gè)超聲波測(cè)距傳感器,機(jī)身前部,即頭部的超聲波傳感器用來確定停止的位置,左右兩側(cè)的超聲波傳感器用來確定繞

18、線位置。掃地機(jī)器人工作環(huán)境可以視為是一個(gè)二維的片面圖形,它和障礙物之間的距離可以用 L 來表示。掃地機(jī)器人跟障礙物的轉(zhuǎn)彎值為k。L2k 按當(dāng)前速度走, kL2k 速度為 k/L,Lk 避障轉(zhuǎn)彎。在機(jī)器人繞開物體避障過程中,依據(jù)弧長(zhǎng)和角度的關(guān)系:(|h1-h2|= *|R-r| );(2-1)|R-r| 為機(jī)器人左右兩輪之間的間隔, h1、h2 分別為兩輪的編碼器的值,則可求得, 掃地機(jī)器人則依據(jù)原來的程序連續(xù)執(zhí)行,連續(xù)執(zhí)行從前的清潔任務(wù),也可以用此公式為回位數(shù)據(jù)。假設(shè)機(jī)器人單向行駛完一次需行走的長(zhǎng)度為m,當(dāng)超聲波傳感器感應(yīng)到前方有物體時(shí),機(jī)器人以及行駛的的距離為n1,超聲波傳感器傳回的數(shù)據(jù)并且

19、處理得到的距離為 n2,假如 n1+n2 TIM9_CH1 PE6- TIM9_CH2*/void LED_Init(void)TIM_OC_InitTypeDef sConfigOC; TIM_HandleTypeDef htim9;htim9.Instance = TIM9; htim9.Init.Prescaler = 168-1;htim9.Init.CounterMode = TIM_COUNTERMODE_UP; htim9.Init.Period = 1000;/1000ms htim9.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; H

20、AL_TIM_PWM_Init(&htim9);sConfigOC.OCMode = TIM_OCMODE_PWM1; sConfigOC.Pulse = 0;sConfigOC.OCPolarity = TIM_OCPOLARITY_LOW;HAL_TIM_PWM_ConfigChannel(&htim9, &sConfigOC, TIM_CHANNEL_1); HAL_TIM_PWM_ConfigChannel(&htim9, &sConfigOC, TIM_CHANNEL_2);HAL_TIM_PWM_Start(&htim9,TIM_CHANNEL_1);/ HAL_TIM_PWM_S

21、tart(&htim9,TIM_CHANNEL_2);/* TIM4 init function */void TIM4_Init(void)/TIM_OC_InitTypeDef sConfigOC; TIM_HandleTypeDef htim4;htim4.Instance = TIM4; htim4.Init.Prescaler = 84-1;htim4.Init.CounterMode = TIM_COUNTERMODE_UP; htim4.Init.Period = 20000;/20ms htim4.Init.ClockDivision = TIM_CLOCKDIVISION_D

22、IV1; HAL_TIM_PWM_Init(&htim4);/1900 2620 2250sConfigOC.OCMode = TIM_OCMODE_PWM1; sConfigOC.Pulse = 2250;sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; HAL_TIM_PWM_ConfigChannel(&htim4, &sConfigOC, TIM_CHANNEL_1);HAL_TIM_PWM_MspInit(&htim4); HAL_TIM_PWM_Start(&htim4,TIM_CHANNEL_1);void HAL_TIM_PWM_MspIn

23、it(TIM_HandleTypeDef *htim) HAL_RCC_TIM4_CLK_ENABLE(); HAL_RCC_TIM9_CLK_ENABLE();GPIO_InitTypeDef GPIO_InitStruct; if(htim-Instance=TIM4)/*TIM4 GPIO Configuration PD12 TIM4_CH1PD13- TIM4_CH2PD14- TIM4_CH3PD15- TIM4_CH4*/ HAL_RCC_GPIOD_CLK_ENABLE();GPIO_InitStruct.Pin = GPIO_PIN_12; GPIO_InitStruct.M

24、ode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_PULLUP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; GPIO_InitStruct.Alternate = GPIO_AF2_TIM4; HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);else if(htim-Instance=TIM9)/*TIM9 GPIO ConfigurationPE5- TIM9_CH1 PE6- TIM9_CH2*/ HAL_RCC_GPIOE_CLK_ENABLE();GPIO_

25、InitStruct.Pin = GPIO_PIN_5|GPIO_PIN_6; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_PULLUP; GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;GPIO_InitStruct.Alternate = GPIO_AF3_TIM9; HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);/void GREEN_LED(uint16_t bright)TIM9-CCR1 = bright;/void RED_L

26、ED(uint16_t bright)TIM9-CCR2 = bright;/*狀態(tài)燈*/*串口通信*/ #include usart1.h#include stm32f4xx_hal.h/,printf,use MicroLIB/#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f) #if 1#pragma import( use_no_semihosting)/ struct FILEint handle;FILE stdout;/_sys_exit() void _sys_exit(int x)x = x;/fputcint fputc

27、(int ch, FILE *f)while(USART1-SR&0X40)=0);/-, USART1-DR = (uint8_t) ch;return ch;#endifUART_HandleTypeDef huart1;DMA_HandleTypeDefUART2RxDMA_Handler; DMA_HandleTypeDefUART4RxDMA_Handler;/void USART1_Init(void)huart1.Instance = USART1; huart1.Init.BaudRate = 115200;huart1.Init.WordLength = UART_WORDL

28、ENGTH_8B; huart1.Init.StopBits = UART_STOPBITS_1; huart1.Init.Parity = UART_PARITY_NONE; huart1.Init.Mode = UART_MODE_TX_RX; huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;HAL_UART_Init(&huart1);/void HAL_UART_MspInit(UART_HandleTypeDef* uartHandle)GPIO_InitTypeDef GPIO_InitStruct; if(uartHandle-Instan

29、ce=USART1) HAL_RCC_GPIOA_CLK_ENABLE(); HAL_RCC_USART1_CLK_ENABLE();/* PA9 USART1_TXPA10 USART1_RX */GPIO_InitStruct.Pin = GPIO_PIN_9 | GPIO_PIN_10; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_PULLUP; GPIO_InitStruct.Speed = GPIO_SPEED_FAST; GPIO_InitStruct.Alternate = GPIO_AF

30、7_USART1; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);else if(uartHandle-Instance=USART2)/ HAL_RCC_USART2_CLK_ENABLE(); HAL_RCC_DMA1_CLK_ENABLE(); HAL_RCC_GPIOD_CLK_ENABLE();/* PD5 USART2_TXPD6 USART2_RX */GPIO_InitStruct.Pin = GPIO_PIN_6; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GP

31、IO_PULLUP; GPIO_InitStruct.Speed = GPIO_SPEED_FAST; GPIO_InitStruct.Alternate = GPIO_AF7_USART2; HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);/RX UART2RxDMA_Handler.Instance=DMA1_Stream5;UART2RxDMA_Handler.Init.Channel=DMA_CHANNEL_4;UART2RxDMA_Handler.Init.Direction = DMA_PERIPH_TO_MEMORY; UART2RxDMA_Hand

32、ler.Init.PeriphInc = DMA_PINC_DISABLE; UART2RxDMA_Handler.Init.MemInc = DMA_MINC_ENABLE; UART2RxDMA_Handler.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE; UART2RxDMA_Handler.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE; UART2RxDMA_Handler.Init.Mode = DMA_CIRCULAR; UART2RxDMA_Handler.Init.Priority =

33、DMA_PRIORITY_LOW; UART2RxDMA_Handler.Init.FIFOMode = DMA_FIFOMODE_DISABLE;HAL_DMA_Init(&UART2RxDMA_Handler); HAL_LINKDMA(uartHandle,hdmarx,UART2RxDMA_Handler);HAL_NVIC_SetPriority(USART2_IRQn, 5, 0); HAL_NVIC_EnableIRQ(USART2_IRQn);/USART2else if(uartHandle-Instance=UART4) HAL_RCC_UART4_CLK_ENABLE()

34、; HAL_RCC_DMA1_CLK_ENABLE(); HAL_RCC_GPIOA_CLK_ENABLE();/* PA0 UART4_TXPA1 UART4_RX */GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_PULLUP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; GPIO_InitStruct.Alternate = GPIO_AF8_UART4; HAL

35、_GPIO_Init(GPIOA, &GPIO_InitStruct);/RX UART4RxDMA_Handler.Instance=DMA1_Stream2;UART4RxDMA_Handler.Init.Channel=DMA_CHANNEL_4;UART4RxDMA_Handler.Init.Direction = DMA_PERIPH_TO_MEMORY; UART4RxDMA_Handler.Init.PeriphInc = DMA_PINC_DISABLE; UART4RxDMA_Handler.Init.MemInc = DMA_MINC_ENABLE; UART4RxDMA_

36、Handler.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE; UART4RxDMA_Handler.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE; UART4RxDMA_Handler.Init.Mode = DMA_CIRCULAR; UART4RxDMA_Handler.Init.Priority = DMA_PRIORITY_LOW; UART4RxDMA_Handler.Init.FIFOMode = DMA_FIFOMODE_DISABLE;HAL_DMA_Init(&UART4RxDMA_H

37、andler); HAL_LINKDMA(uartHandle,hdmarx,UART4RxDMA_Handler);HAL_NVIC_SetPriority(UART4_IRQn, 5, 0); HAL_NVIC_EnableIRQ(UART4_IRQn);/-void Ni_Ming(uint8_t fun,float Pid_ref1,float Pid_ref2,float Pid_ref3,float Pid_ref4)uint8_t send_buf21; unsigned char *p1,*p2,*p3,*p4; p1=(unsigned char *)&Pid_ref1;p2

38、=(unsigned char *)&Pid_ref2; p3=(unsigned char *)&Pid_ref3; p4=(unsigned char *)&Pid_ref4;send_buf0=0XAA; / send_buf1=0XAA; / send_buf2=fun;/ send_buf3=16;/send_buf4=(unsigned char)(*(p1+3); send_buf5=(unsigned char)(*(p1+2); send_buf6=(unsigned char)(*(p1+1); send_buf7=(unsigned char)(*(p1+0);send_

39、buf8=(unsigned char)(*(p2+3); send_buf9=(unsigned char)(*(p2+2); send_buf10=(unsigned char)(*(p2+1); send_buf11=(unsigned char)(*(p2+0); send_buf12=(unsigned char)(*(p3+3); send_buf13=(unsigned char)(*(p3+2); send_buf14=(unsigned char)(*(p3+1);send_buf15=(unsigned char)(*(p3+0);send_buf16=(unsigned

40、char)(*(p4+3); send_buf17=(unsigned char)(*(p4+2); send_buf18=(unsigned char)(*(p4+1); send_buf19=(unsigned char)(*(p4+0);send_buf20=0;for(uint8_t i=0;i20;i+)send_buf20+=send_bufi;/ for(uint8_t i=0;iDR=send_bufi;/*串口通信*/*can 通信*/ #include can_receive.h#include stm32f4xx_hal.h/tof/static tof_can_data

41、_t tof_data;/static gyro_info_t gyro_info;/static motor_measure_t motor_chassis8;/CANvoid HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *hcan)if(hcan = (&hcan1)uint8_t Data8; CAN_RxHeaderTypeDef RxMeg; HAL_StatusTypeDefHAL_RetVal;HAL_RetVal = HAL_CAN_GetRxMessage(&hcan1, CAN_RX_FIFO0, &RxMeg,

42、Data); if(HAL_OK=HAL_RetVal)switch (RxMeg.StdId)case CAN_3508_M1_ID: case CAN_3508_M2_ID:case CAN_3508_M3_ID: case CAN_3508_M4_ID: case CAN_3508_M5_ID: case CAN_3508_M6_ID: case CAN_3508_M7_ID: case CAN_3508_M8_ID:static uint8_t i = 0;/IDi = RxMeg.StdId - 0 x201;/ get_motor_measuer(&motor_chassisi,

43、Data, RxMeg.StdId); break;default:break;if(hcan = (&hcan2)uint8_t Data8; CAN_RxHeaderTypeDef RxMeg; HAL_StatusTypeDefHAL_RetVal;HAL_RetVal = HAL_CAN_GetRxMessage(&hcan2, CAN_RX_FIFO0, &RxMeg, Data); if(HAL_OK=HAL_RetVal)switch (RxMeg.StdId)case 101:static int16_t pitch_connt = 0; static int16_t raw_

44、pit,raw_v_z = 0;static float pitch_angle, last_pitch_angle = 0; raw_v_z = Data28 | Data3;raw_pit = Data48 | Data5;/- gyro_info.v_z = (float)raw_v_z * 0.057295f;/-100pitch_angle = (float)raw_pit/100;/pit if(pitch_angle 330)pitch_connt-;else if(pitch_angle - last_pitch_angle) -330) pitch_connt+;gyro_i

45、nfo.pit = pitch_angle + pitch_connt * 360; last_pitch_angle = pitch_angle;break;case 0 x300:/if(Data08 | Data1) 1000)/tof_data.dis_r = Data08 | Data1;/if(Data28 | Data3) 1000)/tof_data.dis_l = Data28 | Data3; break;case 0 x401:gyro_info.yaw=0.01f*(int32_t)(Data024)|(int32_t)(Data116)| (int32_t)(Data

46、2last_ecd = ptr-ecd;ptr-ecd= Data0 speed_rpm = (uint16_t)(Data2 ecd - ptr-last_ecd 4096)ptr-round_cnt-;ptr-ecd_raw_rate = ptr-ecd - ptr-last_ecd - 8192;else if (ptr-ecd - ptr-last_ecd round_cnt+;ptr-ecd_raw_rate = ptr-ecd - ptr-last_ecd + 8192;elseptr-ecd_raw_rate = ptr-ecd - ptr-last_ecd;int32_t te

47、mp_sum = 0;ptr-rate_bufptr-buf_cut+ = ptr-ecd_raw_rate; if (ptr-buf_cut = 5)ptr-buf_cut = 0;for (uint8_t i = 0; i rate_bufi;ptr-last_filter_rate = ptr-filter_rate; ptr-filter_rate = (int32_t)(temp_sum/5);ptr-total_ecd = ptr-round_cnt * 8192 + ptr-ecd - ptr-offset_ecd;/* total angle, unit is degree *

48、/ptr-angle = ptr-total_ecd / (8192.0f/360.0f*19.0f);/void CAN_CMD_CHASSIS(int16_t motor1, int16_t motor2, int16_t motor3, int16_t motor4)uint8_t Data8; uint32_t pTxMailbox;CAN_TxHeaderTypeDef TxMeg;TxMeg.StdId = CAN_CHASSIS_ALL_ID; TxMeg.IDE = CAN_ID_STD;TxMeg.RTR = CAN_RTR_DATA; TxMeg.DLC = 0 x08;D

49、ata0 = motor1 8; Data1 = motor1; Data2 = motor2 8; Data3 = motor2; Data4 = motor3 8; Data5 = motor3; Data6 = motor4 8; Data7 = motor4;HAL_CAN_AddTxMessage(&hcan1, &TxMeg, Data, &pTxMailbox);/void CAN_CMD_LIFT(int16_t motor1, int16_t motor2, int16_t motor3, int16_t motor4)uint8_t Data8; uint32_t pTxM

50、ailbox;CAN_TxHeaderTypeDef TxMeg;TxMeg.StdId = 0 x1ff; TxMeg.IDE = CAN_ID_STD; TxMeg.RTR = CAN_RTR_DATA; TxMeg.DLC = 0 x08;Data0 = motor1 8; Data1 = motor1; Data2 = motor2 8; Data3 = motor2; Data4 = motor3 8; Data5 = motor3; Data6 = motor4 8; Data7 = motor4;HAL_CAN_AddTxMessage(&hcan1, &TxMeg, Data,

51、 &pTxMailbox);/ID100;mode:0 x30time1000ms void CAN_CMD_GYRO_CALI(uint8_t mode, uint16_t time)uint8_t Data8; uint32_t pTxMailbox;CAN_TxHeaderTypeDef TxMeg;TxMeg.StdId = 100; TxMeg.IDE = CAN_ID_STD; TxMeg.RTR = CAN_RTR_DATA; TxMeg.DLC = 0 x03;Data0 = mode;Data1 = time 8;Data2 = time ; Data3 = 0;Data4

52、= 0;Data5 = 0;Data6 = 0;Data7 = 0;/10ms uint32_t tickstart = HAL_GetTick();uint32_t wait = 10;if (wait HAL_MAX_DELAY)wait += (uint32_t)1;while(HAL_GetTick() - tickstart) v_z,0,0,0);/4ms vTaskDelay(2);chassis_high_water = uxTaskGetStackHighWaterMark(NULL);/void chassis_init(chassis_move_t *chassis_in

53、it)if (chassis_init = NULL)return;/PIDconst static float motor_speed_pid3 = 700, 0, 0;/PIDconst static float motor_pos_pid3 = 0, 0, 0;/ for (uint8_t i = 0; i motor_chassisi.chassis_motor_measure = get_Motor_Measure_Point(i);/chassis_init-chassis_RC = get_remote_control_point();/chassis_init-gyro_dat

54、a = get_GYRO_Measure_Point();/tofchassis_init-tof_measure = get_tof_Info_Measure_Point();/PID for (uint8_t i = 0; i motor_speed_pidi, PID_POSITION, motor_speed_pid, 10000, 0);/PID for (uint8_t i= 0; i motor_pos_pidi, PID_POSITION, motor_pos_pid, 0, 0);/ZPIDCHISSIS_PID_Init(&chassis_init-chassis_gryo

55、_pid, 2000, 0, 12, 0, 0);/kp_out ki_out kp ki kd 20 60CHISSIS_PID_Init(&chassis_init-chassis_acc_pid, 60, 0, 0.3, 0, 0);/chassis_init-gyro_angle_start = chassis_init-gyro_data-yaw;/ chassis_feedback_update(chassis_init);/void chassis_feedback_update(chassis_move_t *chassis_update)/PIDchassis_update-

56、motor_chassis0.speed=chassis_update-motor_chassis0.chassis_motor_measure-filter_rate / 19.0f;chassis_update-motor_chassis1.speed=chassis_update-motor_chassis1.chassis_motor_measure-filter_rate / 19.0f;chassis_update-motor_chassis2.speed=chassis_update-motor_chassis2.chassis_motor_measure-filter_rate

57、 / 19.0f;chassis_update-motor_chassis3.speed=chassis_update-motor_chassis3.chassis_motor_measure-filter_rate / 19.0f; chassis_update-vw_mouse = chassis_update-chassis_RC-mouse.x; chassis_update-tof_h = chassis_update-tof_measure-tof_h;/switch(chassis_update-chassis_RC-rc.s0)case 1:chassis_mode = RC_

58、MODE; break;case 3:chassis_mode = KEY_MODE; break;case 2:chassis_mode = STOP_MODE; break;default:break;/if(xTaskGetTickCount() - chassis_update-chassis_RC-time 88)chassis_mode = STOP_MODE;/PIDvoid chassis_control_loop(chassis_move_t *chassis_control)switch(chassis_mode)case RC_MODE:/chassis_control-

59、vx =chassis_control-chassis_RC-rc.ch0 * 60.0f/660.0f; chassis_control-vy =chassis_control-chassis_RC-rc.ch1 * 60.0f/660.0f; chassis_control-vw_offset += chassis_control-chassis_RC-rc.ch2 * 50/660 *0.02; chassis_control-vw_set = chassis_control-vw_offset + chassis_control-gyro_angle_start; break;case

60、 KEY_MODE:/chassis_control-key_time+;/4ms if(chassis_control-chassis_RC-rc.s1 = 1)chassis_control-vy_offset = 12;chassis_control-vx_offset = 12;else if(chassis_control-chassis_RC-key.v & SHIFT)/shitfelsechassis_control-vy_offset = 60;chassis_control-vx_offset = 50;chassis_control-vy_offset = 50;chas

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論