第一篇:電磁智能小車設計報告
標題:電磁感應智能電動車
摘要:本系統以AVR單片機MEGAl6為核心器件,實現對驅動電路的控制,使電動小車自動行駛。利用電磁原理,在車模前上方水平方向固定兩個相距為L的電感,通過比較兩個電感中產生的感應電動勢大小即可判斷小車相對于導線的位置,進而做出調整,引導小車大致循線行駛。用PWM技術控制小車的直流電動機轉動,完成小車位置、速度、時間等的控制。利用干簧管來檢測跑道的起始和終點位置從而完成小車的起步及停車。
系統總體設計:
AVR單片機MEGAl6(該芯片能夠不需要外圍晶振和復位電路而獨立工作,非常適合智能尋跡車模的要求。)為核心,由單片機模塊、路徑識別模塊、直流電機驅動模塊、舵機驅動模塊等組成,如下圖所示。基于電磁感應的智能尋跡車模系統以
直流電動機為車輛的驅動裝置,轉向電動機用于控制車輛行駛方向。智能尋跡車模利用電磁感應在跑道上自主尋跡前進,轉向。
單片機模塊(控制模塊):
尋跡車模采用AVR內核的ATMEGAl6。該芯片能夠不需要外圍晶振和復位電路而獨立工作,非常適合智能尋跡車模的要求。
路徑識別模塊:
本方案就是在車模前上方水平方向固定兩個相距為L的電感。左邊的線圈的坐標為(x,h,z),右邊的線圈的位置(x-L,h,z)。由于磁場分布是以z軸為中心的同心圓,所以在計算磁場強度的時候我們僅僅考慮坐標(x,y)。由于線圈的軸線是水平的,所以感應電動勢反映了磁場的水平分量。計算感應電動勢:
圖 1 線圈中感應電動勢與它距導線水平位置x 的函數
如果只使用一個線圈,感應電動勢E 是位置x 的偶函數,只能夠反映到水平位置的絕對值x 的大小,無法分辨左右。為此,我們可以使用相距長度為L 的兩個感應線圈,計算兩個線圈感應電動勢的差值:
對于直導線,當裝有小車的中軸線對稱的兩個線圈的小車沿其直線行駛,即兩個線圈的位置關于導線對稱時,則兩個線圈中感應出來的電動勢大小應相同、且方向亦相同。若小車偏離直導線,即兩個線圈關于導線不對稱時,則通過兩個線圈的磁通量是不一樣的。這時,距離導線較近的線圈中感應出的電動勢應大于距離導線較遠的那個線圈中的。根據這兩個不對稱的信號的差值,即可調整小車的方向,引導其沿直線行駛。
對于弧形導線,即路徑的轉彎處,由于弧線兩側的磁力線密度不同,則當載有線圈的小車行駛至此處時,兩邊的線圈感應出的電動勢是不同的。具體的就是,弧線內側線圈的感應電動勢大于弧線外側線圈的,據此信號可以引導小車拐彎。
另外,當小車駛離導線偏遠致使兩個線圈處于導線的一側時,兩個線圈中感應電動勢也是不平衡的。距離導線較近的線圈中感應出的電動勢大于距離導線較遠的線圈。由此,可以引導小車重新回到導線上。
由于磁感線的閉合性和方向性,通過兩線圈的磁通量的變化方向具有一致性,即產生的感應電動勢方向相同,所以由以上分析,比較兩個線圈中產生的感應電動勢大小即可判斷小車相對于導線的位置,進而做出調整,引導小車大致循線行駛。
驅動模塊:
簡易智能小車有兩個電動機。其中一個小電動機控制前輪轉向,給電動機加正反向電壓,實現前輪的左右轉向;另一電動機控制后輪驅動力。控制轉向電動機需要較小的驅動力,經過實驗,選L293作為驅動芯片;由于后輪驅動功率較大,所以選用L298N,經過實驗發現小車行使過程中負載較大,導致L298N發熱較大,故給芯片添加散熱片以保護芯片正常工作。為了優化控制性能,采用PWM脈寬調速,并利用數模轉換芯片產生 模擬電壓,控制555生成占空比可調的脈沖從而控制L293B與L298N進行脈寬調速。
具體設計方案:
本設計使用一普通玩具小車作為車模,采用P W M 信號驅動,當PWM信號脈寬處于(1ms,1.5ms)區間時舵機控制小車向左行駛,脈寬處于(1.5ms,2ms)時小車向右行駛,脈寬約為1.5ms時小車沿直線行駛。本方案使用兩個10mH的電感置于車模頭部作為確定小車位置的傳感器。然后,設計了一個模擬電路,采集、調理、放大由電感得到的電動勢信號。具體電路如圖2所示。
該電路采用電壓并聯負反饋電路,電感信號從PL進入。考慮到單獨電感感應出的電動勢很小,本設計使用電感和電容諧振放大感應電動勢。由于使用的是10mH的電感,導線中電流頻率為20kHz,因此使用6.3nF的電容。這樣在電容上得到的電壓將會比較大,便于三極管進行放大。整個電路的具體放大倍數需要根據實際負載進行計算。本設計的小車控制電路如圖3所示。
首先,把由兩個電感得到的感應電動勢經調理、放大后得到的電壓輸出u1和u2送入由運放組成的減法器中進行減法運算,然后再經由運放組成的電壓跟隨器送給下一級電路。經過分析,這一級電路的輸出大致可由下式進行計算:
后一級電路由兩個555定時器組成,其中下方的555構成一個占空比非常接近于1的脈沖發生器,作為上方555的觸發脈沖。因為此觸發脈沖的低電平信號非常窄,所以能很好的保證上方555構成的單穩態電路正常運行。該脈沖信號頻率為:
上方的555定時器構成一個單穩型壓控振蕩器,它的脈寬受輸入V1的控制,輸出即PWM信號。當V1較大時,即兩個電感線圈中的感應電動勢相差較大時,亦即小車偏離導線向左行駛時,則脈寬較大,舵機將控制小車向右行駛;當V1適中時,接近,即小車沿導線行駛時,則脈寬接近1.5ms,小車按直線行駛;當V1較小時,即小車偏離導線向右行駛時,則脈寬較小,舵機將控制小車向左行駛。從而,控制小車大致循著導線行駛。另外,改變構成減法器的電阻的值,可以調整小車反應的靈敏度,進而防止出現小車以導線為中軸線左右搖擺的現象。
補充說明:跑道上的起始位置及終點位置用干簧管來檢測。
程序設計流程圖:
第二篇:智能小車設計報告
機器人控制技術
實驗設計報告書
題
目:基于STC89C52的智能小車的設計 姓
名:李如發 學
號:073321032 專
業:電氣工程及其自動化 指導老師:李東京 設計時間:2010年 6 月
目
錄
1.引 言..............................................1 1.1.設計意義......................................1 1.2.系統功能要求..................................1 1.3.本組成員所做的工作............................1 2.方案設計...........................................1 3.硬件設計...........................................2 4.軟件設計...........................................7 5.系統調試...........................................7 6.設計總結...........................................8 7.附 錄A;源程序.....................................8 8.附 錄B;作品實物圖片...............................10 9.參考文獻..........................................11
16×16點陣LED室內電子顯示屏的設計
單片機原理及應用課程設計
基于STC89C52的智能小車的設計
1.引 言
1.1.設計意義
本智能小車的設計,首先針對大學所有學習的知識是一個很好的回顧和總結。此智能小車是基于單片機所設計的,具有自動尋跡能力,在實際的很多方面有應用。當我們進一步的改進機器人系統時,可實現更重要的功能,如可設計出自動撲火機器人等。1.2.系統功能要求
此智能小車是基于STC89C52設計的具有自動尋跡能力的小車。系統可實現跟隨黑色引導線行走的能力,在行駛過程中,并能用測速傳感器和光電碼盤對小車速度實現實時監測。小車在行駛過程中并能實現播放美妙的音樂。1.3.本組成員所做的工作
本組成員有李如發,汪航,黃建安,韓文龍,羅瑩,明菲菲,鄒珊,江銳,邵進。
李如發:驅動 073321032 汪航: 電源 073522036 黃建安:最小統 073521013 韓文龍:源程序 073522007 羅瑩: 傳感器 073522038 明飛菲:調試 073522012 鄒芬 : 數碼顯示 073521025 邵琎 : 焊接 073522017 江銳 : 蜂鳴器 073522032
2.方案設計
智能小車主要分為傳感器部分,最小系統部分,電機驅動部分,電源部分。根據功能要求,提出合理的設計方案,畫出方案方框圖,并對系統工作原理進行闡述。
原理,本系統的重要部分是傳感器,它對整個小車的定位起到很重要的作用,由傳感器檢測黑線的位置,其中黑線對光能吸收,白線對光反射。利用此原
16×16點陣LED室內電子顯示屏的設計
單片機原理及應用課程設計
理將紅外線傳感器采集到的信號轉換為數字信號并送入單片機,單片機根據收到的信號實時的控制小車的方向。控制小車的方向主要是運用pwm原理來控制電機的平均電壓,從而來控制電機的轉速,實現小車對黑線的實時跟蹤。
3.硬件設計
硬件設計各模塊電路圖及原理描述 傳感器模塊
方案1:用光敏電阻組成光敏探測器。光敏電阻的阻值可以跟隨周圍環境光線的變化而變化。當光線照射到白線上面時,光線發射強烈,光線照射到黑線上面時,光線發射較弱。因此光敏電阻在白線和黑線上方時,阻值會發生明顯的變化。將阻值的變化值經過比較器就可以輸出高低電平。
但是這種方案受光照影響很大,不能夠穩定的工作。因此我們考慮其他更加穩定的方案。
方案2:用RPR220型光電對管。RPR220是一種一體化反射型光電探測器,其發射器是一個砷化鎵紅外發光二極管,而接收器是一個高靈敏度,硅平面光電三極管。
方案3:用紅外發射管和接收管自己制作光電對管尋跡傳感器。紅外發射管發出紅外線,當發出的紅外線照射到白色的平面后反射,若紅外接收管能接收到反射回的光線則檢測出白線繼而輸出低電平,若接收不到發射管發出的光線則檢測出黑線繼而輸出高電平。我們選擇了此方案。
傳感器是整個系統的眼睛,這部分主要運用紅外線傳感器采集信號送給單片機處理。由于黑色車道對紅外線傳感器發出的光有吸收能力,白色地方對發出的光反射,從而當傳感器在不同的地方產生不同的信號,傳送個單片機。單片機根據采集的信號做出實時的處理。
16×16點陣LED室內電子顯示屏的設計
單片機原理及應用課程設計
最小系統
最小系統是整個系統的心臟,我們采用的是AT89C52芯片。
80C52單片機是把那些作為控制應用所必需的基本內容都集成在一個尺寸有限的集成電路芯片上[2]。如果按功能劃分,它由如下功能部件組成,即微處理器、數據存儲器、程序存儲器、并行I/O口、串行口、定時器/計數器、中斷系統及特殊功能寄存器。它們都是通過片內單一總線連接而成,其基本結構依舊是CPU加上外圍芯片的傳統結構模式。但對各種功能部件的控制是采用特殊功能寄存器的集中控制方式。
驅動模塊
方案1:采用專用芯片L298N作為電機驅動芯片。L298N是一個具有高電壓大電流的全橋驅動芯片,它相應頻率高,一片L298N可以分別控制兩個直流
16×16點陣LED室內電子顯示屏的設計
單片機原理及應用課程設計
電機,而且還帶有控制使能端。用該芯片作為電機驅動,操作方便,穩定性好,性能優良。
方案2:對于直流電機用分立元件構成驅動電路。由分立元件構成電機驅動電路,結構簡單,價格低廉,在實際應用中應用廣泛。但是這種電路工作性能不夠穩定。
因此我們選用了方案1。
由于最小系統和電機驅動部分的電壓幅值不一樣,而且電機是感性負載,在制動時可能反饋電流,因此要在最小系統和驅動模塊之間采用光電隔離,所以用到了光電隔離芯片,TPL521-4
由于光耦芯片的引腳不夠所以在之后采用了一片反相器74HCT14,反相器圖如下
L298是雙H橋高電壓大電流功率集成電路,直接采用TTL邏輯電平控制,可用來驅動繼電器、線圈、直流電動機、步進電動機等電感性負載。它的驅動電壓可達46V,直流電流總和可達4A。其內部具有2個完全相同的PWM功率放大回路。由L298構成的PWM功率放大器的工作形式為單極可逆模式。12個H橋的下側橋晶體管發射極連在一起,其輸出腳(1和15)用來連接電流檢測電阻。第9腳接邏輯控制部分的電源,常用+5V,第4腳為電機驅動電源,本系統中為40V,第5,7,10,12腳輸入標準TTL邏輯電平,用來控制H橋的開和關,16×16點陣LED室內電子顯示屏的設計
單片機原理及應用課程設計
第6,II腳則為使能控制端。當Vs=40V時,最高輸出電壓可達35V,連續電流可達2A。
L298可驅動2個電動機,OUT1,OUT2和OUT3,OUT4之間可分別接電動機,本實驗裝置我們選用驅動兩臺電動機。5,7,10,12腳接輸入控制電平,控制電機的正反轉。EnA,EnB接控制使能端,控制電機的停轉。電動 機的轉速由單片機調節PWM信號的占空比來實現。
L298驅動電路圖
16×16點陣LED室內電子顯示屏的設計
單片機原理及應用課程設計
PWM調速器的硬件組成
在整個PWM調速器中,CPU既是運算處理中心,又是控制中心,是最關鍵的器件。本系統中選用與MCS-51系列完全兼容的AT89C52單片機,它是一種低功耗、高性能、CMOS八位微處理器。片內具有8K字節的在線可重復編程快擦快寫程序存儲器,128x8位內部RAM,AT89C52可構成真正的單片機最小應用系統,縮小系統體積,提高系統可靠性,降低系統成本。
電源模塊
電源中我們采用LM7805穩壓芯片將12v直流電源穩壓成5v直流源。方案1: 采用10節1.5V干電池供電,電壓達到15V,經7812穩壓后給支流電機供電,然后將12V電壓再次降壓、穩壓后給單片機系統和其他芯片供電。但干電池電量有限,使用大量的干電池給系統調試帶來很大的不便,因此,我們放棄了這種方案。
方案2:采用3節4.2V可充電式鋰電池串聯共12.6V給直流電機供電,經過7812的電壓變換后給支流電機供電,然后將12V電壓再次降壓、穩壓后給單片機系統和其他芯片供電。鋰電池的電量比較足,并且可以充電,重復利用,因此,這種方案比較可行。但鋰電池的價格過于昂貴,使用鋰電池會大大超出我們的預算,因此,我們放棄了這種方案。
方案3:采用12V蓄電池為直流電機供電,將12V電壓降壓、穩壓后給單片機系統和其他芯片供電。蓄電池具有較強的電流驅動能力以及穩定的電壓輸出性能。雖然蓄電池的體積過于龐大,在小型電動車上使用極為不方便,但由于我們的車體設計時留出了足夠的空間,并且蓄電池的價格比較低。因此我們選擇了此方案。下:
16×16點陣LED室內電子顯示屏的設計
單片機原理及應用課程設計
4.軟件設計
程序流程圖
5.系統調試
本系統的設計是首先完成每一小部分的設計,因此我們在沒完成一個模塊時就回檢測調試該模塊。在初次調試時我們采用的電源是又單片機開發板所帶的的電源來調試的。調試過程中我們就發現了很重要的問題,由于對本設計的很多模塊的沒有共同的接地使得很多模塊無法工作,我們的解決辦法是12v的直流源穩壓來供給所以的模塊,然后將所以的模塊連接共同的地。在驅動模塊的調試中發現當光耦芯片給定信號時對lm298的輸出沒有反應。我們在檢驗時發現是由于在光耦芯片后部焊接沒有焊好,出現了虛焊。在重新焊接好后,芯片正常工作。分
16×16點陣LED室內電子顯示屏的設計
單片機原理及應用課程設計
塊調試傳感器時,我們將傳感器導通,用黑色物體將傳感器發射部分蓋住檢測輸出,在將黑色物體移開,再檢測輸出。
6.設計總結
本文是關于基于單片機的智能小車的設計,在共同的努力下,各部分的設計均成功,在調試過程中都無誤。本次設計最終實現了直流電機的動態調壓,電源正常輸出供電,數碼管動態顯示數據,蜂鳴器播放美妙的音樂,小車實現簡單的轉彎功能。由于本次設計中尚存在些缺陷和對尋跡程序編寫困難,實現的功能不是很完美,但要求的所有功能基本實現。
本次設計中,從中的體會很多
1、本次的設計可以說設計到大學所學到的所有專業知識,是對大學所學知識的一個整體的回顧。
2、在設計中,不能一氣呵成,因為所有的電路圖都是自己設計的,圖中尚存在不足,所以要反復的琢磨和修改。
3、設計中要注意對每焊完一部分,都要獨立的進行檢查調試,及時的發現錯誤,及時的修改
4、本次最重要的收獲是從中我們看到了團隊合作的重要性,任何事都不是一個人所能完成的,需要大家的共同努力才能獲得最后的成功。
7.附 錄A;源程序
源程序代碼(主要語句要有注釋)。循跡的程序 #include
sbit R=P2^0;//右邊傳感器 sbit L=P2^1;//左邊傳感器 sbit RM1=P1^1;sbit RM2=P1^2;//右邊電機 sbit LM1=P1^3;sbit LM2=P1^4;//左邊電機 void main(){
16×16點陣LED室內電子顯示屏的設計
單片機原理及應用課程設計
RM1=1;
RM2=0;
LM1=1;
LM2=0;
delay(5);
while(1)
{
if((L==1)&&(R==1))//小車前進 {
RM1=1;
RM2=0;
LM1=1;
LM2=0;
delay(5);
}
else if((L==1)&&(R==0))//小車右偏
{
RM1=1;
RM2=0;
LM1=0;
LM2=1;
//左邊的電機停止轉動,右邊的電機轉動,這樣就實現了左轉
delay(10);
}
else if((L==0)&&(R==1))//小車左偏
{
RM1=0;
RM2=1;
LM1=1;
LM2=0;
//右邊的電機停止轉動,左邊的電機轉動,這樣就實現了右轉
delay(10);}
else if((L==0)&&(R==0))//小車停車
{
RM1=0;
RM2=1;
LM1=0;
LM2=1;delay(5);
}
16×16點陣LED室內電子顯示屏的設計
單片機原理及應用課程設計
else
//左右兩個電機同時啟動,直線前進
{
RM1=1;
RM2=0;
LM1=1;
LM2=0;
}
}
delay(10);
}
void delay(uint z)
{
uint a,b;for(a=z;a>0;a--)for(b=120;b>0;b--);}
8.附 錄B;作品實物圖片
16×16點陣LED室內電子顯示屏的設計
單片機原理及應用課程設計
9.參考文獻
[1] Mark Nelson著.瀟湘工作室譯.串行通信開發指南[M].中國水利水電出版社,2002.[2] 王宜懷.單片機原理及其嵌入式應用教程[M].北京希望電子出版社,2002.[3] 張毅剛.單片機原理及應用.高等教育出版社,2009 [4] 康華光.電子技術基礎(模擬部分).高等教育出版社.2006
第三篇:智能小車設計報告
智能小車設計報告
魏旭峰、孔凡明、陳夢洋
(河北科技大學 電氣信息學院)摘要:
AT89S52單片機是一款八位單片機,他的易用性和多功能性受到了廣大使用者的好評。該設計是結合科研項目而確定的設計類課題。本系統以設計題目的要求為目的,采用89S52單片機為控制核心,利用紅外線傳感器檢測道路上的黑線,控制電動小汽車的自動尋路,快慢速行駛。整個系統的電路結構簡單,可靠性能高。實驗測試結果滿足要求,本文著重介紹了該系統的硬件設計方法及測試結果分析。
采用的技術主要有:
通過編程來控制小車的速度及方向; 傳感器的有效應用; 1602液晶顯示的應用;
關鍵詞: 89S52單片機、光電檢測器、PWM調速、電動小車
第一章 方案設計與論證
一 供電系統
二 光電檢測系統
三 單片機最小應用系統設計
四 液晶顯示1602的應用
五 電機驅動
第二章 軟件設計
第二章 方案設計與論證
根據要求,小車應在規定的賽道上行駛,賽道中央黑線寬為25MM,確定如下方案: 在現有玩具電動車的基礎上,加裝光電檢測器,實現對電動車的位置的實時測量,并將測量數據傳送至單片機進行處理,然后由單片機根據所檢測的各種數據實現對電動車的轉向和速度的智能控制.這種方案能實現對電動車的運動狀態進行實時控制,控制靈活、可靠,精度高,可滿足對系統的各項要求。
一 供電系統
本模塊使用LM2940芯片輸出+5V的電壓,為89S52單片機光電檢測電路供電,采用LM1117可控變壓芯片輸出+6V電壓為舵機供電.而電機則由單片機來控制,當單片機輸出的電壓不同時,電機的轉速不同,以此來達到控制小車速度的目的.電路如圖:
二 光電檢測系統
本模塊采用七對紅外線發射和接收對管,來檢測小車前方黑線位置和模擬車站停車位置.發射管發射管出紅外線,當對管正下方為白色跑道時,發射管發射出去的紅外線會被反射回來, 接收因接收到紅外線而導通,兩端電壓為零,當對管正下方為黑色線時,黑線將吸收紅外線,接收管因接收不到紅外線而無法導通,兩端電壓為+4V左右,將接收管端電壓與一個給定電壓經LM324比較后輸出0和+5V兩固定個值,當對管正下方為白色時輸出+5V電壓,當對管正下方為黑線時輸出0V,輸出的電壓交給單片機,以此來確定黑線的位置.電路如圖:
三 單片機最小應用系統設計
89S52單片機是本系統的核心所在,自動尋跡和調速都是它控制, 七對光電對管經比較器輸出的電壓輸入單片機,單片機根據電壓的高低來判斷黑線位置,進而調整速度和方向,電路如下:
四 舵機的應用
舵機是一種位置(角度)伺服的驅動器,適用于那些需要角度不斷變化并可以保持的控制系統。目前在高檔遙控玩具,如航模,包括飛機模型,潛艇模型;遙控機器人中已經使用得比較普遍。舵機是一種俗稱,其實是一種伺服馬達。
其工作原理是:單片機放的控制信號由接收機的通道進入信號調制芯片,獲得直流偏置電壓。它內部有一個基準電路,產生周期為20ms,寬度為1.5ms的基準信號,將獲得的直流偏置電壓與電位器的電壓比較,獲得電壓差輸出。最后,電壓差的正負輸出到電機驅動芯片決定電機的正反轉。當電機轉速一定時,通過級聯減速齒輪帶動電位器旋轉,使得電壓差為0,電機停止轉動。
舵機的控制一般需要一個20ms左右的時基脈沖,該脈沖的高電平部分一般為0.5ms~2.5ms范圍內的角度控制脈沖部分。
五 電機驅動
電機驅動電路是根據單片機的控制型號來控制電機的轉動的,電路如下:
第二章 軟件設計 #include
#define uchar unsigned char//宏定義 uchar duoj,dianj,time0=0,time1=0,L=0,e=30;void timer0()interrupt 1 //定時器零 控制舵機 { time0++;
if(time0==duoj)moto=0;if(time0==80){ time0=0;
moto=1;} TH0=(65536-313)/256;TL0=(65536-313)%256;} void timer1()interrupt 3 ///定時器一 控制電機 { time1++;if(time1==dianj)in1=1;if(time1==80){
time1=0;
in1=0;} TH1=(65536-340)/256;TL1=(65536-340)%256;}
void main()/////主函數開始 { TMOD=0x11;TH0=(65536-313)/256;TL0=(65536-313)%256;TH1=(65536-340)/256;TL1=(65536-340)%256;EA=1;ET0=1;
ET1=1;in1=0;moto=1;TR0=1;TR1=1;while(1)//////檢測黑線位置
{
while(1)
{
if(P1==0xff){duoj=8;dianj=55;break;} 全白時緩進
if(L1==0){duoj=10;dianj=37;L=1;break;} //L1
if(L7==0){duoj=6;dianj=37;L=7;break;} //L7
if(L2==0){duoj=10;dianj=22;L=2;break;} //L2
if(L6==0){duoj=6;dianj=22;L=6;break;} //L6
//
if(L3==0){duoj=9;dianj=27;L=3;break;} //L3
if(L5==0){duoj=7;dianj=27;L=5;break;}
//L5
if(L4==0){duoj=8;dianj=70;L=4;break;}
//l4
//else {duoj=8;dianj=17;break;}
}
while(P1==0xff)當檢測不到信號時保持最后的狀態
{
switch(L)
{
case 1:duoj=10;dianj=39;break;
case 2:duoj=10;dianj=22;break;
// case 3:duoj=9;dianj=25;break;
// case 4:duoj=8;dianj=70;break;
// case 5:duoj=7;dianj=25;break;
case 6:duoj=6;dianj=22;break;
case 7:duoj=6;dianj=39;break;
}
} } }////////主函數結束
第四篇:智能循跡小車___設計報告
智能循跡小車設計
專 業: 自動化 班 級: 自動化132 姓 名:羅植升 莫柏源 梁桂賓 指導老師:
2014年4月——2010年6月
摘要: 本課題是基于STC89C52單片機的智能小車的設計與實現,小車完成的主要功能是能夠自主識別黑色引導線并根據黑線走向實現快速穩定的尋線行駛。小車系統以 STC89C52單片機為系統控制處理器; 采用紅外傳感獲取賽道的信息,來對小車的方向和速度進行控制。此外,對整個控制軟件進行設計和程序的編制以及程序的調試,并最終完成軟件和硬件的融合,實現小車的預期功能。
引 言 當今世界,傳感器技術和自動控制技術正在飛速發展,機械、電氣和電子信息已經不再明顯分家,自動控制在工業領域中的地位已經越來越重要,“智能”這個詞也已經成為了熱門詞匯。現在國外的自動控制和傳感器技術已經達到了很高的水平,特別是日本,比如日本本田制作的機器人,其仿人雙足行走已經做得十分逼真,而且具有一定的學習能力,還據說其智商已達到6歲兒童的水平。
作為機械行業的代表產品—汽車,其與電子信息產業的融合速度也顯著提高,呈現出兩個明顯的特點:一是電子裝置占汽車整車(特別是轎車)的價值量比例逐步提高,汽車將由以機械產品為主向高級的機電一體化方向發展,汽車電子產業也很有可能成為依托整車制造業和用車提升配置而快速成為新的增長點;二是汽車開始向電子化、多媒體化和智能化方向發展,使其不僅作為一種代步工具、同時能具有交通、娛樂、辦公和通訊等多種功能。
無容置疑,機電一體化人才的培養不論是在國外還是國內,都開始重視起來,主要表現在大學生的各種大型的創新比賽,比如:亞洲廣播電視聯盟亞太地區機器人大賽(ABU ROBCON)、全國大學生“飛思卡爾”杯智能汽車競賽等眾多重要競賽都能很好的培養大學生對于機電一體化的興趣與強化機電一體化的相關知識。但很現實的狀況是,國內不論是在機械還是電氣領域,與國外的差距還是很明顯的,所以作為機電一體化學生,必須加倍努力,為逐步趕上國外先進水平并超過之而努力。
為了適應機電一體化的發展在汽車智能化方向的發展要求,提出簡易智能小車的構想,目的在于:通過獨立設計并制作一輛具有簡單智能化的簡易小車,獲得項目整體設計的能力,并掌握多通道多樣化傳感器綜合控制的方法。所以立“智能循跡小車”一題作為嘗試。
此項設計是在以楊老師提供的小車為基礎上,采用AT89C52單片機作為控制核心,實現能夠自主識別黑色引導線并根據黑線走向實現快速穩定的尋線行駛。
一、實驗目的:
通過設計進一步掌握51單片機的應用,特別是在嵌入式系統中的應用。進一步學習51單片機在系統中的控制功能,能夠合理設計單片機的外圍電路,并使之與單片機構成整個系統。
二、設計方案:
該智能車采用紅外傳感器對賽道進行道路檢測,單片機根據采集到的信號的不同狀態判斷小車當前狀態,通過電機驅動芯片L9110發出控制命令,控制電機的工作狀態以實現對小車姿態的控制。
三、報告內容安排:
本技術報告主要分為三個部分。第一部分是對整個系統實現方法的一個概要說明,主要內容是對整個技術原理的概述;第二部分是對硬件電路設計的說明,主要介紹系統傳感器的設計及其他硬件電路的設計原理等;第三部分是對系統軟件設計部分的說明,主要內容是智能模型車設計中主要用到的控制理論、算法說明及代碼設計介紹等。
技術方案概要說明
本模型車的電路系統包括電源管理模塊、單片機模塊、傳感
器模塊、電機驅動模塊。
工作原理:
? 利用紅外采集模塊中的紅外發射接收對管檢測路面上的軌跡 ? 將軌跡信息送到單片機
? 單片機采用模糊推理求出轉向的角度和行走速度,然后去控制 行走部分
? 最終完成智能小車可以按照路面上的軌跡運行。
硬件電路的設計
1、最小系統:
小車采用STC89C52單片機作為控制芯片,圖1是其最小系統電路。主要包括:時鐘電路、電源電路、復位電路。其中各個部分的功能如下:
1、時鐘電路:給單片機提供一個外接的12MHz的石英晶振。
2、電源電路:給單片機提供5V電源。
3、復位電路:在電壓達到正常值時給單片機一個復位信號。
圖1
單片機最小系統原理圖
2、電源電路設計:
模型車通過自身系統,采集賽道信息,獲取自身速度信息,加以處理,由芯片給出指令控制其前進轉向等動作,各部分都需要由電路支持,電源管理尤為重要。在本設計中,51單片機使用5V電源,電機及舵機使用6V電源。考慮到電源為充電電池組,額定電壓為7.2V,實際充滿電后電壓則為6.5-6.8V,所以單片機及傳感器模塊采用7805穩壓后的5V電源供電,舵機及電機直接由電池供電。
3、傳感器電路:
光電尋線方案一般由多對TCRT5000紅外收發管組成,通過檢測接收到的反射光強,判斷黑白線。原理圖由紅外對管和電壓比較器兩部分組成,紅外對管輸出的模擬電壓通過電壓比較器轉換成數字電平輸出到單片機。
圖2
賽道檢測原理圖:
4、電機驅動電路:
電機驅動芯片L9110,內部包含4通道邏輯驅動電路。是一種二相和四相電機的專用驅動器,即內含二個H橋的高電壓大電流雙全橋式驅動器,接收標準TTL邏輯電平信號,可驅動46V、2A以下的電機。其引腳排列如圖1中U4所示,1腳和15腳可單獨引出連接電流采樣電阻器,形成電流傳感信號。L9110可驅動2個電機,OUT1、OUT2和OUT3、OUT4之間分別接2個電動機。5、7、10、12腳接輸入控制電平,控制電機的正反轉,ENA,ENB接控制使能端,控制電機的停轉。也利用單片機產生PWM信號接到ENA,ENB端子,對電機的轉速進行調節。L9110的邏輯功能:
表1 SHARP GP2D12實物圖
外形及封裝:
圖3 L9110實物圖
L9110電路原理圖:
由于一片L298N可以直接驅動兩個電機,但是為了加大驅動力,我們采用兩路并聯的方式來驅動電機。
圖3.3 L9110電路圖
小車循跡規則:
若小車偏左的時候,車輪將向右偏轉;若小車偏右,車輪將向左偏轉;若沒有偏移,小車將繼續向前;若小車完全偏離黑色軌跡,小車后退以尋找黑色軌跡。小車程序:
#include
sbit chongshua=P3^6;//定義單片機控制沖刷的引腳 sbit tuodi=P3^7;//定義單片機控制拖地的引腳
//--------//1602液晶相關I/O設置
sbit E=P2^3;//1602液晶的E腳接在P2.3口上 sbit RW=P2^4;//1602液晶的RW腳接在P2.4口上 sbit RS=P2^5;//1602液晶的RS腳接在P2.5口上
//HC-SR04相關I/O設置 sbit TIRG=P3^4;sbit ECHO=P3^2;
bit flag =0;
//定義IO口,具體可以去查看原理圖 //定義IO口,具體可以去查看原理圖 uchar k;uchar a=0;//定義一個變量a,用來讀取串口的數據
void delay(uint z)//一個帶參數的延時程序 {
}
void init()//初始化子程序 {
} TMOD=0x20;//設置定時器T1為工作方式2 TH1=0xfd;TL1=0xfd;//T1定時器裝初值 TR1=1;//啟動定時器T1 REN=1;//允許串口接收 SM0=0;SM1=1;//設置串口工作方式1 EA=1;//開總中斷 ES=1;//開串口中斷 int i,j;//定義兩個變量 for(i=10;i>0;i--)for(j=z;j>0;j--);//將參數z賦值給j void qian()//左右輪協同前進子函數 {
} void zuo()//左右輪協同左轉子函數 {
you1=0;you2=1;zuo1=1;zuo2=0;delay(9);//pwm調速 此為pwm有效值 you1=1;you2=1;you1=0;you2=1;zuo1=0;zuo2=1;delay(6);//pwm調速 此為pwm有效值 you1=1;you2=1;zuo1=1;zuo2=1;delay(4);
} zuo1=1;zuo2=1;delay(1);
void mzuo()//左右輪協同左轉子函數 {
} void you()//左右輪協同右轉子函數 {
you1=1;you2=0;zuo1=0;you1=0;you2=1;zuo1=1;zuo2=0;delay(10);//pwm調速 此為pwm有效值 you1=1;you2=1;zuo1=1;zuo2=1;delay(5);
} zuo2=1;delay(9);//pwm調速 此為pwm有效值 you1=1;you2=1;zuo1=1;zuo2=1;delay(1);
void myou()//左右輪協同右轉子函數 {
} you1=1;you2=0;zuo1=0;zuo2=1;delay(10);//pwm調速 此為pwm有效值 you1=1;you2=1;zuo1=1;zuo2=1;delay(5);void hou()//左右輪協同前進子函數 {
}
void ting()//左右輪都停止轉動 {
} you1=1;you2=1;zuo1=1;zuo2=1;you1=1;you2=0;zuo1=1;zuo2=0;delay(9);//pwm調速 此為pwm有效值 you1=1;you2=1;zuo1=1;zuo2=1;delay(1);
void Delay1602(unsigned int t){ unsigned int k;//定義一個16位寄存器用來做延時用 for(k=0;k void LCD1602_busy(void){ P0_7=1;// RS=0;//RS=0讀入 RW=1;//RS=0讀入 E=1;//RS=0讀入 while(P0_7==1);// E=0;//} 延時 將P0.7置1,為讀狀態做準備、RW= 1、E=1時,忙信號輸出到DB7,由P0.7、RW= 1、E=1時,忙信號輸出到DB7,由P0.7、RW= 1、E=1時,忙信號輸出到DB7,由P0.7由P0.7讀入1,表示1602液晶忙,需要等待 讀完以后,恢復E的電平void LCD1602_Write_com(unsigned char combuf){ RS=0;//選擇指令寄存器 RW=0;//選擇寫狀態 P0=combuf;//將命令字通過P0口送至DB E=1;//E高電平將命令字寫入1602液晶 E=0;//寫完以后,恢復E的電平} void LCD1602_Write_com_busy(unsigned char combuf){ LCD1602_busy();//調用忙檢測函數 LCD1602_Write_com(combuf);//調用忙檢測函數 } void LCD1602_Write_data_busy(unsigned char databuf){ LCD1602_busy();//調用忙檢測函數 RS=1;//選擇數據寄存器 RW=0;//選擇寫狀態 P0=databuf;//將命令字通過P0口送至DB E=1;//E高電平將命令字寫入1602液晶 E=0;//寫完以后,恢復E的電平} void LCD1602_Write_address(unsigned char x,unsigned char y){ x&=0x0f;//列地址限制在0-15間 y&=0x01;//行地址限制在0-1間 if(y==0)//如果是第一行 LCD1602_Write_com_busy(x|0x80);//將列地址寫入 else //如果是第二行 LCD1602_Write_com_busy((x+0x40)|0x80);//將列地址寫入 } void LCD1602_init(void){ Delay1602(1500);//調用延時函數 LCD1602_Write_com(0x38);//8位數據總線,兩行顯示模式,5*7點陣顯示 Delay1602(500);//調用延時函數 LCD1602_Write_com(0x38);//8位數據總線,兩行顯示模式,5*7點陣顯示 Delay1602(500);//調用延時函數 LCD1602_Write_com(0x38);//8位數據總線,兩行顯示模式,5*7點陣顯示 LCD1602_Write_com_busy(0x38);//8位數據總線,兩行顯示模式,5*7點陣顯示 LCD1602_Write_com_busy(0x08);//顯示功能關,無光標 LCD1602_Write_com_busy(0x01);//清屏 LCD1602_Write_com_busy(0x06);//寫入新的數據后,光標右移,顯示屏不移動 LCD1602_Write_com_busy(0x0C);//顯示功能開,無光標 } void LCD1602_Disp(unsigned char x,unsigned char y,unsigned char buf){ LCD1602_Write_address(x,y);//先將地址信息寫入 LCD1602_Write_data_busy(buf);//再寫入要顯示的數據 } void Timer0(void)interrupt 1 { } flag=0;void xunji(){ qian();//調用前進子函數,使小車光電管不滿足以下幾個條件時都處于前進狀態 while((z==0)&&(y==1)&&(q==1))//判斷當左邊光電管遇到黑線,{ } while((z==1)&&(y==0)&&(q==1))//判斷當右邊光電管遇到黑線,{ } while((z==0)&&(y==0)&&(q==1))//判斷當左邊光電管遇到黑線,右邊 //左邊和前邊的光電管遇到白線時右轉 //右邊和前邊的光電管遇到白線時左轉 zuo();//調用左轉函數 zd=1;you();//調用右轉函數 yd=1;光電管也遇到黑線 { //前邊的光電管遇到白線時停止 ting();//調用停止函數 } hd=1;while((z==0)&&(y==0)&&(q==0))//判斷當左邊、右邊、前邊光電管同時遇到黑線 } void csb(){ long S;unsigned int i;unsigned int Timeout; { } //即遇到十字路口,小車前進 qian();//調用前進函數 LCD1602_init();//調用1602液晶初始化函數 //***定時器Timer0初始化*** TMOD&=0xF0;//將TMOD的低4位定時器0控制部分清零 TMOD|=0x01;//設置定時器0為方式1 TMOD=0x01;TL0=0;//設置定時器0初值低8位 TH0=0; //設置定時器0初值高8位 TR0=0;//停止定時器0 ET0=1;//Timer0中斷允許 //***開全局中斷設置**** //定時器Timer0設置了中斷允許,此處要開全局中斷 EA=1;//開全局中斷 TIRG=1; //發一個脈沖觸發信號 //維持約17US,符合不低于10US的要求 //維持約17US,符合不低于10US的要求 i=4; while(i>0)i--; TIRG=0;TR0=0; //維持約17US,符合不低于10US的要求 //撤銷觸發信號 //關閉定時器 //設置定時器0初值低8位為0 TL0=0; TH0=0; //設置定時器0初值高8位為0 //清除溢出標志 k=0;flag=0;Timeout=0;while((ECHO==0)&&((Timeout++)<50000)); //等待回響高電平 TR0=1;//回響高電平來后啟動定時器 Timeout=0;while((ECHO==1)&&((Timeout++)<50000)); //等待回響高電平結束后 TR0=0; //關閉定時器 S=((TH0*256+TL0)*1)/58; if(flag==1||S>400)//超出測量范圍顯示“-” { LCD1602_Disp(0, 0, '-'); LCD1602_Disp(1, 0, '-'); LCD1602_Disp(2, 0, '-'); LCD1602_Disp(3, 0, 'C'); LCD1602_Disp(4, 0, 'M'); } else { LCD1602_Disp(0, 0, S%1000/100+'0'); LCD1602_Disp(1, 0, S%1000%100/10+'0');// LCD1602_Disp(2, 0, S%1000%100%10+'0'); LCD1602_Disp(3, 0, 'C'); LCD1602_Disp(4, 0, 'M'); } i=18000; while(i>0) //顯示百位- //顯示十位- //顯示個位- //顯示C //顯示M //顯示百位 顯示十位 //顯示個位 //顯示C //顯示M //維持約77400US,符合不低于60MS的要求 //維持約77400US,符合不低于60MS的要求 i--; } void main()//主程序 { //維持約77400US,符合不低于60MS的要求 init();//調用初始化子程序 while(1)//死循環 { switch(a)//判斷a從串口讀取到的數據 { case 0x00://如果是0x1f就前進 xunji();break;case 0x01://如果是0x2f就后退 qian();break;case 0x02://如果是0x3f就左轉 csb();break; case 0x03://如果是0x4f就右轉 mzuo();zd=1;break; case 0x04://如果是0x00就停止 hou();break; case 0x05://如果是0xa0車燈打開 myou();yd=1;break; case 0x06://如果是0xb0車燈關閉 chongshua=1;break; case 0x07://如果是0xc0蜂鳴器鳴響 } ting();hd=1;break; case 0x08://如果是0xc0蜂鳴器鳴響 tuodi=1;break;} } void chuan()interrupt 4//串口中斷服務程序 { } RI=0;//軟件清除串口響應 a=SBUF;//讀取單片機串口接受的藍牙模塊發送的數據 結論 根據本次設計要求,我們小組系統地閱讀了大量的資料,并認真分析了設計課題的需求,還系統學習了51系列單片機的工作原理及其使用方法,并獨自設計智能小車的整個項目。 雖然條件艱苦,但經過不懈鉆研和努力,購買到了所有所需的元器件,并系統的進行了多項試驗,最終做出了整個小車的硬件系統,然后結合課題任務和小車硬件進行了程序的編制,本系統能夠基本滿足設計要求,能夠較快較平穩的是小車沿引導線行駛,但由于經驗能力有限,該系統還存在著許多不盡人意的地方有待于進一步的完善與改進。 通過本次課題設計,不僅是對我們課本所學知識的考查,更是對我的自學能力和收集資料能力以及動手能力的考驗。本次畢業設計使我們對一個項目的整體設計有了初步認識,還認識了幾種傳感器,并能獨立設計出其接口電路,再有對電路板的制作有了一定的了解,并學會了使用Protel設計電路。本次畢業設計使我們意識到了實驗的重要性,在硬件制作和軟件調試的過程中,出現了很多問題,最終都是通過實驗的方法來解決的。還有以前對程序只是一個很模糊的概念,通過這次的課題設計使我對程序完全有了一個新的認識,并能使用C熟練的進行編程了。通過本次課題設計,極大的鍛煉了我們的思考和分析問題的能力,并對單片機有了一個更深的認識。 總之,在課題設計的過程中,無論是對于學習方法還是理論知識,我們都有了新的認識,受益匪淺,這將激勵我們在今后再接再厲,不斷完善自己的理論知識,提高實踐運作能力。 目錄 一.學分認定書 …… …………………………………………XX 二.實驗報告 …… ………………………………………………XX 三.智能車制作研究報告 ……………………………………… XX 四.心得體會 ………………………………………………… XX 五.附錄:程序源代碼………………………………………… … XX (要求:給出一級目錄,宋體加粗,四號字,1.5倍行距。) 一.學分認定書(每個隊員1份)二.實驗報告 實驗一.通用輸入輸出口和定時中斷 一、實驗目的 1.掌握 MC9S12XS128 匯編語言對通用端口的操作指令。2.掌握程序中指令循環和跳轉的方法。 3.學會使用程序延時,并會大概估算延遲時間。 二、實驗任務 1.將 PORTA 口接八位DIP 開關,PORTB口接七段數碼管顯示,PORTK控制四個數碼管其中某一個顯示。 2.采用定時中斷方式,利用八位DIP 開關輸入二進制數,數碼管顯示其十進制數。 三、實驗內容 實驗中每個通用輸入輸出端口要用到的寄存器都有兩個,端口定義寄存器和端口方向寄存器。以 A 端口為例,端口定義寄存器為PORTA和端口方向寄存器為DDRA。在MC9S12XS128的DATASHEET 上可以查到DDRA的地址是0x00(輸入), DDRB的地址是0xFF(輸出), DDRK的地址是0xFF(輸出)。則初始化端口PORTA、PORTB、PORTK的語句為: void initGPIO(void){ DDRA = 0x00;DDRB = 0xFF;DDRK= 0xFF;} 置0 表示該位為接受輸入位,置1 表示該位為輸出位。 MC9S12DP256/DG128 中可以使用實時時鐘或增強型定時器來完成定時功能,二者是相互獨立的。本實驗中用實時時鐘定時。實時時鐘的可以通過對外部晶振分頻而得到一個定時中斷。RTICTL 是實時時鐘控制寄存器,向該寄存器寫入內容,通過查表會得到一個分頻因子,外部晶振除以分頻因子就是中斷的頻率了。因為外部晶振頻率是16MHz,要得到1ms中斷一次,需要16000分頻。在MC9S12XS128的DATASHEET 上可以查到RTICTL設置為0x8F, 中斷允許寄存器CRGINT設置為0x80(開中斷)。則初始化中斷程序為: void InitRTI(void){ RTICTL = 0x8F;CRGINT = 0x80;} 一但進入中斷,即開始讀PORTA口的二進制數,并轉換為十進制,通過PORTB口顯示出來。由于是數碼管動態顯示,PORTK口控制四個數碼管輪流顯示。具體程序見開發板例程中——SevenSegmentDigitalTube。 四、思考題 1.如果不用PORTA口做輸入,直接讓單片機內部從0—9999自動計數,并在PORTB口顯示出計數過程,PORTK口控制四個數碼管輪流顯示,程序該如何改? 對程序的修改如下: void interrupt 7 RTI_INT(void){ time++;if(time >=50){ 2 time=0;Count_Num++;LedData[0] = Count_Num/1000%10;LedData[1] = Count_Num/100%10;LedData[2] = Count_Num/10%10;LedData[3] = Count_Num%10;if(Count_Num >=9999){ Count_Num=0;} } PORTK = 0x01 << LedNum;PORTB = LedCode[LedData[LedNum]];LedNum++;if(LedNum >= 4)LedNum = 0;CRGFLG = 0x80;} 這樣便可以在數碼管中顯示動態顯示0000—9999,經試驗檢測該方法正確。 實驗二.A/D轉換實驗 一、實驗目的 了解 S12 單片機ADC 模塊的使用方法。 二、實驗任務 用 S12 的ADC 模塊將一路(或多路)模擬電平轉換成數字量,并將轉換結果顯示在數碼管上,或者通過SCI 發送到PC 終端顯示出來。 三、實驗內容 1、與 S12 的ADC 模塊相關的寄存器如下,各寄存器的詳細定義可參閱datasheet。ATDCTL2:控制寄存器。主要設置A/D 標志位清除方式、A/D 采樣觸發方式、是否允許A/D 采樣完成中斷等。 ATDCTL3:控制寄存器。主要設置每次A/D 轉換采樣幾路電平、采樣結果的存儲方式等。 ATDCTL4:控制寄存器。主要設置A/D 轉換精度、A/D 轉換時鐘頻率等。 ATDCTL5:控制寄存器。主要設置A/D 轉換結果的對齊方式和數據類型,以及A/D 的采樣模式(連續采樣/單詞采樣,順序轉換/單通道轉換等) ATDSTAT0:狀態標志寄存器。包括A/D 轉換完成標志,出錯標志、轉換結果存儲索引等標志位。 ATDTEST1:測試寄存器。 ATDSTAT1:標志寄存器。標識一次A/D 轉換中各通道的完成情況。 以上寄存器的具體內容和其他與 ADC 模塊相關的寄存器請參看datasheet 相應章節。 2、本實驗采取AN14單通道連續AD轉換模式,且結果存放在ATD0DR0L中, 轉換序列長度為1,轉換精度為8位,在freeze模式下繼續轉換。通過查看datasheet,得出ATD0初始化程序如下:void ATD0_init(void){ ATD0CTL1=0x0e;//轉換精度為8位,從AN14通道轉換 ATD0CTL2=0x40;//禁止外部觸發, 中斷禁止 ATD0CTL2_ASCIE = 1;//允許中斷 ATD0CTL3=0x88;//轉換序列長度為1,在freeze模式下繼續轉換 ATD0CTL4=0xFF;ATD0CTL5=0x2E;//單通道連續AD轉換模式 } 具體程序見開發板例程中——testAN14。 四、預習要求 (1)參考datasheet 明確ADC 各寄存器的作用,主要思考以下問題: 1.A/D 轉換的時鐘應該是多少?如何設置分頻因子? 答:A/D 轉換的時鐘應該是如下: 其中PRS為ATDCLT4中的后五位。 2.A/D 轉換如何啟動?有幾種啟動方式?分別如何設置相關寄存器? 答:可以用ATD0CLT2去給ATD模塊上電,有五種上電(觸發方式)分別如下:設置ATD0CLT2中的10~12位。第10位為0時忽略外部觸發,為1時則使用內部觸發。但第十位為1時,前兩位為00,01,10,11,分別對應下降沿觸發,上升沿觸發,低電平觸發,高電平觸發。3.每次A/D 轉換啟動那幾路電平采樣?采樣結果如何存儲(注意FIFO 的A/D 轉換模式)?采樣結果的數據類型(8 位/10 位?左對齊/右對齊?有符號數/無符號數?)? 答: 每次啟動那一路轉化得看ATD0CTL5中的設置。采樣結果的儲存也是在該寄存器控制的。采樣結果的位數也是該寄存器控制。如ATD0CTL5 = 00110000時該結果為左對齊無符號型數據是連續轉化,多通道轉化。并且從0通道開始轉化。4.如何判斷A/D 轉換是否結束?如何清標志位? 答:從ATD0START1_CCF0 = 0 時轉化完成。(2)如何實現多通道轉換? 答:ATD0CTL5中的第四位置1。 五、實驗現象 開發板通電后,用起子旋轉電位器,發現數碼管上數字從0—255連續變化。 實驗 三、PWM 模塊實驗 一、實驗目的 1. 學習使用 PWM 模塊。 2. 用 PWM 實現小型直流電機調速和舵機轉向。 二、實驗任務 1、使用單片機內部PWM 模塊調制產生不同脈寬的方波,實現小型直流電機調 速和舵機轉向。 2、將 PORTA 口接八位DIP 開關,PORTB口接七段數碼管顯示,PORTK控制 四個數碼管其中某一個顯示,數碼管動態顯示原理同實驗1。撥碼開關高兩位控 制舵機,當為00,11代表舵機轉到正中央,為10,01代表舵機分別左轉右轉。撥 碼開關低六位控制電機,表示PWM占空比。數碼管第一位顯示舵機控制方向,后 兩位顯示電機占空比。 三、實驗內容 1.PWM 模塊共有28 個寄存器,其中8 個為系統保留寄存器,具體介紹如下: PWM 啟動寄存器(PWME) 本寄存器的 8 個bits 分別用來開關8 路PWM 的通道。PWM 極性寄存器(PWMPOL) 本寄存器的 8 位bits 分別用來設定8 路PWM 通道輸出波形的起點電平。PWM 預分頻寄存器(PWMPRCLK) 本寄存器用來設定 ClockA 和ClockB 的預分頻因子。ClockA 分頻寄存器(PWMSCLA) 本寄存器提供 PWM 模塊操作時的幾個控制位。PWM 通道周期寄存器(PWMPERx) 此 8 個寄存器分別為8 個通道設定方波的周期。PWM 通道脈寬寄存器(PWMDTYx)此 8 個寄存器分別為8 個通道設定脈寬。PWM初始化程序如下: void initPWM(void){ PWME=0x00;//關閉所有PWM通道 PWMPOL = 0xFF;//PWM極性選擇,選擇一個周期開始時為高電平 PWMPRCLK = 0x22;//CLOCK A,B時鐘分頻,均選擇從總線四分頻 10M PWMSCLA = 5;//CLOCK SA從CLOCK A十分頻,1M PWMSCLB = 5;//CLOCK SB從CLOCK B十分頻,1M PWMCTL = 0xF0;//01級聯,23級聯,45級聯,67級聯 PWMCLK = 0xFF;//PWM始終選擇,選擇CLOCK SA SB為PWM時鐘 PWMPER01=1000;//電機PWM正轉頻率1k PWMDTY01=0;PWMPER23=1000;PWMDTY23=0;//電機反轉頻率為1k PWMPER45=20000;//舵機PWM頻率為50Hz PWMDTY45=STEER_CENTER;//舵機占空比 PWME_PWME3=1;PWME_PWME1=1;//電機PWM波開始輸出 PWME_PWME5=1;//舵機PWM波開始輸出 } 參考程序參見實驗例程——motorpwm 四、實驗現象 撥碼開關高兩位控制舵機轉向,當為00,11舵機在中央,為10,01舵機分別左轉右轉。撥碼開關低六位控制電機,表示PWM占空比。數碼管第一位顯示舵機控制方向,后兩位顯示電機占空比。占空比越大,轉速越大。 四、電磁組實驗——信號處理 一、實驗步驟 1、電磁傳感器檢測到信號 2、單片機處理這些信號——判斷是否需要轉向、減速 二、實驗內容 1、電磁感器檢測處理后為一模擬電平,需用到AD 轉換程序。將光信號轉換為數字量存在單片機中。接下來由單片機處理這些數,判斷是否要轉向。最簡單的兩個傳感器布局,當導線在傳感器中央時,相應的AD數值相同,導線偏向右邊的傳感器時,右邊傳感器的值變大,左邊傳感器值變小。本實驗關鍵在于如何確定導線位置。 2、輸入輸出口和ATD 的初始化同前面的實驗一和實驗二,將程序運行后,打 開Data1 窗口,找出AD 轉換后的數字值,應該在0-255 之間。將車子的左邊電感對準黑色牽引線,觀察兩個傳感器。理論上應該該電感的值最大,調解好放大器的應在160左右記錄該數值(159),再將黑線想又移動,發現右邊傳感器的值逐漸增大,左邊傳感器的值逐漸減小。黑線一動到右邊電感正下方時,將此電感的值調解到160左右,記錄該數值(150)。而黑線偏出兩個電感的范圍時,兩個傳感器的值同時減小。 正常情況下小車檢測中心線程序如下: //計算Line_center 6 if(ad_data[0]+ad_data[1]<100){ Line_center =(int)(ad_data[0])*160/159-(int)(ad_data[1])*160/150;//歸一化,差值計算中心線 Get_Line = 1;} else{ Get_Line = 0;} 根據檢測到黑線的位置可以判斷行車方向。參考程序見電磁基本程序。 三.智能車制作研究報告 1.原理介紹 可以確定電感相對于導線的位置,或者說可以確定導線相對于小車的分布 2.電磁傳感器 1首先由LC回路檢測磁場○,輸出信號Singal1。 2通過放大電路INA128將信號放大 ○ 3通過○獲得負電源。 4因為放大后的電路頻率依然為20KHz的周期信號,所以我們通過下面電路轉換為穩○定輸出。 5在起跑線檢測上我們用干簧管電路。○6幅值測量 ○可以不使用檢波電路,而直接將上述單管放大電路中,三極管集電極電壓接入單片機的AD 端口,使用單片機直接采樣交變電壓信號 只要保證單片機的 AD 采集速率大于20kHz 的5-10 倍,連續采集5-10 個周期的電壓信號(大約100 數據左右),就可以直接從采集的數據中最大值減去最小值獲得信號的峰峰值。假設采集了128 個數據: , 1,2, ,128 i x i=,計算信號的峰峰值p p V ? 可以有下式計算: 上面計算計算方法由于只用應用了數據的最大值、最小值,所得結果容易受 到噪聲的影響,所以還可以通過計算數據交流信號的平均值、有效值反映信號的 幅值: 上面所計算得到的 , ave e x x 等都與信號的峰峰值成單調關系,所以也可以用來 進行計算位置差值信號。 7軟件設計 ○程序主要用到 S12 芯片中的PWM 模塊,TIM 模塊、PIT 模塊、AD 模塊、I/O 模塊 以及 SCI 模塊等。PWM 模塊主要用來控制舵機和電的運轉; TIM 模塊主要是用在了測速模塊,捕捉中斷并計算瞬時度。PIT模塊用于設置定時中斷; AD 模塊主要用于讀取傳感器信息以判斷黑線位置; I/O 模塊主要是用來讀取按鍵信息和控制數碼管顯示; SCI 模塊只要用在無線串口傳送模塊。 源碼后附 四.心得體會(每個隊員都要提交心得體會) 五.附錄:程序源代碼 #include #include “derivative.h” /* derivative-specific definitions */ /********************************************************************************* * * * * *********************************************************************************/ #define StrCnr 1500 /**********************************/ //初始化鎖相環 //將總線頻率調整到40M /**********************************/ void InitPLL(void){ CLKSEL=0x00;//禁止鎖相環,時鐘由外部晶振提供,總線頻率=外部晶振/2 PLLCTL_PLLON=1;//打開鎖相環 SYNR=0x49;REFDV=0x43;// pllclock=fvco=2*osc*(1+SYNR)/(1+REFDV)=80MHz;POSTDIV = 0x00;_asm(nop);//BUS CLOCK=40M _asm(nop);while(!(CRGFLG_LOCK==1));// 等待鎖相環初始化完成 CLKSEL_PLLSEL =1;// 使用鎖相環 2012東南大學智能車競賽電磁組Demo程序 電感信號分別接0,1口 } /**********************************/ //初始化通用IO口 //A口輸入B口和K口輸出 /**********************************/ void InitGPIO(void){ DDRA = 0x00;//A口輸入 DDRB = 0xFF;//B口輸出 DDRK = 0xFF;//K口輸出 } /**********************************/ //初始化PWM /**********************************/ void InitPWM(void){ PWME=0x00;PWMPOL = 0xFF;PWMPRCLK = 0x22;PWMCLK = 0xFF;PWMSCLA =5;PWMSCLB =5;PWMCTL = 0xF0;PWMCAE=0;PWMPER01=100;PWMDTY01=0;PWMPER23=100;PWMDTY23=0;PWMPER45=20000;PWMDTY45=StrCnr;PWME_PWME3=1;PWME_PWME1=1;PWME_PWME5=1;} /**********************************/ //初始化AD /**********************************/ void InitATD(void){ ATD0CTL0 = 0x0f;ATD0CTL1_SRES = 2;ATD0CTL1_SMP_DIS=1;ATD0CTL2_AFFC = 1;//ATD0CTL2_ASCIE = 1;//10 //關閉所有PWM通道 每位對應一個端口 //PWM極性選擇,選擇一個周期開始時為高電平//CLOCK A,B時鐘頻率為10M //選擇CLOCK SA SB為PWM時鐘 //CLOCK SA頻率為1M //CLOCK SB頻率為1M //設定PWM通道兩兩級聯使用 //電機正轉頻率10k //電機反轉頻率10k //設定舵機控制線的頻率為50Hz //設定舵機初始位置 //電機PWM波開始輸出 //舵機PWM波開始輸出 //多路轉換時轉換 //轉換精度為12位 //中斷標志位自動清零 一個序列傳喚結束觸發中斷 //ATD0CTL3 = 0xC0;//結果寄存器對齊方式右對齊(ATD0CTL3_DJM=1),轉換序列長度為8(8路),循環轉換,freeze模式下繼續轉換 ATD0CTL3 = 0x80;ATD0CTL4_SMP = 0;// 采樣周期為4個周期 ATD0CTL4_PRS = 19;//atdclk=busclk/(2*(19+1))=1M ATD0CTL5_SCAN = 1;//連續轉換模式 ATD0CTL5_MULT = 1;//多通道采樣 } /**********************************/ //初始化實時中斷 /**********************************/ void InitRTI(void){ RTICTL =0x9F;//2ms中斷一次 } void main(void){ /* put your own code here */ InitPLL();InitGPIO();InitPWM(); { _FEED_COP();/* feeds the dog */ } /* loop forever */ /* please make sure that you never leave main */ } float StrP=0.1;float StrD=0.01;float StrPCtl;float StrDCtl;float StrCtl; #pragma CODE_SEG __NEAR_SEG NON_BANKED void interrupt 7 RTI_INT(void){ DisableInterrupts;11 InitRTI();InitATD();EnableInterrupts;CRGINT_RTIE = 1;for(;;)CRGFLG = 0x80; //可以在此加入合適的數碼管顯示代碼,讓其中兩位顯示左邊電感的AD值(顯示不下可以顯示其中 //部分二進制位),讓另外兩位顯示右邊電感的AD值,方便調試。注意需要合適的初始化操作。 StrCtl=(ATD0DR1-ATD0DR0)*StrP;//如果需要更加精確可以使用ATD中斷,對這兩個值進行取平均值,低通濾波等操作。 /* 如果使用PD控制的偽代碼: StrPCtl=(Right-Left)*StrP; StrDCtl=((Right-Left)-LastValueOf(Right-Left))*StrD;StrCtl=StrPCtl+StrDCtl;*/ //對舵機控制輸出限幅,避免燒壞舵機 if(StrCtl>1800)StrCtl=1800;else if(StrCtl<1200)StrCtl=1200;PWMDTY45=StrCtl; //請加入合適的速度控制 //如果不確定,可以使用撥碼控制速度。這時請注意相關初始化操作 EnableInterrupts;}第五篇:智能車電磁組報告