摘要:為測量在油氣井開發(fā)過程中所需要的壓力數(shù)據(jù),設(shè)計制作了一種以PIC16F87X單片機(jī)為核心的微型井下智能壓力計。在設(shè)計中,采用I2C總線技術(shù)中器件地址的硬件接口設(shè)置,可同時掛接多個存儲器到總線,解決了大容量數(shù)據(jù)快速存儲的問題;利用FT245BL芯片,實(shí)現(xiàn)了USB和并行I/O口之間數(shù)據(jù)傳輸協(xié)議的自動轉(zhuǎn)換。
1 系統(tǒng)整體設(shè)計方案
本系統(tǒng)分為井下儀器部分和地面軟件處理部分,如圖1所示。井下儀器部分主要有壓力采集電路,并進(jìn)行相應(yīng)的處理,以完成信號電平調(diào)整,阻抗匹配等;在井下復(fù)雜環(huán)境中不利于數(shù)據(jù)的無線傳輸,需要把采集到的數(shù)據(jù)存儲起來;地面軟件部分,將數(shù)據(jù)送入計算機(jī),利用PC機(jī)強(qiáng)大的數(shù)據(jù)處理功能進(jìn)行數(shù)據(jù)分析。
2 數(shù)據(jù)傳輸存儲模塊
(1)系統(tǒng)的數(shù)據(jù)傳輸存儲采用I2C總線標(biāo)準(zhǔn)。I2C總線是一種高性能芯片間串行同步傳輸總線,它僅需要兩根信號線,就可實(shí)現(xiàn)完善的雙工同步數(shù)據(jù)傳送,能夠極其方便地構(gòu)成多機(jī)系統(tǒng)和外圍器件擴(kuò)展系統(tǒng)。本系統(tǒng)采用AT24C16存儲壓力數(shù)據(jù),方法如下:AT24C系列E2PROM接口及地址選擇。由于I2C總線可掛接多個串行接口器件,在I2C總線中每個器件應(yīng)有唯一的器件地址,按I2C總線規(guī)則,器件地址為7位數(shù)據(jù),它和1位數(shù)據(jù)方向位構(gòu)成一個器件尋址字節(jié),最低位D0為方向位(讀/寫)。器件尋址字節(jié)中的最高4位(D7~D4)為器件型號地址,不同的I2C總線接口器件的型號地址是廠家給定的,如AT24C系列E2PROM的型號地址皆為1010;器件地址中的低3位為引腳地址A2、A1、A0,對應(yīng)器件尋址字節(jié)中的D3、D2、D1位,在硬件設(shè)計時由連接的引腳電平給定。
AT24C系列片內(nèi)地址在接收到每—個數(shù)據(jù)字節(jié)地址后自動加1,故裝載一頁以內(nèi)規(guī)定數(shù)據(jù)字節(jié)時,只須輸入首地址,若裝載字節(jié)多于規(guī)定的最多字節(jié)數(shù),數(shù)據(jù)地址將自動翻頁,新頁中以前的數(shù)據(jù)將被覆蓋。
(2)主控器與從接收器之間在總線上進(jìn)行一次數(shù)據(jù)傳輸,稱為“一幀”。按I2C總線規(guī)范的約定,一幀之內(nèi)由啟動信號、尋址字節(jié)、若干個數(shù)據(jù)字節(jié)、停止信號以及重啟動信號組成。在傳輸數(shù)據(jù)開始前,主控器件應(yīng)發(fā)送起始位,通知從接收器件作好接收準(zhǔn)備;接著發(fā)送地址字節(jié),當(dāng)主控器收到從接收器件的應(yīng)答位后發(fā)送第一個數(shù)據(jù)字節(jié),從接收器收到數(shù)據(jù)后又返送一個應(yīng)答信號,主控器收到應(yīng)答位后發(fā)送第二個數(shù)據(jù)字節(jié),如此循環(huán)反復(fù);在傳輸數(shù)據(jù)結(jié)束時,主控器件發(fā)送停止位,通知從接收器件停止接收。每次傳輸?shù)淖止?jié)不受限制,每個字節(jié)必須有—個確認(rèn)位(又稱應(yīng)答位ACK)。數(shù)據(jù)傳送時都是高位在前。
3 USB通信模塊
系統(tǒng)的USB通信模塊完成PIC單片機(jī)與上位機(jī)設(shè)備的通信,從而將采集到的數(shù)據(jù)送到上位機(jī)進(jìn)行處理。數(shù)據(jù)傳送需要遵循相同的傳輸協(xié)議,如果單片機(jī)和上位機(jī)之間的傳輸協(xié)議不一樣,就需要進(jìn)行協(xié)議間的轉(zhuǎn)換。
本文采用FT245BL芯片實(shí)現(xiàn)USB和并行I/O口之間的協(xié)議轉(zhuǎn)換。一方面, FT245BL從主機(jī)接收USB數(shù)據(jù),并將其轉(zhuǎn)換為并行I/O口的數(shù)據(jù)流格式發(fā)送給外設(shè);另一方面,外設(shè)通過并行I/O口將數(shù)據(jù)轉(zhuǎn)換為USB的數(shù)據(jù)格式傳回主機(jī)。中間的轉(zhuǎn)換工作全部由芯片自動完成,開發(fā)者無須考慮固件的設(shè)計。采用FT245BL芯片,需事先安裝虛擬串口VCP驅(qū)動程序(VirtualCOM Port),并且可以在這虛擬串口上進(jìn)行應(yīng)用程序的開發(fā)。該虛擬串口可以像一個標(biāo)準(zhǔn)的物理串口那樣被訪問,可本質(zhì)上所有針對虛擬串口的數(shù)據(jù)通信都是通過USB總線完成的,在設(shè)備端則通過并行I/O口完成。
3.1 單片機(jī)端
在單片機(jī)設(shè)備端,接收數(shù)據(jù)時:首先,采樣RXF#端上的信號,若為低,表明有接收到來自PC機(jī)的數(shù)據(jù),允許單片機(jī)通過8位數(shù)據(jù)總線RD0~RD7讀取數(shù)據(jù);接著,通過信號由低到高的變化鎖存數(shù)據(jù)(讀入數(shù)據(jù));最后,延遲一段時間,重新開始下一字節(jié)的讀取。發(fā)送數(shù)據(jù)時,采樣TXE#端上的信號,若為低,允許發(fā)送,將數(shù)據(jù)寫入發(fā)送緩沖區(qū),等待上位機(jī)接收。
3.2 上位機(jī)端
只需把與FT245BL相連的USB線接到計算機(jī)的USB接口。上位機(jī)軟件的串口通信采用VisualC++6.0自帶的串口通信類(MSComm類)來完成,MSComm類通過控件的形式來使用。
MSComm通信控件有兩種處理事件的方式,分別為查詢方式和事件驅(qū)動方式。本文采用事件驅(qū)動方式,在串口接收緩沖區(qū)中有字符時,利用MSComm控件的OnComm事件捕獲并處理這些通信事件。這種方法的優(yōu)點(diǎn)是程序響應(yīng)及時、可靠性高。編寫程序時,只要了解使用MSComm的屬性和事件的用法就可以實(shí)現(xiàn)對串口的操作。
在當(dāng)前應(yīng)用程序中插入MSComm控件。本文新建一個MFC AppW izard工程項目,應(yīng)用程序類型選擇基本對話框,視圖類基于CFormView。只需在CForm-View對應(yīng)的對話框窗體插入MSComm控件,再在ClassW izard中為該控件聲明一個變量即可。
下位機(jī)采集的數(shù)據(jù)及上位機(jī)發(fā)給下位機(jī)的指令都是通過串口進(jìn)行傳輸?shù)摹I衔粰C(jī)與下位機(jī)通過雙方共同認(rèn)可的協(xié)議進(jìn)行通信,所以要進(jìn)行串口初始化,使得串口參數(shù)設(shè)置匹配。串口初始化要完成以下幾個設(shè)置:通信端口號、通信協(xié)議、傳輸速率、其他參數(shù)。兩種方法可以對串口進(jìn)行初始化:一是自己編寫串口初始化函數(shù),另一種是利用MSComm控件的屬性對話框進(jìn)行初始化。本文采用了自定義函數(shù)INItial-izeComPort()初始化其端口。
初始化主要程序代碼片段如下(這里m_Com1是有效的MSComm對象):
InitializeComPort()
{
m_Com1. SetCommPort(3); //選擇COM3
m_Com1. SetInBufferSize(512); //設(shè)置輸入緩沖區(qū)的大小
m_Com1. SetOutBufferSize(512); //設(shè)置輸出緩沖區(qū)的大小
if(!m_Com1.GetPortOpen()); //打開串口
m_Com1. SetPortOpen(TRUE);
m_Com1. SetInpuMt ode(1); //設(shè)置輸入方式為二進(jìn)制方式
m_Com1. SetSettings(“9600, n, 8, 1”); //設(shè)置數(shù)據(jù)傳輸速率、偶校驗、數(shù)據(jù)比特、停止比特參數(shù)
m_Com1. SetRThreshold(1); //為1表示有一個字符引發(fā)一個事件
m_Com1. SetInputLen(0); //讀取全部字符
}
上位機(jī)向下位機(jī)發(fā)送“讀指令”,并將數(shù)據(jù)保存起來。該功能主要由兩部分程序?qū)崿F(xiàn),一部分為發(fā)“讀數(shù)據(jù)”指令程序,另一部分為串口接收數(shù)據(jù)程序。發(fā)“讀數(shù)據(jù)”指令程序主要實(shí)現(xiàn)的功能是向下位機(jī)發(fā)送“讀數(shù)據(jù)”指令,并提示數(shù)據(jù)傳輸?shù)臓顟B(tài);串口接收數(shù)據(jù)程序?qū)崿F(xiàn)的功能是根據(jù)命令類型變量,在發(fā)“讀數(shù)據(jù)”指令時置的值,決定相應(yīng)的操作,若命令類型為“讀數(shù)據(jù)”,則從下位機(jī)接收壓力數(shù)據(jù),并保存。流程圖見圖2。
圖2 發(fā)“讀數(shù)據(jù)”指令流程圖
4 結(jié)果與討論
完成系統(tǒng)的硬件測試與軟件調(diào)試之后,將下位機(jī)與上位機(jī)連接好,上位機(jī)串口設(shè)置和下位機(jī)串口設(shè)置匹配,便可以對整個系統(tǒng)所測量的結(jié)果進(jìn)行觀察。硬件電路將壓力轉(zhuǎn)化成相應(yīng)的頻率,程序采集頻率數(shù)據(jù),并轉(zhuǎn)換成相應(yīng)的壓力數(shù)據(jù)。輸出結(jié)果如圖3所示,由圖中可以看出,壓力與頻率成正比,實(shí)際給定的壓力值與測量到的壓力值幾乎一致。