PC-AD16xx系列高精度AD转换板用户手册
(16位16 /32通道100KHz)


返回主页


目 录

1、概述 
2、特性指标 
3、简要工作原理 
4、端口定义和设置说明 
5、软件编程 
  5.1 A/D数据格式 
  5.2 I/O 方式 
  5.3 定时/计数器的编程 
  5.4 DMA方式 
6、各种高级语言编程技巧 
  6.1 Basic编程技巧 
  6.2 Pascal编程技巧 
  6.3 C与汇编语言的链接 
7、安装和调试 
8、附录 


1、概述
        PC-AD16XX系列是为PC 386/486/586配套使用的高精度AD板。该产品选用了世界上先进的运算放大器,降低了使用普通放大器所带来地动态交越失真和噪声误差,确保高位A/D实用分辨能力,能满足用户高精度系统要求。
    PC-AD16XX系列主要有二种型号,各种型号的功能特点参见下表:

型 号 PC-AD1616 PC-AD1632(PS-2120)
通道数 16路单端 32路单端
分辨率 16位
增 益 1 2
转换时间 10uS(100KHz)
DMA 吐纳率 ≤100KHz
I / O 吐纳率 单通道/多通道 100 / 80 KHz
量 程 ±10V ±5V
数 字 I/O 8 位输出 8 位 输入
其 它 3路定时/计数,内/外触发中断,DMA通道

*所有通道均设有输入防冲击保护,并预留RC滤波电容焊孔位置。
该板可用于:
①测量仪器、医疗设备 ②数据采集 ③测试系统。
注:可根据用户需要,将输入改为单通道差动方式使用。

2、特性指标
 
2.1 模拟量输入
·分辨率: 16 bit        ·量化误差: ±2 LSB
·系统精度: ±0.005%        ·过压输入: 2×FS
·输入阻抗: >500KΩ·            
码制: 二进制补码
·漂移--温度漂移: FS 20PPm/℃;  增益漂移: 35PPm/℃

2.2 数字输入/输出能力:TTL兼容
2.3 定时/计数,数字输入/输出
·工作方式: 事件计数、频率测量
脉冲(方波)输出、定时输出
·事件计数
计数率: 典型值500KHz ( MAX: 5MHz )
范 围: 2^32
·频率测量
频率范围: 典型值0~500KHz ( MAX: 5MHz )
分辩率: 16位
·脉冲输出
脉 宽: 0.5uS~16.384mS        级 数: 232
·时基频率: 4MHz (0.25uS)    ·时基精度: ±0.01%
·输入/输出能力:TTL兼容
2.4 数据交换方式
·I/O方式
·查询I/O
·定时+DMA(仅适用于单通道)
·定时+中断
·外触发+定时
2.5 地址
·地址范围: 00X ~ FFXH
·方 式: 板选+基址(16个)    A11~A4+A3~A0
2.6 中断
·中断请求: IRQ3/IRQ5(跨线选择)    中断源: 外触发、定时/计数器
2.7 物理特性
·模拟量接口: J2-模拟信号输入/输出(DC-50P)
·数字量接口: J3-数字信号输入/输出(DC-26P)
·定时/计数: J4-门控/时钟输入/输出(DC-10P)
·工作温度: 0~60℃    ·工作湿度: <90%(无结露)
·外形尺寸: 165×108 mm
2.8 电源
·电压: 5V ±5% (±12V ±5%)    ·电流: 0.5A ( 0.1A)

3、简要工作原理
         PC-AD16XX主要由100KHz A/D转换、多路器、缓冲放大器;数字I/O、定时/计数器、I/O口译码电路、DMA及中断控制逻辑等几个部分组成。ADC使用ADS7805芯片,该芯片为自带采样保持器的AD转换器,转换时间10uS;该芯片由单一5V供电,功耗很低。
                      模拟量输入原理:
                                   



4、端口定义和设置说明
4.1 外部端口定义
4.1.1 PC-AD16XX 系列为了兼容多种机型, 因此设计为8位数据总线结构,即总线接口为PC机短槽62总线插脚,亦可插在
      EISA总线上。
4.1.2 J2是模拟量输入信号插座,接口定义见下图。
 p1

p49

CH0 GND CH9 CH2 GND CH11 CH4 GND CH13 CH6 GND CH15 CH16 GND CH25 CH18 GND CH27 CH20 GND CH29 CH22 GND CH31 NC
CH8 CH1 GND CH10 CH3 GND CH12 CH5 GND CH14 CH7 GND CH24 CH17 GND CH26 CH19 GND CH28 CH21 GND CH30 CH7 GND NC

 p2

p50

 4.1.3 A/D输入通道地址定义:
PC - AD1616 CH0 - CH15: 0 - 15
PC - AD1632 CH0 - CH31: 0 - 31
PS - 2120   CH0 - CH31: 0 - 31
4.1.4. J3是数字量及定时/计数器输入输出插座,接口定义见下图

 p1 DO0 GND DO3 DO4 GND DO7 DI0 GND DI3 DI4 GND DI7 XCLK
DO1 DO2 GND DO5 DO6 GND DI1 DI2 GND DI5 DI6 NC GATE p26

·XCLK 为计数器1/定时器2输入输出端(与J4配合使用)
J4是定时/计数器输入输出插座(或跨线选择器),接口定义见下图

 p1

GND GATE1 CLK1 OUT0 GATE2
GND GATE0 OUT2 CLK0 OUT1

p10

·GATEx为定时/计数器外触发控制端:    "1" 允许定时0/计数器0工作,    "0" 禁止定时0/计数器0工作

4.2 硬件设置说明
4.2.1 板选地址设定:
板选地址由SW设定,板选地址由板选+基本地址组成。设定范围:00X~FFXH(A11~A4)

  A11   A10   A9   A8   A7    A6    A5   A4 地 址
ON 0    0    0    0    0    0    0    0 00
OFF 1    1    1    1    1    1    1    1 FF

4.2.2 I/O端口基本地址分配:
0: CNT0 — 定时/计数器通道0的时间常数
1: CNT1 — 定时/计数器通道1的时间常数
2: CNT2 — 定时/计数器通道2的时间常数
3: 8253 — 工作方式命令
4: CH — AD通道控制寄存器
5: NC — 未使用
6: ADR — AD转换完成信号
7: NC — 未使用
8: ADL — AD输入低8位
9: ADH — AD输入高8位
A: DIN — 数字量8位输入
B: DOUT — 数字量8位输出
C: NC — 未使用
D: NC — 未使用
E:NC — 未使用
F:NC — 未使用
4.2.3 跨线说明:
JP4 中断请求选择
          IRQ 3   5

4.2.4 调整电位器说明:
VG — A/D增益微调    VZ — A/D调零

5、软件编程
    PC-AD1632板支持各种带有口操作指令的高级语言, 如: BASIC、 PASCAL、C等以及80X86汇编语言。
5.1 A/D数据格式:
    ADL-AD低8位数据
    ADH-AD高8位数据

描 述 模 入 值 数字量输出 二进制补码
二 进 制 十六进制
满量程范围
最小分辩率
+满量程
零 点
零点分辩率
-满量程
±10V
305uV
9.999695V
0V
-305uV
-10V


0111 1111 1111 1111
0000 0000 0000 0000
1111 1111 1111 1111
1000 0000 0000 0000


7FFF
0000
FFFF
8000



ADR-AD转换完成信号
D7 D6 D5 D4 D3 D2 D1 D0
 X  X  X  X  X  X  X  S

     S = 0 AD数据准备好。 S = 1 AD正在转换。

5.2 I/O方式的编程(以BASIC为例,板选地址 ADDRESS=&H310)
5.2.1 A/D的编程:
A. 送模拟通道号/地址寄存器
    10 OUT ADDRESS+4,CH
    注:CH数见A/D通道地址定义(4.1.3)
B. 插入延时 5-10uS
    20 FOR I = 0 TO n: NEXT
C. 启动A/D转换
    30 ADH = INP( ADDRESS + 9 )
D. 判断AD转换完成信号
    40 ADR = INP( ADDRESS + 6 )
    50 IF ( ADR AND 1 ) = 1 THEN GOTO 40
E. 取A/D转换低8位数据
    60 ADL = INP( ADDRESS + 8 )
F. A/D转换高8位数据并启动下次A/D转换
    70 ADH = INP( ADDRESS + 9 )
G. 拼合16位数据
    80 ADH = ADH XOR &H80
    90 AD = ADH * 256 + ADL
H. 换算电压值
    100 V = 20 * (AD - 32768) / 65536

5.2.2 编程举例
例1.单通道采数程序
5 ADDRESS = &H310
10 OUT ADDRESS + 4, 1 "置通道1
15 FOR I = 0 TO n :NEXT "n = 10~500,延时(5 - 10 uS)
20 ADH = INP( ADDRESS + 9 ) "启动AD
30 ADR = INP( ADDRESS + 6 ) "读转换完成标志
40 IF (ADR AND 1) = 1 THEN GOTO 30 "AD未准备好
50 ADL = INP( ADDRESS + 8 ) "AD准备好,读入AD低8位数据
60 ADH = INP( ADDRESS + 9 ) "读入AD高8位数据
70 ADH = ADH XOR &H80 "将二进制补码变换为偏移二进制码
80 AD = ADH * 256 + ADL "拼合16位数据
90 PRINT 20 * (AD - 32768) / 65536 "显示电压值
100 GOTO 30

例2.多单通道采数程序
10 ADDRESS = &H310
20 FOR I = 0 TO 31
30 OUT ADDRESS + 4, I "置通道号
40 FOR J = 0 TO n : NEXT J " n = 10~500,延时(5 - 10 uS)
50 ADR = INP( ADDRESS + 6 ) "读转换完成标志
60 IF (ADR AND 1) = 1 THEN GOTO 50 "AD未准备好
70 ADL = INP( ADDRESS + 8 ) "AD准备好,读入AD低8位数据
80 ADH = INP( ADDRESS + 9 ) "AD准备好,读入AD高8位数据
90 ADH = ADH XOR &H80 "将二进制补码变换为偏移二进制码
100 AD = ADH*256+ADL "拼合16位数据
110 PRINT "CH = ",I-1;"VOLT=",20 * (AD - 32768)/65536 "显示电压值
100 NEXT I
110 GOTO 20
5.2.3 数字量输出口/扩展口编程
ADDRESS = &H310
OUT ADDRESS + &H0A,0~255
5.2.4 数字量输入口
ADDRESS = &H310
DIN = INP(ADDRESS + &H0B)
5.3 定时/计数器的编程
为了方便用户使用,板上设置了可编程定时/计数器"8253", "8253" 有三个通道,8253占用地址口: XX 0H~ XX3H。
5.3.1 通道功能分配:CNT0 — 触发中断
CNT1 — DMA定时及中断时钟
CNT2 — 时基发生器
通道0的输出通过跨线可以接到PC总线的IRQ3或IRQ5上, 通过通道0, 可做定时或外触发中断。
通道1可以作为DMA定时信号及定时中断时钟。
通道2只能用做时基(脉冲)发生器,用来产生定时时基。
通道0和通道1还可当做外部信号计数器。
所有门控端GATE 通过上拉电阻接主机+5V电源并可由J4插脚引出。
8253的基本接法如图所示:
                       



5.3.2 8253的编程方法

⑴8253方式字说明: D7      D6       D5       D4       D3       D2       D1       D0

方式字格式:

SC1

SC0

RL1

RL0

M2

M1

M0

BCD

·方式字定义:
* SC1、SC0 ─ 选择计数器
    00 选择计数器0
    01 选择计数器1
    10 选择计数器2
    11 非法
* RL1、RL0 ─ 读/写方式选择
    00 锁定计数值操作
    01 只读/写低八位计数值
    10 只读/写高八位计数值
    11 先读/写低八位计数值,后读/写高八位计数值
* M2、M1、M0─ 选择工作方式
    000 方式0
    001 方式1
    010 方式2
    011 方式3
    100 方式4
    101 方式5
* BCD ─ 选择计数值进制
    0 选择二进制计数值,    1 选择BCD码计数值
·方式说明:
    8253的三个计数器按照各工作方式寄存器中控制字的设置进行工作。可以选择的工作方式有六种。
*方式0:计数到终点时中断
    编程后自动启动,计数器开始减1计数,计数到终点(减到0)后输出高电平,可用作中断请求信号,在GATE为低电平时停止计数,回到高电平继续往下计数。再次启动要重新装入计数值或重新编程。
*方式1:可编程单脉冲输出
    在GATE上升沿进行初始化并开始计数,输出低电平的宽度等于计数时间。单脉冲输出可用GATE上升沿多次触发。
*方式2:比率发生器
    编程后重复地循环计数。计数到终点时输出一个时钟周期宽度的低电平脉冲,自动初始化后继续计数。用GATE的上升沿初始化并开始计数。GATE为低电平时停止计数。
*方式3:方波比率发生器
    这种方式也在编程后重复地循环计数,输出波形为方波。如果初始计数值为偶数,每个输入时钟脉冲使计数器减2, 达到计数终点时输出电平改变。如果初始计数值为奇数,则输出高电平时第一个时钟输入脉冲使计数器减1,随后每个输入脉冲使计数器减2,输出为低电平时第一个输入脉冲使计数器减3,随后每个输入脉冲使计数器减2,达到计数终点时输出电平改变, 计数器自动初始化后继续计数, 用GATE的上升沿初始化并开始计数。GATE为低电平时停止计数。
*方式4:软件启动选通脉冲输出
    编程后自动启动,计数到终点后输出一个时钟周期的低电平脉冲。在计数期间,如果写入新的计数常数值,则在下一个时钟脉冲到来时开始新的计数周期。GATE为低电平时停止计数,恢复为高电平时,继续计数。
*方式5:硬件启动选通脉冲输出
    编程后,等待GATE上升沿初始化并开始计数,计数到终点后输出一个时钟周期的低电平脉冲,计数器开始计数后不受GATE信号电平的影响。这种选通脉冲的输出可用GATE的上升沿多次触发。
(2) 编程步骤:
写入各通道方式字和时间常数:
OUT Address+3, &H94 "置通道2方式字-低8位,方式2
OUT Address+2, nn "置通道2计数值
OUT Address+3, &h54 "置通道1方式字-低8位,方式2
OUT Address+1, nn "置通道1计数值
每个通道一旦写入时间常数便开始工作(启动)。
(3) 编程举例(以BASIC为例):
例3: 外触发中断
    将外触发信号接到J4的GATE0上,J4:OUT2与CLK0短接,JP4选择IRQ3或IRQ5;8253 使用通道0和通道2,通道2设置工作方式为8位方式2,计数值为2;通道0 设置工作方式为方式0,计数值为1。当外触发信号由低到高变化时,OUT0将向主机发出中断请求。
Address = &H310
OUT Address+3, &H94
OUT Address+3, 02
OUT Address+3, &H10
OUT Address+0, 01
例4: 内时钟定时中断
    当使用内时钟定时中断时,首先根据定时间隔,决定使用二或三个定时器。
时基发生器的时间为:0.5uS~16.384mS;
使用二级定时器的时间为:0.1uS~1073.74S
设定时间隔为:100mS
步骤1:
    硬件设置:将J4上OUT0与CLK2用短路环短接, JP4选择IRQ3或IRQ5, 8253使用通道0和通道2。
步骤2:
    计算每个通道的时间常数值 C0,C2:
    为了计算方便,取通道2的时基1mS,则通道0时间常数C0 = 100mS / 1mS = 100;
步骤3:
    计算通道2的时间常数C2: C2 = 1mS / 0.25uS = 4000;
    将C2分为高/低二个字节C2H/C2L:
    C2H = INT( 4000 / 256 ) = 15
    C2L = 4000 - 256 * C2H = 160
程序清单:
Address = &H310
C0% = 100
C2% = 1000 / 0.25
C2H% = INT( 4000 / 256 )
C2L% = C2% - 256 * C2H%
OUT Address + 3, &H34 "通道0:工作方式=低8位方式2
OUT Address + 0, C0%
OUT Address + 3, &HB4 "通道2:工作方式=16位方式2
OUT Address + 0, C0L%
OUT Address + 0, C0H%
    中断服务程序的编程方法请参考第6部分。
例5: 计数器
    只有通道0和通道1可作为外部信号计数器,计数器工作方式可以使用方式2或方式3。以通道1为例:
硬件设置:将外部信号接到J4的CLK1上。
编程:
Address = &H310
OUT Address+3, &H74 " 通道1,方式2,16位
OUT Address+1, 0 " 计数器初始值
OUT Address+1, 0 " 当初始值置"0"时,为65536
SL = INP(Address + 1)
SH = INP(Address + 1) " 读入初始计数值
SetTIME1 = " 设置初始时刻
.
CL = INP(Address + 1)
CH = INP(Address + 1) " 读入计数值
.
COUNT = (SH * 256 + SL) - ( CH * 256 + CL ) " 计算计数值
SL = CL
SH = CH
.
5.4 DMA方式的编程
    当 A / D 以 DMA 方式与主机交换数据时,定时器作为 DMA 时钟,用户在使用DMA方式时, 应对PC-AD1632的8253芯片和主机中DMA控制器同时编程才能正常使用。
5.4.1 PC主机中DMA控制器编程
    DMA控制器有4个8位DMA通道,PC-AD1632板使用通道1。
①.DMA通道和页寄存器的对应关系
DCH0 -- 87H;
DCH1 -- 83H;
DCH2 -- 81H;
DCH3 -- 82H;
②.DMA控制器简介:
·通用地址寄存器:用于DMA传送期间保存地址数值,在传送期间可自动加/减1。
·通用计数寄存器:在DMA传送期间测定传输字节的数量,每传送一次自动减1。
·基地址寄存器:存放地址原始数值,用于自动预置方式下复位通用地址寄存器。
·基计数寄存器:存放计数原始数值,用于自动预置方式下复位通用计数寄存器。
·命令寄存器: 用于控制DMA操作,按命令寄存器程序规则进行编程,用总清指令清除。

D7 D6 D5 D4 D3 D2 D1 D0

0位:0 禁止存储器到存储器传输    1 允许存储器到存储器传输
1位:0 禁止通道0保存地址    1 允许通道0保存地址
2位:0 允许控制    1 禁止控制
3位:0 正常计时    1 压缩计时    × 当0位数值为1时无关
4位:0 固定优先极    1 循环优先极
5位:0 滞后写操作周期    1 延长写操作周期    × 当3位为1时无关
6位:0 请求信号DREQ高电平有效    1 请求信号DREQ低电平有效
7位:0 响应信号DACK低电平有效    1 响应信号DACK高电平有效

·方式寄存器:确定DMA控制器各通道工作方式。

D7 D6 D5 D4 D3 D2 D1 D0

0,1位: 00 选择通道0
        01 选择通道1
        10 选择通道2
        11 选择通道3
2,3位: 00 检验传输
        01 写传输
        10 读传输
        11 非法
                  ×× 当6,7位为11时无关
4位: 0 禁止自动预置    1 允许自动预置
5位: 0 地址加一    1 地址减一
6,7位:  00 选查询方式传输
        01 选单一字节传输方式
        10 选块传输方式
        11 级联方式

            DMA控制器口地址:

DMA口地址 寄 存 器 名 称
读 (-IOR) 写 (-IOW)
0H CH0当前地址寄存器 CH0基地址寄存器
1H CH0当前字计数寄存器 CH0基字计数寄存器
2H CH1当前地址寄存器 CH1基地址寄存器
3H CH1当前字计数寄存器 CH1基字计数寄存器
4H CH2当前地址寄存器 CH2基地址寄存器
5H CH2当前字计数寄存器 CH2基字计数寄存器
6H CH3当前地址寄存器 CH3基地址寄存器
7H CH3当前字计数寄存器 CH3基字计数寄存器
8H 状 态 寄 存 器 命 令 寄 存 器
9H   请 求 寄 存 器
AH   屏蔽寄存器单个屏蔽位
BH   工 作 方 式 寄 存 器
CH   清 除 先 后 触 发 器
DH 暂 存 寄 存 器 清 除 指 令
EH   清 屏 蔽 寄 存 器
FH   写屏蔽寄存器全部位


·请求寄存器:响应DMA服务请求,可用软件和DREQ发出请求置位信号。

D7 D6 D5 D4 D3 D2 D1 D0

0,1位 :00 选通道0
        01 选通道1
        10 选通道2
        11 选通道3
2位: 0 复位请求位    1 置位请求位
3-7位:无关
·屏蔽寄存器:每个通道有一关联的屏蔽位,屏蔽位置位使新来的请求信号无效。此寄存器有两种方式控制,一种方式是单一位控制,对应的I/O口地址为0AH,另一种方式为所有屏蔽位控制,对应I/O口地址为0FH。
        0AH口数据定义:

D7 D6 D5 D4 D3 D2 D1 D0

0,1位: 00 选择通道0
        01 选择通道1
        10 选择通道2
        11 选择通道3
2位: 0 清除屏蔽    1 设置屏蔽
3-7位:无关

        0FH口数据定义:

D7 D6 D5 D4 D3 D2 D1 D0

0位: 0 清0通道屏蔽    1 设置0通道屏蔽
1位: 0 清1通道屏蔽    1 设置1通道屏蔽
2位: 0 清2通道屏蔽    1 设置2通道屏蔽
3位: 0 清3通道屏蔽    1 设置3通道屏蔽

·状态寄存器: 保存DMA控制器的信息,此信息表明各通道计数是否完成,哪个通道有外部的请求信号。

D7 D6 D5 D4 D3 D2 D1 D0

0位=1 通道0计数完成
1位=1 通道1计数完成
2位=1 通道2计数完成
3位=1 通道3计数完成
4位=1 通道0请求
5位=1 通道1请求
6位=1 通道2请求
7位=1 通道3请求
·临时寄存器:此寄存器用于存储器到存储器传输数据期间保存数据,可读到传输的最后一个字节。
③ 初始化DMA控制器编程: 由于IBM PC计算机上电后其BIOS已对DMA控制器做了必要的初始化工作,用户只需按如下步骤继续对通道1 进行初始化,即可使 PC-AD1632板通过DMA1通道传输数据。
·屏蔽通道1请求    OUT &H0A,5
·清字节指针触发器    OUT &H0C,0
·写方式字    OUT &H0B,MW
数值MW取值为:
自动预置 = 55H
非自动预置 = 05H
·写1通道页寄存器及页控制寄存器
OUT &H83,DMAPAGE
DMAPAGE — 数据缓冲区页地址
·写地址寄存器
OUT 02,LA
OUT 02,HA
    写地址寄存器必须写两次,第一次写16位绝对地址的最低8位数值,第二次写另外8位数值。
·写计数寄存器
OUT 03, LC
OUT 03, HC
写计数寄存器同样需要写两次,第一次写低8位计数值,第二次写高8位计数值。
·清屏蔽位    OUT &H0A, 1
    用户编程时应将初始化DMA的程序放在启动8253定时器指令之前。
例5.DMA定时采数程序
    设采样间隔为100uS,采样长度为10K WORD,通道为CH4
编程步骤如下:
1.计算定时常数C    C = 100 / 0.25 = 400
2.将C分为C1(通道1时间常数)和C2(通道2时间常数)
C2应≥8,若C2 = 8,则 C1 = C / C2 = 400 / 8 = 50
3.将采样长度分为低8位和高8位
LH = INT(10240 * 2 / 256) = 80 
LW = 10240 * 2 - LH * 256 = 0
4.程序清单
5 Address = &h310
10 OUT Address + 4, 4 "设置A/D通道号
20 OUT &H0A, 5 "设置DMA通道1
30 OUT &H0C, 0 "清除先后触发器
40 OUT &H0B, MW "写DMA方式字
50 OUT &H83, PAGE "置1通道页寄存器(3-9) /数据缓冲区段地址
60 OUT &H02, 0 "数据缓冲区初始地址低8位
70 OUT &H02, 0 "数据缓冲区初始地址高8位
80 OUT &H03, LW
90 OUT &H03, LH "置采数长度
100 OUT Address + 3, &h94 "置8253通道2方式字
110 OUT Address + 2, C2 "置通道2计数值
120 OUT Address + 3, &h54 "置8253通道1方式字
130 OUT Address + 1, C1 "置通道1计数值

6、各种高级语言编程技巧
6.1 BASIC语言
6.1.1 欲提高解释BASICA程序的执行速度,可将10进制数据改为16进制数据。将循环语句改为分组单次操作语句。另外还可以对解释BASIC程序进行编译。编译后的BASIC程序比解释 BASIC程序运行速度快3~10倍。

6.1.2 建立数据段提取数据
        BASIC语言中POKE和PEEK语句与DEF SEG语句结合起来可对任一内存单元寻址。POKE、PEEK语句直接访问DEF SEG所定义的64K字节的RAM区。
举例如下:
500 DEF SEG = &H3000
510 LB = PEEK(0)
520 HB = PEEK(1) XOR &H80
530 D = HB * 256 + LB
540 V = ( D - 32768 ) * 20 / 65536
550 PRINT D,V

6.1.3 数据写入磁盘
        使用BASIC语言中BSAVE命令可一次将64K字节的数据存入BSAVE命令定义的 磁盘文件中。格式:BSAVE"filename", offset,length说明:filename填入数据文件名,缺省扩展名则 默认为 . BAS,offset是DEF SEG指明段的偏移量,取值范围0~65535。lenght是存盘数据的长度,取值范围1~65535。
程序举例:
600 DEF SEG=&H3000
610 BSAVE"DATA.DAT",0,65535
6.1.4 使用BLOAD命令可将用BSAVE命令保存在磁盘上的数据文件调入内存。此命令与BSAVE一样可一次装入64K字节数据。
格式:BLOAD "filename",[offset]
    说明:filename填入数据文件名,缺省扩展名则默认为 . BAS,offset是DEF SEG指明段的偏移量。若缺省则取BSAVE命令中指定的偏移量。
程序举例:
650 DEF SEG=&H3000
660 BLOAD"data,dat",0
BLOAD命令的其他使用方法,请参阅BASIC手册。
    使用汇编语言编程的用户可参考BASIC语言调用方法进行编程。
6.1.5 BASIC调用机器语言子程序方法
        在使用计算机进行过程控制,数据采集的工作中,为提高程序运行速度,往往需要调用机器语言子程序。以下介绍CALL语句调用的子程序的建立方法、装入方法和CALL语句调机器语言子程序的方法。
6.1.5.1 先编写汇编语言子程序:
·假设文件名为SUBRT.ASM。
格式:CODE SEGMENT
           ASSUME CS:CODE
           SUBRT PROC FAR
           PUSH BP
           MOV BP, SP
           .
           .
           POP BP
           RET n
           SUBRT ENDP
      CODE ENDS
      END
注:① 子程序不能设置栈段,若需用栈段可另辟。
    ② n等于CALL语句所有参数的地址偏移量在栈内所占字节数。
    ③ 子程序用SS:BP访问堆栈。
·使用MASM.EXE程序,编译子程序目标文件SUBRT.OBJ
·使用LINK. EXE程序,将编译好的子程序目标文件连接在内存的高端,即使用/HIGH参数。
格式:LINK/HIGH SUBRT.OBJ
经连接得到子程序的执行文件SUBRT.EXE。
·使用调试程序DEBUG.COM装入子程序的执行文件。用调试程序的R命令显示寄存器数据:记录CS、IP和CX寄存器中的十六进制数值。
·使用调试程序的 N,L 命令装入BASICA.EXE程序。使用G命令运行BASICA程序,并在BASICA下建立程序。
10 DEF SEG = CS
20 BSAVE"SUBRT.DAT",IP,CX
    10 行CS处填入记录的CS寄存器的数值,20行SUBRT.DAT是子程序映象文件名,IP处填入记录的IP寄存器中的数值,CX处填入记录的CX寄存器中的数值。完成以上步骤就可得到子程序的机器码文件。

6.1.5.2 装入方法
    在BASIC主程序加入以下程序,就可将子程序调入内存指定单元。
DEF SEG=SEGMENT
BLOAD "SUBRT.DAT",offset
    SEGMENT 处填入子程序的段地址,SUBRT.DAT 是子程序映象文件名,offset处填入子程序的地址偏移量。

6.1.5.3 CALL语句调用机器语言子程序
格式:CALL numver [variable,...,variable]
    说明:numver是一个数字变量的名字,此变量的数值是子程序开始处的存贮器地址的偏移量。子程序开始处的段地址由 DEF SEG语句指定。
举例如下:
100 DEF SEG = &H2000
110 SUBRT = 0
120 CALL SUBRT( A%, B%, C )

6.2 PASCAL语言编程
6.2.1 PASCAL语言与汇编语言的链接用汇编语言编写的程序可以作为PASCAL的过程或函数被调用。
6.2.1.1 建立汇编语言子程序
① 格式:
CODE SEGMENT BYTE PUBLIC
    ASSUME CS:CODE
    PUBLIC SUBRT
    SUBRT PROC FAR
          PUSH BP
          MOV BP,SP
    .
         POP BP
         RET n
    SUBRT ENDP
CODE ENDS
     END
② 用MASM.EXE汇编子程序生成目标文件SUBRT.OBJ。

6.2.1.2 PASCAL语言调用格式是:
PROGRAM MYPRO
{$L SUBRT}
{$F+}
PROCEDURE SUBRT(MM:WORD):WORD;EXTERNAL;
{$F-}
BEGIN
.
END.
    其中$L编译指令链接子程序目标文件, $F+指明子程序为长调用,并且用机器语言编写的过程或函数必须被声明为外部的。
    当子程序为函数时,其结果作为第一个参数首先入栈,然后其它参数顺序入栈,访问它们可用BP加一个固定偏移量作地址。

6.2.1.3 举例说明:
主程序如下:
PROGRAM Main;
Uses crt,dos;
TYPE
    adarray = array[0..1024] of word;
VAR
    ad,i,count :integer;
    chp :byte;
    adbuf :^adarray;
{$L ADIN}
{$F+}
PROCEDURE ADIN(chp:byte;count:word;adbuf:pointer);EXTERNAL;
{$F-}
BEGIN
    read(chp,count);
    getmem(adbuf,count*2);
    repeat
        adin(chp,count,adbuf);
        for i:=1 to count do
        begin
            ad:=adbuf^[i];
            writeln(ad, (ad - 32768 ) * 20 / 65536);
        end;
    until keypressed;
    freemem(adbuf,count*2);
END.
    子程序ADIN.ASM见测试软件。

6.2.2 PASCAL语言调中断服务子程序方法
6.2.2.1 中断服务子程序格式:
PROCEDURE INTHANDLER(FLAGS,CS,IP,AX,BX,CX,DX,SI,DI,ES,BP:WORD);
INTERRUPT;
BEGIN
.
END;
    在入口时,中断过程自动保存所有的寄存器(不管过程头如何)并初始化DS寄存器。
    注意:在缺少STI指令时,可以被再中断。应用INLINE语句,可以自己产生这个代码。出口代码恢复寄存器并执行中断返回指令。
    中断过程可以改变它的参数,改变已说明的参数将在中断处理返回时改变对应的寄存器。
    含有硬中断的过程不能使用TURBO PASCAL的输入输出和动态存储分配程序,因为这些程序都是不可重入的;也不能使用 DOS 功能,因为DOS也是不可重入的。

6.2.2.2 主程序中应有保存原中断向量、设置将要调用的新的中断向量及在程序结束前恢复原中断向量等 语句,如:
GETINTVEC ($1B,INT1BSAVE);
SETINTVEC ($1B,@INT1BHANDLER);
..
SETINTVEC ($1B,INT1BSAVE);
    其中:GETINTVEC($1B, INT1BSAVE)语句的功能是把内存$1B单元的原中断向量保存在变量INT1BSAVE中;SETINTVEC($1B, @INT1BHANDLER)语句是把名为INT1BHANDLER的中断服务程序的首地址(即新的中断向量)置入内存$1B单元;显然SETINTVEC($1B, INT1BSAVE)的功能是恢复原中断向量于$1B中。

6.3 C语言与汇编语言的链接
6.3.1 建立子程序(与PASCAL调用格式大致相同)
格式:
_TEXT SEGMENT BYTE PUBLIC "CODE"
ASSUME CS:_TEXT
PUBLIC _SUBRT
_SUBRT PROC NEAR(或FAR)
        PUSH BP
        MOV BP,SP
        SUB SP,n ; 在栈内为局部变量保留 n字节
        PUSH DI
        PUSH SI
        .
        POP SI
        POP DI
        MOV SP,BP ; 当有SUB BP,SP指令时
        RET
_SUBRT ENDP
_TEXT ENDS
        END
6.3.2 汇编子程序可以象C的普通函数被调用,C程序的调用格式是:
MAIN()
{

}
6.3.3 举例说明:
子程序完成 1 + 2 = 3的计算,主程序将结果打印出来。
主程序如下:
MAIN()
{
    PRINTF("1+2=%d\n",ADD(1,2);
}
子程序如下:
_TEXT SEGMENT BYTE PUBLIC "CODE"
ASSUME CS: _TEXT
PUBLIC _ADD
_ADD PROC NEAR
        PUSH BP
        MOV BP,SP
        MOV AX,[BP+4]
        ADD AX,[BP+6]
        RET
_ADD ENDP
EXT ENDS
        END
运行结果:
1+2=3
说明:
① C的编译程序将自动到AX/DX寻找函数的结果, 因此必须把子程序的结果放入 AX(结果为WORD),或放入 AX/DX(结果为DWORD)。本例AX = 3。
② 带入子程序的参数以反序压入堆栈(与BASIC、PASCAL的调用格式刚好相反),每个参数所占字节由它的类型决定。
③ 本例调用类型为 NEAR(短调用),故返回地址在栈内占两字节(仅是返回地址的偏移量) ;若调用类型为FAR(长调用),则返回地址(包括段和偏移量)在栈内占四字节。
无论是PASCAL还是C都有多种编译程序, 每种编译程序的调用约定可能略有不同,使用时请参阅有关书籍。

6.4 附加说明
    由于PASCAL及C语言的变量可以定义, 因此用PASCAL及C语言编程时,ADL必需为不带符号字节型, 而ADH变量应定义为带符号整型。这样可充分利用二进制补码进行AD值的计算,即在编程说明变量时使用入下语句:
PASCAL语言举例
var
    ADL : byte,
    ADH : integer;
    AD : real;
    ..
    BEGIN
    .
    ADL : = PORT( ADDRESS + 8 );
    ADH : = PORT( ADDRESS + 9 );
    AD : = ADH * 256 + ADL;
    .
    END.

C语言例
float ADC( )
{
    unsigned adl;
    int adh;
    float ad;
    ..
    adl = _inp( address + 8);
    adh = _inp( address + 9);
    ad = adh * 256 + adl;
    ..
    return(ad);
}

7、安装与调整
7.1 安装
7.1.1 安装PC-AD16XX前应根据需要将板地址及跨线短路器设置好。
7.1.2 关掉主机电源后打开机箱盖,将PC-1632插入空余的EISA扩展槽中。
7.1.3 将固定螺钉拧紧后即可打开主机电源进行检测调整工作(检测调整方法见检测及调整说明部分)
7.1.4 调整正常后,关掉主机电源,将机盖装好。

7.2 检测及调整
    PC-AD16XX配有检测程序,检测程序文件名为AD1632.EXE。板上装有二个调整电位器,用于调整AD转换器的满度量程和零点偏移。
7.2.1 检测
    在PC-AD16XX正确装入主机后,打开主机电源,运行检测程序。屏幕将出现屏幕菜单,用户根据AD所设置的工作极性选择项号进行检测。 检测时应先检测其它项,最后进行DMA方式的检测。
    运行检测程序第1项:
    设置板地址一定要与硬件设置一致。
7.2.2 调整
7.2.2.1 I/O测试
    运行检测程序第6项:
    检测输出与输入是否正确,此项为新板的最基本测试项目,若此项有问题可能会影响到其它项的测试结果。
7.2.2.2 A/D调整
    运行检测程序第2项:A/D Conversion
    首先根据A/D设置项运行2项。
    将输入端与地短接, 调整VZ(调整零点)使显示的电压值为0.00xxV,使得显示的电压值变化最小;外加一略小于额定输入电压的高精度电压源,调整VG使显示值为输入电压;改变电压值,反复调整,使A/D显示值正确。
7.2.2.3 A/D放大器调整
    PC-AD1632为小信号模拟量输入设计了缓冲放大器,用户可根据需要调整放大器增益。放大器为同相放大器,增益计算公式:G = 1 +(Rf/Ri),用户选用放大器电阻时应选择温度系数≤50ppm的精密电阻。
    出厂设置增益为: PC-AD1616 G = 1 ; PC-AD1632 G = 2
★ PC-1616/1632的AMP增益量程可根据用户需求进行调整:
        a. PC-1616(±10V)G=1         b. PC-1632(±5V)G=2
          


★ 产品动态误差 ≤ ±0.005%,用户采样低于 80 / 100 KHz 时,(尤其是G=2),可在回路中设置1阶(-3db/oct)低通滤波器而使精度提高,带通宽度为:fc(KHz)=159 ÷(R(Ω)×C(pF)). 例如:R=10KΩ;C=5100P;fc=3.1KHz:
            a. G=1(±10V)时                         b. G=2(±5V)时
       

★ 加入滤波器时,如同时使用多通道采集方式,应考虑通道切换会受RC时间常数影响,这时的RC常数 应≤1/4~1/5稳定时间。 
7.2.2.4 定时/计数器测试
设置J4: OUT2-CK1
        OUT1-CK0
运行检测程序第7项:
各个通道的数值应不断变化。
7.2.2.5 DMA测试
运行检测程序4项:A/D DMA Demo
单次输入"5";多次输入"85"。

8、附 录 
8.1 AD1632元器件位置图



8.2 磁盘文件说明:
① AD1632.PAS : PC-AD1632 板检测源程序
② AD1632.EXE : PC-AD1632 板检测程序
③ ADIN.ASM : PC-AD1632 汇编子程序
④ ADIN.OBJ : ADIN.ASM 的目标文件
⑤ TASM.EXE : 宏汇编程序
⑥ LINK.EXE : 连接程序
⑦ PC-AD1632.H : W95/W98动态连接库头文件
⑧ PC-AD1632.DLL: W95/W98动态连接库
8.3 应用注意事项⑿线;且特别注意主机电源、信号源电源及保护地线的接法。
8.3.1 电源及保护地线接法:
说明:信号地不得与保护地相接(在信号源侧),当信号源与计算机连接后,信号地通过计算机与保护地联在一起。
       

8.3.2 同一电源不同输出信号与AD板接法:
说明:当输入信号传输距离较长时,输入信号应使用屏蔽线,屏蔽层在计算机侧接大地。
           

8.3.3 不同电源,不同输出信号与AD板接法:
           

8.4 PS-2120 I/O端口基本地址分配:

I/O 地址 功 能
XXX0 WR 通道选择
XXX1 RD 判断A/D转换是否完成
XXX2 RD 读A/D转换结果高8位
XXX3 RD 读A/D转换结果低8位
XXX4 RD/WR 8253 通道0 数据口
XXX5 RD/WR 8253 通道1 数据口
XXX6 RD/WR 8253 通道2 数据口
XXX7 WR 8253 控制口


    公司地址:北京海淀北三环中路31号测试大楼1009室          邮编:100088
    传真:82002398                   e_mail:webmaster@xiangyun.com.cn
    市场部  Tel:82002398                                                   
    技术部  Tel:82002399                                                    

 
返回主页