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