數字指南針(電子羅盤)的設計 大學本科生畢業設計(論文) 目 錄 摘要……………………………………………………………………………………………………1 前言……………………………………………………………………………………………………3 第一章 緒論……………………………………………………………………………………….....4 第1.1節 電子羅盤的原理…………………………………………………………………………4 第1.2節 電子羅盤的發展趨勢……………………………………………………………………4 第二章 總體方案設計…………………………………………………………………………….....6 第2.1節 總體方案選擇…………………………………………………………………………....6 第2.2節 硬件方案………………………………………………………………………………....7 第2.3節 軟件方案………………………………………………………………………………....8 第三章 硬件系統設計…………………………………………………………………………….....10 第3.1節 控制模塊設計…………………………………………………………………………....10 第3.2節 傳感器模塊設計………………………………………………………………………....11 第3.3節 顯示模塊設計……………………………………………………………………………13 第3.4節 總體電路設計…………………………………………………………………………....14 第四章 軟件系統設計……………………………………………………………………………….17 第4.1節 主程序設計………………………………………………………………………………17 第4.2節 傳感器模塊程序設計……………………………………………………………………18 第4.3節 顯示模塊程序設計………………………………………………………………………19 第五章 系統調試…………………………………………………………………………………….20 總結……………………………………………………………………………………………….......21 參考文獻………………………………………………………………………………………….......22 致謝……………………………………………………………………………………………….......23 附錄1 實物照片說明………………………………………………………………………………..24 附錄2 部分源程序…………………………………………………………………………………..24
【摘要】:當今社會交通越來越發達,導航系統也逐漸普遍。在以前人們使用紙質地圖看路況。現如今由于經濟發展,交通路線也變化非常之大。現在雖然有GPS,但是在一些山區有覆蓋遮蔽的地方,GPS也會失去作用。汽車出行不方便,為解決這個問題,本文主要研究使用在汽車導航設備的能夠精確定向的電子羅盤系統。本文主要介紹磁阻式電子羅盤的工作原理,并詳細介紹了磁阻傳感器HMC5883,AT89S52單片機的磁阻式電子羅盤的硬件設計;根據傳感器信號輸出特點,利用AT89S52單片機處理信息功能經過分析后,經顯示屏顯示方向。在研制磁阻電子羅盤原理樣機過程中,我對系統做出一定的誤差補償,使其系統的精度提高,并且對系統做經一步的改進。
對研制的數字電子羅盤系統樣機,進行測試。其結果顯示,該數字電子羅盤能對行駛方向進行的動態測量,在 0°到360°范圍行駛方向測量精度可達±2.0°。研制的數字電子羅盤,具有體積小、性能穩定、反應快、低功耗等優點,在車輛導航設備領域有非常廣闊的應用前景。
前言 通常的導航儀器主要有兩種:陀螺羅經和磁羅盤。對地磁場測量方向的儀器叫做磁羅盤。我國發明指南針就是一個簡易的磁羅盤,對整個人類社會發展做出巨大貢獻。在公元 50 年左右,磁石已經被運用到導航航啦,并且研制出了司南。在公元 960-1127 年時候,支撐是的指南針——指南龜被研制出來。到 20 世紀初,隨著工業的發展,羅盤制造工藝也得到了飛速的發展,材料的選擇和機械制造使得羅盤的性能有了顯著地提高。尤其是是機械式磁羅盤,現在某些情況下依然使用機械式磁羅盤 。到了20世紀出,陀螺羅盤的問世,對羅盤又是一場革命。羅盤感應這地球的自轉,磁性物質對其沒有影響。使得陀螺羅盤的標度盤非常穩定,讀取數據更加精確。當代GPS雖然有廣泛的應用,但是信號經常被物體所遮擋,使其精度大打折扣。有效性也大大降低。數字電子羅盤系統則將填補這一個不足,采用地磁場的工作原理,無論何時何地磁場的水平分量永遠指向地磁北極,對GPS信號進行有效補償。 隨著科技發展和道路建設完善,汽車會給人們生活極大方便,汽車將會普及在我們生活中。電子羅盤定向系統將會出現每一輛汽車里;屆時很多人會開自己的車旅游,回家,談生意等等,當置于一個陌生的環境中,導航定向對于行車安全非常重要。所以,迫切需要研究出一種低功耗,便于攜帶,內置磁場感應器,系統穩定,并且能完成精確定向的微系統,而本課題設計就是研究出一個數字電子羅盤,專門解決這個問題而產生的。
第一章 緒論第1.1節 電子羅盤原理目前電子羅盤按照有無傾角補償可以分為平面電子羅盤和三維電子羅盤,也可以按照傳感器的不同分為磁阻效應傳感器、霍爾效應傳感器和磁通門傳感器。 利用磁性材料的磁阻效應制成磁性效應傳感器。磁性材料的易磁化軸、形狀和磁化磁場的方向影響著其磁化方向。圖 1.1顯示出,當電流流通磁性材料時,其電阻阻值大小由材料流通電流的方向與磁化方向的夾角θ決定。把磁場 M加在磁性材料上,之前磁化方向開始轉動。如果磁化方向轉向與電流的方向垂直,θ角增大,電阻阻值將減小;如果平行,即θ角減小,電阻阻值將增大,電流方向與電阻值的關系為cos2θ,這就是磁阻效應。
1.001.jpg (14.25 KB, 下載次數: 64)
下載附件
2017-7-29 02:54 上傳
圖1.1磁阻效應原理 磁阻式傳感器具有低功耗,抗干擾,溫度穩定性好,而且電路很容易搭建。靈敏度和線性度比較好。其性能及穩定性容易被遲滯誤差和零點溫度漂移所影響,地磁場強度比較小,外界非磁場容易對磁阻式電子羅盤產生干擾。電子羅盤發展相當迅速,在需要導航的系統的各行各業。并且有著非常大的應用前景。 第1.2節 電子羅盤的發展趨勢由于GPS導航在高山、樹林時信號傳輸不能很好的回饋到衛星中。同時GPS容易受到其他信號、波形干擾,導致其穩定在某些地區較差。所以需要一個穩定的導航系統在任何場地都能測出行駛方向,所以這個導航系統有很大的發展前景。有地磁大小和方向隨地點不同而不同, 無論在地球的每一個地方,磁場的水平分量永遠指向磁北,電子羅盤根據這一個原理制作的,所以電子羅盤可以用于穩定的精確的汽車導航定向,電子羅盤系統的市場需求也在我國日趨明顯,而且也初具規模。我認為未來電子羅盤的發展的方向有以下幾點: (1)使電子羅盤導航系統科技含量更高,整個制造流程可以形成一個完整的產物鏈 (2)把GPS的技術和電子羅盤技術相結合,對于導航的精確性、實用性和穩定性有提高。 (3)把電子羅盤做成信息技術服務的產業,使其應用到更多的行業里,加快電子羅盤研究與發展。 未來科技發展更加快速,相對磁場技術也會越來成熟,電子羅盤系統將朝著先進性、經濟性、實用性、功能型的成熟完善的系統!
第二章 總體方案設計第2.1節 總體方案選擇對于電子羅盤的設計,經查找資料結合所學知識,我得到兩種方案。 方案一:采用Philips公司生產的KMZ52感應磁場傳感器 KMZ52是Philips公司生產的一種磁阻傳感器,是利用坡莫合金薄片的磁阻效應測量磁場的高靈敏度磁阻傳感器。該磁阻傳感器內置兩個正交磁敏電阻橋、完整的補償線圈和設置/復位線圈。補償線圈的輸出與當前測量結果形成閉環反饋,使傳感器的靈敏度不受地域限制。這種磁阻傳感器主要應用于導航、通用地磁測量和交通檢測。該磁阻傳感器在金屬鋁的表面沉積了一定厚度的高磁導率的坡莫合金,在翻轉線圈和外界磁場兩個力的作用下,電子改變運動方向,使得磁敏電阻的阻值發生變化。同時KMZ52的斑馬條電阻成45°放置,這使得電子在正反向磁場力作用下有較好的對稱性。由于加入了翻轉磁場,KMZ52的變化曲線與普通的磁敏電阻不同,更加線性化。KMZ52磁阻傳感器的核心部分是惠斯通電橋,是由4個磁敏感元件組成的磁阻橋臂。磁敏感元件由長而薄的坡莫合金薄膜制成。在外加磁場的作用下,磁阻的變化引起輸出電壓的變化。
1.002.jpg (41.89 KB, 下載次數: 68)
下載附件
2017-7-29 02:54 上傳
圖2.1 KMZ52傳感器引腳圖 方案二:使用霍尼韋爾HMC5883L各向異性磁阻傳感電路 霍尼韋爾 HMC5883L 是一種表面貼裝的高集成模塊,并帶有數字接口的弱磁傳感器芯片,應用于低成本羅盤和磁場檢測領域。HMC5883L 包括最先進的高分辨率HMC118X系列磁阻傳感器,并附帶霍尼韋爾專利的集成電路包括放大器、自動消磁驅動器、偏差校準、能使羅盤精度控制在1°-2°的12位模數轉換器。簡易的I2C 系列總線接口。HMC5883L 是采用無鉛表面封裝技術,帶有16 引腳,尺寸為3.0×3.0×0.9mm。HMC5883L 的所應用領域有手機、筆記本電腦、消費類電子、汽車導航系統和個人導航系統。HMC5883L采用霍尼韋爾各向異性磁阻(AMR)技術,該技術領先于其他磁傳感器技術。這些各向異性傳感器具有在軸向高靈敏度和線性高精度的特點.傳感器具有的對正交軸的低靈敏度的固相結構能用于測量地球磁場的方向和大小,其測量范圍從毫高斯到8高斯(gauss)。霍尼韋爾的磁傳感器在低磁場傳感器行業中是靈敏度最高和可靠性最好的傳感器。
1.003.jpg (13.41 KB, 下載次數: 65)
下載附件
2017-7-29 02:54 上傳
圖2.2 HMC5883L傳感器引腳圖 通過對比各傳感器特點我們了解到它們的優缺點,HMC5883L三軸磁阻傳感器和ASIC都被封裝在一起了,不需要外接ASIC,而12-bit ADC與低干擾AMR傳感器,能在±8高斯的磁場中實現2毫高斯的分辨率,且內置驅動器,顯得更為優越。霍尼韋爾的磁傳感器在低磁場傳感器行業中是靈敏度最高和可靠性最好的傳感器。 綜上結合所學知識我選擇傳感器方案二,使用霍尼韋爾HMC5883L各向異性磁阻傳感電路。
第2.2節 硬件方案數字電子羅盤3大模塊分別是:傳感器模塊、數據采集模塊和MCU模塊。需要硬件有: 磁阻傳感器、 雙軸加速度傳感器、AD轉換器以及單片機的磁阻式電子羅盤。硬件總體框圖如下:
1.004.jpg (18.21 KB, 下載次數: 91)
下載附件
2017-7-29 02:54 上傳
圖2.3系統硬件總體框圖 采用三軸磁阻傳感器進行地球磁場矢量測量,雙軸加速傳感器可以傳感地球重力場中測量載體的姿態,然后通過姿態坐標變換將磁阻傳感器得到載體坐標的測量信號變換到地平坐標系。其磁阻式傳感器HMC5883包含輸出為3路的差分模擬電壓值,差分值大約為幾毫伏,信號經過傳感器內置的ASIC放大器把信號進行放大,再進行模數轉換器進行放大和模數轉換;再由有單片機處理數字信號,經由處理后得到航向角由顯示屏來顯示;復位電路用于恢復磁阻傳感器在強磁干擾后的靈敏度;電源模塊分別為復位電路和信號處理電路供電。 第2.3節 軟件方案系統軟件除了完成初始化、信號采集、信號調理、A/D轉換,再到單片機中進行信號處理分析,然后判斷能否輸出。其框圖如下所示:
1.005.jpg (18.12 KB, 下載次數: 74)
下載附件
2017-7-29 02:54 上傳
圖2.4 軟件總體框圖 單片機對傳感器失調、溫度漂移等干擾造成的誤差進行調整。失調和溫度漂移會在傳感器敏感信號上面疊加一個直流偏置電路,單片機通過將傳感器在置位和復位情況下得到的信號進行分析,算出平均值。就可以得到由于失調和漂移造成的直流偏置信號,在方向角計算前對該偏置信號進行補償即可消除其影響。再判斷能否輸出,如果不能輸出,則再采集一次;能輸出則把數據送到顯示屏顯示。
第三章 硬件系統設計
第3.1節 控制模塊設計AT89S52是一種低功耗、高性能CMOS 8位微控制器,具有8K 在系統可編程Flash存儲器。使用Atmel 公司高密度非易失性存儲器技術制造,與工業80C51 產品指令和引腳完全兼容。片上Flash允許程序存儲器在系統可編程,亦適于常規編程器。在單芯片上,擁有靈巧的8 位CPU 和在系統可編程Flash,使得AT89S52在眾多嵌入式控制應用系統中得到廣泛應用。 AT89S52具有以下標準功能: 8k字節Flash,256字節RAM, 32 位I/O 口線,看門狗定時器,2 個數據指針,三個16 位 定時器/計數器,一個6向量2級中斷結構,全雙工串行口, 片內晶振及時鐘電路。另外,AT89S52 可降至0Hz 靜態邏 輯操作,支持2種軟件可選擇節電模式。空閑模式下,CPU 停止工作,允許RAM、定時器/計數器、串口、中斷繼續工 作。掉電保護方式下,RAM內容被保存,振蕩器被凍結,單片機一切工作停止,直到下一個中斷或硬件復位為止。
1.006.jpg (20.59 KB, 下載次數: 53)
下載附件
2017-7-29 02:54 上傳
圖3.1 AT89S52引腳圖 DIP封裝
1.007.jpg (29.07 KB, 下載次數: 83)
下載附件
2017-7-29 02:54 上傳
圖3.2 AT89S52電路連接圖
第3.2節 傳感器模塊設計1.工作原理 霍尼韋爾HMC5883L磁阻傳感器電路是三軸傳感器并應用特殊輔助電路來測量磁場。通過施加供電電源,傳感器可以將量測軸方向上的任何入射磁場轉變成一種差分電壓輸出。磁阻傳感器是由一個鎳鐵(坡莫合金)薄膜放置在硅片上,并構成一個帶式電阻元件。在磁場存在的情況下,橋式電阻元件的變化將引起跨電橋輸出電壓的相應變化。這些磁阻元件兩兩對齊,形成一個共同的感應軸,隨著磁場在感應方向上不斷增強,電壓也會正向增長。因為輸出只與沿軸方向上的磁阻元件成比例,其他磁阻電橋也放置在正交方向上,就能精密測量其他方向的磁場強度。 2.電源管理 該器件可有兩種不同的供電模式。第一個是內部運作的VDD供電電源,第二個是為IO接口供電的VDDIO電源,當然VDDIO的電壓可以與VDD電源相近;單電源模式,或在VDDIO 電壓低于VDD 的情況下,HMC5883L都能正常運作并能與其他裝置兼容。
1.008.jpg (27.46 KB, 下載次數: 72)
下載附件
2017-7-29 02:54 上傳
圖3.3 HMC5883L內部示意圖 3.I2C接口 控制該裝置可以通過I2C總線來實現。該裝置將作為從機在一個主機(例如:處理器)的控制下連接總線。該裝置必須符合I2C-Bus Specification(I2C-總線技術規格標準),作為一個I2C 兼容裝置,該裝置包含一個7-bit串行地址,并支持I2C 協議。這一裝置可以支持標準和快速模式,分別為100kHz和400kHz,但不支持高速模式(Hs)。還需要外接電阻才能支持這些標準和快速模式。要求主機的活動(寄存器的讀取和寫入)優先于內部活動,例如:測量。這一優先次序的安排是為了不讓主機等待,同時I2C總線占用的時間比必需的時間長。 4.置位/復位帶驅動的H-橋式電路 ASIC包含大型開關FETs,可以傳輸大而短的脈沖到傳感器的置位/復位帶。這一置位/復位帶在很大程度上是一種電阻性負載。并不需要外部去增加外部置位/復位回路。每次測量時,ASIC會自動完成置位/復位。首先一次置位脈沖產生后進行測量,然后,一次復位脈沖產生后進行測量,兩次測量的差值的一半將會被放置在三軸上每根軸的數據輸出寄存器上。這樣,在所有測量中傳感器的內部偏差和溫度漂移差值就可以被移除/抵消了。 5.寄存器訪問 下面表格列出了寄存器及其訪問。所有地址為8 bits。 表3.1 寄存器列表
這里介紹讀取和寫入此裝置的過程。該裝置使用地址指針來顯示該寄存器地點是被讀取或寫入。這些指針位置從主機發出到從機并成功獲得的7位地址加1 位讀/寫標識符。為了盡量減少主機和裝置之間的通信,無主機干預下地址指針自動更新。寄存器指示器被讀取后將自動的在目前被成功讀取的寄存器的地址上加1。地址指針本身不能通過I2C總線被讀取。任何試圖去讀取不存在的地址返回為0s,任何去寫不存在的地址或者是未定義的bit寫入定義的地址都將會被該裝置予以忽略。為將地址指針移到隨機存儲器位置,首先發出一個“寫”到寄存器地址,在指令后不帶數據位。 HMC5883L的串行總線與兩個上拉電阻相連,再與電源連接,傳感器字節連接單片機引腳,這個引腳需要加一個上拉電阻,為單片機提供灌電流。 連接電路如下:
1.009.jpg (12.56 KB, 下載次數: 59)
下載附件
2017-7-29 02:54 上傳
圖3.4 HMC5883電路連接
第3.3節 顯示模塊設計1602液晶也叫1602字符型液晶它是一種專門用來顯示字母、數字、符號等的點陣型液晶模塊它有若干個5×7或者5×11等點陣字符位組成,每個點陣字符位都可以顯示一個字符。每位之間有一個點距的間隔每行之間也有間隔起到了字符間距和行間距的作用,正因為如此所以他不能顯示圖形。1602LCD是指顯示的內容為16×2,即可以顯示兩行,每行16個字符液晶模塊(顯示字符和數字)。其引腳圖和引腳說明如下:
1.010.jpg (11.9 KB, 下載次數: 83)
下載附件
2017-7-29 02:54 上傳
圖3.5 LCD1602引腳圖 1602采用標準的16腳接口,其中: 第1腳:VSS為電源地 第2腳:VCC接5V電源正極 第3腳:V0為液晶顯示器對比度調整端,接正電源時對比度最弱,接地電源時對比度最高(對比度過高時會 產生“鬼影”,使用時可以通過一個10K的電位器調整對比度)。 第4腳:RS為寄存器選擇,高電平1時選擇數據寄存器、低電平0時選擇指令寄存器。 第5腳:RW為讀寫信號線,高電平(1)時進行讀操作,低電平(0)時進行寫操作。 第6腳:E(或EN)端為使能(enable)端,高電平(1)時讀取信息,負跳變時執行指令。 第7~14腳:D0~D7為8位雙向數據端。 第15~16腳:空腳或背燈電源。15腳背光正極,16腳背光負極。
1.011.jpg (20.3 KB, 下載次數: 80)
下載附件
2017-7-29 02:54 上傳
圖3.6 LCD1602模塊連線圖 第3.4節 總體電路設計電路如圖:
1.012.jpg (32.6 KB, 下載次數: 77)
下載附件
2017-7-29 02:54 上傳
圖3.7電路整體結構圖 此電路采用排阻,排阻就是封裝在一起的若干電阻,可以是串聯,也可1端并接,只是簡化了PCB的設計、安裝,減小空間,保證焊接質量。 對于晶振,單片機系統里都有晶振,在單片機系統里晶振作用非常大,全程叫晶體振蕩器,他結合單片機內部電路產生單片機所需的時鐘頻率,單片機晶振提供的時鐘頻率越高,那么單片機運行速度就越快,單片接的一切指令的執行都是建立在單片機晶振提供的時鐘頻率。 在通常工作條件下,普通的晶振頻率絕對精度可達百萬分之五十。高級的精度更高。有些晶振還可以由外加電壓在一定范圍內調整頻率,稱為壓控振蕩器(VCO)。晶振用一種能把電能和機械能相互轉化的晶體在共振的狀態下工作,以提供穩定,精確的單頻振蕩。 單片機晶振的作用是為系統提供基本的時鐘信號。通常一個系統共用一個晶振,便于各部分保持同步。有些通訊系統的基頻和射頻使用不同的晶振,而通過電子調整頻率的方法保持同步。 晶振通常與鎖相環電路配合使用,以提供系統所需的時鐘頻率。如果不同子系統需要不同頻率的時鐘信號,可以用與同一個晶振相連的不同鎖相環來提供。 在電路設計中,我加入了DS1302時鐘芯片,確定系統年月日的時間。 DS1302的引腳排列,其中Vcc為后備電源,VCC2為主電源。在主電源關閉的情況下,也能保持時鐘的連續運行。DS1302由Vcc或Vcc2兩者中的較大者供電。當Vcc2大于Vcc+0.2V時,Vcc2給DS1302供電。當Vcc2小于Vcc時,DS1302由Vcc供電。X1和X2是振蕩源,外接32.768kHz晶振。RST是復位/片選線,通過把RST輸入驅動置高電平來啟動所有的數據傳送。RST輸入有兩種功能:首先,RST接通控制邏輯,允許地址/命令序列送入移位寄存器;其次,RST提供終止單字節或多字節數據傳送的方法。當RST為高電平時,所有的數據傳送被初始化,允許對DS1302進行操作。如果在傳送過程中RST置為低電平,則會終止此次數據傳送,I/O引腳變為高阻態。上電運行時,在Vcc>2.0V之前,RST必須保持低電平。只有在SCLK為低電平時,才能將RST置為高電平。I/O為串行數據輸入輸出端(雙向)。電路連接如下:
1.013.jpg (16.07 KB, 下載次數: 64)
下載附件
2017-7-29 02:54 上傳
圖3.8 DS1302電路連接圖
第四章 軟件系統設計
第4.1節 主程序設計軟件設計流程圖如下:先對系統進行初始化,然后再決定是否進行采集測量,然后對信號處理,然后對其補償。方向進行校正。不用測量則直接進行校正,計算偏移量,保存到單片機中。還設置了休眠模式,有定時中斷等功能。
1.014.jpg (32.21 KB, 下載次數: 83)
下載附件
2017-7-29 02:54 上傳
圖 4.1系統主程序圖 第4.2節 傳感器模塊程序設計由復位置位電路的電流帶的特性,在 S/R+端給一個脈沖,則元件能找到準確的方向與其對準。而此脈沖只能加在一個方向。羅盤在工作時, PA1 口每隔 1 秒鐘對傳感器置位一次。程序流程圖:
1.015.jpg (25.39 KB, 下載次數: 82)
下載附件
2017-7-29 02:54 上傳
圖4.2電橋偏置電壓流程圖 void reset_HMC1022() { PORTA &=~(1<<1);PA1 口產生下降沿 _NOP(); //延時 15us …… PORTA |=(1<<1); PA1 口產生上升沿 return; } 第4.3節 顯示模塊程序設計本設計采用LCD1602作為顯示設備,顯示的信息包括當前方位信息與與地理南極的夾角信息(角度制)。我們從HMC5883L得出地磁方向在X與Y軸上的磁場強度分量,采用atan2( )這個函數得出其與地理北極之間的夾角(弧度),再通過弧度到角度的轉換,得到角度值,最后加上180°,使其變為與南極之間的夾角,而且所有值變為正數,方便處理。得到度數后,根據我們預先設定好的角度范圍,判斷當前所在哪個方位,并在LCD1602上顯示,然后將其乘以10倍,變為整數,通過轉換,在LCD1602上顯示與南極夾角的值,具體設計思路如下:
1.016.jpg (12.24 KB, 下載次數: 70)
下載附件
2017-7-29 02:54 上傳
圖4.3 LCD1602流程圖
第五章 系統調試該電子羅盤基本達到實驗研究所想要的結果AT89S52低功耗單片機的正常電壓為4.5V-5.5V,LCD1602液晶的正常工作電壓也為4.5V-5.5V,所以采用3節干電池4.5V作為電源。經測試液晶顯示屏正常顯示,測試過程中所顯示的方位度數與實際方向大致相同,方位度數時常跳動,應該是傳感器靈敏度過強。 電子羅盤是測量方位的儀器,為了測試其功能效果,我將其與一指南針對比,測試出8組數據,記錄如下: 表5.1測試數據表 通過以上數據,設計實物存在一定誤差,在正南正北方向誤差較小,在其他方向誤差較大,經計算:平均誤差為7.0375,最大誤差為13.6,所以本實物誤差在10°以內。作為指南針,誤差在10°內,可以說正常。 誤差存在原因主要是本設計中沒有設計防干擾設置,由于我們周邊存在磁場,電子羅盤在工作時會受到干擾,誤差是不可避免的。
1.017.jpg (23.48 KB, 下載次數: 55)
下載附件
2017-7-29 02:54 上傳
1.018.jpg (8.31 KB, 下載次數: 67)
下載附件
2017-7-29 02:54 上傳
圖5.1測試實物圖 圖5.2指南針圖
總結本次設計主要任務是以AT89S52單片機為核心,HMC5883為輔而制作的電子羅盤,該電子羅盤基本完成任務。整個制作過程包括硬件和軟件的設計。在經查找資料確立總體方案,從而選擇哪種硬件的過程中,讓我對51單片機和磁阻式傳感器有了更為深切的認知。同時我也知道了對于電路硬件的選擇并不是很容易,必須考慮好幾個硬件的功能及搭配,有絲毫誤差電路就不能工作。 之后的軟件設計和系統調試是一個枯燥的過程,但是在成功的時候使我非常欣慰。在這次畢業設計中我學到了很多,從自己一點一滴地查找積累資料到最后焊接電路調試,我的搜集資料能力和系統總體思考能力有所提升,同時讓我對KEIL這個軟件更加熟知,使我的動手能力有所提高。 本次設計在某些方面仍有不足,電路未加防干擾的設計,使精準度有所缺陷。磁傳感器受到磁性物質的影響,從而產生的誤差是磁阻式羅盤誤差最大的來源。對于這種誤差,我認為將羅盤固定在干擾較弱的方向對其進行校正,羅盤的誤差將有所減小。我相信硬件方面優化的話,這種誤差情況會有所改善。
參考文獻[1] 催嵐波.船舶通信與導航[M].哈爾濱:哈爾濱工程大學出版社,2007:35-37 [2] 高光天.傳感器與信號調理器件應用技術[M].北京:科學出版社.2002.7:168-170 [3] TAMARA BRATLAND ROBERT BICKING 和 BHARAT B. PANT.為什么選擇磁性傳感器. [4] 孫希延,紀元法,施滸立.卡爾曼濾實現車載GPS/DR組合導航[J]. 現代電子技術. 2006.11 [5] 王勇軍、李智、李翔. 車載電子羅盤中的一種新型抗干擾設計[J],單片機與嵌入式系統應用,2010,5:8-10 [6] 姜益民. 基于單片機與可編程邏輯控制器的控制系統的分析與設計[D].北京郵電大學,2007 [7] 文樺.單片機教學與應用平臺的研究[D].同濟大學軟件學院,2009 [8] 丁保華、張有忠、陳軍.單片機原理與接口技術實驗教學改革與實踐[J]. 實驗技術與管理,2010,27(1) [9] 施利春、肖海梅. 基于磁阻傳感器的二維電子羅盤設計[J],價值工程,2011,25(10):37-38 [10] 鄭玉冰、章雪挺、劉敬彪. 磁阻式電子羅盤的設計[J],計算機測量與控制,2008,16(7):1027-1029 [11] 楊惠鋒、周奇.基于單片機和磁阻傳感器的新型車輛檢測器[J].重慶工學院學報(自然科學)2008.11 [12] 李希勝、劉洪毅、郭曉霞.車用磁電子羅盤的研制[J].微計算機信息2006.22(10):308-310 [13]胡寧博、李劍、趙櫸云.基于HMC5883的電子羅盤設計[J].傳感器世界2011.6(8):35-39 [14]常青、楊東凱、寇艷紅.車輛導航定位方法及應用[M].北京:機械工業出版社,2005:20-21 [15] Robert Pacz, Christia Schott,Samuel Huber*Electronic Compass Sensor [J].IEEE Magazine 2004 2(4):1446-1449
致謝本論文是在曲輝導師的悉心指導完成的,歷時三個月之久。導師平易近人,和藹可親有著深厚的學術造詣。在做論文的這一個學期,遇到的問題,曲輝老師都會指導我怎么去解決問題,授人以魚,不如授人以漁。曲老師教給我們的是方法,是精髓!在做論文的時候。我學會了基本的研究方法,還使我學會了處理問題的能力。 在此,衷心感謝曲老師的悉心教導!
附錄2:部分源程序
- #include <REG51.H>
- #include <math.h> //Keil library
- #include <stdio.h> //Keil library
- #include <INTRINS.H>
- #include "DS1302.H"
- #define uchar unsigned char
- #define uint unsigned int
- #define SYSTIM 20
- //使用的端口,請按照以下接線
- #define DataPort P0 //LCD1602數據端口
- sbit SCL=P3^7; //IIC時鐘引腳定義
- sbit SDA=P3^6; //IIC數據引腳定義
- sbit LCM_RS=P1^0; //LCD1602命令端口
- sbit LCM_RW=P1^1; //LCD1602命令端口
- sbit LCM_EN=P1^2; //LCD1602命令端口
-
- //按鍵端口定義
- sbit KEY_SET=P3^2;
- sbit KEY_ADD=P3^3;
- sbit KEY_MIN=P3^4;
-
- //蜂鳴器端口定義
- //sbit BEEP=P2^7;
-
- #define SlaveAddress 0x3C //定義器件在IIC總線中的從地址
- typedef unsigned char BYTE;
- typedef unsigned short WORD;
-
- BYTE BUF[8]; //接收數據緩存區
- uchar ge,shi,bai,qian,wan; //顯示變量
- //uint start_A=50,stop_A=80; //報警區間
- uchar SET_FLAG=0;
- uchar sys_time=0;
- uint angle1=0;
- int dis_data; //變量
- bit dis_flag=0;
- unsigned char data TIME_Buffer[6]={0}; // 時間數據暫存數組
- unsigned char LCD1602_Table[]="0123456789:-";
-
- void delayms(unsigned int k);
- void InitLcd();
- void Init_HMC5883(void); //初始化5883
-
- void WriteDataLCM(uchar dataW);
- void WriteCommandLCM(uchar CMD,uchar Attribc);
- void DisplayOneChar(uchar X,uchar Y,uchar DData);
- void conversion(uint temp_data);
-
- void Single_Write_HMC5883(uchar REG_Address,uchar REG_data); //單個寫入數據
- uchar Single_Read_HMC5883(uchar REG_Address); //單個讀取內部寄存器數據
- void Multiple_Read_HMC5883(); //連續的讀取內部寄存器數據
- //以下是模擬iic使用函數-------------
- void Delay5us();
- void Delay5ms();
- void HMC5883_Start();
- void HMC5883_Stop();
- void HMC5883_SendACK(bit ack);
- bit HMC5883_RecvACK();
- void HMC5883_SendByte(BYTE dat);
- BYTE HMC5883_RecvByte();
- void HMC5883_ReadPage();
- void HMC5883_WritePage();
- //-----------------------------------
-
- //*********************************************************
- void conversion(uint temp_data)
- {
- wan=temp_data/10000+0x30 ;
- temp_data=temp_data%10000; //取余運算
- qian=temp_data/1000+0x30 ;
- temp_data=temp_data%1000; //取余運算
- bai=temp_data/100+0x30 ;
- temp_data=temp_data%100; //取余運算
- shi=temp_data/10+0x30 ;
- temp_data=temp_data%10; //取余運算
- ge=temp_data+0x30;
- }
-
- /*******************************/
- void delayms(unsigned int k)
- {
- unsigned int i,j;
- for(i=0;i<k;i++)
- {
- for(j=0;j<121;j++)
- {;}}
- }
-
- /********************************/
- void KEYSCAN()
- {
- if(!KEY_SET)
- {
- delayms(5);
- if(!KEY_SET)
- {
- SET_FLAG++;
- if(SET_FLAG==6)
- {
- SET_FLAG=0;
- WRITE_DS1302(DS1302_WRITE_PROTECT,DS1302_WRITE_PROTECT_NO); //禁止寫保護
- WRITE_DS1302(WRITE_DS1302_YEAR,TIME_Buffer[0]); //年
- WRITE_DS1302(WRITE_DS1302_MONTH,TIME_Buffer[1]); //月份
- WRITE_DS1302(WRITE_DS1302_DAY,TIME_Buffer[2]); //日期
- WRITE_DS1302(WRITE_DS1302_HOUR,TIME_Buffer[3]); //小時
- WRITE_DS1302(WRITE_DS1302_MINUTE,TIME_Buffer[4]); //分
- WRITE_DS1302(WRITE_DS1302_SECOND,TIME_Buffer[5]); //秒
- WRITE_DS1302(DS1302_WRITE_PROTECT,DS1302_WRITE_PROTECT_OFF); //允許寫保護
- }
-
- while(!KEY_SET);
- }
- }
-
- if(!KEY_ADD)
- {
- delayms(5);
- if(!KEY_ADD)
- {
- switch(SET_FLAG)
- {
- case 1:
- if(TIME_Buffer[0]<99)
- TIME_Buffer[0]++;
- break;
- case 2:
- if(TIME_Buffer[1]<12)
- TIME_Buffer[1]++;
- break;
- case 3:
- if(TIME_Buffer[2]<31)
- TIME_Buffer[2]++;
- break;
- case 4:
- if(TIME_Buffer[3]<23)
- TIME_Buffer[3]++;
- break;
- case 5:
- if(TIME_Buffer[4]<59)
- TIME_Buffer[4]++;
- break;
- default: break;
- }
- while(!KEY_ADD);
- }
- }
-
- else if(!KEY_MIN)
- {
- delayms(5);
- if(!KEY_MIN)
- {
- switch(SET_FLAG)
- {
- case 1:
- if(TIME_Buffer[0]>0)
- TIME_Buffer[0]--;
- break;
- case 2:
- if(TIME_Buffer[1]>1)
- TIME_Buffer[1]--;
- break;
- case 3:
- if(TIME_Buffer[2]>1)
- TIME_Buffer[2]--;
- break;
- case 4:
- if(TIME_Buffer[3]>0)
- TIME_Buffer[3]--;
- break;
- case 5:
- if(TIME_Buffer[4]>0)
- TIME_Buffer[4]--;
- break;
- default: break;
- }
- while(!KEY_MIN);
- }
- }
- }
- /*******************************/
- void WaitForEnable(void)
- {
- DataPort=0xff;
- LCM_RS=0;LCM_RW=1;_nop_();
- LCM_EN=1;_nop_();_nop_();
- while(DataPort&0x80);
- LCM_EN=0;
- }
- /*******************************/
- void WriteCommandLCM(uchar CMD,uchar Attribc)
- {
- if(Attribc)WaitForEnable();
- LCM_RS=0;LCM_RW=0;_nop_();
- DataPort=CMD;_nop_();
- LCM_EN=1;_nop_();_nop_();LCM_EN=0;
- }
- /*******************************/
- void WriteDataLCM(uchar dataW)
- {
- WaitForEnable();
- LCM_RS=1;LCM_RW=0;_nop_();
- DataPort=dataW;_nop_();
- LCM_EN=1;_nop_();_nop_();LCM_EN=0;
- }
- /***********************************/
- void InitLcd()
- {
- WriteCommandLCM(0x38,1);
- WriteCommandLCM(0x08,1);
- WriteCommandLCM(0x01,1);
- WriteCommandLCM(0x06,1);
- WriteCommandLCM(0x0c,1); //Angel time
- DisplayOneChar(0,1,'A');
- DisplayOneChar(1,1,'n');
- DisplayOneChar(2,1,'g');
- DisplayOneChar(3,1,'e');
- DisplayOneChar(4,1,'l');
- DisplayOneChar(5,1,':');
- }
- /***********************************/
- void DisplayOneChar(uchar X,uchar Y,uchar DData)
- {
- Y&=1;
- X&=15;
- if(Y)X|=0x40;
- X|=0x80;
- WriteCommandLCM(X,0);
- WriteDataLCM(DData);
- }
-
- /**************************************
- 延時5微秒(STC90C52RC@12M)
- 不同的工作環境,需要調整此函數,注意時鐘過快時需要修改
- 當改用1T的MCU時,請調整此延時函數
- **************************************/
- void Delay5us()
- {
- _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_();_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_();
-
- }
-
- void Delay5ms()
- {
- WORD n = 560;
-
- while (n--);
- }
-
- /**************************************
- 起始信號
- **************************************/
- void HMC5883_Start()
- {
- SDA = 1; //拉高數據線
- SCL = 1; //拉高時鐘線
- Delay5us(); //延時
- SDA = 0; //產生下降沿
- Delay5us(); //延時
- SCL = 0; //拉低時鐘線
- }
-
- /**************************************
- 停止信號
- **************************************/
- void HMC5883_Stop()
- {
- SDA = 0; //拉低數據線
- SCL = 1; //拉高時鐘線
- Delay5us(); //延時
- SDA = 1; //產生上升沿
- Delay5us(); //延時
- }
-
- /**************************************
- 發送應答信號
- 入口參數:ack (0:ACK 1:NAK)
- **************************************/
- void HMC5883_SendACK(bit ack)
- {
- SDA = ack; //寫應答信號
- SCL = 1; //拉高時鐘線
- Delay5us(); //延時
- SCL = 0; //拉低時鐘線
- Delay5us(); //延時
- }
-
- /**************************************
- 接收應答信號
- **************************************/
- bit HMC5883_RecvACK()
- {
- SCL = 1; //拉高時鐘線
- Delay5us(); //延時
- CY = SDA; //讀應答信號
- SCL = 0; //拉低時鐘線
- Delay5us(); //延時
-
- return CY;
- }
-
- /**************************************
- 向IIC總線發送一個字節數據
- **************************************/
- void HMC5883_SendByte(BYTE dat)
- {
- BYTE i;
-
- for (i=0; i<8; i++) //8位計數器
- {
- dat <<= 1; //移出數據的最高位
- SDA = CY; //送數據口
- SCL = 1; //拉高時鐘線
- Delay5us(); //延時
- SCL = 0; //拉低時鐘線
- Delay5us(); //延時
- }
- HMC5883_RecvACK();
- }
-
- /**************************************
- 從IIC總線接收一個字節數據
- **************************************/
- BYTE HMC5883_RecvByte()
- {
- BYTE i;
- BYTE dat = 0;
-
- SDA = 1; //使能內部上拉,準備讀取數據,
- for (i=0; i<8; i++) //8位計數器
- {
- dat <<= 1;
- SCL = 1; //拉高時鐘線
- Delay5us(); //延時
- dat |= SDA; //讀數據
- SCL = 0; //拉低時鐘線
- Delay5us(); //延時
- }
- return dat;
- }
-
- //***************************************************
-
- void Single_Write_HMC5883(uchar REG_Address,uchar REG_data)
- {
- HMC5883_Start(); //起始信號
- HMC5883_SendByte(SlaveAddress); //發送設備地址+寫信號
- HMC5883_SendByte(REG_Address); //內部寄存器地址,請參考中文pdf
- HMC5883_SendByte(REG_data); //內部寄存器數據,請參考中文pdf
- HMC5883_Stop(); //發送停止信號
- }
-
- //********單字節讀取內部寄存器*************************
- uchar Single_Read_HMC5883(uchar REG_Address)
- { uchar REG_data;
- HMC5883_Start(); //起始信號
- HMC5883_SendByte(SlaveAddress); //發送設備地址+寫信號
- HMC5883_SendByte(REG_Address); //發送存儲單元地址,從0開始
- HMC5883_Start(); //起始信號
- HMC5883_SendByte(SlaveAddress+1); //發送設備地址+讀信號
- REG_data=HMC5883_RecvByte(); //讀出寄存器數據
- HMC5883_SendACK(1);
- HMC5883_Stop(); //停止信號
- return REG_data;
- }
- //******************************************************
- //
- //連續讀出HMC5883內部角度數據,地址范圍0x3~0x5
- //
- //******************************************************
- void Multiple_read_HMC5883(void)
- { uchar i;
- HMC5883_Start(); //起始信號
- HMC5883_SendByte(SlaveAddress); //發送設備地址+寫信號
- HMC5883_SendByte(0x03); //發送存儲單元地址,從0x32開始
- HMC5883_Start(); //起始信號
- HMC5883_SendByte(SlaveAddress+1); //發送設備地址+讀信號
- for (i=0; i<6; i++) //連續讀取6個地址數據,存儲中BUF
- {
- BUF[i] = HMC5883_RecvByte(); //BUF[0]存儲0x32地址中的數據
- if (i == 5)
- {
- HMC5883_SendACK(1); //最后一個數據需要回NOACK
- }
- else
- {
- HMC5883_SendACK(0); //回應ACK
- }
- }
- HMC5883_Stop(); //停止信號
- Delay5ms();
- }
-
- //顯示區間子程序
- void DISPLAY()
- {
- sys_time++;
- if(sys_time>=SYSTIM)
- {
- sys_time=0;
- dis_flag=~ dis_flag;
- }
- if(SET_FLAG==0)
- {
- TIME_Buffer[0]=READ_DS1302(READ_DS1302_YEAR);
- TIME_Buffer[1]=READ_DS1302(READ_DS1302_MONTH);
- TIME_Buffer[2]=READ_DS1302(READ_DS1302_DAY);
- TIME_Buffer[3]=READ_DS1302(READ_DS1302_HOUR);
- TIME_Buffer[4]=READ_DS1302(READ_DS1302_MINUTE);
- TIME_Buffer[5]=READ_DS1302(READ_DS1302_SECOND);
- }
- if(SET_FLAG==1&&dis_flag)
- {
- DisplayOneChar(1,0,' ');
- DisplayOneChar(2,0,' ');
- }
- else
- {
- DisplayOneChar(1,0,LCD1602_Table[TIME_Buffer[0]/10]);
- DisplayOneChar(2,0,LCD1602_Table[TIME_Buffer[0]%10]);
- }
- DisplayOneChar(3,0,'/');
- if(SET_FLAG==2&&dis_flag)
- {
- DisplayOneChar(4,0,' ');
- DisplayOneChar(5,0,' ');
- }
- else
- {
- DisplayOneChar(4,0,LCD1602_Table[TIME_Buffer[1]/10]);
- DisplayOneChar(5,0,LCD1602_Table[TIME_Buffer[1]%10]);
- }
- DisplayOneChar(6,0,'/');
- if(SET_FLAG==3&&dis_flag)
- {
- DisplayOneChar(7,0,' ');
- DisplayOneChar(8,0,' ');
- }
- else
- {
- DisplayOneChar(7,0,LCD1602_Table[TIME_Buffer[2]/10]);
- DisplayOneChar(8,0,LCD1602_Table[TIME_Buffer[2]%10]);
- }
- DisplayOneChar(9,0,' ');
- if(SET_FLAG==4&&dis_flag)
- {
- DisplayOneChar(10,0,' ');
- DisplayOneChar(11,0,' ');
- }
- else
- {
- DisplayOneChar(10,0,LCD1602_Table[TIME_Buffer[3]/10]);
- DisplayOneChar(11,0,LCD1602_Table[TIME_Buffer[3]%10]);
- }
- if((TIME_Buffer[5]%2)==0)
- DisplayOneChar(12,0,':');
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
完整論文下載(word格式 可編輯):
電子羅盤的設計-畢業設計.doc
(3.46 MB, 下載次數: 150)
2017-7-29 02:55 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|