楊晨娜
摘 要: 針對傳統(tǒng)油井測量儀器體積大、價格貴等問題,設(shè)計(jì)了一種新型高效的智能三臂測井儀器。該測井儀器將傳統(tǒng)的儀器做成以SPCE061A單片機(jī)為核心的嵌入式系統(tǒng),其集成度高,大部分功能用軟件實(shí)現(xiàn),包括測量、計(jì)算、結(jié)果校正、顯示、儀器量程自動校正和存儲、語音提示、報(bào)警等模塊。實(shí)驗(yàn)證明,該系統(tǒng)能夠穩(wěn)定工作,可靠性高,測量精度可達(dá)2%,能夠滿足實(shí)際油井直徑測試要求。
關(guān)鍵詞: SPCE061A; 軟件設(shè)計(jì); 測量精度; 自動校正
中圖分類號: TN702?34 文獻(xiàn)標(biāo)識碼: A 文章編號: 1004?373X(2015)18?0053?04
Abstract: To solve the problems of large volume and high cost of traditional oil well measuring instruments, a new?type intelligent three?arm logging instrument with high efficiency was designed. Instead of the traditional instruments, the embedded system with high integration density based on SPCE061A was implemented, whose most of functions can be realized with software, including measurement, calculation, result calibration, display, automatic correction/storage of instrument range, voice prompt and alarm modules. The experiment results show that the system has better stability and reliability, and its measuring accuracy can reach 2%, so it can meet the requirements of actual test of oil well diameter.
Keywords: SPCE061A; software design; measurement accuracy; automatic calibration
目前,我國油井直徑測量需求量大,井徑測量儀作為采油設(shè)備工具之一,隨著科學(xué)技術(shù)的快速發(fā)展不斷的更新,但普遍存在著體積大、價格貴、靈活性低等缺點(diǎn)。基于這種現(xiàn)象,本文設(shè)計(jì)了一種基于凌陽單片機(jī)的智能井徑測量系統(tǒng),其集成度高、測量誤差小、操作簡單、便于攜帶,具有很高的實(shí)用價值。
1 系統(tǒng)總體方案設(shè)計(jì)
系統(tǒng)功能的實(shí)現(xiàn)建立在硬件基礎(chǔ)之上,但也離不開質(zhì)量較好的軟件設(shè)計(jì),只有硬件和軟件無縫連接,所設(shè)計(jì)出的系統(tǒng)性能穩(wěn)定,具有較高的可靠性及使用性。在對儀器使用狀況充分了解的基礎(chǔ)上,設(shè)計(jì)了以單片機(jī)為核心的硬件電路。功能框圖及硬件原理圖如圖1所示。但是在測量系統(tǒng)中,不能只靠硬件來實(shí)現(xiàn),功能強(qiáng)大的軟件是驅(qū)動硬件不可或缺的。一個好的軟件大大簡化了硬件的設(shè)計(jì),軟硬件必須兩者緊密結(jié)合起來。既要看到硬件的效率高、又要發(fā)揮軟件功能強(qiáng)的特點(diǎn)。
2 井徑測量儀軟件實(shí)現(xiàn)
本井經(jīng)測量軟件主要由6部分組成:測量、濾波、標(biāo)度變換、存儲、顯示、報(bào)警、LED指示和校正。井徑測量軟件是一個包含鍵盤操作、LED顯示和主板控制存儲的小型操作系統(tǒng)。它用匯編語言和C語言聯(lián)合編寫而成。匯編和C語言相結(jié)合,既顯現(xiàn)出了匯編語言的精煉,又不失C語言的簡練。本程序合理安排匯編和C的比例,使程序精煉而高效。
2.1 主程序模塊
程序采用模塊化設(shè)計(jì)。主程序模塊是整個程序的核心,其流程如圖2所示。進(jìn)入系統(tǒng)后,首先對儀器的標(biāo)準(zhǔn)點(diǎn)進(jìn)行設(shè)置,然后對系統(tǒng)進(jìn)行初始化。接著采用永為真的while語句進(jìn)行不斷循環(huán)掃描,進(jìn)行數(shù)據(jù)采集以及標(biāo)度變換工作。在循環(huán)中,先對鍵盤進(jìn)行初始化操作,之后進(jìn)行鍵盤掃描,直到有一個鍵按下,并讀取鍵值,若再有一鍵按下,則進(jìn)入系統(tǒng)矯正程序,當(dāng)有第三鍵按下時進(jìn)行FLASH擦除工作。接著進(jìn)入A/D轉(zhuǎn)換程序,對采樣的4組數(shù)據(jù)進(jìn)行A/D轉(zhuǎn)換后,進(jìn)行求平均值,所得結(jié)果作為最后采樣數(shù)據(jù)。接著對采樣數(shù)據(jù)進(jìn)行判斷,其值是否處于有效范圍之內(nèi),若結(jié)果小于最小值,則顯示LLL,當(dāng)結(jié)果大于最大值時,則顯示HHH并進(jìn)行報(bào)警,之后才進(jìn)行標(biāo)度變換。
具體程序如下:
#include "hardware.h" //定義頭文件
#include "math.h"
int main() //主函數(shù)
{
int i;
unsigned long int AD_result;
//定義變量存儲A/D轉(zhuǎn)換的結(jié)果
unsigned long int AD_resultall;
//定義變量存儲A/D轉(zhuǎn)換的結(jié)果值
F_FlashErase(0xbf00); //初始化存儲效正值的FLASH段
F_FlashWrite1Word(0xbf00,0); //將A/D轉(zhuǎn)換結(jié)果存入FLASH中 F_FlashWrite1Word(0xbf01,250);
F_FlashWrite1Word(0xbf02,500);
F_FlashWrite1Word(0xbf03,750);
F_FlashWrite1Word(0xbf04,1000);
Initial(); //程序初始化
//A/D轉(zhuǎn)換&誤差效正 //
while(1)
{
key_Initial(); //鍵盤初始化
uiKeyValue=F_GetKeyValue(); //得到鍵值
if ((uiKeyValue==0x0002)|(uiKeyValue==0x0003))
tiaozheng(); //如果為2鍵或1、2同時鍵進(jìn)入調(diào)整程序
if ((uiKeyValue==0x0004)|(uiKeyValue==0x0005))
{
Flash_erase();Flash_enpty=0;}
//初始化FLASH存儲器
AD_resultall=0; //A/D轉(zhuǎn)換累加器清0
AD_average=0; //A/D轉(zhuǎn)換平均值清0
system_off(); //關(guān)閉系統(tǒng)中斷
for(i=1;i<=4;i++) //進(jìn)行4次轉(zhuǎn)換
{
AD_result=AD_converter(); //返回一次A/D轉(zhuǎn)換的結(jié)果
AD_resultall=AD_resultall+AD_result; //求A/D總值
}
system_on();
AD_average=AD_resultall/4; //進(jìn)行4次轉(zhuǎn)換求平均值
//標(biāo)度變換 //
if (AD_averagehhh)
{
shiwei=0x000b;
gewei=0x000b;
xshdhyw=0x000b;
xshdhew=0x000b;
}
else
{
DATA_result=DATA_converte(AD_average);
//對A/D轉(zhuǎn)換結(jié)果進(jìn)行標(biāo)度變換
alarm();
DATA_result*=100; //對結(jié)果乘100
shiwei=DATA_result/1000; //取出結(jié)果的十位
gewei=fmodf(DATA_result,1000)/100; //取出結(jié)果的個位
xshdhyw=fmodf(DATA_result,100)/10;
//取出結(jié)果的小數(shù)點(diǎn)后1位
xshdhew=fmodf(DATA_result,10);
//取出結(jié)果的小數(shù)點(diǎn)后2位
}
}
} //結(jié)束while循環(huán)
}
2.2 A/D轉(zhuǎn)換模塊及其誤差校正
A/D轉(zhuǎn)換模塊是整個程序數(shù)據(jù)的入口,如圖3所示,其關(guān)系著測量的速度和精度。為了提高精度和減少函數(shù)數(shù)量便與傳遞參數(shù),誤差校正模塊嵌入在主程序中,而A/D轉(zhuǎn)換函數(shù)則用匯編語言編寫,函數(shù)無入口參數(shù),返回值為A/D轉(zhuǎn)換的10位2進(jìn)制結(jié)果。
如圖4所示,進(jìn)入誤差校正程序后,首先對標(biāo)志變量清0,調(diào)用A/D轉(zhuǎn)換函數(shù),并將A/D轉(zhuǎn)換的結(jié)果累加,判斷4次轉(zhuǎn)換是否結(jié)束,未結(jié)束則繼續(xù)進(jìn)行轉(zhuǎn)換,結(jié)束后求出平均值存入全局變量AD_average中。
在A/D轉(zhuǎn)換函數(shù)中,首先選擇模擬量輸入通道為LINEIN IOA0 ,允許A/D轉(zhuǎn)換,延時后查詢A/D轉(zhuǎn)換標(biāo)志,判斷A/D轉(zhuǎn)換是否結(jié)束,未結(jié)束繼續(xù)轉(zhuǎn)換,結(jié)束后將結(jié)果左移6位,然后返回給調(diào)用函數(shù)。
2.3 標(biāo)度變換模塊
量程校正模塊是一個結(jié)構(gòu)簡單的模塊,它主要完成復(fù)雜的4次牛頓插值計(jì)算,所以它用C語言編寫,代碼精煉簡單,如圖5所示。
2.4 系統(tǒng)初始化模塊
系統(tǒng)初始化模塊是對系統(tǒng)運(yùn)行前各個參數(shù)的設(shè)置,如圖6所示,包括I/O口的初始化,系統(tǒng)時基的初始化,中斷初始化等,其中時基選擇為32 Hz,中斷為IRQ5?2 Hz用于存儲數(shù)據(jù)計(jì)時,IRQ6?32 Hz用于LED動態(tài)顯示中斷。32 Hz頻率適中,使LED即能達(dá)到亮度,又不回閃爍,顯示穩(wěn)定。RAM校正表的緩存作為一個程序在這里被調(diào)用, 這段程序首先從FLASH ROM中讀出參考的校正數(shù)據(jù),然后根據(jù)計(jì)算生成4次牛頓插值表,并將表存入RAM等候被調(diào)用。
2.5 LED顯示模塊
LED顯示是人機(jī)交互最直觀的部分,要讓他即能及時顯示,又能不受其他程序的影響,所以LED顯示被放在32 Hz中斷中被調(diào)用,當(dāng)每次進(jìn)入中斷時首先就是進(jìn)行壓棧保護(hù),然后取出入口參數(shù),入口參數(shù)為4位要顯示的數(shù)字如:23.87,入口參數(shù)就為2,3,8,7。然后初始化了位選標(biāo)志位寄存器,接著進(jìn)入相應(yīng)位的顯示程序,在那里查表,找到LED位選和段選的編碼送IOB口顯示,延時顯示完1位后就給位標(biāo)志位加1顯示下1位,當(dāng)位選標(biāo)志為5時表示一輪顯示完畢,即出棧后退出中斷程序,如圖7所示。
2.6 存儲程序模塊
存儲程序模塊包括2部分,一部分為FLASH ROM初始化即擦除程序,另一部分為FLASH寫子程序,如圖8所示。FLASH擦除時每次可擦256 B,當(dāng)給FLASH中存儲數(shù)據(jù)時必須先擦除才可寫入。所以專門設(shè)立FLASH擦除鍵,用于手動控制FLASH的初始化。FLASH寫子程序被0.5 Hz的中斷調(diào)用,用于定時存儲數(shù)據(jù),便于日后分析,它將A/D轉(zhuǎn)換的結(jié)果存在以c000開始的FLASH中,每存1次給地址指針加1。
2.7 系統(tǒng)校正程序模塊
系統(tǒng)校正程序標(biāo)志本井徑測量儀進(jìn)入了智能儀器的行列,它之所以被稱為智能是因?yàn)樗梢愿鶕?jù)需要和實(shí)際情況自動的調(diào)整量程,同時亦是對系統(tǒng)誤差的校正,如圖9所示。它的原理是人為地輸入5個標(biāo)準(zhǔn)點(diǎn),測量儀記錄下這5個標(biāo)準(zhǔn)點(diǎn),并通過4次插牛頓值公式生成校正表,等下次測量時就可以根據(jù)這5個標(biāo)準(zhǔn)點(diǎn)和校正表對測量值進(jìn)行標(biāo)度變換,程序具體流程如下所述,進(jìn)入系統(tǒng)校正程序后,首先點(diǎn)亮校正模式指示燈,然后系統(tǒng)關(guān)中斷,將存儲校正值的FLASH初始化,語音提示:“進(jìn)入系統(tǒng)校正模式”提示用戶做好相應(yīng)的校正準(zhǔn)備;程序進(jìn)入一個5次循環(huán),即設(shè)置5個標(biāo)準(zhǔn)點(diǎn),程序提示開始校正第一點(diǎn),請用戶把標(biāo)準(zhǔn)值放在第一點(diǎn)上,緊接著程序不斷進(jìn)行鍵盤掃描等候用戶按確定鍵確認(rèn)輸入的標(biāo)準(zhǔn)量程;當(dāng)有鍵按下時系統(tǒng)進(jìn)行4次A/D轉(zhuǎn)換,并通過求平均值法消除隨即誤差,并將標(biāo)準(zhǔn)值存入內(nèi)存指定單元,程序接著進(jìn)入第二輪循環(huán),并提示進(jìn)行校正第二點(diǎn),這樣當(dāng)進(jìn)行完5次校正后,系統(tǒng)會把校正值存入指定的FLASH ROM單元中,調(diào)用生成校正表程序,提示:“系統(tǒng)校正完畢”,指示燈滅;系統(tǒng)恢復(fù)現(xiàn)場并繼續(xù)進(jìn)行測量,此后測量的結(jié)果都是通過新生成的校正表,插值校正等計(jì)算而成,精確度提高誤差減小。
2.8 其他模塊
(1) 報(bào)警程序模塊:報(bào)警程序被放在標(biāo)度變化后被調(diào)用,判斷變化結(jié)果是否低于報(bào)警值,不低于時退出不做任何操作;若小于設(shè)定報(bào)警值立刻進(jìn)行語音報(bào)警,并驅(qū)動相應(yīng)報(bào)警燈閃爍。它是儀器智能化的一個重要部分。
(2) LED指示程序模塊:LED指示模塊,作為一個獨(dú)立的模塊,需要LED指示的程序調(diào)用,它的入口參數(shù)為要顯示的相應(yīng)燈16進(jìn)制編碼,由于其在IOA的高8位輸出,又不影響IOA口原來的狀態(tài),所以要將數(shù)據(jù)左移8位,然后和IOA口原來的數(shù)據(jù)相異或,在送給IOA口顯示這樣就點(diǎn)亮了相應(yīng)的指示燈。這段程序用匯編語言編寫恰到好處,代碼精煉,運(yùn)行速度快。
(3) 語音播放程序模塊:語音播放是SPCE061A單片機(jī)的特色功能,在這里增加語音提示功能,可以使人機(jī)交互更加方便,生動。它的入口參數(shù)為被播放的語音段編碼,語言播放很簡單,這里采用凌陽壓縮算法S480,它有較高的壓縮率和較清晰的音質(zhì),作為語音提示是個理想的選擇。由于SPCE公司已經(jīng)做好了語音播放函數(shù)庫,這里只需要進(jìn)行語言播放初始化和提供相應(yīng)播放參數(shù)就可進(jìn)行播放;不過每次提示音播放完畢后都要對系統(tǒng)的時鐘和中斷復(fù)位,使系統(tǒng)能夠正常運(yùn)行。
3 結(jié) 語
本井徑測量儀所實(shí)現(xiàn)的功能為:量程范圍為7~15 inch,即17~38 cm;測量儀上電時會立即進(jìn)入測量模式,從3位LED上顯示輸出測量值,測量的結(jié)果會自動存儲,同時存儲指示燈會閃爍,儀器放入井中后會進(jìn)行實(shí)時的測量;當(dāng)測量值小于報(bào)警值時,儀器報(bào)警指示燈會閃爍,并有語音報(bào)警提示;儀器若卡在井中,會自動發(fā)出聲光報(bào)警,可以根據(jù)實(shí)際給定的標(biāo)準(zhǔn)值進(jìn)行自動校正。
參考文獻(xiàn)
[1] 趙茂泰.智能儀器原理及應(yīng)用[M].北京:電子工業(yè)出版社,2009.
[2] 楊秀萍,劉嵩巖.小型化油井綜合測試系統(tǒng)設(shè)計(jì)[J].哈爾濱商業(yè)大學(xué)學(xué)報(bào):自然科學(xué)版,2008(3):344?346.
[3] 侯媛彬.凌陽單片機(jī)原理及其開發(fā)[M].北京:科學(xué)出版社,2012.
[4] 陳言俊.凌陽16位單片機(jī)應(yīng)用[M].北京:北京航空航天大學(xué)出版社,2009.
[5] 任衛(wèi)軍.凌陽十六位單片機(jī)原理及應(yīng)用[M].西安:西安電子科技大學(xué)出版社,2011.
[6] 譚浩強(qiáng).C程序設(shè)計(jì)教程[M].北京:清華大學(xué)出版社,2013.