目錄 第一章 緒論 1 第二章 需求分析 2 2.1 設(shè)計目的 2 2.2 設(shè)計要求 2 第三章 方案設(shè)計 3 第四章 硬件設(shè)計 4 4.1 信號輸入 4 4.2信號放大 5 4.3 A/D轉(zhuǎn)換 7 4.4 單片機 9 第五章 LABVIEW軟件設(shè)計 10 5.1 串口通訊 10 5.2 報警模塊 11 5.3 存入數(shù)據(jù) 11 5.4 數(shù)據(jù)顯示 12 第六章 測量誤差處理 14 6.1 系統(tǒng)誤差處理 14 6.2 隨機誤差處理 14 第七章 小結(jié) 15 參考文獻 16 附錄 17
第一章緒論 本次課程設(shè)計的題目是設(shè)計虛擬電壓表。使用了C51單片機和AD7705模塊完成數(shù)據(jù)的采集和處理,然后將處理后的數(shù)據(jù)通后串口發(fā)送到計算機。計算機由LABVIEW程序編寫上位機程序,將收到的數(shù)據(jù)進行判斷,處理后進行顯示,存儲等操作。由LABVIEW編寫的上位機程序,在整個課程設(shè)計中有重要的作用。本次設(shè)計的虛擬電壓表是一種虛擬儀器。它是由計算機技術(shù)、測量技術(shù)和微電子技術(shù)高速發(fā)展而孕育出的一項革命性技術(shù)。這一創(chuàng)新使得用戶能夠根據(jù)自己的需要定義儀器功能,而不像傳統(tǒng)儀器那樣受到儀器廠家的限制。虛擬儀器的出現(xiàn)徹底改變了傳統(tǒng)的儀器方法,開辟了測控技術(shù)的新紀元。 虛擬儀器由硬件設(shè)備與接口、設(shè)備驅(qū)動軟件和虛擬儀器面板組成。其中,硬件設(shè)備與接口可以是各種以PC為基礎(chǔ)的內(nèi)置功能插卡、通用接口總線接口卡、串行口、VXI總線儀器接口等設(shè)備,或者是其它各種可程控的外置測試設(shè)備,設(shè)備驅(qū)動軟件是直接控制各種硬件接口的驅(qū)動程序,虛擬儀器通過底層設(shè)備驅(qū)動軟件與真實的儀器系統(tǒng)進行通訊,并以虛擬儀器面板的形式在計算機屏幕上顯示與真實儀器面板操作元素相對應(yīng)的各種控件。用戶用鼠標操作虛擬儀器的面板就如同操作真實儀器一樣真實與方便。 與傳統(tǒng)儀器相比,虛擬儀器其有下面一些特點: (1)虛擬儀器的軟硬件都具有開放性、模塊化、互換性、可重復(fù)使用等特點。 (2)大大地降低了測試成本。 (3)使用效率高。 (4)功能更強大,處理能力更強。 (5)遠程訪問和交互式操作。 (6)測量精度更高。 本次的虛擬電壓表設(shè)計就是采用了虛擬儀器設(shè)計,硬件只完成數(shù)據(jù)測量和把測量的數(shù)據(jù)傳入計算機的任務(wù)。然后對數(shù)據(jù)的處理,顯示,判斷,報警等操作都由LABVIEW程序完成。這樣可以盡量減少硬件器件間的干擾,參數(shù)誤差等原因造成的誤差,還能降低購買元件的成本等,能夠帶來很大的方便。 第二章需求分析2.1 設(shè)計目的 本次課程設(shè)計的任務(wù)是設(shè)計虛擬電壓表。設(shè)計一個智能化的虛擬電壓采集、測量、監(jiān)控系統(tǒng),該系統(tǒng)以單片機和虛擬儀器技術(shù)為核心并具有如下功能: (1)能對0-10V范圍變化的模擬信號進行連續(xù)采樣,并在PC機中進行實時顯示,采樣頻率不低于10Hz; (2)具有數(shù)據(jù)記錄功能,能夠?qū)⒉杉降臄?shù)據(jù)以文件形式保存在PC機中; (3)能對系統(tǒng)存在的隨機誤差和系統(tǒng)誤差進行校正; (4)系統(tǒng)具有自動量程選擇功能,量程至少4檔可調(diào); (5)具有自動電壓監(jiān)控功能,當采樣值大于8V時,點亮報警指示燈。 2.2 設(shè)計要求(1)合理設(shè)計系統(tǒng)總體方案,并畫出方框圖; (2)正確選擇A/D和PGA,要求系統(tǒng)測量最大量程時,測量分辨率達到1mV以內(nèi),最小量程時測量分辨率達到1uV以內(nèi); (3)要求系統(tǒng)具有隨機誤差和系統(tǒng)誤差校正功能,具有自動量程選擇功能; (4)PC機軟件由LabVIEW或C/C++等編程實現(xiàn),要求操作方便,界面美觀; (5)設(shè)計說明書應(yīng)詳細說明設(shè)計思路、特點和電路工作原理; (6)用A3紙繪制軟件流程圖,流程圖要模塊化并具有可讀性(即根據(jù)流程圖知道程序功能的實現(xiàn)過程);編制模塊化源程序,注釋不少于1/3; (7)硬件電路圖應(yīng)詳細標明所采用元件的型號、連線的引腳編號,要求采用專業(yè)軟件繪制硬件電路圖; (8)設(shè)計說明書應(yīng)包括課程設(shè)計任務(wù)、總體方案設(shè)計、詳細硬件、詳細軟件設(shè)計、軟件流程圖、程序清單、元器件清單7個部分; 按照學校課程設(shè)計說明書撰寫規(guī)范提交一份課程設(shè)計說明書(6000左右) 第三章 方案設(shè)計設(shè)計方案主要由兩部分組成。單片機和芯片部分組成下位機,用于測量數(shù)據(jù)和把數(shù)據(jù)發(fā)送到計算機。LABVIEW部分組成上位機程序,主要用于測量結(jié)果的顯示和隨機誤差處理。
|
| file:///C:/Temp/Temp/msohtmlclip1/01/clip_image003.png |
圖3.2 LABVIEW程序流程圖
圖3.1 單片機流程圖
第四章硬件設(shè)計本次課程設(shè)計用到的硬件部分主要有C51單片機和AD7705模塊,和一個光敏電阻。AD7705芯片主要用于對電壓進行放大采集和進行AD轉(zhuǎn)換,對外界的輸入電壓進行測量。單片機主要用于控制AD7705芯片的操作,對芯片進行設(shè)置等操作。對系統(tǒng)誤差進行處理,進行串口通信,將數(shù)據(jù)傳入計算機中,由LABVIEW程序進行接收,然后由程序進行進一步的處理和顯示等操作。 4.1 信號輸入由于在設(shè)計要求中的輸入信號要求是0—10V的電壓測量,所以在設(shè)置AD7705芯片時可以采用單極性的工作方式。這樣有利于充分利用芯片AD的轉(zhuǎn)換精度。采用單極性輸入方式時,芯片可接收的信號的范圍是從0—+20mV到0—2.5V的單極性信號。測量要求是要最大輸入0—10V的電壓信號,大于芯片可接收的最大電壓,所以為了滿足設(shè)計要求需要對輸入信號進行分壓操作,使實際輸入AD芯片的電壓為要測量電壓的四分之一,然后進行AD轉(zhuǎn)換后對測量值乘以四倍恢復(fù)實際電壓的大小。 本次課程設(shè)計采用的是AD7705模塊,在模塊設(shè)計時對輸入電壓進行了一次分壓,使得輸入芯片的電壓為所測量的實際電壓的一半。所以AD7705模塊的電壓輸入最大范圍是0—5V。
|
| file:///C:/Temp/Temp/msohtmlclip1/01/clip_image005.jpg |
圖4.1 AD7705模塊輸入電路 在課程設(shè)計中要求的是最大0—10V,所以需要再次進行分壓。第二次分壓使用光敏電阻。當光照強度高時光敏電阻的阻值較小,光敏電阻上的分壓較小。當光照強度較低時,光敏電阻的阻值較大,光敏電阻的分壓較大。所以當改變光照的強度時,電壓就會發(fā)生變化。方便改變輸入的電壓,對不同的電壓值進行測量。檢驗電壓表設(shè)計的精度,判斷設(shè)計是否正確。且使用光敏電阻方便快捷適合對設(shè)計進行檢驗。
4.2信號放大選用的TM7705芯片模塊具有16位的AD轉(zhuǎn)換功能和可編程放大器功能?梢赃x擇1,2,4,8,16,32,64,128倍的增益,通過軟件編程進行控制放大。通過軟件編程直接測量傳感器輸出的各種微小信號,并將不同幅度范圍的各類輸入信號放大到接近A/D轉(zhuǎn)換器的滿標度電壓再進行A/D轉(zhuǎn)換,充分利用A/D的轉(zhuǎn)換精度,減小誤差。 file:///C:/Temp/Temp/msohtmlclip1/01/clip_image006.png 圖4.3 AD7705內(nèi)部結(jié)構(gòu)圖 因為在進行A/D轉(zhuǎn)換時要選擇合適的增益對輸入信號進行放大,充分利用A/D轉(zhuǎn)換的精度,減小誤差。所以在設(shè)計方案時需要對輸入信號的大小進行判斷,選擇合適的增益。 當檢測到輸入信號時先設(shè)置增益為一,芯片對輸入信號進行A/D轉(zhuǎn)換,得到一個16為的二進制轉(zhuǎn)換數(shù)值。然后對轉(zhuǎn)換值的大小進行判斷。若轉(zhuǎn)換值在 1—10V之間,則對信號放大1倍。若在0.1—1V之間,則對信號放大8倍。若在0.01—0.1之間,則對信號放大64倍。若在0到0.01之間,則對信號放大128倍。當放大倍數(shù)確定后,先對增益進行設(shè)置,根據(jù)程序選擇合適的放大倍數(shù),然后將放大后的信號進行A/D轉(zhuǎn)換。放大后的信號更加接近A/D的滿標度電壓,充分利用A/D的精度。 在進行芯片的增益設(shè)置時需要用到芯片內(nèi)部的各種寄存器。A/D7705的工作方式,增益選擇等設(shè)置都是通過改變寄存器內(nèi)的參數(shù)來實現(xiàn)的。 AD7705/7706 片內(nèi)包括 8 個寄存器,這些寄存器通過器件的串行口訪問。第一個是通信寄存器,它管理通道選擇,決定下一個操作是讀操作還是寫操作,以及下一次讀或?qū)懩囊粋寄存器。 所有與器件的通信必須從寫入通信寄存器開始。上電或復(fù)位后,器件等待在通信寄存器上進行一次寫操作。這一寫到通信寄存器的數(shù)據(jù)決定下一次操作是讀還是寫,同時決定這次讀操作或?qū)懖?作在哪個寄存器上發(fā)生。所以,寫任何其它寄存器首先要寫通信寄存器,然后才能寫選定的寄存器。所有的寄存器(包括通信寄存器本身和輸出數(shù)據(jù)寄存器)進行讀操作之前,必須先寫通信寄存器,然后才能讀選定的寄存器。此外,通信寄存器還控制等待模式和通道選擇,此外 DRDY狀態(tài) 也可以從通信寄存器上讀出。 所以在對增益進行設(shè)置前需要先對通信寄存器進行寫操作。 file:///C:/Temp/Temp/msohtmlclip1/01/clip_image007.png表4.1 通信寄存器
表4.2 設(shè)置寄存器
|
| file:///C:/Temp/Temp/msohtmlclip1/01/clip_image008.png |
先對通信寄存器寫入0x38,選擇數(shù)據(jù)寄存器,選擇通道一,下一步進行讀操作。然后調(diào)用編寫的A/D7705讀函數(shù)。讀取轉(zhuǎn)換結(jié)果輸出端口DOUT。然后對轉(zhuǎn)換結(jié)果的大小進行判斷。再對通信寄存器進行操作,寫入0x10。選擇設(shè)置寄存器,選擇通道一,下一步進行寫操作。根據(jù)對轉(zhuǎn)換結(jié)果大小的判斷,對設(shè)置寄存器寫入數(shù)據(jù)。如第一次轉(zhuǎn)換值在1—10V,則增益選擇應(yīng)為一倍。在設(shè)置寄存器中寫入0x46。選擇自校準模式,增益設(shè)置為一倍,單極性工作模式,緩沖模式。將下一次的A/D轉(zhuǎn)換設(shè)置合理的增益,使下一次的A/D轉(zhuǎn)換輸入盡量達到滿標度值,增加精度。
4.3 A/D轉(zhuǎn)換在選擇合適的增益后需要對放大后的電壓進行A/D轉(zhuǎn)換。A/D轉(zhuǎn)換是由A/D7705模塊內(nèi)部的ε—Δ調(diào)制器完成。 AD7705是一種16位A/D轉(zhuǎn)換器,可以用于測量低頻模擬信號。當電源電壓為5V、基準電壓為2.5V時,AD7705可直接接收0-2.5V擺幅范圍的單極性信號和-2.5V-2.5V范圍內(nèi)的雙極型信號。器件帶有增益可編程放大器,可選擇1、2、4、8、16、32、64、128等8中增益之一,通過軟件編程可以直接測量傳感器輸出的各種微小的信號,并將不同幅度范圍的各種輸入信號放大到接近AD轉(zhuǎn)換器的滿量程電壓進行AD 轉(zhuǎn)換。 AD7705是應(yīng)用于低頻測量的2/3通道的模擬前端。該器件可以接受直接來自傳感器的低電平的輸入信號,然后產(chǎn)生串行的數(shù)字輸出。利用Σ-∆轉(zhuǎn)換技術(shù)實現(xiàn)了16位無丟失代碼性能。選定的輸入信號被送到一個基于模擬調(diào)制器的增益可編程專用前端。片內(nèi)數(shù)字濾波器處理調(diào)制器的輸出信號。通過片內(nèi)控制寄存器可調(diào)節(jié)濾波器的截止點和輸出更新速率,從而對數(shù)字濾波器的第一個陷波進行編程。AD7705/7706只需2.7~3.3V或4.75~5.25V單電源。AD7705是雙通道全差分模擬輸入,它帶有一個差分基準輸入。當電源電壓為5V、基準電壓為2.5V時,這種器件都可將輸入信號范圍從0~+20mV到0~+2.5V的信號進行處理。還可處理±20mV~±2.5V的雙極性輸入信號,對于AD7705是以AIN(-)輸入端為參考點,而AD7706是COMMON輸入端。當電源電壓為3V、基準電壓為1.225V時,可處理0~+10mV到0~+1.225V的單極性輸入信號,它的雙極性輸入信號范圍是±10mV到±1.225V。因此,AD7705可以實現(xiàn)2/3通道系統(tǒng)所有信號的調(diào)理和轉(zhuǎn)換。A/D7705是用于智能系統(tǒng)、微控制器系統(tǒng)和基于DSP系統(tǒng)的理想產(chǎn)品,其串行接口可配置為三線接口。增益值、信號極性以及更新速率的選擇可用串行輸入口由軟件來配置。該器件還包括自校準和系統(tǒng)校準選項,以消除器件本身或系統(tǒng)的增益和偏移誤差。CMOS結(jié)構(gòu)確保器件具有極低功耗,掉電模式減少等待時的功耗至20μW(典型值)。AD7705采用16腳塑料雙列直插(DIP)和16腳寬體(0.3英寸)SOIC封裝和16腳TSSOP封裝。 file:///C:/Temp/Temp/msohtmlclip1/01/clip_image010.jpg 圖4.4 A/D7705引腳分配圖 A/D7705是完整的16位低成本Σ-Δ調(diào)制器,用于直流測量和低頻交流測量應(yīng)用,其具有低功耗(3 V時最大1m W)特性。 A/D7705擁有兩個差分通道,在實際設(shè)置時由于只需要一個輸入電壓,所以固定選擇通道一,每次設(shè)置通信寄存器時將最后兩位設(shè)置為00。當電壓經(jīng)過A/D7705模塊內(nèi)的PGA進行放大后,進入Σ-Δ調(diào)制器進行轉(zhuǎn)換。然后由程序讀函數(shù)(AD7705_Read())讀DOUT(轉(zhuǎn)換結(jié)果輸出端),得到一個16為的二進制數(shù)。將模擬信號轉(zhuǎn)換為數(shù)字信號。
4.4 單片機本次課程設(shè)計中還用到了C51單片機。單片機的主要作用是對A/D7705芯片進行控制,消除系統(tǒng)誤差和進行串口通訊將數(shù)據(jù)發(fā)送到計算機。將編寫好的程序?qū)雴纹瑱C中,通過程序給芯片寫入各種數(shù)據(jù),引導芯片動作,得到A/D轉(zhuǎn)換的結(jié)果。然后對數(shù)據(jù)進行系統(tǒng)誤差處理。系統(tǒng)誤差處理是通過誤差模型校正系統(tǒng)誤差。假設(shè)實際值x與測量值y是線性關(guān)系,建立系統(tǒng)誤差模型x=a*y+b。然后將輸入值接0和輸入最大值10,然后用萬用表測出輸出輸出值,求出a和b。然后將A/D轉(zhuǎn)換值帶入公式,進行系統(tǒng)誤差校正。 進行系統(tǒng)誤差校正后需要將轉(zhuǎn)換數(shù)據(jù)發(fā)送到計算機中,但為了充分利用A/D的轉(zhuǎn)換精度,輸入電壓通過PGA進行過放大。所以數(shù)據(jù)在發(fā)送前需要除以放大的倍數(shù),然后再將數(shù)據(jù)進行發(fā)送。 在數(shù)據(jù)發(fā)送時要用到串口通訊,所以在單片機程序中需要對串口進行設(shè)置。設(shè)置SCON 和TMOD 寄存器。允許串口接收,設(shè)置串口工作方式等。選定工作的定時器,選擇定時器工作方式。然后給低八位和高八位賦值,設(shè)置波特率。完成對串口的設(shè)置。
第五章 LABVIEW軟件設(shè)計5.1 串口通訊單片機與計算機的通訊用VISA來完成,VISA是虛擬儀器軟件體系結(jié)構(gòu)的縮寫,實質(zhì)上是一個I/O口軟件庫及其規(guī)范的總稱。VISA是應(yīng)用于儀器編程的標準I/0應(yīng)用程序接口,是工業(yè)界通用的儀器驅(qū)動器標準API(應(yīng)用程序接口),采用面向?qū)ο缶幊,具有很好的兼容性、擴展性和獨立性。用戶可用一個API控制包括VXI、GPIB及串口儀器在內(nèi)的不同種類的儀器。它還支持多平臺工作、多接口控制,是一個多類型的函數(shù)庫。在LabVIEW中編寫的VISA接口程序,當外部設(shè)備變更時,只需要更換幾個程序模塊即可使用,簡單方便而且開發(fā)效率高。在LabVIEW 中利用VISA節(jié)點進行串行通信編程。
|
| file:///C:/Temp/Temp/msohtmlclip1/01/clip_image011.png |
圖5.1 串口配置 在VISA資源名稱端連接串口選擇輸入端口,方便在運行程序時選擇USB接口。配置串口時還連接了波特率和數(shù)據(jù)比特輸入控件,方便對VISA串口進行配置。在VISA讀取時需要對每次讀取的字節(jié)數(shù)進行設(shè)置。在單片機程序中,波特率設(shè)置為9600,每次發(fā)送兩個數(shù)據(jù),每個數(shù)據(jù)為8比特,。所以在LABVIEW程序中,設(shè)置要與單片機保持一致,保證通訊的正常進行,得到正確的數(shù)據(jù)。如果需要對數(shù)據(jù)通訊方面進行更改時,需要對單片機程序和LABVIEW程序都進行更改,保證設(shè)置的匹配。
5.2 報警模塊報警模塊是一個簡單的比較程序,串口讀取的電壓與設(shè)置的報警電壓值進行比較,若串口的電壓值較大,則“大于等于”輸出的結(jié)果為真,報警燈的顏色改變,蜂鳴器報警。設(shè)置蜂鳴器報警頻率為2Hz,每次持續(xù)時間為5ms。 file:///C:/Temp/Temp/msohtmlclip1/01/clip_image012.png
圖5.2 報警模塊 5.3 存入數(shù)據(jù)存入數(shù)據(jù)時先在前面板選擇文件存入路徑,點擊存入“數(shù)據(jù)按鈕”,開始存入數(shù)據(jù)。按鈕的屬性設(shè)置為釋放時轉(zhuǎn)換,所以當點擊按鈕后,電壓數(shù)據(jù)會不斷存入文件中,再次點擊按鈕后停止。
|
|
|
|
| file:///C:/Temp/Temp/msohtmlclip1/01/clip_image013.png |
|
| file:///C:/Temp/Temp/msohtmlclip1/01/clip_image014.png |
|
圖5.3 存入數(shù)據(jù)(后面板) 圖5.4 存入數(shù)據(jù)(前面板) 5.4 數(shù)據(jù)顯示數(shù)據(jù)顯示時應(yīng)用了數(shù)值顯示控件以數(shù)字的形式顯示電壓,還有一個波形圖表顯示控件,顯示電壓值與時間的變化關(guān)系。前面板還有一個儀表顯示控件,用指針的形式顯示數(shù)值。
|
| file:///C:/Temp/Temp/msohtmlclip1/01/clip_image016.jpg |
圖5.5 數(shù)據(jù)顯示(前面板)
|
| file:///C:/Temp/Temp/msohtmlclip1/01/clip_image018.jpg |
圖5.6 數(shù)據(jù)顯示(后面板) 進行平均值濾波后的數(shù)據(jù)先進入“判定范圍并強制轉(zhuǎn)換”控件,判斷電壓的范圍。因為每個判斷控件的上下限判斷范圍不重合,所以四個判斷控件中只有一個判斷控件的輸出結(jié)果為真,其余輸出結(jié)果為假且只有輸出為“真”的判斷控件對應(yīng)的圓形指示燈會亮。四個控件的輸出結(jié)果進入條件結(jié)構(gòu)。只有一個條件結(jié)構(gòu)執(zhí)行“真”分支,將電壓數(shù)據(jù)乘以對應(yīng)的倍數(shù)輸出。執(zhí)行“假”分支的條件結(jié)構(gòu)都會輸出0。然后將所有條件結(jié)構(gòu)輸出的結(jié)果相加,輸入儀表顯示控件,用指針顯示。由于儀表顯示控件是顯示范圍只能設(shè)置一個范圍。所以將每個量程范圍內(nèi)的電壓值乘以合適的倍數(shù)都轉(zhuǎn)化到0-10V的范圍顯示。實際值根據(jù)哪一個圓形指示燈亮判斷在那個范圍。
第六章測量誤差處理6.1 系統(tǒng)誤差處理測量數(shù)據(jù)的系統(tǒng)誤差處理在單片機程序內(nèi)進行。系統(tǒng)誤差處理是通過誤差模型校正系統(tǒng)誤差。假設(shè)實際值x與測量值y是線性關(guān)系,建立系統(tǒng)誤差模型x=a*y+b。然后將輸入值接0和輸入最大值10,然后用萬用表測出輸出輸出值,求出a和b。然后將A/D轉(zhuǎn)換值帶入公式,進行系統(tǒng)誤差校正。
6.2 隨機誤差處理隨機誤差處理采用算數(shù)平均值濾波的方法處理。這種濾波方法的實質(zhì)是把N個數(shù)據(jù)的值相加,再求其平均值。顯然N的值越大,結(jié)果越準確,但計算的時間越長。這種濾波方法適用于對周期脈動的數(shù)據(jù)進行平滑加工,但對脈沖性干擾的平滑作用不理想,不宜用于脈沖性干擾較嚴重的場合。在對電壓值進行平均值濾波時,采用N為5,每五個數(shù)據(jù)計算平均值輸出,對隨機誤差進行處理。
|
| file:///C:/Temp/Temp/msohtmlclip1/01/clip_image020.jpg |
圖5.7 隨機誤差處理 第七章小結(jié)通過此次課程設(shè)計,使我更加扎實的掌握了有關(guān)智能儀器方面的知識,知道了還有許多東西我們沒有學到。在設(shè)計過程中雖然遇到了一些問題,但經(jīng)過一次又一次的思考,一遍又一遍的檢查終于找出了原因所在,也暴露出了前期我在這方面的知識欠缺和經(jīng)驗不足。實踐出真知,通過親自動手編程,使我們掌握的知識不再是紙上談兵。在課程設(shè)計過程中,我們不斷發(fā)現(xiàn)錯誤,不斷改正,不斷領(lǐng)悟,不斷獲取。最終的檢測調(diào)試環(huán)節(jié),本身就是在踐行過而能改,善莫大焉的知行觀。這次課程設(shè)計終于順利完成了,在設(shè)計中遇到了很多問題,最后在查找資料后,許多問題終于游逆而解,但也有的沒有弄懂。在今后社會的發(fā)展和學習實踐過程中,一定要不懈努力,不能遇到問題就想到要退縮,一定要不厭其煩的發(fā)現(xiàn)問題所在,然后一一進行解決,只有這樣,才能成功的做成想做的事,才能在今后的道路上劈荊斬棘,而不是知難而退,那樣永遠不可能收獲成功,收獲喜悅,也永遠不可能得到社會及他人對你的認可!
參考文獻[1] 微機原理與接口技術(shù)[M]/周鵬編著.--機械工業(yè)出版社.2001 [2] 智能儀器設(shè)計基礎(chǔ)/史健芳等編著.—2版.—北京:電子工業(yè)出版社,2012.9 [3]虛擬儀器測試技術(shù)/屈有安,陳雪敏主編.—北京:北京理工大學出版社,2016.1 [4] 智能化測量控制儀表原理與設(shè)計(第二版)/徐愛均編著.--北京:北京航空航天大學出版.2004.3 [5] 智能儀器原理及設(shè)計技術(shù)/劉大茂編著.—國防工業(yè)出版社.2014.5
附錄LABVIEW前面板程序:
|
| file:///C:/Temp/Temp/msohtmlclip1/01/clip_image022.jpg |
LABVIEW后面板程序:
|
| file:///C:/Temp/Temp/msohtmlclip1/01/clip_image024.jpg |
單片機程序: #include<reg51.h> #include<intrins.h> #define uchar unsigned char #define uint unsigned int
sbit CS=P1^0; //AD7705使能端 sbit DIN=P1^1; //單片機給AD7705數(shù)據(jù)輸入端 sbit DRDY=P1^2; //AD7705邏輯輸出端,用于控制結(jié)果是否輸出
sbit RST=P1^3; //AD7705復(fù)位端 sbit SCLK=P1^4; //AD7705外部時鐘信號輸入端 sbit DOUT=P1^5; //AD7705模數(shù)轉(zhuǎn)換結(jié)果輸出端
uchar tab[]={0x00,0x00}; //串口輸出數(shù)組 void delay1ms(uint z); //延時函數(shù),最小延時1ms void AD7705_Reset(); //AD7705復(fù)位函數(shù) void AD7705_Init(); //AD7705初始化函數(shù),包括各種寄存器設(shè)置與初始化 void AD7705_Write(uchar dat); //AD7705的DIN端口數(shù)據(jù)輸入函數(shù) uint AD7705_Read(); //AD7705的DOUT端口讀取模數(shù)轉(zhuǎn)換數(shù)據(jù)的函數(shù) void UART_Init(); //串口初始化函數(shù) void UART_SendByte(uchar dat); //串口發(fā)送1字節(jié)函數(shù) float AD_adjust(uint num_ad); //系統(tǒng)誤差模型矯正函數(shù)
uint AD_choose(uint num); //量程選擇函數(shù) uint deal(uintflags,uint Nums); /*主函數(shù)設(shè)計*/ void main() { uintFLAG; uintnData; UART_Init(); //串口初始化 AD7705_Reset(); //端口復(fù)位與函數(shù)復(fù)位共同執(zhí)行保證芯片正常運行 AD7705_Init(); //AD7705初始化函數(shù),包括各種寄存器設(shè)置與初始化 delay1ms(500); while(1) { while(DRDY); //當DRDY置1時,即數(shù)據(jù)轉(zhuǎn)換結(jié)束后開始運行下一步程序 ,DRDY=0表示數(shù)據(jù)寄存器中的數(shù)據(jù)可讀 AD7705_Write(0x38); //寫通信寄存器,選擇下一步讀、通道CH nData=AD7705_Read(); nData=AD_adjust(nData); //系統(tǒng)誤差處理 /**********************************量程選擇處理****************/ FLAG=AD_choose(nData); /**********************************量程選擇之后再次讀數(shù)據(jù)*******/ while(DRDY); AD7705_Write(0x38); //寫通信寄存器,選擇下一步讀、通道CH nData=AD7705_Read(); nData=deal(FLAG,nData); nData=AD_adjust(nData); //系統(tǒng)誤差處理
tab[0]=nData/256; //通過數(shù)據(jù)讀取函數(shù)將16位數(shù)據(jù)拆成2個8位數(shù)據(jù)賦給數(shù)組tab[] tab[1]=nData%256; UART_SendByte(tab[0]); //將數(shù)據(jù)的兩個位數(shù)分別通過串口函數(shù)傳輸給電腦形成16位數(shù) UART_SendByte(tab[1]); while(!DRDY); // } }
/*延時函數(shù)設(shè)計,最小延時1ms*/ void delay1ms(uint z) //延時z ms { uintx,y; for(x=z;x>0;x--) for(y=115;y>0;y--); }
/*AD7705復(fù)位函數(shù)設(shè)計,通過給DIN輸入持續(xù)32個脈沖周期(SCLK)以上的高電平將復(fù)位AD7705的數(shù)字接口, 復(fù)位之后要等待500us以上才能訪問AD7705芯片,這種復(fù)位方式不會影響AD7705內(nèi)部的任何寄存器, 所有的寄存器將保持復(fù)位之前的內(nèi)容,這種操作可以防止AD7705出現(xiàn)端口迷失*/ void AD7705_Reset() { uchari; CS=0; RST=1; DRDY=1;//設(shè)置DRDY為輸入 DOUT=1;//設(shè)置DOUT為輸入 DIN=1; for(i=0;i<40;i++)//DIN口高電平持續(xù)至少32個時鐘后芯片復(fù)位 { SCLK=0; _nop_(); SCLK=1; _nop_(); } } /*AD7705初始化函數(shù)設(shè)計*/ void AD7705_Init() //gain為增益的指數(shù)值,范圍0-7,代表1、2、4、8、16、32、64、128倍;CH為通道,1為通道1,2為通道2 {
AD7705_Write(0x20); //寫通信寄存器,選擇通道一,選擇下一步寫時鐘寄存器 AD7705_Write(0x08); //晶振二分頻,選擇輸出更新率分別為20Hz(0x00),25Hz(0x01),100Hz(0x02),200Hz(0x03)————默認輸出更新率為20Hz AD7705_Write(0x10); //寫通信寄存器,選擇通道一,選擇下一步寫設(shè)置寄存器 AD7705_Write(0x46); //***************************** //單極性,自校準,有緩沖,增益指數(shù)值 } /*AD7705的DIN端口指令輸入函數(shù)設(shè)計*/ void AD7705_Write(uchar dat) //設(shè)定形參為8位數(shù)據(jù) { uchar i; SCLK=1; for(i=8;i>0;i--) //將8位形參從高到低按位分8次輸給AD7705 { SCLK=0; //時鐘脈沖SCLK=0時才能給DIN輸入數(shù)據(jù)使DIN端發(fā)生改變 _nop_(); if(dat&0x80) DIN=1; else DIN=0; _nop_(); SCLK=1; //SCLK=1時允許DIN的數(shù)據(jù)寫入到TM7705中 _nop_(); dat<<=1; } DIN=1; //寫入結(jié)束使DIN=1和SCLK=1以防端口迷失 SCLK=1; } /*AD7705的DOUT端口數(shù)據(jù)讀取函數(shù)設(shè)計*/ uint AD7705_Read() //返回一個8位的數(shù)據(jù)轉(zhuǎn)換結(jié)果 { uchar i; uintdd=0; SCLK=1; for(i=0;i<16;i++) //分八次將8位數(shù)據(jù)結(jié)果從高位到低位逐位讀取 { SCLK=0; //SCLK=0允許DOUT端口數(shù)據(jù)發(fā)生改變 _nop_(); dd=dd<<1; if(DOUT) dd|=0x01; SCLK=1; //SLCK=1時使DOUT端口數(shù)據(jù)穩(wěn)定 _nop_(); } SCLK=1; //讀出結(jié)束使SCLK=1以防端口迷失 return dd; //返回函數(shù)數(shù)據(jù) } void UART_Init() //串口初始化 { SCON=0x50;//設(shè)置串口方式1且允許串口接收。串口工作方式一,8位異步工作方式,波特率可變,由定時器設(shè)置 TMOD=0x20;//設(shè)置定時器T1,工作方式2,八位自動裝入計數(shù)初值工作方式。 TL1=0xfd; TH1=0xfd;// TH1:重裝值9600波特率晶振11.0592MHz TR1=1;// TR1=1,打開定時器T1 } void UART_SendByte(uchar dat) { SBUF=dat; //將八位數(shù)據(jù)dat直接賦值給SBUF寄存器 while(!TI); //串口發(fā)送中斷產(chǎn)生時TI=1,否則TI=0; TI=0; //串口發(fā)送成功后必須將TI軟件置0 } uint deal(uintflags,uint Nums) { if(flags==1) { Nums=Nums/1.0; } elseif(flags==2) { Nums=Nums/8.0; } elseif(flags==3) { Nums=Nums/64.0; } elseif(flags==4) { Nums=Nums/128.0; } returnNums; }
float AD_adjust(uint num_ad) //系統(tǒng)誤差模型矯正函數(shù) { floatad_vo;
ad_vo=4.88*num_ad/4.84125952; returnad_vo; } uint AD_choose(uint num) //量程選擇函數(shù) { uintflag=0; //量程轉(zhuǎn)換標志 if(num>1&&num<=10) { AD7705_Write(0x10); //寫通信寄存器,選擇通道一,選擇下一步寫設(shè)置寄存器 AD7705_Write(0x46); //放大倍數(shù)1倍 flag=1; } elseif(num>0.1&&num<=1) { AD7705_Write(0x10); //寫通信寄存器,選擇通道一,選擇下一步寫設(shè)置寄存器 AD7705_Write(0x5e); //放大倍數(shù)8倍 flag=2; } elseif(num>0.01&&num<=0.1) { AD7705_Write(0x10); //寫通信寄存器,選擇通道一,選擇下一步寫設(shè)置寄存器 AD7705_Write(0x76); //放大倍數(shù)64倍 flag=3; } elseif(num>=0&&num<=0.01) { AD7705_Write(0x10); //寫通信寄存器,選擇通道一,選擇下一步寫設(shè)置寄存器 AD7705_Write(0x7e); //放大倍數(shù)128倍 flag=4; } returnflag; }
|