学海荡舟手机网

主页 > 实用文摘 > 教育文摘_18 > > 详细内容

利用Delphi 3.0开发微机数据采集与处理软件系统_信息技术论文

张 建 军 (中国人民解放军合肥炮兵学院研究生系)

摘要结合开发“无线电话务模拟训练系统”win32版软件的实例,本文详细介绍利用delphi3.0开发微机数据采集与处理软件系统的方法。


关键词:delphi adc dac

  1. 微机数据采集与处理系统简介

数据采集与处理是计算机应用的一个重要分支,主要研究信息数据的采集、存贮、处理及控制等内容。70年代以来,由于微机技术的快速发展及其在军、民用工程领域的广泛应用,尤其是适于通用微机(如ibm pc系列)使用的板卡级数据采集产品的大量出现,以微机为核心的可编程数据采集与处理技术得到迅速发展。现在的微机,只需在其扩展槽内插上一块数据采集板,并辅以应用软件,即可组成一套微机数据采集与处理系统,实现处理和实时控制功能。

  1. 数据采集与数据处理

 

数据采集与处理技术主要研究模数、数模转换(a/d、d/a)、数据处理等问题,需要计算机硬件电路和软件编程知识。

数据采集:为对温度、压力、流量、速度、位移、振动、噪声等物理量进行测控,首先通过传感器把上述量转换成模拟电信号,而后由a/d—d/a板将模拟电信号转换成时间、数值上量化且离散的数字量输入计算机系统。数据采集的核心是a/d转换。

数据处理:计算机根据被测控对象的需要,对采集到的数据进行分析运算,处理结果一方面送至显示器、打印机等外设,一方面由a/d—d/a板将数字量转换成模拟电信号输出,对外部量进行实时监控。数据处理的核心是数值处理和d/a转换。

2、微机数据采集与处理系统硬件组成

系统主要由被测控对象(设备)、a/d—d/a通道、开关量i/o通道、微机等组成,如图1所示。较复杂的系统包括单片机等多机系统。

wpe3.jpg (15241 字节)

图1 微机数据采集与处理系统硬件组成

3、与ibm pc兼容的板卡级数据采集产品

利用ibm pc系列微机及其兼容机i/o通道开放的设计特点,许多厂商已经设计出采用板卡级结构的数据采集产品。这类产品在一块印刷电路板上包括了模拟多路开关(mux)、采样保持电路(s/h)、模数、数模转换器(adc、dac)等部件(有的板型还提供并行i/o接口8255,定时/计数器8254/8254等通用可编程芯片),采用ibm pc总线,可直接插入微机任一扩展槽。本文介绍台湾axiom公司生产的ax5412高速数据采集板,以及利用delphi开发该产品a/d—d/a接口软件的方法。

  1. 软件系统设计

㈠、预备知识

  1. 软件开发工具的选择

    为开发基于windows95/nt/98操作平台的32位数据采集与处理系统,软件设计应符合以下需求:

    ⑴具有在windows下实时访问80x86 cpu i/o端口、硬件中断调用等功能;

    ⑵支持32位编程;

    ⑶代码执行速度快、界面友好、使用方便;

    ⑷开发周期短、代码可重用性好、效费比高。

    综上所述,根据vc5.0、vb5.0、delphi3.0(或其最新版delphi4.0)三种流行rad工具的不同特点,作者在开发windows版“无线电话务模拟训练系统”软件过程中选择了delphi3.0,利用delphi的ide环境编写vcl构件,结合虚拟设备驱动程序(.vxd)实现⑴的功能。

    2、vcl构件主要属性、方法、事件、过程介绍

    ⑴通用属性、方法、过程

    ·activehw: boolean:该属性只读且运行时有效,如果虚拟设备驱动程序正常工作,则activehw为true,否则为false。

    ·opendriver:该方法加载虚拟设备驱动程序,为其分配内存,使程序具有直接访问系统硬件的能力。如果虚拟设备驱动程序加载成功,activehw属性被设置为true,否则为false。

    ·closedriver:该方法关闭虚拟设备驱动程序,释放为其分配的内存。如果虚拟设备驱动程序关闭成功,activehw被设置为false。

    ⑵i/o端口访问

    ·hardaccess: boolean:该属性决定虚拟设备驱动程序采用何种方式访问i/o端口。如果hardaccess为false,i/o访问速度较快,但若指定i/o地址已被其它驱动程序占用,i/o访问可能失败;如果hardaccess为true,i/o访问速度稍慢,但能保证若指定i/o地址已被其它驱动程序占用,i/o访问仍能进行。

    ·port[index: word]: byte:该方法数据类型为byte—字节。(读/写指定地址的i/o端口,参数index为指定i/o端口地址,数据类型为word—字,下同)

    ·portw [index: word]: word:该方法数据类型为word—字。

    ·portl [index: word]: dword:该方法数据类型为dword—双字。

    i/o读写代码实例:

    with myport do

    begin

    {...}

    port[$2f0]:=$47; //向地址为2f0h的i/o端口写一个字节的数据47h

    {...}

    myinpute:=port[$2f9]; //从地址为2f9h的i/o端口读一个字节的数据,并赋给变量

    //myinpute

    {...}

    end;

    ⑶硬件中断调用

    与dos不同,在windows操作系统中,硬件中断调用功能被隐藏或屏蔽起来,windows一般不允许直接调用硬件中断。为此,需使用以下属性、事件、方法:

    ·onhwinterrupt: tnotifyevent:该事件通知系统一个硬件中断已经被调用。应将中断服务程序放在该事件中。

    ·irqnumber: byte:该属性指定欲调用的中断号(irq1—15),不支持0号中断(irq0—系统时钟)。

    · setirq:该方法将irqnumber指定的中断分配给onhwinterrrupt过程,并将isirqset属性设置为true。

    ·unmaskinterrupt:该方法解除windows对irqnumber指定中断的屏蔽,当中断产生时,将调用onhwinterrupt事件,并将masked属性设置为false。

    ·maskinterrupt:该方法恢复windows对irqnumber指定中断的屏蔽,并将masked属性设置为true。

    ·destroyirq:该方法释放为解除屏蔽由irqnumber指定中断分配的内存空间,并将isirqset属性设置为false,masked属性设置为true。

    ·isirqset: boolean:该属性只读,如果setirq设置中断成功,isirqset属性被设置为true,否则为false。

    ·masked: boolean:该属性只读,如果中断设置成功,masked为false,否则为false。

    3、ax5412数据采集板性能简介

    与其它产品(如ms1215)相比,ax5412具有许多优越性能。限于篇幅,本文无法对产品特性、开关描述、用户连接、引脚功能、板上寄存器结构和格式等逐一介绍,仅简要介绍与接口编程有关的重要部分,以便阅读下文所述程序时理解。

    ⑴采用12位a/d转换器,a/d转换时间为9us。

    ⑵可编程增益控制。

    ⑶开关选择单端16通道模拟输入或差动8通道模拟输入(可抑制嗓声,得到高精度a/d转换结果)。

    ⑷占用16个连续i/o端口地址,通过板上基地址选择开关设置基地址,默认为300h。

    ⑸`定时器基频率选择开关(j3):ax5412自带一片8254计数/定时器,8254中的计数器1和计数器2在内部串联起来产生一个固定周期信号作为a/d转换的触发源。有两个基频率1mhz或10mhz通过j3选择,默认为1mhz。级联定时器的频率由下式确定:

    除数1和除数2分别对应于8254计数器1和计数器2设定的计数值(2~65535,计数器是16位的)。计数器1和计数器2值串联相当于一个32位的计数器,可以用于时间很长的定时。

    ⑹a/d数据寄存器(基址+0和基址+1)

    ·基址+0(读):低4位说明进行a/d转换的通道号(0~15);高4位是a/d转换值的低4位。

    ·基址+0(写):写任意值即实施软件触发开始a/d转换。

    ·基址+1(读):a/d转换值的高8位。

    ⑺转换通道控制寄存器(基址+2,读/写):低4位表示多通道a/d转换的开始通道,高4位表示多通道a/d转换的结束通道。如低4位和高4位写入的值相同,表示单一通道连续采样。

    ⑻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位。

    ⑽状态寄存器(基址+8)

    ·读:第7位(a/d转换完成位)eoc表示a/d转换是否完成。若eoc=0,a/d转换已完成,可以读取a/d转换数据;若eoc=1,a/d转换未完成。当开始读取数据,eoc被重新置1。

    ·写:向该寄存器写任何值清除中断请求。在实际中断服务程序中,在开中断前应先清中断,再利用控制寄存器(基址+9)开中断。

    ⑾控制寄存器(基址+9)

    ·0~1位:控制启动a/d的触发源。

    ·2位:为1,dma方式有效;为0,dma方式无效。

    ·4~6位:选择中断级别。(pc机8259中断控制器管理的中断中,中断2系统未用,一般选2级中断)

    ⑿定时器控制寄存器(基址+10,写)

    ·0位:若为1,表示ax5412板上8254计数器中由计数器1和计数器2串联成的定时器触发起作用;否则,不起作用。

    ⒀增益控制寄存器(基址+11,读/写):低4位组合表示增益。

    ㈡、编程实例

    以下程序均以ax5412为例。

    1、软件启动,查询管理

    ·a/d轮换:

    设有一模拟输入信号单端输入,输入10通道,现对其进行a/d转换,输入计算机。

    {...}

    var

    const basea:word=$300;//ax5412默认基地址为300h

    {...}

    procedure adc:integer;//a/d转换

    var

    state :byte;//读取a/d转换完成位

    al :byte;//a/d转换低4位

    ah :byte;//a/d转换高8位

    adval :integer;//a/d转换结果

    begin

    with myport do

    begin

    port[basea+2]:=$aah;//10通道单通道连续采样,170d=aah

    port[basea+11]:=0;//增益为1

    port[basea+9]:=0;//软件启动a/d转换

    port[basea]:=0;//开始a/d转换

    repeat

    state:=port[basea+8];

    until b and $80=$80;//检测a/d转换完成情况

    al:=port[basea];//读a/d转换值低4位

    ah:=port[basea+1];//读a/d转换值高8位

    adval:=(al / 16) or (ah * 16);//计算12位a/d转换结果

    adc:=adval;//返回值

    end;

    end;

    ·d/a转换:

    设将一模拟控制电压volt从d/a1通道输出,控制某一对象。

    说明:ax5412数字量输出满量程(即12位均为1时,数字值为4095d)时输出的模拟电压为5伏。

    procedure dac(volt:float);//d/a转换

    var

    al :integer;//d/a转换低4位

    ah :integer;//d/a转换高8位

    daval :float;

    begin

    daval:=4095/5*volt;//将欲输出的模拟电压值近似为数字值

    ah:=int(daval/16);//a/d转换高8位

    al:=int(daval-ah*16)*16;//a/d转换低4位

    with myport do

    begin

    port[basea+6]:=al;//取d/a通道1,输出d/a转换值低4位

    port[basea+7]:=ah;//输出d/a转换值高8位

    end;

    end;

  2. 定时启动,中断管理

设采样点数为1024,采样频率为3000hz,32位定时器采用1mhz基频率,连接pc机8259的2级中断。

⑴设定采样参数

point:=1024;//采样点数为1024

count:=1000000/3000;//采样频率为3000hz,count为计数器1和计数器2级联成的

//定时器的计数值

count1:=2;//设定计数器1的计数值为2

count2:=int(count/2);//计算计数器1的计数值

low1:=2;//计数器1计数值的低字节

high1:=0;//计数器1计数值的高字节

low2:=count2 mod 256;//计数器2计数值的低字节

high2:=count2/256;//计数器2计数值的高字节

with myport do

begin

port[basea+11]:=0;//增益为1

port[basea+2]:=$11h;//通道1单通道连续采样

port[basea+15]:=$74h;//选择计数器1为工作计数器,按方式2工作,对计数器进

//行2次读/写操作,先低字节,后高字节

port[basea+13]:=low1;//写计数器1计数值的低字节

port[basea+13]:=high1;//写计数器1计数值的高字节

port[basea+15]:=$b4h;//选择计数器1为工作计数器,按方式2工作,对计数器进

//行2次读/写操作,先低字节,后高字节

port[basea+13]:=low2;//写计数器2计数值的低字节

port[basea+13]:=high2;//写计数器2计数值的高字节

end;

⑵编写中断服务程序

procedure tform1.myporthwinterrupt(sender: tobject);//中断服务程序

{...}

importhigh:=port[basea+1];//读a/d转换高8位

importlow:=port[basea];//读a/d转换高8位

sample[i]:=importhigh*16 or importlow/16;//计算12位a/d转换结果,并赋值给采

//样数组

i:=i+1;

port[basea+8]:=0;//清中断

end;

⑶设置中断

with myport do

begin

if activehw then closedriver

else

begin

opendriver;

if not activehw then

begin

messagebeep(0);

application.messagebox('系统发现指定i/o端口未能成功打开!',

'请注意!',mb_ok or mb_iconhand);

end

else

begin

irqnumber:=2;

setirq;

end;

end;

end;

⑷开中断,进行采样

port[basea+9]:=$a3h;//选择定时器触发,连接pc机2级中断,开中断

port[basea+8]:=1;//选择定时器触发

i:=0;

while i<>point do ;//等待中断,每中断一次采样一个数据,直至采满point个点

⑸退出系统前关闭中断

procedure tform1.formclose(sender: tobject; var action: tcloseaction);

begin

{...}

myport.closedriver;

{...}

end;

在实际工作中,读者应根据具体数据采集板的硬件特性,参考上述方法,编写数据采集、分析、输出代码。

参考文献

 

  1. 沈兰荪.数据采集技术.中国技术大学出版社.1990
  2. frank engo.使用delphi 3编程.电子工业出版社.1997

                       一九九九年一月

 

作者通信地址:(230031)安徽省合肥市炮兵学院研究生系97级 张建军(收)

作者电话:(0551)5560324(宿舍直拨) (0551)5562566转68750(研究生系值班室)

作者e_mail: hyperlink mailto:davidhy@263.net davidhy@263.net