大學(xué)隊技術(shù)分析方案Final_第1頁
大學(xué)隊技術(shù)分析方案Final_第2頁
大學(xué)隊技術(shù)分析方案Final_第3頁
大學(xué)隊技術(shù)分析方案Final_第4頁
大學(xué)隊技術(shù)分析方案Final_第5頁
已閱讀5頁,還剩66頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、第一屆“飛思卡爾”杯全國大學(xué)生智能汽車邀請賽技術(shù)報告附件 B 智能移動小車的開發(fā)與研制學(xué)校:四川大學(xué)隊伍名稱:四川大學(xué)1 隊參賽隊員:楊承凱、鐘鵬、陳果帶隊教師:楊剛I/70II/70關(guān)于技術(shù)報告和研究論文使用授權(quán)的說明本人完全了解第一屆“飛思卡爾”杯全國大學(xué)生智能汽車邀請賽關(guān)保留、使用技術(shù)報告和研究論文的規(guī)定,即:參賽作品著作權(quán)歸參賽者本人,比賽組委會和飛思卡爾半導(dǎo)體公司可以在相關(guān)主頁上收錄并公開參賽作品的設(shè)計方案、技術(shù)報告以及參賽模型車的視頻、圖像資料,并將相關(guān)內(nèi)容編纂收錄在組委會出版論文集中。參賽隊員簽名:楊承凱鐘鵬陳果帶隊教師簽名:楊剛?cè)掌冢?2006-8-5I/70目錄第一章前言 3

2、第二章模型車設(shè)計制作的主要思路以及實現(xiàn)的技術(shù)方案概要說明 2 2.1 檢測機構(gòu) 2普通紅外對管 3帶調(diào)制紅外傳感器3圖像傳感器 32.2控制算法 3第三章模型車機械部分安裝及改造、傳感器的設(shè)計安裝、系統(tǒng)電路板的固定及連接等 43.1機械改動及電路板安裝43.2線陣 CCD圖像傳感器的設(shè)計53.3速度檢測傳感器 8第四章電路設(shè)計說明8第五章 HS12 控制軟件主要理論、算法說明及代碼設(shè)計介紹等 10 5.1 模糊控制器的基本結(jié)構(gòu) 11模糊集合的隸屬函數(shù)12論域 12模糊推理 12第六章開發(fā)工具、制作、安裝、調(diào)試過程說明 20 第七章模型車的主要技術(shù)參數(shù)說明 21結(jié)論 22II/70參考文獻 23

3、附錄 A :源代碼 XXIV附錄 B:智能移動小車的開發(fā)與研制XXVII第一章 前言本智能車采用了紅外光電開關(guān)作為速度檢測單元,線陣CCD圖像傳感器作為引導(dǎo)線檢測單元,模糊控制作為主要控制算法。紅外光電開關(guān)發(fā)出的紅外線受安裝在驅(qū)動電機轉(zhuǎn)軸上的扇頁片切割,通過其兩次跳變信號的時間間隔即可計算出車輪轉(zhuǎn)速; CCD的驅(qū)動信號由外部獨立數(shù)字電路產(chǎn)生,輸出信號由放大比較電路處理后將空間上引導(dǎo)線的位置映射為時間上相應(yīng)時刻的脈沖信號,MCU只需要向 CCD發(fā)出幀同步信號然后檢測輸出脈沖發(fā)生的時間便可以判斷出引導(dǎo)線的位置,軟件消耗極?。荒:刂破饕?CCD視覺中心偏離引導(dǎo)線的誤差和誤差變化率作為輸入量,以舵機

4、轉(zhuǎn)向角作為輸出量,輸入隸屬函數(shù)采用三角形法,輸出隸屬函數(shù)采用脈沖法,由人的駕駛經(jīng)驗和智能車實際運行情況得到模糊規(guī)則,采用 MAX-MIN推理法則得到輸出語言,通過重心法計算出轉(zhuǎn)向角。報告的第一部分介紹模型車設(shè)計制作的主要思路以及實現(xiàn)的技術(shù)方案;第二部分介紹模型車的機械改裝、電路板固定和傳感器的設(shè)計;第三部分介紹模型車主控板的電路設(shè)計說明;第四部分介紹模糊控制的主要理論、算法說明和代碼設(shè)計介紹;第五部分介紹開發(fā)工具、制作、安裝、調(diào)試過程說明;第六部分介紹模型車的主要技術(shù)參數(shù);III / 70第七部分是對設(shè)計的總結(jié)。第二章 模型車設(shè)計制作的主要思路以及實現(xiàn)的技術(shù)方案概要說明智能車是一個集光、機、電

5、于一體的綜合性系統(tǒng),主要包括執(zhí)行機構(gòu)、檢測機構(gòu)和控制器,系統(tǒng)結(jié)構(gòu)如圖 2.1 。執(zhí)行機構(gòu)由大賽統(tǒng)一規(guī)定,本設(shè)計未做任何改裝,現(xiàn)主要考慮的是檢測機構(gòu)和控制算法。圖 2.12.1 檢測機構(gòu)檢測白色背景上黑線的方法很多,主要分為普通紅外對管,帶調(diào)制紅外傳2/70感器, CCD圖像檢測等。普通紅外對管普通紅外對管使用簡單、反應(yīng)快、信號穩(wěn)定、靈敏度好,在智能車前方安裝一排這種對管可以較好的檢測到地面上的引導(dǎo)線,但其檢測距離近,一般有效距離為 5mm-20mm,不能探測到前方賽道信息,在小車高速時通過這種方式檢測到賽道變化再做出反應(yīng)一般來不及,很容易沖出賽道,本設(shè)計中沒有采用此方案。帶調(diào)制紅外傳感器普通紅

6、外對管經(jīng)過調(diào)制 調(diào)制頻率一般為 40K)后可以探測到更遠的距離,但要求反射面垂直,智能車檢測賽道時射線是傾斜反射的,探測距離大打折扣,不過仍然能達到 30cm 左右,本設(shè)計曾采用過此方案,實測中發(fā)現(xiàn)調(diào)制后不同對管之間容易產(chǎn)生干擾,若采用時分方式總體采樣率又太低,故放棄了此方案。圖像傳感器CCD圖像傳感器分為線陣和面陣兩種,由于智能小車只需要檢測黑線的位置,可以不需要面信息,選用了線陣CCD比較合適。 CCD圖像傳感器優(yōu)點在于可以穩(wěn)定的檢測到較遠距離的賽道信息一般在 30cm以上),并且檢測分辨率高,幀采樣頻率也較高 和 12V 電源條件下。在使用 PD3575D設(shè)計線陣 CCD圖像傳感器的過程

7、中有兩個難點。一是驅(qū)動信號的產(chǎn)生,二是輸出信號的處理。PD3575D的驅(qū)動需要四路脈沖 ,分別為轉(zhuǎn)移柵時鐘 IO、復(fù)位時鐘 RO、采樣保持時鐘 SHO和傳輸門時鐘 TG,它們的時序圖如下:5/70圖 3.2在明確了 CCD的驅(qū)動時序后,下面關(guān)心的便是如何產(chǎn)生這四路驅(qū)動信號。有兩種方案:錯誤 ! 由單片機程序產(chǎn)生四路時鐘驅(qū)動信號,這種辦法簡單易行。但實際上是不適用于智能小車系統(tǒng)的。因為驅(qū)動信號的頻率相當高8M),如果用單片機產(chǎn)生這個信號,那幾乎將占用所有的單片機時間,導(dǎo)致無法對信號做出處理和響應(yīng)其他操作。錯誤 ! 由外圍電路直接產(chǎn)生CCD驅(qū)動時鐘,這種辦法比較復(fù)雜,要用計數(shù)器和觸發(fā)器專門設(shè)計一個

8、時序電路因為大賽規(guī)定另外不能用可編程器件),單片機只需要產(chǎn)生一個幀同步信號 模糊控制不依賴于被控對象的精確數(shù)學(xué)模型,僅依賴專家知識和操作者的經(jīng)驗。2 模糊控制具有較強的知識表達能力,可以將專家知識和操作者經(jīng)驗以規(guī)則的形式加以描述和提煉。3模糊控制具有較強的推理功能,經(jīng)過模糊推理可以實現(xiàn)類似與人的決策過程。5.1 模糊控制器的基本結(jié)構(gòu)圖 5.1 為基本模糊控制系統(tǒng),其中 T 為采樣周期; r 為設(shè)定值; y 為被控過程的輸出; e* ,ec* 和 u* 分別為偏差、偏差變化率、控制增量的精確量;A*、B*和 C*分別為 e* , ec* 和 u* 的模糊量; qe 、 qec 和 qu 分別為

9、e* , ec* 和 u* 的量化因子和比例因子。u*quu 被r(kTe*(kT模模糊糊 C*晰控+ec*B*推過化化-理qu程+qece*(kT-T輸入輸出隸屬函數(shù)T圖 5.1模糊控制器基本結(jié)構(gòu)模糊集合的隸屬函數(shù)在人類的思維中,有許多模糊的概念,如大、小、冷、熱等,都沒有明確的內(nèi)涵和外延。只能用模糊集合來描述;有的概念具有清晰的內(nèi)涵和外延,如男人和女人。我們把前者叫做模糊集合,后者叫做普通集合 或經(jīng)典集合)。如果把模糊集合的特征函數(shù)稱為隸屬函數(shù)。記作A (x) ,則A ( x) 表示元素屬于模糊集合A 的程度。隸屬函數(shù)是模糊數(shù)學(xué)中最基本的概念,我們用隸屬函數(shù)來給出模糊集合:在論域U 上的模

10、糊集合A ,由隸屬函數(shù)A (x) 來表征,A ( x) 區(qū)間內(nèi)連續(xù)取值。 A ( x) 的大小反映了元素 x 對于模糊集合 A 的隸屬程度。論域所謂論域,即隸屬函數(shù)輸入量的的變化范圍,一般分為離散論域和連續(xù)論域。離散論域即是說輸入量的變化的離散的,不連續(xù)的,比如我們常說的年齡,通常是按整數(shù)來表示的,從 0 歲到 120 歲,那么它就是一個離散論域;連續(xù)論域即是說輸入量的變化是連續(xù)的,如溫度,從 -30到 80。模糊推理模糊邏輯主要研究模糊推理,模糊推理實際上是從模糊前提出發(fā)按照模糊規(guī)則進行推理,而后得出結(jié)論 也是模糊的)。模糊規(guī)則是模糊推理的依據(jù),這些12/70模糊規(guī)則是人們實際工作中的經(jīng)驗用

11、語言的表達,因此也稱為語言規(guī)則,基本上采用如下三種形式 16 。錯誤 !“如 A 則 B 型”。此種形式可以寫成“ IF A THEN B”的條件語句,例如:“如果土壤干燥則灑水”。錯誤 !“如 A 則 B 否則 C”型。此種形式可以寫成“ IF A THEN B ELSE C ”,例如:“如果土壤干燥則灑水,否則就不灑水”。錯誤 !“如 A 且 B 則 C”型。此種形式可以寫成“ IF A AND B THEN C”,例如:“如果土壤干且氣溫高,則灑水”。以上幾種模糊規(guī)則中,第三種用得最多,尤其是在模糊控制中更是如此。因為在控制過程中,不但要考慮實測值與設(shè)定值之間所形成的誤差,而且還要考慮這

12、個誤差的變化率,一般用A 表示誤差, B 表示誤差變化率, C 表示控制量。輸出清晰化模糊推理的結(jié)果依然是模糊量,這種結(jié)論不能用來控制,因為系統(tǒng)依然不知道控制量到底是多少。因此,必須進行反模糊化,將模糊控制量變?yōu)榫_控制量。反模糊的輸入是前一步模糊規(guī)則的輸出,即輸出變量各語言值的隸屬度,反模糊化的輸出是系統(tǒng)輸出變量的精確輸出值。其過程就是根據(jù)輸出變量的隸屬函數(shù),從輸出變量各語言值的隸屬度求出精確的輸出值的過程。也就是說,反模糊化的過程是在輸出變量隸屬度函數(shù)的圖形中,已知 Y 值求 X 值的過程。這一過程需要用戶提供的數(shù)據(jù)是輸出變量的隸屬函數(shù)。反模糊化有多種方法,最常用的是最大隸屬度法和重心法。

13、錯誤 !最大隸屬度法最大隸屬度法用于要求不高的系統(tǒng),它是選取輸出語言值中隸屬度最大者作為最終語言值。該語言值變化范圍的中心值就作為實際輸出的精確值。錯誤 !重心法在要求較高的系統(tǒng),反模糊一般采用重心法 COG),即求所有模糊輸出量的重心,計算公式如下:13/70nSi FiCOGi 15-2)nFii 1這里, Fi 代表的就是輸出變量的隸屬度,Si 代表輸出變量的語言值。5.2 控制器設(shè)計本系統(tǒng)中,利用模糊控制器來控制智能移動小車的運動軌跡,首先需要得到控制器的輸入量。上文中我們得出,在不打滑時,移動智能小車的運動軌跡與車速無關(guān),只與前后輪距離和小車轉(zhuǎn)向角度有關(guān)。根據(jù)這一結(jié)論,要使移動智能小

14、車能夠正確的尋跡,需要調(diào)整的只是轉(zhuǎn)向角 前后輪距離是已知量),所以,傳感器檢測的重點也是轉(zhuǎn)向角誤差,考慮到當轉(zhuǎn)向角誤差相同時,不同的誤差變化率可以反映出不同的軌道半徑,因此,本設(shè)計中還檢測了轉(zhuǎn)向角誤差變化率。通過 CCD 圖象傳感器來檢測白色地面上的黑線,根據(jù)返回的信號便可以得出駕駛角誤差和誤差變化率,如圖 4.8:e引導(dǎo)線t2t1傳感器檢測區(qū)域圖 5.2引導(dǎo)線檢測原理圖檢測出 t1,t2 間的誤差 e,然后根據(jù)上一次誤差計算誤差變化率 ec,由此得到控制器的誤差輸入量。14/70當誤差量 e 很小,且誤差不變時,就可判定為智能小車正沿著引導(dǎo)線行駛,則機器人小車沿直線行進;若誤差變化率比較大時

15、,表明智能小車正在偏離引導(dǎo)線,此時,就需要對航向角做出相應(yīng)的調(diào)整。前文已經(jīng)給出移動智能小車的運動學(xué)模型和傳感器的輸入特征,需要指出的是,通過 CCD 傳感器得到的檢測信號是其視覺中心與引導(dǎo)線中心的位置差,設(shè)計中控制的目標是讓視覺中心與引導(dǎo)線中心重合?;谶@個模型的模糊控制如下。模糊集與隸屬函數(shù)將 CCD 圖象傳感器視覺中心的誤差和誤差變化率作為控制器的輸入,以下用e和 ec表示,輸出為駕駛角,用 表示,模糊語言值分別選為:e:LB ,LM , LS,CE,RS,RM , RBec: PB ,PM, PS,ZO,NS,NM ,NB:LB , LM ,LS, CE, RS, RM ,RB 隸屬度函

16、數(shù)采用三角形,函數(shù)表達式如下式18 。(x a) /(ba), xa & x bF ( x)(x c) /(b c), x b & x c0, 其他LM LSCE RS RM RBLB-9-6-30369NBNMNSZO PSPMPB-9-6-30369LBLMLSCE RSRMRB-25-13-5051325誤差 ecm)誤差變化率ec得到約束條件 a2-bl=b2-cl。定義模糊集中心點之間的距離 D=b2-bl 。這樣論域上的所有模糊集隸屬度函數(shù)的參數(shù)就由交疊系數(shù)和 D 確定下來,在多次調(diào)節(jié)這兩個參數(shù)就可以對系統(tǒng)最優(yōu)化處理。模糊推理與模糊控制算法推理的方法很多,本設(shè)計使用的是最常見 MA

17、X-MIN 法則,這種方法的推理過程大致如下:錯誤 !建立規(guī)則庫基于駕駛經(jīng)驗可以得到下表所示的模糊規(guī)則表:表 5.1模糊規(guī)則表ec eLBLMLSCERSRMRBNBRbRbrmrmrsceceNMRbRbrmrmrsceceNSRbRbrmrscelmlmZORbRbrscelslblbPSRmrmcelslmlblbPMCeCelslmlmlblbPBCeCelslmlmlblb錯誤 !尋找對推理起作用的規(guī)則。一般情況下,一個輸入變量的精確輸入值對應(yīng)于該變量各語言值的隸屬函數(shù)只有一個或兩個非零值。那么,雙變量輸入的系統(tǒng)中就會有 1 條、 2 條、 3 條或 4 條規(guī)則有效。其他規(guī)則對推理不

18、起作用。在本設(shè)計中,如果 e=5 且 ec=-2,經(jīng)過模糊化后,它們各具有兩個非零的隸屬度。這樣,就共有 4 條規(guī)則有效。16/70錯誤 !確定規(guī)則強度。所謂規(guī)則強度,就是有效規(guī)則成立的“真實”程度,或則說有效規(guī)則的“適合度”、“力度”。實質(zhì)上就是規(guī)則后件中輸出模糊變量某語言值的隸屬度。根據(jù) MAX-MIN法則,由于規(guī)則前件間用“AND ”操作符連接,因此,每一條規(guī)則的強度等于前件中的最小值,同時,規(guī)則后件用“ OR”操作符連接,因此,每一條規(guī)則的強度等于后件中的最大值。輸出清晰化因為移動智能小車系統(tǒng)對控制要求比較高,所以反模糊采用的是重心法。由輸出隸屬函數(shù)可以看出,設(shè)計中使用的是脈沖法,這樣

19、運算比較簡單,而且實踐證明可三角形法的效果相比基本沒有性能上的下降。例如,當推理機的輸出為 RS(0.5和 RM(0.3 時,反模糊化結(jié)果為 0.55+0.313)/0.3+0.5)=8度。5.3 軟件實現(xiàn)要實現(xiàn)模糊控制程序,首先要構(gòu)造模糊語言集、隸屬函數(shù)和推理矩陣,程序中構(gòu)造如下:/誤差論域enum ERRORlb,lm,ls,ce,rs,rm,rb。/誤差變化率論域enum DFERRORnb,nm,ns,zo,ps,pm,pb 。/駕駛角輸出論域enum OREAdlb,dlm,dls,dce,drs,drm,drb。/隸屬函數(shù)參數(shù)結(jié)構(gòu)struct TRIANGLE_ int a。 in

20、t b。 int c 。 TRIANGLE。/ERROR 隸屬結(jié)構(gòu)typedef struct FUNCERROR_ enum ERROR key。 TRIANGLE func 。 FUNCERROR 。17/70/DFERROR 隸屬結(jié)構(gòu)typedef struct FUNCDFERROR_ enum DFERROR key。 TRIANGLE func 。 FUNCDFERROR 。/OREA 隸屬結(jié)構(gòu)typedef struct FUNCOREA_ enum OREA key。 char func 。 FUNCOREA 。/ERROR 變量結(jié)構(gòu)typedef struct VARIERR

21、OR_ enum ERROR key。 float dat 。 float sub 。 V ARIERROR 。/DFERROR 變量結(jié)構(gòu)typedefstructVARIDFERROR_enumDFERRORkey 。floatdat 。floatsub 。 VARIDFERROR 。/OREA 變量結(jié)構(gòu)typedef struct VARIOREA_ enum OREA key。 float dat 。 float sub 。 V ARIOREA模糊控制程序流程如下:18/70開始讀取CCD視覺誤差ccd_error.dati=0; buff_error.len=0;ccd_error.d

22、at處于func_errori.func.a與func_errori.func.c之間?Y計算隸屬度 subYccd_error.key=func_errori.key;ccd_error.sub=sub;Nbuff_error.arr_errorbuff_error.len=ccd_error;buff_error.len+;i+;i7?N讀取CCD視覺誤差變化率ccd_dferror.dati=0; buff_dferror.len=0;i=0; j=0;n=0;buff_orea.len=0;sub=minbuff_error.arr_errori.sub,buff_dferror.ar

23、r_dferrorj.sub;key=rulebuff_error.arr_errori.keybuff_dferror.arr_dferrorj.key;nbuff_orea.len?n+;YYNNbuff_orea.arr_orean.key=key?Ybuff_orea.arr_orean.subsub?Ybuff_orea.arr_orean.sub=sub;Buff_orea.arr_orean.key=key;Buff_orea.arr_orean.sub=sub;buff_orea.len+;j+;jbuff_dferror.len?ccd_dferror.dat處于func_d

24、ferrori.func.a與func_dferrori.func.c之間?YNi+; ibuff_error.len?Y計算隸屬度 subYccd_dferror.key=func_dferrori.key;ccd_dferror.sub=sub;Nbuff_dferror.arr_dferrorbuff_dferror.len=ccd_error;buff_dferror.len+;i+;i7?n=0; result_orea=0; sum=0;func=func_oreabuff_orea.arr_orean.key.func;Ysub=buff_orea.arr_orean.sub;r

25、esult_orea+=funcsubsum+=sub;n=+; nbuff_orea.len?result_orea/=sum;返回圖 5.4尋跡控制程序流程圖19/70第六章 開發(fā)工具、制作、安裝、調(diào)試過程說明軟件開發(fā)工具使用 codewarrior4.1, 程序下載調(diào)試工具使用大賽組委會統(tǒng)一的清華 BDM for S12 調(diào)試器。模型車安裝好后主要調(diào)整差速器的松緊和前輪的前束,之后主要是熟悉 S12 平臺的開發(fā),包括編譯器和調(diào)試器的使用。平臺熟悉后就開始寫單片機各模塊的驅(qū)動程序,遇到問題時主要是通過看編譯器幫助文檔、芯片 datasheet 或上網(wǎng)詢問等辦法解決。為了避免智能車在調(diào)試過程

26、中突然沖出跑道沖撞其它物體造成車體損壞,臨時加入無線開關(guān)控制其啟動和停止。在賽車運動狀態(tài)下,主要的調(diào)試方法是把想要了解的參數(shù)寫到單片的 E2PROM 里,然后再從串口讀出以查看參數(shù)值。對于一些智能車非運動條件下的參數(shù),可以直接通過串口查看。測試賽道選擇韓國 2004 賽道 檢測頻率100HZ21/70結(jié)論根據(jù)智能移動小車的特點和設(shè)計目標,采取了模糊控制算法對小車的尋跡進行控制,實踐中控制器發(fā)揮了相當不錯的效果,智能小車在彎、直道上均能快速轉(zhuǎn)向并很快達到穩(wěn)定,尋跡速度約為 1.4m/s 。所設(shè)計的 CCD圖象傳感器系統(tǒng),與 MCU接口簡單,占用極小的 MCU軟件資源,使用方便可靠,在應(yīng)用實際應(yīng)用

27、中發(fā)揮出了良好的性能。使用了紅外光電開關(guān)檢測車輪的轉(zhuǎn)速,性能穩(wěn)定可靠。不足和尚需完善之處:在智能移動小車走小的 S 型彎道可以想辦法讓小車不轉(zhuǎn)彎直線行駛過去,因為比賽時智能小車可以跑兩圈,打算在第一圈記錄一些統(tǒng)計信息,第二圈時根據(jù)上一圈的統(tǒng)計信息識別出前方 S 型彎道,通過讓參考點偏移的方法使小車直線通過。22/70參考文獻蔣新松 . 機器人學(xué)導(dǎo)論 . 第一版 . 沈陽:遼寧人民出版社 .1994 : 420-426吳廣玉、姜復(fù)興 . 機器人工程導(dǎo)論 . 第一版 . 哈爾濱:哈爾濱工業(yè)大學(xué)出版社1988: 196-2413徐國華,譚民. 移動機器人的發(fā)展現(xiàn)狀及其趨勢. 機器人技術(shù)與應(yīng)用,200

28、1 年第三期: 5-16 頁周遠清、張再興 . 智能機器人系統(tǒng) . 第一版 . 北京:清華大學(xué)出版社, 1989: 24-27張吉禮 . 模糊 - 神經(jīng)網(wǎng)絡(luò)控制原理與工程應(yīng)用 . 第二版 . 哈爾濱:哈爾濱工業(yè)大學(xué)出版社, 2004: 19-21西三一郎 . 自律型機器人制作 . 第一版 . 北京:科學(xué)出版社, 2001: 89-94張巖、胡秀芳等 . 傳感器應(yīng)用技術(shù) . 第一版 . 福建:福建科學(xué)技術(shù)出版社,2005 :24-28王國鼎、袁海慶、陳開利. 橋梁檢測與加固 . 第一版 . 北京:人民交通出版社,2003: 16-179 邵貝貝 .單片機嵌入式應(yīng)用的在線開發(fā).第一版 .北京:清華

29、大學(xué)出版社,2004: 40-4223/70附錄 A:源代碼/*Copyright(c*四川大學(xué)*-文件信息 -文 件 名: datatype.h創(chuàng) 建 人:陳果最后修改日期 : 2006 年 4 月 14 日描述: 重新定義數(shù)據(jù)類型以方便編程*-歷史版本信息 -創(chuàng)建人 : 陳果版 本: 1.0日 期:2006年 4月 14日描 述: 原始版本*-當前版本修訂 -修改人 :日 期 :描 述 :*-* */#ifndef _DATATYPE_H#define _DATATYPE_Htypedef unsigned char uint8 。typedef signed char int8 。typ

30、edef unsigned int uint16 。typedef signed int int16 。typedef unsigned long uint32 。typedef signed long int32 。typedef float fp32 。typedef double fp64 。24/70typedef structuint8 nCounter 。uint16 arrLine5 。LINE_INFO 。extern LINE_INFO gLineInfo。extern LINE_INFO lLineInfo。extern uint8 ctrFlag 。 extern int

31、32 fRev 。/extern fp32 fAcc 。extern uint8 CpFlag 。extern uint8 gAngle 。#endif#include datatype.hLINE_INFO gLineInfo。LINE_INFO lLineInfo。uint8 ctrFlag=1 。uint8 CpFlag=0 。int32 fRev=0 。/fp32 fAcc=0 。uint8 gAngle = 90 。/*Copyright(c*四川大學(xué)*-文件信息 -文 件 名: UART.h創(chuàng) 建 人:陳果最后修改日期 : 2006 年 4 月 15 日描述: UATRT 頭文件

32、,只提供發(fā)送功能用于程序調(diào)試*-歷史版本信息 -創(chuàng)建人 : 陳果II/70版 本: 1.0日 期:2006年 4月 15日描 述: 原始版本*-當前版本修訂 -修改人 :日 期 :描 述 :*-* */#ifndef _UART_H#define _UART_H#include #include datatype.h#include /#define BaudRate9600/#define BusClock24000000void UART_Ini(void。void UART_SendChar(unsigned char b 。voidUART_SendStr(char *p 。#prag

33、ma CODE_SEG _NEAR_SEG NON_BANKEDvoid interrupt Isr_RecUART(void。#pragma CODE_SEG DEFAULT#endif#include datatype.hIII / 70#include motorcontrol.h#include timer.h#include pwm.h#define MAXACC 100#define KVOT1#define KP 6#define KI 10#define MAXDIVU 5int32 CurRev 。int32 CurAcc 。 int32 PreErrAcc 。 int32

34、VisualVot 。 /fRev /fAccvoid SetRev(int32 refRevint32 RefAcc 。int32 ErrRev 。int32 ErrAcc 。int32 ErrVot 。int32 OutV ot。CurRev = fRev 。/ CurAcc = fAcc 。ErrRev = refRev - CurRev 。RefAcc = ErrRev * 1000 。if(RefAccMAXACC RefAcc = MAXACC。ErrAcc = RefAcc - CurAcc。ErrVot = 80*ErrAcc - 78*PreErrAcc。ErrVot /=

35、100 。VisualVot += ErrV ot。OutVot = VisualV ot / KVOT 。/*if(OutVot = 0elseOutVot = -OutVot 。*/if(OutV ot = 255 OutV ot = 255。if(OutV ot OutV ot = 0 。IV/70PWMDTY2 = OutV ot。PreErrAcc = ErrAcc 。void PISetRev(uint32 refRevstatic int32 preerror=0 。static int32 sumu=0 。int32 divu 。int32 error 。error = ref

36、Rev - fRev 。divu = KP*(error - preerror + KI*error。divu /= 60 。if(divuMAXDIVUdivu = MAXDIVU。if(divudivu = -MAXDIVU。sumu += divu 。if(sumu255sumu = 255 。if(sumusumu = 0 。PWMDTY2 = sumu 。preerror = error 。V/70#ifndef _MOTORCONTROL_H#define _MOTORCONTROL_Hvoid SetRev(int32 refRev 。void PISetRev(uint32 r

37、efRev 。#endif#include pwm.hvoid PWM_Ini(void/DDRA = 0X0F 。 /PORTA_BIT0 = 0 。/PORTA_BIT1 = 1 。DDRB = 0XFF 。PORTB = 0X20 。DDRA = 0XF0 。PORTA_BIT5 = 1 。PWME=0。PWMPOL = 0Xfb 。PWMCAE = 0 。PWMCTL = 0X10 。PWMCLK = 0X07。PWMSCLA = 133 。PWMSCLB = 5 。/PWMPER0 = 0X07 。/PWMPER1 = 0X08 。PWMPER0 = 0X03 。PWMPER1 =

38、0X86 。PWMPER2 = 0XFF 。PWMDTY0 = 0 。PWMDTY1 = 148 。PWMDTY2 = 0 。PWME = 0X07 。VI/70void SteeringgearAngle (unsigned char aif(a = 180 a = 180 。if(a a = 0 。PWMDTY1 = 58 + a 。void MotoSpeed(unsigned char sunsigned char nTemp。nTemp = PWMDTY2 。if (s PWMDTY2 = s 。 elsewhile(nTempPWMDTY2 = nTemp 。nTemp+ 。PWM

39、DTY2 = nTemp 。/PWMDTY2 = s 。#ifndef _PWM_H#define _PWM_H#include void PWM_Ini(void。void SteeringgearAngle (unsigned char a 。VII / 70void MotoSpeed(unsigned char s 。#endif/*Copyright(c*四川大學(xué)*-文件信息 -文 件 名: timer.c創(chuàng) 建 人:陳果最后修改日期 : 2006 年 4 月 15 日描述: timer 主文件*-歷史版本信息 -創(chuàng)建人 : 陳果版 本: 1.0日 期:2006年 4月 15日描 述

40、: 原始版本*-當前版本修訂 -修改人 :日 期 :描 述 :*-*/#include timer.h#define TG PORTK_BIT0#define Pulse_EN PORTK_BIT1#define _8us asm ( nop 。 nop。 nop。 nop。 nop。 nop。 nop。 nop。 nop。 nop。 nop。nop。 nop。 nop。 nop 。 nop 。 nop 。 nop。 nop。 nop。 nop。 nop。 nop。 nop。 nop。nop。 nop。 nop。 nop 。 nop 。 nop 。 nop。 nop。 nop。 nop。 no

41、p。 nop。 nop。 nop。nop。 nop 。 nop。 nop。 nop 。 nop。 nop 。 nop。 nop 。 nop。 nop 。 nop。 nop 。 nop。VIII / 70nop。 nop。 nop。 nop 。 nop 。 nop 。 nop。 nop。 nop。 nop。 nop。 nop。 nop。 nop。nop。 nop。 nop。 nop 。 nop 。 nop 。 nop。 nop。 nop。 nop。 nop。 nop。 nop。 nop。nop。 nop 。 nop。 nop。 nop 。 nop。 nop 。 nop。 nop 。 nop。 n

42、op 。 nop。 nop 。 nop。nop。 nop。 nop。 nop 。 nop 。 nop 。 nop。 nop。 nop。 nop。 nop。 nop。 nop。 nop。nop。 nop。 nop。 nop 。 nop 。 nop 。 nop。 nop。 nop。 nop。 nop。 nop。 nop。 nop。nop。 nop。 nop。 。#define _1us asm ( nop 。 nop。 nop。 nop。 nop。 nop。 nop。 nop。 nop。 nop。 nop。nop。 nop。 nop。 nop 。 nop 。 nop 。 nop。 nop。 nop

43、。 nop。 nop。 nop。 nop。 nop。nop。 nop。 nop。 nop 。 nop 。 nop 。 nop。 nop。 nop。 nop。 nop。 nop。 nop。 nop。nop。 nop。 nop。 nop。 nop。 nop。 nop。 nop。 nop。 #define MAXPULSEWIDTH 1200#define MINPULSEWIDTH 100uint32 nOFCounter = 0 。uint32 nRevPeriod=0 。/uint16 cnt 。/char str20 。void Timer_Ini(voidMCCTL = 0Xc6 。 MC

44、CNT = 30000 。/TSCR2_PR = 3 。TSCR2_TOI = 0 。TSCR1_TFFCA = 1 。TCTL4_EDG0A = 1 。TCTL4_EDG0B = 0 。TCTL4_EDG1A = 0 。TCTL4_EDG1B = 1 。TCTL4_EDG2A = 1 。TCTL4_EDG2B = 0 。TIE = 0X03 。TSCR1_TEN = 1 。/IX/70DDRK = 0X03 。TG=1。Pulse_EN = 0 。/EnableInterrupts 。 void GetRev(voidstatic int32 arrPreRev8 。/static fp32

45、 fPreRev 。static uint8 nRevCounter=0 。/fp32 nRevTemp 。/nRevTemp = (nRevPeriod=0?0:(750000/nRevPeriod。arrPreRevnRevCounter = nRevPeriod 。nRevCounter+ 。if(nRevCounter = 8nRevCounter = 0 。fRev = (arrPreRev0+arrPreRev1+arrPreRev2+arrPreRev3+arrPreRev4+arrPreRev5+arrPreRe v6+arrPreRev7/8 。fRev /= 100 。 /

46、fAcc = fRev - fPreRev 。/fPreRev = fRev 。#pragma CODE_SEG _NEAR_SEG NON_BANKEDvoid interrupt Isr_Timer(void/static uint16 counter=0 。uint16 temp 。X/70/TIE = 0X01 。 /MCFLG_MCZF = 1。 temp = MCCNT 。Pulse_EN = 0 。TG = 0 。 _8usTG = 1 。 _1usPulse_EN = 1 。/gLineInfo = lLineInfo。lLineInfo.nCounter = 0 。ctrFl

47、ag = 1 。nOFCounter+ 。void interrupt Isr_IC0(voidstatic uint32 nPreOFCounter = 0 。static uint16 nPreTC0 = 0 。uint32 nPeriod 。uint16 nTemp 。nTemp = TC0 。 nTemp = MCCNT 。nPeriod = (nOFCounter - nPreOFCounter*0X7530 + nPreTC0 - nTemp 。 if(nPeriod nRevPeriod = nPeriod 。 nPreOFCounter = nOFCounter 。nPreTC

48、0 = nTemp 。CpFlag = 1 。GetRev( 。XI/70void interrupt Isr_IC1(voiduint16 nTemp 。nTemp = TC1 。lLineInfo.arrLinelLineInfo.nCounter = MCCNT。 /cnt = MCCNT 。nTemp = TC2 。 TIE |= 0X04 。void interrupt Isr_IC2(voiduint16 nTemp 。nTemp = TC2 。nTemp = MCCNT 。nTemp = lLineInfo.arrLinelLineInfo.nCounter - nTemp。/s

49、printf(str,%u=%u=%u,nTemp,lLineInfo.arrLinelLineInfo.nCounter-1,lLineInfo.nCounter 。/UART_SendStr(str 。if(nTempMINPULSEWIDTH&(nTempif(lLineInfo.nCounterlLineInfo.nCounter+ 。TIE &= 0XFB 。 nTemp = TC1 。#pragma CODE_SEG DEFAULT/*Copyright(c*四川大學(xué)*-文件信息 -文 件 名: timer.h創(chuàng) 建 人:陳果最后修改日期 : 2006 年 4 月 15 日描述:

50、timer 頭文件*-歷史版本信息 -XII / 70創(chuàng)建人 : 陳果版 本: 1.0日 期:2006年 4月 15日描 述: 原始版本*-當前版本修訂 -修改人 :日 期 :描 述 :*-*/#ifndef _TIMER_H #define _TIMER_H#include #include datatype.h#include #include #include uart.hvoid Timer_Ini(void。void GetRev(void 。#pragma CODE_SEG _NEAR_SEG NON_BANKEDvoid interrupt Isr_Timer(void。void

51、 interrupt Isr_IC0(void。void interrupt Isr_IC1(void。void interrupt Isr_IC2(void。XIII / 70#pragma CODE_SEG DEFAULT#endif/*Copyright(c*四川大學(xué)*-文件信息 -文 件 名: UART.c創(chuàng) 建 人:陳果最后修改日期 : 2006 年 4 月 16 日描述: UATRT 主文件 ,只提供發(fā)送功能用于程序調(diào)試*-歷史版本信息 -創(chuàng)建人 : 陳果版 本: 1.0日 期:2006年 4月 15日描 述: 原始版本*-當前版本修訂 -修改人 :日 期 :描 述 :*-*/#i

52、nclude UART.hvoid UART_Ini(voidSCI0BD = 13 。 / 設(shè)置波特率寄存器SCI0CR2_TE = 1 。 /使能發(fā)送SCI0CR2_RE = 1 。 / 使能接收/SCI0CR2_RIE = 1 。/ 接收中斷使能EnableInterrupts 。XIV / 70void UART_SendChar(unsigned char bwhile(SCI0SR1_TDRE=0 。SCI0DRL = b 。voidUART_SendStr(char *pwhile(*p!=0UART_SendChar(*p+ 。#pragma CODE_SEG _NEAR_SE

53、G NON_BANKEDvoid interrupt Isr_RecUART(voiduint8 nTemp 。SCI0SR1_RDRF = 0 。nTemp = SCI0DRL 。PORTB = nTemp 。#pragma CODE_SEG DEFAULT#include /* common defines and macros */#include /* derivative information */#include datatype.h#include timer.h#include uart.h#include pwm.h#include motorcontrol.h#inclu

54、de fuzzy.h#include e2prom.h#include XV/70/#include rtsxgate.cxgate#pragma LINK_INFO DERIVATIVE mc9s12dg128b/extern uint32 nOFCounter 。extern int32 nRevPeriod 。/float nRev 。/extern uint16 cnt 。uint8 brake=0 。void main(void/start your code here/char str40 。/ uint8 i 。int16 temp 。uint16 rev=0 。/uint8 b

55、rake=0 。Timer_Ini( 。UART_Ini( 。PWM_Ini( 。E2PROM_Ini( 。/PORTB = 0X00 。while(PORTA_BIT0=0。 /MotoSpeed(160 。while(1if(PORTA_BIT1=1MotoSpeed(0 。brake = 1 。/WriteE2PROM(rev,0 。else if(PORTA_BIT0=1 brake = 0 。XVI / 70else if(ctrFlag = 1 /wait foreverif(CpFlag!=1fRev = 0 。fAcc = 0 。else CpFlag = 0 。/if(bra

56、ke=0/MotoSpeed(250 。/sprintf(str,%lu%ld ,fRev,fAcc。/ UART_SendStr( 。/for(i=0 。 i/sprintf(str,%u ,gLineInfo.arrLinei。/ UART_SendStr(str 。/ctrFlag = 0 。/gAngle = 90 + (int8FuzzyControl(。temp = (int16FuzzyControl(。gAngle = 90 + (int8temp 。SteeringgearAngle(gAngle 。/*Copyright(c*四川大學(xué)XVII / 70*-文件信息 -文 件

57、 名: E2PROM.h創(chuàng) 建 人:陳果最后修改日期 : 2006 年 4 月 17 日描述: E2PROM 頭文件*-歷史版本信息 -創(chuàng)建人 : 陳果版 本: 1.0日 期:2006年 4月 17日描 述: 原始版本*-當前版本修訂 -修改人 :日 期 :描 述 :*-* */#ifndef _E2PROM_H#define _E2PROM_H#include #include datatype.h#include void E2PROM_Ini(void。voidWriteE2PROM(uint16 data,uint16 addr。uint16 ReadE2PROM(uint16 add

58、r。#endif/fuzzy.c#include datatype.hXVIII / 70#include #include #include UART.h#include e2prom.h#include pwm.h/*/micro defines#defineKEX0.007936#defineKECX 300/#defineKECX 200/#defineCEX13234#defineCEX123.6/*/*/micro defines/#defineKEX 8/#defineKECX 0.001/#defineCEX300/*enum ERRORlb,lm,ls,ce,rs,rm,rb

59、。enum DFERRORnb,nm,ns,zo,ps,pm,pb 。enum OREAdlb,dlm,dls,dce,drs,drm,drb。typedef struct int8 a 。 int8 b 。 int8 c。 TRIANGLE。typedef struct FUNCERROR_ enum ERROR key。 TRIANGLE func 。 FUNCERROR 。typedef struct FUNCDFERROR_ enum DFERROR key 。 TRIANGLE func 。 FUNCDFERROR 。typedef struct FUNCOREA_ enum ORE

60、A key。 char func 。 FUNCOREA 。typedef struct VARIERROR_ enum ERROR key。 fp32 dat 。 fp32 sub。 VARIERROR 。XIX / 70fp32 ex = 0.00000001 。fp32 pre_ex = 0.0000001 。 fp32 ecx = 0.0000001 。FUNCERROR func_error7 = lb,-100,-9,-6, lm,-9,-6,-5, ls,-6,-5,-3, ce,-5,0,5,typedef struct VARIOREA_ enum OREA keytypede

溫馨提示

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

評論

0/150

提交評論