JP FREE
no SW no JUMPER
AC6111
使 用 手 册
wwlab
2003/7
目录
1
简介
5
1.1AC6111介绍
5
 1.1.1 AD部分介绍
5
 1.1.2 DA部分介绍
6
 1.1.3 开关量介绍
6
 1.1.4 软件支持
7
1.2 性能
7
 1.2.1 AD性能
7
 1.2.2 DA性能
9
 1.2.3 开关量性能
9
 1.2.4 计数器性能
10
1.3 原理说明
11
 1.3.1 AD转换部分的原理
12
 1.3.2 DA部分的原理
18
 1.3.3 开关量部分的原理
18
 1.3.4 计数器的原理
19
2
硬件安装与连接
22
2.1 安装
22
2.2 注意事项
22
 2.2.1 模拟输入
22
 2.2.2 模拟输出
22
 2.2.3 开关量
23
2.3 配套端子板
23
3
软件安装与开发指南
25
3.1 驱动软件安装
25
 3.1.1 驱动安装前的准备工作
25
 3.1.2 在各种操作系统中安装驱动
26
3.2 接口函数表及开发指导
30
 3.2.1 API函数接口列表
30
 3.2.2 程序开发指南
32
 3.2.2.1 程序开发基本思路
32
 3.2.2.2 简要例程和程序流程图
33
3.3 AC6111采集板API使用说明
39
 3.3.1 通用函数
39
 3.3.2 专用函数
40
 3.3.3 AD部分函数
41
 3.3.4 DA部分
47
 3.3.5 数字IO部分
51
 3.3.6 计数器、定时器部分
55
3.4 其他语言环境的使用
59
3.5 全套例程
60
 3.5.1 VC例程
60
 2.5.2 VB例程
65
4
AC6111的IO功能说明
72
5
附录
77
连接器P1模拟输入插座定义
77
P2数字输出连接器
78
AC6111示意图
79
AC6111产品包中的附件
80
补充说明:具有充分输入的6111补充说明
第一章、AC6111简介
1.1 AC6111介绍
AC6111是一款中速度通用A/D板,采用PCI总线支持即插即用。属于“JP FREE”(注)系列,无需任何跳线、开关设置,方便应用。
AC6111具有16路模拟输入、2路12位D/A输出、16路可编程开关量、一路16位计数器、采集转换支持多种触发形式。AC6111采用大规模可编程门阵列设计,提高可靠性。主要特点、功能:
*JP FREE:免跳线设置。
1.1.1 AD部分介绍:
采用DB25接头。
16路输入,支持通道扫描及伪同时采样(同步采保)扫描模式。(注:伪同步模式:既模拟同步采样模式,采样被定时器或外部时钟启动后,6111以400KHz的最大速度对用户设置的一组通道采样,结束后等待下一次启动,如此循环采样),新卡支持16路单端/8路差分输入(连接与定义见附录最后)。
12位400KHz A/D转换器。多通道采集速度可以达到最大采样速度。
模拟输入通道支持自动扫描模式,可以设置任意起始、截止通道。
输入量程程控,范围:5伏、10伏、(5伏、(10伏。
输入通道模式:SH/NORMAL,既:伪同步/等时间间距通道扫描模式。
AD启动模式:软件、外部硬件触发。触发可以选择上升、下降边沿有效。
AD定时器模式:板上16位定时器(基准时钟4MHz)、外部同步时钟(OCLK)。OCLK可以选择时钟上升或下降边沿有效。时钟触发在“SH”模式,每个触发转换N个通道;“NORMAL”模式,每个时钟触发转换一个通道。
AD接口采用4K字FIFO,支持大容量数据采集。
采集数据支持:起始通道标志、触发标志。用户可以检测采集数据的连续性及支持预触发功能。
1.1.2 DA部分介绍:
DB25插座。
二路D/A输出,分辨率12位。
模拟输出量程:10伏、(10伏,每路输出可以分别软件设置。
输出建立时间:小于50微秒(0.1%精度)
1.1.3 开关量部分介绍:
20芯扁平电缆插座。
16位开关量的二个8位可以分别设置为输入、输出。
一路16位计数器(DB25插座输入)。内置16位定时器(基准时钟:1MHz),可以精确测量频率、脉冲宽度。定时器测量范围:1微秒-65毫秒。
1.1.4 软件支持:
提供DOS测试程序(含:波形显示)
win98、2000、XP、NT驱动。
主要应用范围:电力谐波、纪录测量,医疗仪器,震动信号采集,频谱分析。
1.2 性能:
1.2.1 AD性能:
A/D转换器,400KHZ 12位A/D ADS7818,A/D内置采样保持器。
16路单端输入/8路差分,输入阻抗:大于100MΩ,最大输入电压:< +12V / -12V,瞬时输入耐压:-30V - +30V,差分输入共模抑制比大于80DB。DB25孔式输入连接器。
输入支持:SH、NORMAL二种通道模式(并行采样、扫描采样)。对应最小每通道采样时间:
SH:N*2.5 (uS) 其中:N为设置的采样通道数量。
NORMAL:2.5uS
程控模拟输入范围,双极性输入幅度: 5V、(10伏,单极性输入幅度:5V、10V输入,对应输入幅度及精度如下:
输入
精度
分辨率
0-5V
0.1%
 1LSB
0-10V
0.1%
 1LSB
-5V-+5V
0.1%
 1LSB
-10V-+10V
0.1%
 1LSB
A/D最大通过率:400KHZ,输入通道建立时间<2uS。
AD工作模式、参数:
采集启动模式:软件、硬件触发(外触发)启动。外部触发的极性可以选择为“上升边沿“或“下降边沿“有效。
触发输入:TTL电平(注1),内置10K上拉电阻,CMOS输入。输入带shmit触发器。
采样定时器模式:内部时钟、外部时钟。外部时钟支持上升、下降边沿选择。
板上时钟:16位定时器、基准时钟4MHz,设置范围:10-65535,对应采样速度:400KHz-16Hz。
外部时钟输入:TTL电平,输入特性同外部触发输入。时钟输入最小有效脉冲宽度:大于100nS。时钟频率必须小于对应采样模式的最大采样速度。
AD与计算机采用FIFO接口,容量:4K字,提供:FIFO空、半满、溢出标志。半满标志支持中断。
1.2.2 DA性能:
二路12位D/A,输出电压10V或(10V(程控)。
精度:10V,0.1%,-10V - +10V,0.2%。
分辨率:12位。
输出驱动能力:电流大于5毫安、电容驱动能力:100P。
1.2.3 开关量性能:
16路开关量(2个8位定义为:PA、PB口),TTL电平(注1)。PA、PB可以分别程控为输入、输出。20脚扁平电缆插座输出、输出。开关量复位后为输入状态。
输出高电压 > 3V,低电压 < 0.4V
输出下拉电流 > 20mA/路,上拉>6mA
输入电流:<0.1mA 输入高电压门限:〉2.5V,低电压:〈 0.8V,
最大输入耐压:-0.3V - +7V
1.2.4 计数器性能:
16位计数器,计数范围1-65535,减法计数器。计数输入TTL电平(注1),上升边沿有效,内部结构同触发输入。最大计数频率:大于5MHz。具有计数溢出标志(计数到0时溢出)。
内置16位定时器,可以测量从计数器设置数值到溢出有效这一个时间段的时间。定时器输入时钟为1MHz(1uS周期),精度:(66纳秒。
计数器与定时器结合可以完成:计数、测频、测量脉冲宽度的功能。
PCI总线,符合PCI V2.1标准
AC6111占用64个I/O选通空间(自动分配)。
注1:TTL电平:高电平大于2.3V,低电平小于:0.6V
1.3原理说明:
AC6111采用PLX9052 PCI接口芯片及门阵列作为主控芯片。门阵列控制模拟输入、采样、模拟输出及开关量。如下图:
输出
输入量程选择
SW SH A/D 门阵列 D/A
XC95288
D/A
计数器触发、时钟
16DIO
缓冲 PLX9052 PCI总线
16MHz
时钟
1.3.1 AD转换部分的原理
转换模式、通道控制
ac6111具有二种采样模式,SH:采保模式、NORMAL:普通扫描模式。
SH模式:模拟同步采样模式,适合应用在对一组输入通道采样的时差要求尽量小,但组之间的时间间隔较大的应用场合。当由定时器脉冲或外部时钟有效边沿启动后,在板上逻辑的控制下以400KHz的速度,从第N通道开始顺序转换到第M通道结束,(N、M 分别为用户设置的起始与结束通道,N<=M)。同时转换数据顺序写入FIFO寄存器中,转换完后重新进入等待模式,等待下一个启动信号。
NORMAL模式:普通模式指,当由定时器脉冲或外部时钟有效边沿启动后,AD开始转换当前通道,并通道在转换时自动设置为下一个转换通道,等待下一个有效启动脉冲到来。通道转换顺序为:从第N通道开始顺序转换到第M通道结束,然后由重新从N到M通道,如此循环直到用户结束转换,(N、M定义同上)。转换数据顺序写入FIFO寄存器中。
因此,在不同模式下,启动时钟的最大频率不同。由于AD的转换速度是400KHz,各种模式下的最大转换速度如下:
SH模式:K个通道的最小转换时间 Tmin = 2.5*K (uS),K=(M-N+1)为一次转换的输入通道数量。等效每通道最大采样速度:1000/Tmin(KHz)。
NORMAL,每通道最小转换时间:Tmin=2.5uS/通道,等效每通道最大转换速度:400/(转换通道个数) (KHz)。
AD转换启动控制转换启动可以在触发选择中(TRSL)设置:由软件或外部硬件触发启动整个转换过程,除非用户终止转换,否测将一直转换下去。硬件触发可以在触发极性选择中(TRPOL)设置为“上升边沿”或“下降边沿”有效。
一旦启动转换,AD转换将在板上定时器或外部时钟驱动下按用户设置的起始(STCH)、终止通道(ENDCH)逐一通道顺序、循环转换。时钟选择(CLKSL)可以软件设置。应用外部时钟时,可以在模式设置字的CLKPOL控制位,控制时钟为“上升边沿”或“下降边沿”有效或启动转换。
用户应该区分二种模式:SH、NORMAL模式的通道转换模式及最小转换时间(或最大转换速度)的要求。
小结:采样模式转换触发启动:软件/硬件 (trsl=0/1)。
硬件触发极性:上升/下降边沿 (trpol=0/1)。
转换控制时钟:内部/外部 (clksl=0/1)。
外部时钟极性,上升/下降 (clkpol=0/1)。
模拟通道采样模式:SH/NORMAL (sammode=1/0)。
采样通道控制:起始通道/结束通道 (stch/endch)。
板上转换定时器
AC6111的16位定时器为模拟转换提供精确的定时,误差小于(250纳秒。定时器输入基准时钟为4MHz,周期为250纳秒。定时器为减法计数器,当由用户设置数值tdata减到1时,发出启动脉冲并自动将定时器数据重新设置为tdata。
16位数据取值(tdata):1-65535,对应周期=0.25*N(uS),N:设置的16位定时器数据tdata。
在NORMAL模式下:最小转换周期为2.5uS(tdata=10),由此6111的转换周期为:2.5uS – 16385uS。
在SH模式下,最小转换周期为2.5*Nch(uS),Nch:为采样通道的个数。由此转换周期的间隔范围为:2.5*Nch(uS) – 16385uS。
相应启动频率为,F=1000/(0.25*N) (KHz) N:16位定时器数据。
FIFO数据、状态:
FIFO中的数据按从stch的采样数据到endch采样数据循环存放,如下:
Stch,stch+1,….,endch…….stch,..,endch,……结束
6111的FIFO(先进先出寄存器)容量为4096字,具有空(EF)、半满(HF)、溢出(FF)标志,标志为“0”时有效。采样数据不断的写入FIFO中,用户检测到半满标志后,立即读入2048个数据,以保持FIFO中的数据不超过4096个,否则FIFO溢出,数据队列顺序会打乱(新进入的数据将冲掉最先写入的数据)。如果出现FIFO溢出,只能靠提高计算机速度或降低采样速度或扩大存储器容量来弥补。
数据格式:16位读出数据定义如下:
D15
D14
D13
D12
D11
D10
D9
D8
AD11
AD10
AD9
AD8
AD7
AD6
AD5
AD4
D7
D6
D5
D4
D3
D2
D1
D0
AD3
AD2
AD1
AD0
IO1
IO0
trsign
chsign
D15-D0:16位数据的从高到低位。
AD11-AD0:12位采样数据,(MSB - LSB)。
IO1:开关量通道1状态。
IO0:开关量通道0状态。
Trsign:触发标志,=0:没有触发 / =1:触发有效
Chsign:通道标志,=0:数据为起始通道数据 / =1:其他通道的数据。
应用:
采样时可以记录开关量通道的0、1号,IO0、IO1状态(必须设置为输入状态)。由此可以将二个输入作为数字波形纪录器使用,速度为AD采样速度。
trsign:记录录外部触发状态,如果触发有效,trsign将从0变为1。检测这位可以在软件启动模式下检测外部触发的开始,用于实现预触发功能。
chsign:用于通道检测校正。如果FIFO中的数据乱了,可以通过检测chsign是否为“0”重新获得数据的起始位置。因为通道按stch-endch顺序循环采样,由此chsign每隔采样通道数量的个数为“0”、或对起始通道(stch)采样时起始时为“0”,其余时间为“1”。
模拟输入量程选择控制
6111的AD输入有4档量程,为:
单极性:0-5伏、0-10伏双极性:-5伏 - +5伏、-10伏 - +10伏由PS位设置。PS=0,1,2,3对应选择输入为:5、10、(5、(10伏。注意:不要在AD转换过程中设置通道stch、endch与PS。
1.3.2 DA部分的原理:
AC6111提供二路12位D/A。输出可以分别由软件控制为:0-10伏或(10伏。控制寄存器为damode的低二位,如下:16位数据D15-D0的D1、D0控制模拟输出通道1、0号的输出范围,对应控制字定义为:damode0、damode1,分别控制DA输出通道0、1号。
Damode0或damode1 =0,对应输出为0-10伏。
Damode0或damode1 =1,对应输出为(10伏。
1.3.3 开关量部分的原理:
16路开关量DIO15-DIO0分为二个8位,可以由iomode寄存器的iomode0、iomode1位控制为输入或输出,0号控制低8位PA:DIO7-DIO0、1号控制高8位PB,DIO15-DIO8。Iomode0、iomode1对应16位控制字D15-D0的D0、D1位。定义:
IOMODEn=0:设置对应口为输入。
IOMODEn=1:设置对应口为输出。
注,n=0、1
16路数据通过16位I/O指令一次性读入或输出。如果对应口为输入,输出数据没有影响,但输入可以读入输出的状态。结构如下:
数据线D7-D0
PA
输出寄存器
PA输出容许
PB 数据线D15-D8
输出寄存器
PB输出容许
PA读入数据,D7-D0
PB读入数据,D15-D8
1.3.4 计数器的原理
AC6111提供一个16位多功能计数器cnt,可以完成:计数、测频、脉冲宽度测量等功能。计数器为16位减法计数器,设置数据范围1-65535,输入上升边沿脉冲有效(进行减1操作)。计数器减法计数到0时,自动将溢出标志cntov由0设置为1,并保持到重新设置计数器数值。Cntov可以由状态查询位读入。Cnt的数据可以通过cntw、cntr指令设置或随时读出,cntw指令清除计数器、定时器数据并重新开始计数、定时。
AC6111内置16位定时器tcnt,功能为:测量由开始计数的第一个上升边沿到计数器溢出(最后一个脉冲的上升边沿)间的时间周期。Tcnt的输入时钟为1微秒,测量时间为1-65535微秒,如果超过65535。微秒,读入数值恒定为65535微秒。如果读入数据为FFFFH(65535),用户应该认为定时器已经溢出、测量结果无效。定时器性能:
16位定时器,定时范围:1-65535微秒,对应频率测量范围5000KHz-16Hz。
定时器为加法计数器,从0开始计数。
输入时钟:1微秒周期。时钟来自16兆时钟源4分频,并且分频器与定时器同时启动,保证(66纳秒的时钟精度。
应用:
计数器模式:用户初始化计数器数值,开始减法计数操作。可以随时读入计数器数值,计数的个数=初始化数值 - 读入数值。
测量N个脉冲上升边沿间的时间:设置计数器数值为N,检测到计数器溢出标志后,读入tcnt数据,时间间隔为tcnt(uS)。注意:N的最小数值为2,即测量一个波形周期(二个上升边沿间)的时间。
波形示意:
写入数据 N
开始计数
cntov
定时器
启动
计数器数据 N-1 N-2 0
定时器数据 0 1 M
注:
1.计数器初始化数据为N
2.定时器结束数值为M。

第二章、硬件安装与连接
2.1安装:
关掉PC机电源,将AC6111插入主机的任何一个PCI插槽中并将外部的输入、输出线连好。如果主机有多套AC系列PCI插卡,请注意并标记插槽的顺序与号码以方便连接与编程。
2.2注意事项注:差分输入的开关选择与输入定义见附录:
2.2.1 模拟输入:
输入连接电缆必须用屏蔽电缆。
模拟信号的地线应该连接到前端的模拟输出的地线上,不能与数字地线混合。如果需要混合数字、模拟地线,可以将数字地线连接到前端的电源地线上。
如果前端信号干扰较大,如电力信号采集应用时,最好将PC机的外壳与前端的地线单独连接。这样可以避免干扰、高压烧毁6111卡。
2.2.2 模拟输出:
输出不要对外部电源短路。
输出的电容负载能力有限,注意不能驱动大的电容负载,否则会引起输出不稳定。如果需要驱动电容、电感负载,应该在输出与被驱动设备间加入一个10-100欧姆的电阻。
2.2.3 开关量:
开关量输入电平不能低于-0.3V 或高于+5V。
输出不要对地线、电源短路。
输出如果需要驱动大功率设备,为防止干扰应该选用AC145端子板,将输出与设备隔离。
2-3:配套端子板
AC6111模拟输入可以配接AC146端子板。开关量可以配接AC142或AC145端子板
AC146:
提供:25端子到DB25插座的接线
AC142:
40路螺丝端子
DB37或40脚扁平电缆插座。
AC145:
16路隔离输入5-24伏,端子输入。
16路隔离输出,集电极开路(OC)输出,电流100毫安/路,耐压:大于30伏。端子输出。
I/O为40脚扁平电缆插座。
连接:
A/D、D/A
P1 P2
AC146
AC142
AC145
第三章、软件安装与开发指南
本章介绍驱动的安装、API函数使用方法以及针对AC6111的软件开发指导。
3.1驱动软件安装
3.1.1 驱动安装前的准备工作请用户在编程前,仔细阅读本手册,了解相关信息,按照下面的步骤开展工作:
检查AC6111产品包中的附件是否齐全。
附件包括:
AC6111 PCI卡一块
DB25针接头一套
AC146端子板一套(DB25针-DB25针电缆一条)
1米长20芯扁平电缆一条说明书一本
CD-ROM一张(内含各种板卡的手册和开发指导)。
AC6111附带光盘中,提供如下内容:
说明书。
驱动程序
Visaul C++、Visaul Basic编程实例。
DOS下的测试程序。(本产品的检测程序,可以检验本产品是否工作正常,运行环境DOS 6.22)。
提供Pci总线的扫描程序PciScan.exe,帮助用户检查Pci板卡的分配状况(pciscan.exe分为dos版和windows版本,dos版可以运行在dos 6.22系统上;在使用windows版的pciscan之前一定要先安装驱动程序)。
注:如果发现配件不全,请与经销商联系;
关闭计算机电源;
打开机箱,找到PCI总线插槽(一般PCI总线插槽是白色的,ISA总线插槽一般是黑的,AGP总线插槽一般是棕色的);
将AC6111 A/D采集板按正确的方向插入PCI总线插槽;
打开电源,启动计算机,安装驱动程序。
3.1.2 在各种操作系统中安装驱动对于在不同的操作系统下的安装驱动程序的方法:
Windows 98驱动安装:
1、打开计算机电源,启动Windows 98;
2、Windows 98将会显示找到新硬件(将显示找到Pci Device),进行下一步;
3、在添加硬件向导窗口中选择搜索设备的最新驱动程序,下一步;
4、选择驱动所在目录,进行安装(\ac6000 driver\win98win2000);
5、Windows 98将显示找到WWlab PCI AC6111 A/D Board提示进行下一步;
6、驱动已经安装完成
注:安装完毕后将在设备管理器中出现一个其他设备(其他设备是问号--不表示设备有问题,只是表示系统不知道ac6111是何种设备)
Windows 2000驱动安装:
1、打开计算机电源,启动Windows 2000;
2、Windows 2000将会显示找到新硬件,可按找到新硬件向导进行下一步;
3、选择搜索适用与我的设备的驱动程序(推荐),下一步;
4、选择驱动所在目录,进行安装(\ac6000 driver\win98win2000);
5、按找到新硬件向导的提示进行下一步;
6、Windows 2000将显示完成添加/删除硬件向导,单击完成即可完成安装过程
注:安装完毕后将在设备管理器中出现一个其他设备(其他设备是问号--不表示设备有问题,只是表示系统不知道ac6111板卡是何种设备),
Windows NT 4.0驱动安装:
1、打开ac6111系列板卡的电源,打开计算机电源;
2、启动Windows NT 4.0;
3、运行INSTDRV.EXE安装程序,程序将自动安装驱动程序。
驱动安装程序Instdrv.exe位于CD-ROM的\PCI\AC6000 DRIVER目录下。运行Instdrv.exe后,看到窗口显示安装成功,表示已经成功安装了驱动程序;
当看到安装失败的窗口显示,表明安装失败,请退出其他应用程序再进行安装,如果仍然无法安装,请与经销商联系。
对板卡编程控制,请参考程序流程图。当发现在编程、调试的过程中,发现板卡工作不正常时,请一定要使用随机提供的测试程序进行检查,如果测试测试程序报告有问题,请与经销商联系。
注:
当Visaul C++/Visaul Basic例程从CD-ROM复制到硬盘时,属性仍将保持为只读属性,这将影响用户调试程序。请将属性改为文档属性,这样就可以进行正常的编译、调试工作了。
测试程序运行环境:DOS5.x-Dos6.x版本或win98 DOS(板卡驱动必须已经在windows系统中安装,否则无法正确运行)
3.2接口函数表及开发指导
3.2.1 API函数接口列表序号
函数名
参数列表
功能描述
1
AC_OpenDriver
void
获得驱动句柄
2
AC_CloseDriver
HANDLE driver
关闭驱动
3
AC_6111_INIT
HANDLE port,
unsigned long *board_id
搜索AC6111卡的数量和识别ID
4
AC_6111_AD
HANDLE port,
Unsigned long board_id,
int ad_timer,
int start_ch,
int end_ch,
int ps,
int triger_sl,
int clk_sl,
int triger_pol,
int clk_pol,
int sam_mode,
int dif,
unsigned long *Data,
int Size
进行AD采样数据由*Data返回
5
AC_6111_DA
HANDLE port,
unsigned long board_id,
unsigned long chn,
unsigned long da_data
DA输出
6
AC_6111_DA_MODE
HANDLE port,
unsigned long board_id,
unsigned long da_mode0,
unsigned long da_mode1
设置DA电压输出电压范围
7
AC_6111_DI
HANDLE port,
unsigned long board_id,
unsigned long *di_data
开关量输入
8
AC_6111_DO
HANDLE port,
unsigned long board_id,
unsigned long do_data
开关量输出
9
AC_6111_IO_MODE
HANDLE port,
unsigned long board_id,
unsigned long io_mode0,
unsigned long io_mode1
开关量输入/输出口模式设定,可选择作为输入或输出
10
AC_6111_rCounter
HANDLE port,
unsigned long board_id,
unsigned long *counter_data
读计数器数值
11
AC_6111_wCounter
HANDLE port,
unsigned long board_id,
unsigned long counter_data
这是计数器数初值
12
AC_6111_rTimer
HANDLE port,
Unsigned long board_id,
Unsigned long *timer_data
读定时器数值
3.2.2程序开发指南
程序开发基本步骤:
加载动态链接库获得驱动句柄检测AC6111是否存在,获得PCI板卡ID(所有的操作都是通过板卡ID来识别的)
选定板卡进行具体操作(可以进行多卡操作)
用户自己的应用程序退出前关闭驱动,卸载动态链接库
3.2.2.2简要例程和程序流程图
Visual C++程序简要说明
#include ".\include\io_nt.h"
#include ".\include\AC6111.h"
HINSTANCE hDLL; //DLL句柄
HANDLE NTportio=NULL; //NT IO驱动 句柄--->暂定为全局变量,自定义时,可以自己传递参数
int main(int argc,char* argv[])
{
char *dll_name="acpci.dll";//动态链接库名
hDLL=LoadLibrary(dll_name); //调入DLL,动态调用
#include ".\include\io_nt_func.h"
#include ".\include\ac6111_func.h"
//-----------------------------------------------------------------
//---------用户程序可以写在下面----------------
unsigned long idd[100];
unsigned long cardc;

cardc=AC_6111_INIT(NTportio,idd);//获得AC6111卡的数量和卡ID
printf("\n\ncard number=%x\n",cardc);
if(cardc==0){
printf("There is no card(AC6111) in this machine! exit.\n");
getch();
exit(0);
}
int do_data;
unsigned long di_data;
do_data=0xAAAA;
AC_6111_IO_MODE(NTportio,idd[0],0,1);//设置IO模式
printf("AC6111 Digital Out =%X ",do_data);
AC_6111_DO(NTportio,idd[0],do_data); //数字量输出
AC_6111_DI(NTportio,idd[0],&di_data);
printf("\nAC6111 Digital In =%X\n",di_data);//显示数字量输入的值
getch();
}
AC_CloseDriver(NTportio); //关闭驱动程序
}
FreeLibrary(hDLL);//关闭DLL
}
getch();
}
return 0;
}
Visual Basic程序简要说明
首先启动Visaul Basic开发环境;
新建一个标准EXE应用;
在工程菜单中添加模块,将acpci.bas模块加入(该模块在光盘中\pci\ac6111\vb目录中);
接下来可以按照函数说明编写:
1、在通用对象中加入定义
Dim cardid(100) As Long <----定义AC6111卡ID数组
2、在Form_Load中加入如下代码
NTportio = AC_OpenDriver()
注:获得驱动句柄,Ntportio已在模块文件中定义为Global变量
cardnumber = AC_6111_INIT(NTportio,cardid(0))
注:获得AC6111卡的数量和各自的识别ID,按插卡的顺序分别存放在cardid数组中,第一块卡的ID为cardid(0),第二块卡的ID为cardid(1)..依次类推..第N块卡的ID为cardid(n-1)。以后所有的操作都依靠ID来识别具体操作哪块卡。
3、在Form中建立一个CommonButton,名为Command1
在Command1_Click()过程中加入A/D,D/A转换函数,IO函数
Private Sub Command1_Click()
//用户具体程序语句
End Sub
4、在程序退出时,应该在Form_Unload()过程中加入释放驱动句柄的操作,具体程序如下:
AC_CloseDriver Ntportio
有关用户其他方面的应用请参考请参考函数说明和例程。
例:
Private Sub Form_Load()
NTportio = AC_OpenDriver() ‘获得驱动句柄
cardnumber = AC_6111_INIT(NTportio,cardid(0))
Form1.Caption = Form1.Caption + " 检测到有 " + Str(cardnumber) + " 块AC6111卡在机器中"
End Sub
Private Sub Form_Unload(Cancel As Integer)
AC_CloseDriver Ntportio ‘关闭驱动
End Sub
流程图:
流程图

3.3 AC6111采集板API使用说明
3.3.1 通用函数
AC_OpenDriver
HANDLE AC_OpenDriver( void )
功能:打开驱动,获得驱动句柄;
参数:无;
返回:获得的驱动句柄。数据类型为HANDLE。
举例:参考AC_CloseDriver()函数的例子
AC_CloseDriver
int AC_CloseDriver(HANDLE portio)
功能:关闭驱动,释放驱动句柄;
参数:要释放的驱动句柄;
返回:无。
举例:
Visual C++:
HANDLE Temp;
Temp=AC_OpenDriver();
If ( Temp != NULL ) //驱动加载成功
else //驱动加载失败
AC_CloseDriver(Temp); //驱动卸载
Visual Basic:
Global Temp
Temp=AC_OpenDriver() ‘驱动加载
AC_CloseDriver Temp ‘驱动卸载
3.3.2专用函数
AC_6111_INIT
int AC_6111_INIT(HANDLE port,unsigned long *board_id)
功能:初始化AC6111插卡,获得插卡的数量和识别ID
参数:
port:驱动句柄,类型为HANDLE。此举柄由AC_OpenDriver()获得。
*board_id :AC6111插卡识别ID通过此指针返回,数据类型为unsigned long指针返回:AC6111插卡的数量(比如计算机中有3块AC6111插卡,则返回 3)
举例:
Visual C++:
unsigned long idd[100];//存放板卡识别ID的变量
unsigned long cardc; //存放板卡数量的变量
cardc=AC_6111_INIT(NTportio,idd);//获得AC6111卡的数量和卡ID
printf("\n\ncard number=%x\n",cardc);//显示卡的数量
if(cardc==0){//没找到卡
printf("There is no card(AC6111) in this machine! exit.\n");
}
Visual Basic:
cardnumber = AC_6111_INIT(NTportio,cardid(0))
3.3.3 AD部分函数
AC_6111_AD
int AC_6111_AD(
HANDLE port,
unsigned long board_id,
int ad_timer,
int start_ch,
int end_ch,
int ps,
int triger_sl,
int clk_sl,
int triger_pol,
int clk_pol,
int sam_mode,
int dif,
unsigned long *Data,
int Size
)
功能:AC6111 A/D 采样
参数:
port :驱动句柄
board_id :要操作的AC6111插卡ID由AC_6111_INIT获得
int ad_timer,//10-65536,4M的时基,每个数表示0.25uS的时间长度
start_ch,//0-15,采样起始通道号
end_ch,//0-15,采样停止通道号
ps,//表示模拟输入的电压范围,用0-3分别表示0-5V、0-10V、±5V ±10V
triger_sl,//触发方式选择,用0/1分别表示软件/硬件触发,0-软件 1-硬件
clk_sl,//采样时钟的选择,0—使用内部时钟 1—使用外部时钟
triger_pol,//触发极性选择0—上升沿触发 1—下降沿触发
clk_pol,//时钟极性选择0—上升沿 1—下降沿
sam_mode,//采样方式选择 0--普通采样模式 1--采样/保持模式
dif,//模拟输入选择0--单端模式,1--差分模式(信号+、信号-、信号地),
此选项是为611x系列兼容考虑,对于AC6111是无意义的;
*Data,//回传的数据缓冲,数据类型是无符号长指针
Size//回传的数据的长度
返回:0—表示采样正确/11—表示参数有误。
下面详细描述数据各二进制位的具体含义:
A/D信号由P1-25脚D型插座输入,定义见附录。模拟输入电压与采集数据的换算关系:
由于16位读入数据的高12位为12位采样数据。如下:
数据格式:16位读出数据定义如下:
D15
D14
D13
D12
D11
D10
D9
D8
AD11
AD10
AD9
AD8
AD7
AD6
AD5
AD4
D7
D6
D5
D4
D3
D2
D1
D0
AD3
AD2
AD1
AD0
IO1
IO0
Trsign
chsign
D15-D0:16位数据的从高到低位。
AD11-AD0:12位采样数据,(MSB - LSB)。
IO1:开关量通道1状态。
IO0:开关量通道0状态。
Trsign:触发标志,=0:没有触发 / =1:触发有效
Chsign:通道标志,=0:数据为起始通道数据 / =1:其他通道的数据。
因此,用户必须将16位FIFO数据(fdata)转换为12位采集数据data,方法如下:
VB:
Data=(fdata and &hfff0)/16
Data=data and &hfff
Io1=fdata and &h8
Io0=fdata and &h4
Trsign=fdata and &h2
Chsign=fdata and &h1
VC:
Data=(fdata>>4) & 0xfff;
Io1=fdata & 0x8;
Io0=fdata & 0x4;
Trsign=fdata & 0x2;
Chsign=fdata & 0x1;
设:A/D读入数据为:data (data=0-4095),对应电压为:
0-5V输入,V=data*5000.0/4095.0 (mV)
0-10V输入,V=data*10000.0/4095.0 (mV)
-5V - +5V输入,V=(data-2048)*5000.0/2048.0 (mV)
-10V - +10V输入,V=(data-2048)*10000.0/2048.0 (mV)
举例:
Visual C++:
以下是三种电压输入方式、0-15通道、软件触发、采样/保持模式、采集2048点的例子
//0-5V
printf("sample return=%x\n",AC_6111_AD(NTportio,idd[0],120,0,7,0,0,0,0,0,1,1,data,2048));
for(int ii=0;ii<8;ii++) printf( "%10.3f",((data[ii]>>4))/4095.0*5.0);
//0-10 V
printf("sample return=%x\n",AC_6111_AD(NTportio,idd[0],120,0,7,1,0,0,0,0,1,1,data,2048));
for( ii=0;ii<8;ii++) printf( "%10.3f",((data[ii]>>4))/4095.0*10.0);
//-5--+5 V
printf("sample return=%x\n",AC_6111_AD(NTportio,idd[0],120,0,7,2,0,0,0,0,1,1,data,2048));
for( ii=0;ii<8;ii++) printf( "%10.3f",((data[ii]>>4)-2048)/2048.0*5.0);
Visual Basic:
0-5V
Print Hex(AC_6111_AD(NTportio,cardid(0),120,0,7,0,0,0,0,0,1,0,data1(0),2048))
Print Hex(data1(0)),(data1(0) And &HFFF0&) / 16 / 4095# * 5#; "V"
0-10V
Print Hex(AC_6111_AD(NTportio,cardid(0),120,0,7,1,0,0,0,0,1,0,data1(0),2048))
Print Hex(data1(0)),(data1(0) And &HFFF0&) / 16 / 4096# * 10#; "V"
-5-+5V
Print Hex(AC_6111_AD(NTportio,cardid(0),120,0,7,2,0,0,0,0,1,0,data1(0),2048))
Print Hex(data1(0)),((data1(0) And &HFFF0&) / 16 - 2048) / 2048# * 5#; "V"
3.3.4 DA部分
AC_6111_DA_MODE
int AC_6111_DA_MODE(
HANDLE port,
unsigned long board_id,
unsigned long da_mode0,
unsigned long da_mode1)
功能:AC6111 D/A 输出电压模式的设定
参数:
port :驱动句柄
board_id :要操作的AC6111插卡ID
da_mode0 :DA0输出的电压范围选择(0、1);0:0-10V / 1:(10V
da_mode1 :DA1输出的电压范围选择(0、1);0:0-10V / 1:(10V
返回:0表示操作成功;10表示参数错误
例:
Visual C++:
设两通道都为0-10v输出,设置0通道电压输出为10V
AC_6111_DA_MODE( NTportio,idd[0],0,0 );
AC_6111_DA(NTportio,idd[0],0,4095);
Visual Basic:
AC_6111_DA_MODE NTportio,idd[0],0,0
AC_6111_DA NTportio,idd[0],0,4095
AC_6111_DA
int AC_6111_DA(
HANDLE port,
unsigned long board_id,
unsigned long chn,
unsigned long da_data)
功能:AC6111 D/A 输出参数:
port :驱动句柄
board_id :要操作的AC6111插卡ID
da_mode0 :DA0输出的电压范围选择(0、1);0:0-10V / 1:(10V
da_mode1 :DA1输出的电压范围选择(0、1);0:10V / 1:(10V
chn :选择的D/A输出通道(0,1),共两个通道
da_data :D/A输出的数据(0-4095)
返回:0表示操作成功;10表示参数错误。
举例:见AC_6111_DA_MODE函数的距举例。
D/A信号由P1-25脚D型插座输出,定义见附录。模拟输出量程软件设置。输出电压与写入数据关系。
设:D/A写入数据为:data (data=0-4095),对应电压为:
0-10V输出,V=data*10000.0/4095.0 (mV)
即:data=4095*V/10000.0(mV)
-10V - +10V输出,V=(data-2048)*10000.0/2048.0 (mV)
即:data=2048+2048*V/10000.0(mV)
注:用户如果输出数据超出了0-4095的范围后,程序自动进行如下处理:
data是否大于4095,如果大于,则data=4095。
data是否小于0,如果小于,则data=0。

3.3.5数字IO部分:
AC_6111_IO_MODE
int AC_6111_IO_MODE(
HANDLE port,
unsigned long board_id,
unsigned long io_mode0,
unsigned long io_mode1 )
功能:设置AC6111数字IO部分的模式(输入/输出)
参数:
port :驱动句柄
board_id :要操作的AC6111插卡ID
io_mode0 :0表示输入方式/1表示输出方式(低8位的IO口)
io_mode1 :0表示输入方式/1表示输出方式(高8位的IO口)
返回:0表示操作成功 / 返回10表示参数有误,操作未进行。
举例:
Visual C++:
下面的例子是将低8位IO口设置位输入方式,将高8位IO口设置位输出方式
AC_6111_IO_MODE(NTportio,idd[0],0,1);//设置IO模式
AC_6111_DO(NTportio,idd[0],do_data); //数字量输出
AC_6111_DI(NTportio,idd[0],&di_data); //数字量输入
Visual Basic:
AC_6111_IO_MODE NTportio,idd[0],0,1 ‘设置IO模式
AC_6111_DO NTportio,idd[0],do_data ‘数字量输出
AC_6111_DI NTportio,idd[0],&di_data ‘数字量输入
AC_6111_DI
int AC_6111_DI(HANDLE port,unsigned long board_id)
功能:AC6111数字输入参数:
port :驱动句柄
board_id :要操作的AC6111插卡ID
返回:数字输入的数值(0-0xffff),16位数据D15-D0对应输入通道15-0.(16位数据的含义与IO_MODE设置的模式紧密相关。例如,当低8位数据被设置成输出而高8位数据被设置成输入时,则D15-D8对于输入有意义,D7-D0可以读回,但读回的是输出寄存器锁存的内容)
Visual C++:
下面的例子是将低8位IO口设置位输入方式,将高8位IO口设置位输出方式
AC_6111_IO_MODE(NTportio,idd[0],0,1);//设置IO模式
AC_6111_DI(NTportio,idd[0],&di_data); //数字量输入
Visual Basic:
AC_6111_IO_MODE NTportio,idd[0],0,1 ‘设置IO模式
AC_6111_DI NTportio,idd[0],&di_data ‘数字量输入
AC_6111_DO
int AC_6111_DO(HANDLE port,unsigned long board_id,unsigned long do_data)
功能:AC6111数字输出参数:
port :驱动句柄
board_id :要操作的AC6111插卡ID
do_data,要输出的16位数值(0-0xffff),16位数据D15-D0对应输入通道15-0。
返回:保留。
举例:
Visual C++:
下面的例子是将低8位IO口设置位输入方式,将高8位IO口设置位输出方式
AC_6111_IO_MODE(NTportio,idd[0],0,1);//设置IO模式
AC_6111_DO(NTportio,idd[0],do_data); //数字量输出
Visual Basic:
AC_6111_IO_MODE NTportio,idd[0],0,1 ‘设置IO模式
AC_6111_DO NTportio,idd[0],do_data ‘数字量输出
(16位数据的含义与IO_MODE设置的模式紧密相关,当低8位数据被设置成输出而高8位数据被设置成输入时,则D15-D8对于输出无意义,D7-D0对于输出有意义)
开关量由P2,20芯扁平电缆输入/输出。定义见附录。
16路开关量DIO15-DIO0分为二个8位,可以由iomode寄存器的iomode0、iomode1位控制为输入或输出,0号控制低8位PA:DIO7-DIO0、1号控制高8位PB,DIO15-DIO8。Iomode0、iomode1对应16位控制字D15-D0的D0、D1位。定义:
IOMODEn=0:设置对应口为输入。
IOMODEn=1:设置对应口为输出。
注,n=0、1
16路数据通过16位I/O指令一次性读入或输出。如果对应口为输入,输出数据没有影响,但输入可以读入输出的状态。
3.3.6 计数器、定时器部分:
AC_6111_rCounter
int AC_6111_rCounter(
HANDLE port,
unsigned long board_id,
unsigned long *counter_data)
功能:读取计数器的数值参数:
port :驱动句柄;
board_id :板卡ID;
*counter_data :计数器的数值由指针返回;
返回:0—表示返回的数据有效/1—表示计数器溢出,数据无效举例:
Visual C++:
Unsigned long data1;
AC_6111_rCounter(NTportio,idd[0],&data1);
Visual Basic:
DIM data1(2) As Long
AC_6111_rCounter NTportio,idd[0],data1(0)
AC_6111_wCounter
int AC_6111_wCounter(
HANDLE port,
unsigned long board_id,
unsigned long counter_data)
功能:置计数器的初值并启动计数器参数:
port :驱动句柄;
board_id :板卡ID;
counter_data :要设置的数值;0-65535
返回:保留举例:
Visual C++:
Unsigned long data1=65535;
AC_6111_wCounter(NTportio,idd[0],data1);
Visual Basic:
AC_6111_wCounter NTportio,idd[0],65535
AC_6111_rTimer
int AC_6111_rTimer(
HANDLE port,
unsigned long board_id,
unsigned long *timer_data)
功能:读定时器的时间值参数:
port :驱动句柄;
board_id :板卡ID;
*timer_data:计数器的数值由指针返回;
返回:0—表示返回的数据有效/1—表示定时器溢出,数据无效
举例:
Visual C++:
Unsigned long data1;
AC_6111_rTimer(NTportio,idd[0],&data1);
Visual Basic:
DIM data1(2) As Long
AC_6111_rTimer NTportio,idd[0],data1(0)
注:
计数器、定时器的使用原理和使用方法
AC6111提供一个16位多功能计数器cnt,可以完成:计数、测频、脉冲宽度测量等功能。计数器为16位减法计数器,设置数据范围1-65535,输入上升边沿脉冲有效(进行减1操作)。计数器减法计数到0时,自动将溢出标志cntov由0设置为1,并保持到重新设置计数器数值。Cntov可以由状态查询位读入。Cnt的数据可以通过cntw、cntr指令设置或随时读出,cntw指令清除计数器、定时器数据并重新开始计数、定时。
AC6111内置16位定时器tcnt,功能为:测量由开始计数的第一个上升边沿到计数器溢出(最后一个脉冲的上升边沿)间的时间周期。Tcnt的输入时钟为1微秒,测量时间为1-65535微秒,如果超过65535。微秒,读入数值恒定为65535微秒。如果读入数据为FFFFH(65535),用户应该认为定时器已经溢出、测量结果无效。定时器性能:
16位定时器,定时范围:1-65535微秒,对应频率测量范围5000KHz-16Hz。
定时器为加法计数器,从0开始计数。
输入时钟:1微秒周期。时钟来自16兆时钟源4分频,并且分频器与定时器同时启动,保证(66纳秒的时钟精度。
应用:
计数器模式:用户初始化计数器数值,开始减法计数操作。可以随时读入计数器数值,计数的个数=初始化数值 - 读入数值。
测量N个脉冲上升边沿间的时间:设置计数器数值为N,检测到计数器溢出标志后,读入tcnt数据,时间间隔为tcnt(uS)。注意:N的最小数值为2,即测量一个波形周期(二个上升边沿间)的时间。
3.4其他语言环境的使用
双诺公司提供的DLL函数的调用约定是遵守PASCAL规则的,即__stdcall;其他语言(Borland C++ Builder、Delphi等等),应该根据需要使用。
3.5 Visual C++和Visual Baisc全套例程
所有的源代码再随卡的附件CD-ROM盘中都有。
3.5.1 Visual C++例程:
Visual C++例子程序仅给出的是个WIN32 CONSOLE应用程序,以便与用户参考和使用。用户应该结合自己的实际需要使用。要注意的是在定义一些重要的变量时,应该考虑其有效的作用域,对于在整个程序运行中都需要使用的重要变量,应该定义成全局变量,否则在使用时会导致错误或程序崩溃,计算机死机等意想不到的后果。(比如,dll句柄,IO句柄,PCI卡ID变量等等)
// AC6111.cpp,Defines the entry point for the console application.
#include "stdafx.h"
#include <conio.h>
#include "windows.h" // 应加入的头文件
#include "winioctl.h" // 应加入的头文件
#include <stdio.h>
#include <stdlib.h>
#include <winbase.h>
#include ".\include\io_nt.h"
#include ".\include\AC6111.h"
HINSTANCE hDLL; //DLL句柄
HANDLE NTportio=NULL; //NT IO驱动 句柄--->暂定为全局变量,自定义时,可以自己传递参数
unsigned short ad_data[1000000];
int main(int argc,char* argv[])
{
char *dll_name="acpci.dll";//动态链接库名
hDLL=LoadLibrary(dll_name); //调入DLL,动态调用
if(hDLL!=NULL){
if((int)hDLL<31){
printf("%s未找到!",dll_name);
}else{
printf("%s已调入。",dll_name);
#include ".\include\io_nt_func.h"
#include ".\include\ac6111_func.h"
//-----------------------------------------------------------------
if(AC_OpenDriver==NULL){
printf("\nAC_OpenDriver函数不存在!");
}else{
printf("\nAC_OpenDriver函数存在。");
NTportio=AC_OpenDriver(); //获取IO驱动句柄
if(NTportio==NULL)
{
printf("Drivers is not exist!!!\n");//未成功加载驱动
getch();
FreeLibrary(hDLL);//清DLL句柄
exit(0);//退出
}
if(AC_Version==NULL){
printf("\nAC_Version函数不存在!");
}else{
printf("\nAC_Version函数存在。");
char Version[100];
AC_Version(NTportio,Version);//ok
printf("%s\n",Version);
}
//判断AC6111系列API是否正确加载
if(AC_6111_DI==NULL || AC_6111_DO==NULL ||
AC_6111_DA==NULL ||AC_6111_INIT==NULL ||
AC_6111_AD==NULL || AC_6111_AD_INI ==NULL
|| AC_6111_rTimer == NULL || AC_6111_rCounter== NULL || AC_6111_wCounter== NULL
){ printf("ac6111 函数不存在!\n");
}else{ printf("ac6111 函数 is ok!\n");
//---------用户程序可以写在下面----------------
unsigned long idd[100];
unsigned long cardc;
cardc=AC_6111_INIT(NTportio,idd);//获得AC6111卡的数量和卡ID
printf("\n\ncard number=%x\n",cardc);
if(cardc==0){
printf("There is no card(AC6111) in this machine! exit.\n");
getch();
exit(0);
}
printf("-----------Test IO part!--------------\n");
int do_data;
unsigned long di_data;
do_data=0xAAAA;
AC_6111_IO_MODE(NTportio,idd[0],0,1);//设置IO模式
printf("AC6111 Digital Out =%X ",do_data);
AC_6111_DO(NTportio,idd[0],do_data); //数字量输出
AC_6111_DI(NTportio,idd[0],&di_data);
printf("\nAC6111 Digital In =%X\n",di_data);//显示数字量输入的值
getch();
int temp=0;
printf("-----------Test AD part!--------------\n");
unsigned long data[100000];

/*//AC_6111_AD函数参数说明
HANDLE port,
unsigned long board_id,
int ad_timer,//10-65536
int start_ch,//0-15 起始通道
int end_ch,//0-15 停止通道
int ps,//0-3--0-5V 0-10V ±5V ±10V
int triger_sl,//0-软件方式触发 1--硬件方式触发
int clk_sl,//0--内部采样时钟 1--外部采样时钟
int triger_pol,//0—上升沿触发 1—下降沿触发
int clk_pol,//0—上升沿同步 1—下降沿同步
int sam_mode,//0--普通采样模式 1--采样/保持模式
int dif,//0--单端模式,1--差分模式 为611x系列兼容考虑
unsigned long *Data,//回传的数据缓冲
int Size//回传的数据的长度
*/
for(;;){
//0-5V
printf("sample return=%x\n",AC_6111_AD(NTportio,idd[0],120,0,7,0,0,0,0,0,1,1,data,2048));
for(int ii=0;ii<8;ii++)
//AD采样数据的高12位为有效的电压数据,详细的说明请参阅说明书中的具体说明
printf( "%10.3f",((data[ii]>>4))/4095.0*5.0);
if(kbhit() && getch()==27)break;
//0-10 V
printf("sample return=%x\n",AC_6111_AD(NTportio,idd[0],120,0,7,1,0,0,0,0,1,1,data,2048));
for( ii=0;ii<8;ii++)
//AD采样数据的高12位为有效的电压数据,详细的说明请参阅说明书中的具体说明
printf( "%10.3f",((data[ii]>>4))/4095.0*10.0);
if(kbhit() && getch()==27)break;
//-5--+5 V
printf("sample return=%x\n",AC_6111_AD(NTportio,idd[0],120,0,7,2,0,0,0,0,1,1,data,2048));
for( ii=0;ii<8;ii++)
//AD采样数据的高12位为有效的电压数据,详细的说明请参阅说明书中的具体说明
printf( "%10.3f",((data[ii]>>4)-2048)/2048.0*5.0);
if(kbhit() && getch()==27)break;
}
getch();
printf("-----------Test DA part!--------------\n");
//选择DA的模式和要输出的通道(共2个通道),输出模拟电压
//使用方法请参考说明书中的函数说明
getch();
for(int i=0;i<2;i++){
printf(" DA%d !\n",i);
getch();
printf("0xffff\n");
AC_6111_DA_MODE(NTportio,idd[0],0,0);
AC_6111_DA(NTportio,idd[0],0,4095);
getch();
printf("0x7fff\n");
AC_6111_DA_MODE(NTportio,idd[0],0,0);
AC_6111_DA(NTportio,idd[0],0,2047);
getch();
printf("0x0\n");
AC_6111_DA_MODE(NTportio,idd[0],0,0);
AC_6111_DA(NTportio,idd[0],0,0);
getch();
}
printf("-----------Counter part!--------------\n");
AC_6111_wCounter( NTportio,idd[0],500);//设置计数器初值500
//下面是个测试时使用的模拟方波发生
//用户可以使用IO口发出高低电压,模拟方波脉冲,以便于调试计数器和,定时器
//模拟100次脉冲发生
for(int jj=0; jj<100;jj++){
AC_6111_IO_MODE(NTportio,idd[0],0,1);
AC_6111_IO_MODE(NTportio,idd[0],1,1);
}
unsigned long data1;
printf("rcount return = %d\n",AC_6111_rCounter(NTportio,idd[0],&data1));
printf("500 Counter -100 = %d\n",data1);//读计数器数值
getch();
printf("-----------Timer part!--------------\n");
AC_6111_wCounter( NTportio,idd[0],2);//设置计数器初值2,测量2个脉冲间隔的时间
//模拟10次脉冲发生,实际应用中用户应该自己产生脉冲
for(jj=0; jj<10;jj++){
AC_6111_IO_MODE(NTportio,idd[0],0,1);
AC_6111_IO_MODE(NTportio,idd[0],1,1);
}
//读取定时器的数值,时基为1uS,每个计数相当于1uS
printf("rtimer return = %d\n",AC_6111_rTimer(NTportio,idd[0],&data1));
printf(" %d uS\n",data1);
getch();
}
}
//关闭驱动程序
if(AC_CloseDriver==NULL){
printf("AC_CloseDriver函数不存在!");
}else{
printf("\nAC_CloseDriver函数存在。");
AC_CloseDriver(NTportio);
}
FreeLibrary(hDLL);//清DLL
}
getch();
//return 0;
}
return 0;
}
3.5.2 Visual Basic例程:
acpci.bas:模块文件
'NT IO DRIVER -------------------------------------------------- W & W lab
Public Declare Function AC_OpenDriver Lib "acpci.dll" () As Long
Public Declare Function AC_CloseDriver Lib "acpci.dll" (ByVal HANDLE As Long) As Long
Public Declare Function AC_Version Lib "acpci.dll" (ByVal HANDLE As Long,Version As Byte) As Long
Public Declare Function AC_inp Lib "acpci.dll" (ByVal HANDLE As Long,ByVal Address As Long) As Long
Public Declare Function AC_inpw Lib "acpci.dll" (ByVal HANDLE As Long,ByVal Address As Long) As Long
Public Declare Function AC_outp Lib "acpci.dll" (ByVal HANDLE As Long,ByVal Address As Long,ByVal data As Long) As Long
Public Declare Function AC_outpw Lib "acpci.dll" (ByVal HANDLE As Long,ByVal Address As Long,ByVal data As Long) As Long
Public Declare Function AC_inps Lib "acpci.dll" (ByVal HANDLE As Long,ByVal Address As Long,data As Byte,ByVal Count As Long) As Long
Public Declare Function AC_inpws Lib "acpci.dll" (ByVal HANDLE As Long,ByVal Address As Long,data As Integer,ByVal Count As Long) As Long
Public Declare Function AC_outps Lib "acpci.dll" (ByVal HANDLE As Long,ByVal Address As Long,output_data As Byte,ByVal Count As Long) As Long
Public Declare Function AC_outpws Lib "acpci.dll" (ByVal HANDLE As Long,ByVal Address As Long,output_data As Integer,ByVal Count As Long) As Long
'-----------PCI CARD ----------------
Public Declare Function AC_6111_INIT Lib "acpci.dll" ( _
ByVal NTportio As Long,_
cardid As Long _
) As Long
Public Declare Function AC_6111_IO_MODE Lib "acpci.dll" ( _
ByVal NTportio As Long,_
ByVal cardid As Long,_
ByVal iomode0 As Long,_
ByVal iomode1 As Long _
) As Long
Public Declare Function AC_6111_DI Lib "acpci.dll" ( _
ByVal NTportio As Long,_
ByVal cardid As Long,_
di_data As Long _
) As Long
Public Declare Function AC_6111_DO Lib "acpci.dll" ( _
ByVal NTportio As Long,_
ByVal cardid As Long,_
ByVal DoData As Long _
) As Long
Public Declare Function AC_6111_DA Lib "acpci.dll" ( _
ByVal NTportio As Long,_
ByVal cardid As Long,_
ByVal chn As Long,_
ByVal DA_DATA As Long _
) As Long
Public Declare Function AC_6111_DA_MODE Lib "acpci.dll" ( _
ByVal NTportio As Long,_
ByVal cardid As Long,_
ByVal da_mode0 As Long,_
ByVal da_mode1 As Long _
) As Long
Public Declare Function AC_6111_rCounter Lib "acpci.dll" ( _
ByVal NTportio As Long,_
ByVal cardid As Long,_
count_data As Long _
) As Long
Public Declare Function AC_6111_wCounter Lib "acpci.dll" ( _
ByVal NTportio As Long,_
ByVal cardid As Long,_
ByVal count_data As Long _
) As Long
Public Declare Function AC_6111_rTimer Lib "acpci.dll" ( _
ByVal NTportio As Long,_
ByVal cardid As Long,_
timer_data As Long _
) As Long
Public Declare Function AC_6111_AD Lib "acpci.dll" ( _
ByVal NTportio As Long,_
ByVal cardid As Long,_
ByVal timer_data As Long,_
ByVal start_ch As Long,_
ByVal end_ch As Long,_
ByVal ps As Long,_
ByVal triger_sl As Long,_
ByVal clk_sl As Long,_
ByVal triger_pol As Long,_
ByVal clk_pol As Long,_
ByVal sam_mode As Long,_
ByVal dif As Long,_
data As Long,_
ByVal size As Long _
) As Long
Global NTportio As Long
ac6111.frm:窗体文件
Dim cardid(20) As Long '卡id数组
Dim TIMERDATA(3) As Long '定时器数据数组
Dim COUNTERDATA(3) As Long '计数器数据数组
Dim data1(100000) As Long 'AD采样数据数组
Dim di_data(2) As Long
Private Sub AC6111_AD_Click()
'函数参数说明
'AC_6111_AD(
' HANDLE port,
' board_id,
' ad_timer,//10-65536
' start_ch,//0-15
' end_ch,//0-15
' ps,//0-3--0-5 0-10 +-5 +-10
' triger_sl,//0-软件 1--硬件
' clk_sl,//0--内部 1--外部
' triger_pol,//0--rise 1--down
' clk_pol,//0--rise 1--down
' sam_mode,//0--普通采样模式 1--采样/保持模式
' dif,//0--单端模式,1--差分模式 为611x系列兼容考虑
' *Data,//回传的数据缓冲
' Size//回传的数据的长度
' )
Print Hex(AC_6111_AD(NTportio,cardid(0),10,0,0,0,0,0,0,0,0,0,data1(0),2048))
Print Hex(data1(0)),(data1(0) And &HFFF0&) / 16 / 4095# * 5#; "V"
Print Hex(AC_6111_AD(NTportio,cardid(0),10,0,0,1,0,0,0,0,0,0,data1(0),2048))
Print Hex(data1(0)),(data1(0) And &HFFF0&) / 16 / 4096# * 10#; "V"
Print Hex(AC_6111_AD(NTportio,cardid(0),10,0,0,2,0,0,0,0,0,0,data1(0),2048))
Print Hex(data1(0)),((data1(0) And &HFFF0&) / 16 - 2048) / 2048# * 5#; "V"
End Sub
Private Sub AC6111_COUNTER_Click()
'计数器计数实例
AC_6111_wCounter NTportio,cardid(0),500 '设置计数器初值为500,并启动计数
'读如计数器数值,如果返回11则表示计数器溢出,数据存储在COUNTERDATA(0)中
AC_6111_rCounter NTportio,cardid(0),COUNTERDATA(0)
Print "count_org="; COUNTERDATA(0) '显示计数器值初值
'-------------发生100个脉冲-----------------------
For i = 0 To 99
AC_6111_IO_MODE NTportio,cardid(0),0,1
AC_6111_IO_MODE NTportio,cardid(0),1,1
Next i
'-------------------------------------------------
AC_6111_rCounter NTportio,cardid(0),COUNTERDATA(0)
Print "count_end="; COUNTERDATA(0) '显示计数器值最终的数值为400
Print
'测频率
AC_6111_wCounter NTportio,cardid(0),2 '设置计数器初值为2,并启动计数
'读如计数器数值,如果返回11则表示计数器溢出,数据存储在COUNTERDATA(0)中
AC_6111_rCounter NTportio,cardid(0),COUNTERDATA(0)
Print "count_org="; COUNTERDATA(0) '显示计数器值初值
'-------------发生5个脉冲--------------------------
For i = 0 To 4 '发生5个脉冲
AC_6111_IO_MODE NTportio,cardid(0),0,1
AC_6111_IO_MODE NTportio,cardid(0),1,1
Next i
'---------------------------------------------------
Print AC_6111_rTimer(NTportio,cardid(0),TIMERDATA(0)) '返回为11则表示定时器溢出
Print "Timer Data="; TIMERDATA(0) '显示定时器的数值,时基是1微秒,按1个数表示1微秒可以计算出时间
Print
End Sub
Private Sub AC6111_DA_Click()
Dim DA_DATA As Long
DA_DATA = &H0 'DA数值0-4095,
AC_6111_DA_MODE NTportio,cardid(0),1,1
'输出一通道,使用+-10v输出
AC_6111_DA NTportio,cardid(0),0,DA_DATA
'输出二通道,使用+-10v输出
AC_6111_DA NTportio,cardid(0),1,DA_DATA
End Sub
Private Sub AC6111_DIO_Click()
AC_6111_IO_MODE NTportio,cardid(0),0,1 '设置0-15通道IO为输入状态,设置8-15通道IO为输出状态
AC_6111_DO NTportio,cardid(0),&HA500 '输出8-15通道&H55
temp = AC_6111_DI(NTportio,cardid(0),di_data(0)) '输入0-15通道
Print "IO 0- 7:"; Hex(temp And &HFF) '显示0-15通道输入的IO值
Print "IO 8-15:"; Hex((di_data(0) And &HFF00) / 256) '显示8-15通道输入的IO值,由于AC6111是可编程IO,因此读输出口数据时,其数值为上次输出的所存的数据
End Sub
Private Sub Form_Click()
Cls
End Sub
Private Sub Form_Load()
NTportio = AC_OpenDriver()
cardnumber = AC_6111_INIT(NTportio,cardid(0))
Form1.Caption = Form1.Caption + " 检测到有 " + Str(cardnumber) + " 块AC6111卡在机器中"
If cardnumber = 0 Then
AC6111_DA.Enabled = False
AC6111_AD.Enabled = False
AC6111_DIO.Enabled = False
AC6111_COUNTER.Enabled = False
End If
End Sub
Private Sub Form_Unload(Cancel As Integer)
AC_CloseDriver NTportio
End Sub
第四章,AC6111的IO功能说明
偏移地址分配(IOBASE0):
偏移地址
A0-A5
读操作(RD)
写操作(WR)
0 H
A/D状态STATE
A/D输入通道号CH
2 H
Rew,复位
启动A/D转换,RUN
4 H
A/D结果(16位),ADDATA
禁止操作
6 H
Mode:AD模式
8 H
Timer:采样定时器
A H
Damode:DA模式
CH
DACS0,设置D/A输出#0
EH
DACS1,设置D/A输出#1
10H
读入开关量输入口数据DI
写入开关量输出DO
14H
Iomode:DIO模式
18H
Cntr:计数器读
Cntw:计数器写
20H
tCntr:计数定时器读
注:
所有I/O操作为16位操作。
AC6111占用“0”号I/O空间。
说明:
STATE,0H 读,A/D状态
读入16位数据,D15 - D0的低5位有效,定义:
D0:EF,=0,FIFO空
D1:HF,=0,FIFO半满
D2:FF,=0,FIFO溢出
D3,0
D4:cntov:=1,计数器溢出
RUN,2H写,启动A/D转换
向2H口写入任何一个数字,A/D开始转换操作
CH,0H写,送A/D采样的通道号、设置输入范围。
D15
D14
D13
D12
D11
D10
D9
D8
X
PS1
PS0
X
X
ENDCH3
D7
D6
D5
D4
D3
D2
D1
D0
ENDCH2
ENDCH1
ENDCH0
STCH3
STCH2
STCH1
STCH0
PS=[PS1,PS0]:模拟输入范围
00:0-5伏
01:0-10伏
10:(5伏
11:(10伏
ENDCH=[ENDCH3-ENDCH0]:采样终止通道。
STCH=[STCH3-STCH0]:采样起始通道。
ADDATA:4H 读操作(读FIFO)
ADMODE:6H写
16位数据定义:
D0:TRSL。 0:软件触发 / 1:硬件触发
D1:CLKSL。 0:转换应用内部时钟 / 1:外部时钟
D2:TRPOL 0:触发上升边沿触发 / 1:下降边沿触发
D3:CLKPOL 0:外部时钟上升边沿触发 / 1:下降边沿触发
D4:SAMMODE 0:采样模式为NORMAL / 1:SH模式
8H:写,采样定时器
16位定时器,基准时钟4MHz。
数字I/O-开关量读写
AC6111 16位开关量输入、16位开关量输出,输入由P2插座输入,输出。16位读入数据D0-D15对应开关量输入:DI0-DI15。16位写入数据D0-D15对应开关量输出:DO0-DO15。
14H 写,开关量模式
16位数据的D1、D0分别为:IOMODE1、IOMODE0。
IOMODE0:设置低8位DIO,0:输入 / 1:输出
IOMODE1:设置高8位DIO,0:输入 / 1:输出
DACS0、DACS1
设置D/A输出通道“0”、“1”。16位输出数据D0-D15的高12位对应12位D/A的12位数据。
DAMODE AH写
16位数据的D1、D0分别为:DAMODE1、DAMODE0。
DAMODEn:0:10V / 1:(10V
CNTR、CNTW 18H R/W
计数器读、写。写入新数据,重新开始计数。并计数输入的第一个上升边沿启动计数定时器。
TCNTR:
读入计数器定时器数据,如果为FFFFH,表示溢出。定时器为加法计数器,从0开始计数,时钟:1MHz。

第五章、附录输入差分选择:
6位拨码开关“SW1”选择模拟输入方式为差分或单端模式,如下:
1、2、3号ON,4、5、6号OFF选择输入为单端模式。
1、2、3号OFF,4、5、6号ON选择输入为差分模式。
连接器P1,模拟输入插座定义,
P1:DB25芯D型插头,孔式,在输入的插头上标有对应的号码。定义如下:

输入定义:
AIN0-AIN15对应A/D单端输入通道:0-15。
差分模式:AIN0-AIN7对应差分“+”输入通道0-7、AIN8-AIN15:对应“-”输入通道0-7号。
AMPLOW:伪差分输入,6111不用。
DAOUT0、DAOUT1:对应D/A输出通道“0”、“1”。
9、22脚:模拟GND
13脚:数字地
CNT0:计数器输入
TRIG:触发输入
OCLK:外部时钟输入
P2:数字输出连接器
I0-I15:开关量通道0-15。
脚:9,10,19,20:GND
AC6111示意图:
AC6111产品包中的附件:
AC6111 PCI卡一块
DB25针接头一套
AC146端子板一套(DB25针-DB25针电缆一条)
1米长20芯扁平电缆一条说明书一本
CD-ROM一张(内含各种板卡的手册和开发指导)。
AC6111附带光盘中,提供如下内容:
说明书。
驱动程序
Visaul C++、Visaul Basic编程实例。
DOS下的测试程序。(本产品的检测程序,可以检验本产品是否工作正常,运行环境DOS 6.22)。
提供Pci总线的扫描程序PciScan.exe,帮助用户检查Pci板卡的分配状况(pciscan.exe分为dos版和windows版本,dos版可以运行在dos 6.22系统上;在使用windows版的pciscan之前一定要先安装驱动程序)。
注:如果发现配件不全,请与经销商联系;
具有充分输入的6111补充说明
输入差分选择:
6位拨码开关“SW1”选择模拟输入方式为差分或单端模式,如下:
1、2、3号ON,4、5、6号OFF选择输入为单端模式。
1、2、3号OFF,4、5、6号ON选择输入为差分模式。
输入定义:
AIN0-AIN15对应A/D单端输入通道:0-15。
差分模式:AIN0-AIN7对应差分“+”输入通道0-7、AIN8-AIN15:对应“-”输入通道0-7号。