[返回]
计算机世界1999年第16期

用Delphi 3.0和AX5412卡
开发数据采集和处理系统

合肥炮兵学院研究生系 张建军

  一、微机数据采集与处理系统简介

  系统主要由被测控对象(设备)、A/D ~D/A 通道、开关量I/O 通道、微机等组成,如图1 所示。较复杂的系统包括单片机等多机系统。
d031_1.jpg (13867 字节)
  利用IBM PC 系列微机及其兼容机I/O 通道开放的设计特点,许多厂商已经设计出采用板卡级结构的数据采集产品。这类产品在一块印刷电路板上包括了模拟多路开关(MUX)、采样保持电路(S/H)、模/ 数、数/ 模转换器(ADC、DAC)等部件(有的板型还提供并行I/O 接口8255,定时/计数器8254 /8254 等通用可编程芯片),采用IBM PC 总线,可直接插入微机任一扩展槽。本文介绍台湾AXIOM 公司生产的AX5412 高速数据采集板,以及利用Delphi 开发该产品A/D ~D/A 接口软件的方法。

  二、AX5412 数据采集板简介

  本文简要介绍与接口编程有关的重要部分,以便阅读下文所述程序时有助理解。
  1、采用12 位A/D 转换器,A/D 转换时间为9 μs。
  2、可编程增益控制。
  3、开关选择单端16 通道模拟输入或差动8 通道模拟输入(可抑制噪声,得到高精度A/D 转换结果)。
  4、占用16 个连续I/O 端口地址,通过板上基地址选择开关设置基地址,默认为300H。
  5、定时器基频率选择开关(J3):AX5412 自带一片8254 计数/定时器,8254 中的计数器1 和计数器2 在内部串联起来产生一个固定周期信号作为A/D 转换的触发源。有两个基频率1MHz 或10MHz 通过J3 选择,默认为1MHz。级联定时器的频率由下式确定:
d031_2.jpg (6387 字节)

  除数1 和除数2 分别对应于8254 计数器1 和计数器2 设定的计数值(2 ~65535,计数器是16 位的)。计数器1 和计数器2 值串联相当于一个32 位的计数器,可以用于时间很长的定时。
  6、A/D 数据寄存器(基址+0 和基址+1)
  * 基址+0(读):低4 位说明进行A/D 转换的通道号(0 ~15);高4 位是A/D 转换值的低4 位;
  * 基址+0(写):写任意值即实施软件触发开始A/D 转换;
  * 基址+1(读):A/D 转换值的高8 位。
  7、转换通道控制寄存器(基址+2,读/写):低4 位表示多通道A/D 转换的开始通道,高4 位表示多通道A/D 转换的结束通道。如低4 位和高4 位写入的值相同,表示单一通道连续采样。
  8、0 通道D/A 输出(基址+4 和基址+5,写)
  * 基址+4:写该寄存器高4 位输出D/A0 低4 位,该寄存器低4 位无效;
  * 基址+5:写该寄存器8 位输出D/A0 高8 位。
  9、1 通道D/A 输出(基址+6 和基址+7,写)
  * 基址+6:写该寄存器高4 位输出D/A1 低4 位,该寄存器低4 位无效;
  * 基址+7:写该寄存器8 位输出D/A1 高8 位。
  10、状态寄存器(基址+8)
  * 读:第7 位(A/D 转换完成位)EOC 表示A/D 转换是否完成。若EOC=0,A/D 转换已完成,可以读取A/D 转换数据;若EOC=1,A/D 转换未完成。当开始读取数据,EOC 被重新置1;
  * 写:向该寄存器写任何值清除中断请求。在实际中断服务程序中,在开中断前应先清中断,再利用控制寄存器(基址+9)开中断。
  11、控制寄存器(基址+9)
  * 0 ~1 位:控制启动A/D 的触发源;
  * 2 位:为1,DMA 方式有效;为0,DMA 方式无效;
  * 4 ~6 位:选择中断级别。(PC 机8259 中断控制器管理的中断中,中断2 系统未用,一般选2 级中断)
  12、定时器控制寄存器(基址+10,写)
  * 0 位:若为1,表示AX5412 板上8254 计数器中由计数器1 和计数器2 串联成的定时器触发起作用;否则,不起作用。
  13、增益控制寄存器(基址+11,读/写):低4 位组合表示增益。

  三、编程实例

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