目录
1. 介绍 (2)
1.1 概述 (2)
1.2 I/O 接口 (2)
1.3 针脚定义 (2)
2. 研华设备驱动应用 (4)
3. 函数参考 (4)
3.1 USB系列函数支持列表 (4)
3.1.1Device 函数组 (4)
3.1.2 模拟量输入函数组 (4)
3.1.3 模拟量输出函数组 (4)
3.1.4 数字量输入/输出函数组 (5)
3.1.5Counter 函数组 (5)
4. 使用函数 (5)
4.1 设备函数组 (5)
4.1.1DRV_DeviceOpen (7)
4.1.2DRV_DeviceClose (7)
4.2 模拟量输入函数组 (7)
4.2.1DRV_AIConfig (8)
4.2.2DRV_AIV oltageIn (9)
4.3 模拟量输出函数组 (10)
4.3.1DRV_AOConfig (10)
4.3.2DRV_AOV oltageOut (12)
4.4 Counter 函数组 (12)
4.4.1DRV_CounterEventStart (13)
4.4.2DRV_CounterEventRead (14)
4.4.3DRV_CounterReset (15)
5. VC中使用研华设备驱动编程指南 (16)
5.1 添加必要文件 (18)
5.2 编写代码 (19)
5.3 测试程序 (20)
1. 介绍
1.1 概述
USB-4711A系列板卡是即插即用数据采集模块,它通过USB端口与计算机相连,为数据测量与系统控制提供了便利。USB-4711A通过USB端口获得所需电源,在该板卡上包含了所有的数据采集功能,如:16路AI,2路AO,8路DI,8路DO,1路32位计数器,其中A/D数据采集为12位。USB-4711A板卡如图1.1所示。
图1.1 USB-4711A板卡
1.2 I/O 接口
USB-4711A 配有插入式螺丝端子接口,因此连接模块时无需另外准备端子板或电缆。
1.3 针脚定义
图 1.2为USB-4711A 上五个10针I/O 接口的针脚定义。两个接地参考AGND 和DGND 的用途不同,其中AGND为模拟量的接地端,DGND为数字量的接地端,不要将两者进行连接。表1.1为I/O 接口信号的描述。
DO0
DO1
DO2
DO3
DGND
DO4
DO5
DO6
DO7
DGND
DI0
DI1
DI2
DI3
DGND
AI0
GATE DGND EXT
TRG DGND EVT
IN
P
Out AGND AO1AGND
DI4
DI5
DI6
DI7 DGND
AI1
AI2
AI3
AGND
AI4
AI5
AI6
AI7
AGND
AI8
AI9
AI10
AI11
AGND
AI12
AI13
AI14
AI15
AGND
AO0
USB
LED
8-TTL DO Port
8-TTL DI Port
16-SE/8-Diff AI External Control2-AO Port
图 1.2I/O 接口针脚定义
表 1.1I/O 接口信号描述
2. 研华设备驱动应用
研华Windows设备驱动是动态链接的。以下列出了开发应用时必需的文件:
3. 函数参考
3.1 USB系列函数支持列表
3.1.1Device 函数组
3.1.2 模拟量输入函数组
3.1.3 模拟量输出函数组
3.1.4 数字量输入/输出函数组
3.1.5Counter 函数组
4. 使用函数
函数描述
函数部分包括模拟量输入函数,模拟量输出函数,数字量输入函数,数字量输出函数等等。研华的每个函数都将以如下形式出现:
status = FUNCTION_Name (parameter 1, parameter 2,... , parameter n)(n>0),每个函数都会返回一个状态,表明函数执行成功还是失败(保存在status变量中)。
Status是一个4字节的整型变量,在DRIVER.H里被定义。
4.1 设备函数组
进行所有I/O 操作时,必须首先调用DRV_DeviceOpen,通过设备号(Device Number)打开设备得到设备句柄,以使用户访问该设备,然后调用一系列函数执行相应的功能。结束操作时,调用DRV_DeviceClose关闭设备,释放由DRV_DeviceOpen分配的资源,基本流程如图4.1所示。
图4.1 设备函数组应用流程
指定要进行I/O操作的设备,即要打开的设备的设备号。设备号在Advantech Device Manager(运行界面如图4.2)中初始化设备的时候分配。比如“000:Advantech DEMO I/O=1H”,这个设备的设备号就为000,用户可以直接在DRV_DeviceOpen函数中指定要打开的设备号,也可以通过调用DRV_SelectDevice 函数打开一个对话框选择需要的设备,从而取得相应的设备号。
图4.2 Advantech Device Manager运行界面
4.1.1DRV_DeviceOpen
DRV_DeviceOpen (ULONG DeviceNum,LONG * DriverHandle );
用途:
通过指定的设备号(DeviceNum)来打开一个已经安装的设备,返回设备句柄DriverHandle以备后续操作。与指定设备相关的所有操作都必须使用指向该设备的句柄,所以用户在使用与设备所分配资源相关的任何一项操作,如DIO、AO、AI等之前,必须先调用此函数。
参数:
4.1.2DRV_DeviceClose
DRV_DeviceClose ( LONG * DriverHandle );
用途:
关闭由设备句柄DriverHandle 指向的设备,释放为该设备分配的资源。所有与设备分配资源相关的操作,如:DIO、AO、AI等完成后需要关闭该设备,以释放由函数DRV_DeviceOpen 为该设备分配的资源。
参数:
4.2 模拟量输入函数组
软件方式:
该组函数通过软件命令触发数据转换。可以使用软件定时器来周期性地调用这些函数,对单通道或多通道周期性地进行采样。对于大块数据的连续高速采样,可以采用中断或DMA传输方式。
单通道采样:
DRV_AIConfig 函数为指定通道设置输入值范围。如果在运行期需要改变输入值范围,则需要再次调用DRV_AIConfig函数。DRV_AIV oltageIn函数读取输入通道当前电压值。设备驱动通过函数DRV_AIBinaryIn读取输入通道的当前二进制值,DRV_AIScale函数可以把它转化成电压值。
4.2.1DRV_AIConfig
DRV_AIConfig (LONG DriverHandle, LPT_AIConfig lpAIConfig );
用途:
在设备句柄DriverHandle 指向的设备上,通过设置GainCode来配置指定AI(Analog Input)通道(Channel)的电压输入范围。
参数:
在lpAIConfig指向的结构PT_AIConfig 中保存的参数包括:所要设置的通道(DasChan) 和GainCode (DasGain)。
函数DRV_AIConfig使用到的PT_AIConfig结构体:
Typedef struct tagPT_AIConfig
{
USHORT DasChan;
USHORT DasGain;
} PT_AIConfig,* LPT_AIConfig;
成员描述:
gain code列表
4.2.2DRV_AIVoltageIn
DRV_AIVoltageIn (LONG DriverHandle,LPT_AIVoltageIn lpAIVoltageIn ); 用途:
在设备句柄DriverHandle 指向的设备上,读取指定AI(Analog Input)通道的电压值。
参数:
此函数等同于依序调用DRV_AIBinaryIn 与DRV_AIScale。
在lpAIV oltageIn 指向的结构PT_AIV oltageIn 中保存的参数包括:采样通道(chan)、GainCode (gain)、触发模式(TrigMode) 和返回电压值(voltage)。
函数DRV_AIVoltageIn使用到的PT_AIVoltageIn 结构体:
typedef struct tagPT_AIV oltageIn
{
USHORT chan;
USHORT gain;
USHORT TrigMode;
FLOAT *voltage;
} PT_AIVoltageIn,* LPT_AIV oltageIn;
成员描述:
4.3 模拟量输出函数组
该组函数实现模拟量输出的功能。采样方式分为单通道,多通道同步输出,及DMA方式的波形输出等。
软件方式:单通道单次转换
DRV_AOV oltageOut函数用于电压输出:
DRV_AOV oltageOut 函数接收到一个浮点电压值,并把它转化成二进制数写入模拟量输出通道来改变电压输出值。电压输出范围取决于Advantech Device Manager 中DA参考电压的设置。在运行态可以调用DRV_AOConfig 函数改变电压范围的设置。
设备驱动也提供了二进制数据输出函数DRV_AOBinaryOut,函数接收到二进制数值并把它写入模拟量输出通道。先通过DRV_AOScale 函数可以把想得到的模拟量输出值转换成二进制数,再通过函数DRV_AOBinaryOut 输出。
4.3.1DRV_AOConfig
DRV_AOConfig( LONG DriverHandle,LPT_AOConfig lpAOConfig );
用途:
在设备句柄DriverHandle 指向的设备上,改变所指定AO(Analog Output)
通道的输出范围默认配置(未调用本函数前,AO通道的输出范围默认的是用户在研华设备管理器Advantech Device Manager 中的设置数据,这个数据保存在注册表Registry中)。本函数改变的配置数据只是执行时的暂存信息,保存在注册表的配置数据并没有被改变。
参数:
在lpAOConfig 指向的结构(PT_AOConfig) 中保存的参数包括指定通道(chan),指定参考源(RefSrc),参考电压上限(MaxValue)和参考电压下限(MinValue)。
函数DRV_AOConfig使用到的PT_AOConfig 结构体:
typedef struct tagPT_AOConfig
{
USHORT chan;
USHORT RefSrc;
FLOAT MaxValue;
FLOAT MinValue;
} PT_AOConfig,* LPT_AOConfig;
成员描述:
4.3.2DRV_AOVoltageOut
DRV_AOV oltageOut(LONG DriverHandle, LPT_AOV oltageOut lpAOVoltageOut ); 用途:
在设备句柄DriverHandle 指向的设备上,以设置浮点型的电压值,来改变指定AO (Analog Output) 通道的输出状态。
参数:
此函数等同于依序调用DRV_AOScale 与DRV_AOBinaryOut。
在lpAOV oltageOut 指向的结构PT_AOV oltageOut 中保存的参数包括:指定的AO通道(chan)和所要设置的浮点型电压值(outputValue)。
函数DRV_AOVoltageOut使用到的PT_AOVoltageOut结构体:typedef struct tagPT_AOV oltageOut
{
USHORT chan;
FLOAT OutputValue;
} PT_AOVoltageOut,* LPT_AOV oltageOut;
成员描述:
4.4 Counter 函数组
Counter 函数组包含三种操作方式:事件计数,脉冲输出和频率测量。
中断方式的Counter和Q Counter(PCL-833)都属于事件计数组。
事件计数函数
普通Counter (Intel 8254 或AMD 9513A):
DRV_CounterEventStart启动counter操作。当counter开始计数时,可以反复调用DRV_CounterEventRead函数读取计数值。操作完成后可以调用函数DRV_CounterReset停止计数。
4.4.1DRV_CounterEventStart
DRV_CounterEventStart ( LONG DriverHandle,LPT_CounterEvenStart lpCounterEventStart ); 用途:
在设备句柄DriverHandle 指向的设备上,将指定的计数器配置为事件计数并启动该操作。启动后,可调用函数DRV_CounterEventRead 读取计数值与状态。参数:
在lpCounterEventStart 指向的PT_CounterEventStart 结构中,保存的参数包括:目标计数器通道号(counter)和门控模式(GateMode)。
函数DRV_CounterEventStart使用到的PT_CounterEventStart结构体:typedef struct tagPT_CounterEventStart
{
USHORT counter;
USHORT GateMode;
} PT_CounterEventStart,* LPT_CounterEventStart;
成员描述:
4.4.2DRV_CounterEventRead
DRV_CounterEventRead ( LONG DriverHandle,LPT_CounterEventRead lpCounterEventRead ); 用途:
在设备句柄DriverHandle 指向的设备上,读取指定计数器的当前计数值和
溢出状态标志。此操作将不影响计数器的持续工作。
参数:
在lpCounterEventRead 指向的PT_CounterEventRead 结构中,保存的参数
包括:目标计数器通道号(counter),读回的溢出标志(overflow),以及读回的
当前计数值(count)。
函数DRV_CounterEventRead使用到的PT_CounterEventRead结构体:typedef struct tagPT_CounterEventRead
{
USHORT counter;
USHORT *overflow;
ULONG *count;
} PT_CounterEventRead,* LPT_CounterEventRead;
成员描述:
4.4.3DRV_CounterReset
DRV_CounterReset ( LONG DriverHandle,LPARAM counter );
用途:
在设备句柄DriverHandle 指向的设备上,重置计数器以停止当前的操作。本函数适用于所有与计数器相关的函数(包括:DRV_CountEventStart,DRV_CounterFreqStart,DRV_QCounterStart,DRV_CounterPulseStart,DRV_CounterPWMEnable,DRV_TimerCounterSetting 等等),但不包括DRV_FreqOutStart 函数。
参数:
5. VC中使用研华设备驱动编程指南
研华Windows设备驱动是动态链接的。VC开发应用时必需的文件:
因此开发应用程序时,要进行必要的配置包含上述路径,以Microsoft Visual C++ 6.0为例,说明配置工作。
⑴打开Microsoft Visual C++ 6.0,从主菜单栏中选择“工具→选项”。
⑵选择“目录”选项卡,选择目录“Include files”,点击图标,新建路径“安装路径\ADSAPI\Include”。
⑶选择目录“Library files”,选择目录“Include files”,点击图标,新建路径“安装路径\ADSAPI\Lib”。
配置完成。
以设备打开和关闭操作为例,说明开发应用程序的基本步骤。
(一)创建一个新的控制台工程
依照以下步骤创建VC++工程:
⑴从主菜单栏中选择“文件→新建”。
⑵定义新工程类型为“Win32 Console Application”,并指定一个工程文件路径,输入工程名称,本例工程名称为“test”。
⑶定义控制台程序类型为“一个空工程”
5.1 添加必要文件
为使用研华设备驱动开发应用程序,首先要添加必要的文件。
⑴添加研华设备驱动中的Include头文件(Driver.h)。从主菜单栏中选择“工程→添加到工程→文件”,文件在“安装路径\ADSAPI\Include\DRIVER.H”。
⑵同样方法添加adsapi32.lib,使应用程序目标文件和设备驱动库链接起来,文件在“安装路径\ADSAPI\Lib\Adsapi32.lib”。
5.2 编写代码
⑴从主菜单栏中选择“文件→新建”。
⑵选择文件“C++ Source File”,勾选添加到工程,输入文件名,本例文件名称为“test”。
在空的test.cpp源文件中编写代码:
#include
#include
#include "driver.h"
void main()
{
DWORD dwErrCde;
ULONG lDevNum;
long lDriverHandle;
lDevNum=0;
dwErrCde = DRV_DeviceOpen( lDevNum,&lDriverHandle);
if ( dwErrCde != SUCCESS )
{
printf("设备打开错误!\n");
return ;
}
else
{
printf("设备打开成功!\n");
printf("设备句柄:%ld\n",lDriverHandle);
}
dwErrCde = DRV_DeviceClose( &lDriverHandle );
if ( dwErrCde != SUCCESS )
{
printf("设备关闭错误!\n");
return ;
}
else
{
printf("设备关闭成功!\n");
}
}
5.3 测试程序
点击编译,无错误后,点击运行程序,结果如下