- 相關(guān)推薦
利用Delphi 3.0開發(fā)微機數(shù)據(jù)采集與處理軟件系統(tǒng)
張建軍(中國人民解放軍合肥炮兵學(xué)院研究生系)摘要:結(jié)合開發(fā)“無線電話務(wù)模擬訓(xùn)練系統(tǒng)”Win32版軟件的實例,本文詳細(xì)介紹利用Delphi3.0開發(fā)微機數(shù)據(jù)采集與處理軟件系統(tǒng)的方法。
關(guān)鍵詞:DelphiADCDAC
微機數(shù)據(jù)采集與處理系統(tǒng)簡介
數(shù)據(jù)采集與處理是計算機應(yīng)用的一個重要分支,主要研究信息數(shù)據(jù)的采集、存貯、處理及控制等內(nèi)容。70年代以來,由于微機技術(shù)的快速發(fā)展及其在軍、民用工程領(lǐng)域的廣泛應(yīng)用,尤其是適于通用微機(如IBMPC系列)使用的板卡級數(shù)據(jù)采集產(chǎn)品的大量出現(xiàn),以微機為核心的可編程數(shù)據(jù)采集與處理技術(shù)得到迅速發(fā)展,F(xiàn)在的微機,只需在其擴展槽內(nèi)插上一塊數(shù)據(jù)采集板,并輔以應(yīng)用軟件,即可組成一套微機數(shù)據(jù)采集與處理系統(tǒng),實現(xiàn)信息處理和實時控制功能。
數(shù)據(jù)采集與數(shù)據(jù)處理
數(shù)據(jù)采集與處理技術(shù)主要研究模數(shù)、數(shù)模轉(zhuǎn)換(A/D、D/A)、數(shù)據(jù)處理等問題,需要計算機硬件電路和軟件編程知識。
數(shù)據(jù)采集:為對溫度、壓力、流量、速度、位移、振動、噪聲等物理量進行測控,首先通過傳感器把上述物理量轉(zhuǎn)換成模擬電信號,而后由A/D—D/A板將模擬電信號轉(zhuǎn)換成時間、數(shù)值上量化且離散的數(shù)字量輸入計算機系統(tǒng)。數(shù)據(jù)采集的核心是A/D轉(zhuǎn)換。
數(shù)據(jù)處理:計算機根據(jù)被測控對象的需要,對采集到的數(shù)據(jù)進行數(shù)學(xué)分析運算,處理結(jié)果一方面送至顯示器、打印機等外設(shè),一方面由A/D—D/A板將數(shù)字量轉(zhuǎn)換成模擬電信號輸出,對外部物理量進行實時監(jiān)控。數(shù)據(jù)處理的核心是數(shù)值處理和D/A轉(zhuǎn)換。
。、微機數(shù)據(jù)采集與處理系統(tǒng)硬件組成
系統(tǒng)主要由被測控對象(設(shè)備)、A/D—D/A通道、開關(guān)量I/O通道、微機等組成,如圖1所示。較復(fù)雜的系統(tǒng)包括單片機等多機系統(tǒng)。
圖1微機數(shù)據(jù)采集與處理系統(tǒng)硬件組成
。、與IBMPC兼容的板卡級數(shù)據(jù)采集產(chǎn)品
利用IBMPC系列微機及其兼容機I/O通道開放的設(shè)計特點,許多廠商已經(jīng)設(shè)計出采用板卡級結(jié)構(gòu)的數(shù)據(jù)采集產(chǎn)品。這類產(chǎn)品在一塊印刷電路板上包括了模擬多路開關(guān)(MUX)、采樣保持電路(S/H)、模數(shù)、數(shù)模轉(zhuǎn)換器(ADC、DAC)等部件(有的板型還提供并行I/O接口8255,定時/計數(shù)器8254/8254等通用可編程芯片),采用IBMPC總線,可直接插入微機任一擴展槽。本文介紹臺灣AXIOM公司生產(chǎn)的AX5412高速數(shù)據(jù)采集板,以及利用Delphi開發(fā)該產(chǎn)品A/D—D/A接口軟件的方法。
軟件系統(tǒng)設(shè)計
、、預(yù)備知識
軟件開發(fā)工具的選擇
為開發(fā)基于Windows95/NT/98操作平臺的32位數(shù)據(jù)采集與處理系統(tǒng),軟件設(shè)計應(yīng)符合以下需求:
⑴具有在Windows下實時訪問80x86CPUI/O端口、硬件中斷調(diào)用等功能;
、浦С郑常参痪幊;
、谴a執(zhí)行速度快、界面友好、使用方便;
、乳_發(fā)周期短、代碼可重用性好、效費比高。
綜上所述,根據(jù)VC5.0、VB5.0、Delphi3.0(或其最新版Delphi4.0)三種流行RAD工具的不同特點,作者在開發(fā)Windows版“無線電話務(wù)模擬訓(xùn)練系統(tǒng)”軟件過程中選擇了Delphi3.0,利用Delphi的IDE環(huán)境編寫VCL構(gòu)件,結(jié)合虛擬設(shè)備驅(qū)動程序(.vxd)實現(xiàn)⑴的功能。
。病CL構(gòu)件主要屬性、方法、事件、過程介紹
、磐ㄓ脤傩、方法、過程
·ActiveHW:Boolean:該屬性只讀且運行時有效,如果虛擬設(shè)備驅(qū)動程序正常工作,則ActiveHW為True,否則為False。
·OpenDriver:該方法加載虛擬設(shè)備驅(qū)動程序,為其分配內(nèi)存,使程序具有直接訪問系統(tǒng)硬件的能力。如果虛擬設(shè)備驅(qū)動程序加載成功,ActiveHW屬性被設(shè)置為True,否則為False。
·CloseDriver:該方法關(guān)閉虛擬設(shè)備驅(qū)動程序,釋放為其分配的內(nèi)存。如果虛擬設(shè)備驅(qū)動程序關(guān)閉成功,ActiveHW被設(shè)置為False。
、艻/O端口訪問
·HardAccess:Boolean:該屬性決定虛擬設(shè)備驅(qū)動程序采用何種方式訪問I/O端口。如果HardAccess為False,I/O訪問速度較快,但若指定I/O地址已被其它驅(qū)動程序占用,I/O訪問可能失。蝗绻鸋ardAccess為True,I/O訪問速度稍慢,但能保證若指定I/O地址已被其它驅(qū)動程序占用,I/O訪問仍能進行。
·Port[Index:Word]:Byte:該方法數(shù)據(jù)類型為Byte—字節(jié)。(讀/寫指定地址的I/O端口,參數(shù)Index為指定I/O端口地址,數(shù)據(jù)類型為Word—字,下同)
·PortW[Index:Word]:Word:該方法數(shù)據(jù)類型為Word—字。
·PortL[Index:Word]:dWord:該方法數(shù)據(jù)類型為DWord—雙字。
I/O讀寫代碼實例:
withmyPortdo
begin
{...}
Port[$2F0]:=$47;//向地址為2F0H的I/O端口寫一個字節(jié)的數(shù)據(jù)47H
{...}
myInpute:=Port[$2F9];//從地址為2F9H的I/O端口讀一個字節(jié)的數(shù)據(jù),并賦給變量
//myInpute
{...}
end;
、怯布袛嗾{(diào)用
與DOS不同,在Windows操作系統(tǒng)中,硬件中斷調(diào)用功能被隱藏或屏蔽起來,Windows一般不允許直接調(diào)用硬件中斷。為此,需使用以下屬性、事件、方法:
·OnHwInterrupt:TnotifyEvent:該事件通知系統(tǒng)一個硬件中斷已經(jīng)被調(diào)用。應(yīng)將中斷服務(wù)程序放在該事件中。
·IRQNumber:Byte:該屬性指定欲調(diào)用的中斷號(IRQ1—15),不支持0號中斷(IRQ0—系統(tǒng)時鐘)。
·SetIRQ:該方法將IRQNumber指定的中斷分配給OnHwInterrrupt過程,并將IsIRQSet屬性設(shè)置為True。
·UnmaskInterrupt:該方法解除Windows對IRQNumber指定中斷的屏蔽,當(dāng)中斷產(chǎn)生時,將調(diào)用OnHWInterrupt事件,并將Masked屬性設(shè)置為False。
·MaskInterrupt:該方法恢復(fù)Windows對IRQNumber指定中斷的屏蔽,并將Masked屬性設(shè)置為True。
·DestroyIRQ:該方法釋放為解除屏蔽由IRQNumber指定中斷分配的內(nèi)存空間,并將IsIRQSet屬性設(shè)置為False,Masked屬性設(shè)置為True。
·IsIRQSet:Boolean:該屬性只讀,如果SetIRQ設(shè)置中斷成功,IsIRQSet屬性被設(shè)置為True,否則為False。
·Masked:Boolean:該屬性只讀,如果中斷設(shè)置成功,Masked為False,否則為False。
3、AX5412數(shù)據(jù)采集板性能簡介
與其它產(chǎn)品(如MS1215)相比,AX5412具有許多優(yōu)越性能。限于篇幅,本文無法對產(chǎn)品特性、開關(guān)描述、用戶連接、引腳功能、板上寄存器結(jié)構(gòu)和格式等逐一介紹,僅簡要介紹與接口編程有關(guān)的重要部分,以便閱讀下文所述程序時理解。
、挪捎12位A/D轉(zhuǎn)換器,A/D轉(zhuǎn)換時間為9us。
⑵可編程增益控制。
⑶開關(guān)選擇單端16通道模擬輸入或差動8通道模擬輸入(可抑制嗓聲,得到高精度A/D轉(zhuǎn)換結(jié)果)。
、日加16個連續(xù)I/O端口地址,通過板上基地址選擇開關(guān)設(shè)置基地址,默認(rèn)為300H。
⑸`定時器基頻率選擇開關(guān)(J3):AX5412自帶一片8254計數(shù)/定時器,8254中的計數(shù)器1和計數(shù)器2在內(nèi)部串聯(lián)起來產(chǎn)生一個固定周期信號作為A/D轉(zhuǎn)換的觸發(fā)源。有兩個基頻率1MHZ或10MHZ通過J3選擇,默認(rèn)為1MHZ。級聯(lián)定時器的頻率由下式確定:
除數(shù)1和除數(shù)2分別對應(yīng)于8254計數(shù)器1和計數(shù)器2設(shè)定的計數(shù)值(2~65535,計數(shù)器是16位的)。計數(shù)器1和計數(shù)器2值串聯(lián)相當(dāng)于一個32位的計數(shù)器,可以用于時間很長的定時。
、蔄/D數(shù)據(jù)寄存器(基址+0和基址+1)
·基址+0(讀):低4位說明進行A/D轉(zhuǎn)換的通道號(0~15);高4位是A/D轉(zhuǎn)換值的低4位。
·基址+0(寫):寫任意值即實施軟件觸發(fā)開始A/D轉(zhuǎn)換。
·基址+1(讀):A/D轉(zhuǎn)換值的高8位。
、宿D(zhuǎn)換通道控制寄存器(基址+2,讀/寫):低4位表示多通道A/D轉(zhuǎn)換的開始通道,高4位表示多通道A/D轉(zhuǎn)換的結(jié)束通道。如低4位和高4位寫入的值相同,表示單一通道連續(xù)采樣。
⑻0通道D/A輸出(基址+4和基址+5,寫)
·基址+4:寫該寄存器高4位輸出D/A0低4位,該寄存器低4位無效。
·基址+5:寫該寄存器8位輸出D/A0高8位。
、1通道D/A輸出(基址+6和基址+7,寫)
·基址+6:寫該寄存器高4位輸出D/A1低4位,該寄存器低4位無效。
·基址+7:寫該寄存器8位輸出D/A1高8位。
、螤顟B(tài)寄存器(基址+8)
·讀:第7位(A/D轉(zhuǎn)換完成位)EOC表示A/D轉(zhuǎn)換是否完成。若EOC=0,A/D轉(zhuǎn)換已完成,可以讀取A/D轉(zhuǎn)換數(shù)據(jù);若EOC=1,A/D轉(zhuǎn)換未完成。當(dāng)開始讀取數(shù)據(jù),EOC被重新置1。
·寫:向該寄存器寫任何值清除中斷請求。在實際中斷服務(wù)程序中,在開中斷前應(yīng)先清中斷,再利用控制寄存器(基址+9)開中斷。
、峡刂萍拇嫫鳎ɑ+9)
·0~1位:控制啟動A/D的觸發(fā)源。
·2位:為1,DMA方式有效;為0,DMA方式無效。
·4~6位:選擇中斷級別。(PC機8259中斷控制器管理的中斷中,中斷2系統(tǒng)未用,一般選2級中斷)
、卸〞r器控制寄存器(基址+10,寫)
·0位:若為1,表示AX5412板上8254計數(shù)器中由計數(shù)器1和計數(shù)器2串聯(lián)成的定時器觸發(fā)起作用;否則,不起作用。
⒀增益控制寄存器(基址+11,讀/寫):低4位組合表示增益。
、妗⒕幊虒嵗
以下程序均以AX5412為例。
1、軟件啟動,查詢管理
·A/D輪換:
設(shè)有一模擬輸入信號單端輸入,輸入10通道,現(xiàn)對其進行A/D轉(zhuǎn)換,輸入計算機。
{...}
var
constBasea:Word=$300;//AX5412默認(rèn)基地址為300H
{...}
procedureAdc:Integer;//A/D轉(zhuǎn)換
var
state:Byte;//讀取A/D轉(zhuǎn)換完成位
al:Byte;//A/D轉(zhuǎn)換低4位
ah:Byte;//A/D轉(zhuǎn)換高8位
adval:Integer;//A/D轉(zhuǎn)換結(jié)果
begin
withmyPortdo
begin
Port[Basea+2]:=$AAH;//10通道單通道連續(xù)采樣,170D=AAH
Port[Basea+11]:=0;//增益為1
Port[Basea+9]:=0;//軟件啟動A/D轉(zhuǎn)換
Port[Basea]:=0;//開始A/D轉(zhuǎn)換
repeat
state:=Port[Basea+8];
untilband$80=$80;//檢測A/D轉(zhuǎn)換完成情況
al:=Port[Basea];//讀A/D轉(zhuǎn)換值低4位
ah:=Port[Basea+1];//讀A/D轉(zhuǎn)換值高8位
adval:=(al/16)or(ah*16);//計算12位A/D轉(zhuǎn)換結(jié)果
Adc:=adval;//返回值
end;
end;
·D/A轉(zhuǎn)換:
設(shè)將一模擬控制電壓Volt從D/A1通道輸出,控制某一對象。
說明:AX5412數(shù)字量輸出滿量程(即12位均為1時,數(shù)字值為4095D)時輸出的模擬電壓為5伏。
procedureDac(Volt:Float);//D/A轉(zhuǎn)換
var
al:Integer;//D/A轉(zhuǎn)換低4位
ah:Integer;//D/A轉(zhuǎn)換高8位
daval:Float;
begin
daval:=4095/5*Volt;//將欲輸出的模擬電壓值近似為數(shù)字值
ah:=Int(daval/16);//A/D轉(zhuǎn)換高8位
al:=Int(daval-ah*16)*16;//A/D轉(zhuǎn)換低4位
withmyPortdo
begin
Port[Basea+6]:=al;//取D/A通道1,輸出D/A轉(zhuǎn)換值低4位
Port[Basea+7]:=ah;//輸出D/A轉(zhuǎn)換值高8位
end;
end;
定時啟動,中斷管理
設(shè)采樣點數(shù)為1024,采樣頻率為3000HZ,32位定時器采用1MHZ基頻率,連接PC機8259的2級中斷。
、旁O(shè)定采樣參數(shù)
Point:=1024;//采樣點數(shù)為1024
Count:=1000000/3000;//采樣頻率為3000HZ,Count為計數(shù)器1和計數(shù)器2級聯(lián)成的
//定時器的計數(shù)值
Count1:=2;//設(shè)定計數(shù)器1的計數(shù)值為2
Count2:=Int(Count/2);//計算計數(shù)器1的計數(shù)值
Low1:=2;//計數(shù)器1計數(shù)值的低字節(jié)
High1:=0;//計數(shù)器1計數(shù)值的高字節(jié)
Low2:=Count2mod256;//計數(shù)器2計數(shù)值的低字節(jié)
High2:=Count2/256;//計數(shù)器2計數(shù)值的高字節(jié)
withmyPortdo
begin
Port[Basea+11]:=0;//增益為1
Port[Basea+2]:=$11H;//通道1單通道連續(xù)采樣
Port[Basea+15]:=$74H;//選擇計數(shù)器1為工作計數(shù)器,按方式2工作,對計數(shù)器進
//行2次讀/寫操作,先低字節(jié),后高字節(jié)
Port[Basea+13]:=Low1;//寫計數(shù)器1計數(shù)值的低字節(jié)
Port[Basea+13]:=High1;//寫計數(shù)器1計數(shù)值的高字節(jié)
Port[Basea+15]:=$B4H;//選擇計數(shù)器1為工作計數(shù)器,按方式2工作,對計數(shù)器進
//行2次讀/寫操作,先低字節(jié),后高字節(jié)
Port[Basea+13]:=Low2;//寫計數(shù)器2計數(shù)值的低字節(jié)
Port[Basea+13]:=High2;//寫計數(shù)器2計數(shù)值的高字節(jié)
end;
、凭帉懼袛喾⻊(wù)程序
procedureTForm1.myPortHwInterrupt(Sender:TObject);//中斷服務(wù)程序
{...}
ImportHigh:=Port[Basea+1];//讀A/D轉(zhuǎn)換高8位
ImportLow:=Port[Basea];//讀A/D轉(zhuǎn)換高8位
Sample[i]:=ImportHigh*16orImportLow/16;//計算12位A/D轉(zhuǎn)換結(jié)果,并賦值給采
//樣數(shù)組
i:=i+1;
Port[Basea+8]:=0;//清中斷
end;
、窃O(shè)置中斷
withmyPortdo
begin
ifActiveHWthenCloseDriver
else
begin
OpenDriver;
ifnotActiveHWthen
begin
MessageBeep(0);
Application.MessageBox('系統(tǒng)發(fā)現(xiàn)指定I/O端口未能成功打開!',
'請注意!',mb_OKormb_ICONHAND);
end
else
begin
IRQNumber:=2;
SetIRQ;
end;
end;
end;
、乳_中斷,進行采樣
Port[Basea+9]:=$A3H;//選擇定時器觸發(fā),連接PC機2級中斷,開中斷
Port[Basea+8]:=1;//選擇定時器觸發(fā)
i:=0;
whilei<>Pointdo;//等待中斷,每中斷一次采樣一個數(shù)據(jù),直至采滿Point個點
、赏顺鱿到y(tǒng)前關(guān)閉中斷
procedureTForm1.FormClose(Sender:TObject;varAction:TCloseAction);
begin
{...}
myPort.CloseDriver;
{...}
end;
在實際工作中,讀者應(yīng)根據(jù)具體數(shù)據(jù)采集板的硬件特性,參考上述方法,編寫數(shù)據(jù)采集、分析、輸出代碼。
參考文獻
沈蘭蓀.數(shù)據(jù)采集技術(shù).中國科學(xué)技術(shù)大學(xué)出版社.1990
FrankEngo.使用Delphi3編程.電子工業(yè)出版社.1997
一九九九年一月
作者通信地址:(230031)安徽省合肥市炮兵學(xué)院研究生系97級張建軍(收)
作者電話:(0551)5560324(宿舍直撥)(0551)5562566轉(zhuǎn)68750(研究生系值班室)
【利用Delphi 3.0開發(fā)微機數(shù)據(jù)采集與處理軟件系統(tǒng)】相關(guān)文章:
利用ColdFire uClinux實現(xiàn)數(shù)據(jù)采集和傳輸08-06
具有故障保護功能的數(shù)據(jù)采集系統(tǒng)08-06
基于USB總線的高速數(shù)據(jù)采集系統(tǒng)08-06
基于USB接口的數(shù)據(jù)采集系統(tǒng)設(shè)計08-06
Windows 95下智能數(shù)據(jù)采集系統(tǒng)08-06
采用USBN9602的數(shù)據(jù)采集系統(tǒng)設(shè)計08-06
基于DSP的 USB 口數(shù)據(jù)采集分析系統(tǒng)08-06