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