当前位置:首页 > 嵌入式 > 嵌入式教程
[导读]探讨研华32位DLL驱动程序

摘要:本文概述了研华32位DLL驱动程序的构成,并对利用驱动程序开发动态数据采集程序所涉及的部分概念和一些重要参数进行了详细的分析,对利用32位驱动程序有实用价值。

关键词:32位DDL驱动程序动态数据采集

1引言

研华公司是台湾和中国大陆工业电脑产品最大的供应厂商,其PC&Web-based数据采集和控制产品更是以优良的性价比获得了众多的客户的青睐。32位DLL驱动程序是研华为诸如VC,VB,DELPHI,BorlandC++,C++Builder等高级语言提供的接口,通过这个驱动程序,编程人员可以方便的对硬件进行编程控制。该驱动程序覆盖了每一款研华的数据采集卡以及MIC-2000、ADAM-4000和ADAM-5000系列模块,应用极为广泛,是编制数据采集程序的基础。虽然该驱动程序的功能强大,但是研华公司为其提供的产品手册对该驱动程序的讲解却不够详尽,让使用者,有只能修改例子来达到目的的感觉,一些重要函数的参数设置缺乏相应说明。对其使用的概念有些解释不够清楚……。本文是在实际编写动态数据采集程序中经验的积累,对利用32位驱动程序有实用价值。

232位驱动程序概览

32位驱动程序主要包括10类函数及其相应的数据结构,这些函数和数据结构在Adsapi32.lib中实现。这10类函数分别是:

DeviceFunctions设备函数

AnalogInputFunctionGroup模拟输入函数组

AnalogOutputFunctionGroup模拟输出函数组

DigitalInput/OutputFunctionGroup数字输入/输出函数组

CounterFunctionGroup计数器函数组

TemperatureMeasurementFunctionGroup温度测量函数组

AlarmFunctionGroup报警函数组

PortFunctionGroup端口函数组

CommunicationFunctionGroup通信函数组

EventFunctionGroup事件函数组

可以把这10类函数分为两个部分:设备函数部分(只包括第一类函数)和操作函数部分(包括第一类函数外的所有函数),设备函数部分负责获取硬件特征和开关硬件。而操作函数部分则在硬件设备就绪以后,进行具体的采集、通信、输出、报警等工作。具体工作结束后,调用设备函数关闭设备。这些函数的调用过程如图1所示。

3动态数据采集程序的实现

用32位DLL驱动程序实现动态数据采集程序时,按触发方式可以有中断触发,DMA触发和看门狗触发三种方式可选。DMA触发方式下的编程难度较大,而看门狗触发方式是PCL1800特有的触发方式,所以中断触发方式是最常用的触发方式。

在各种高级语言下,驱动程序提供的函数形式相同,所以此处只给出驱动程序函数的调用流程,在具体的某种高级语言下,只要按照流程图就能实现动态数据采集。流程图如下:

ADS_EVT_BUFCHANGE事件,该事件表示内部缓冲区已经半满。可以将这部分数据传输到用户缓冲区中。

DRV_FAIIntScanStart:开始中断触发方式的A/D转换。

DRV_CheckEvent:检查是否有设定的事件发生。

DRV_FAICheck:检查A/D转换的状态。在本例中用于检查究竟是内部缓冲区的前半部分满了,还是后半部分满了。

DRV_FAITransfer:将采集的数据从内部缓冲区传输到用户缓冲区。

DRV_FAIStop:结束A/D转换。

DRV_DeviceClse:关闭指定的数据采集板。

4动态采集程序涉及到驱动程序中部分概念的分析

4.1使用的缓冲区

在驱动程序进行A/D或D/A转换时,最多可使用三种缓冲区:采集板上的FIFO缓冲区,计算机内存中的内部缓冲区和用户缓冲区。

使用FIFO缓冲区可以达到更高的采集频率,如PCL1800使用1K的FIFO缓冲区后,最高采样频率可达到330KHZ。但是有些型号的采集板不带FIFO缓冲区。

内部缓冲区和用户缓冲区是数据采集程序动态分配给驱动程序使用的两块内存区域。这二者的区别在于,内部缓冲区中存放的是RawData(原始数据),用户缓冲区中存放的是电压值。关于原始数据和电压值的区别后面会有介绍。

中断触发方式的A/D转换中这三种缓冲区的使用如图3所示。

在使用DRV_FAIIntScanStart函数将采样值放到内部缓冲区有两种方式:有FIFO和无FIFO。没有FIFO时,每完成一次A/D转换就产生一个中断,驱动程序响应中断将这个采样值传到内部缓冲区中。有FIFO时,采样值先放在FIFO中,当FIFO半满或全满时,才产生一个中断,驱动程序响应中断将FIFO中的数据传送到内部缓冲区中,这是使用FIFO能提高采样频率的原因。

4.2双缓冲区

在不了解数据采集的DMA触发方式时,很容易把中断触发方式下,调用DRV_FAIIntScanStart函数时同时使用FIFO和内部缓冲区的方式认为是双缓冲区工作方式,进而对PTFAICheck结构的ActiveBuf域产生误解。实际上,双缓冲区是指同时使用A、B两个内部缓冲区。这是在DMA触发方式下的特殊工作方式,由DRV_FAIDualDmaStart函数启动。在中断触发方式下不能同时使用双缓冲区的工作方式。

4.3循环(cycle0和非循环(no_cycle)

循环和非循环是指内部缓冲区的使用方式。

非循环方式下,内部缓冲区作为一个整体使用。在非循环方式下执行一次DRV_FAIIntScanStart函数只能进行有限次(1-65536)的A/D转换,DRV_FAIIntScanStart函数执行过程中将所有数据都放到内部缓冲区;A/D转换结束后,再用DRV_FAITransfer函数将数据传送到用户缓冲区中。

循环方式下,内部缓冲区分为两个半区使用。执行一次DRV_FAI_IntScanStart函数可以进行无限次的A/D转换,直到调用DRV_FAI_Stop函数。这种方式下有限的内部缓冲区不可能容纳无限多的采集数据。因此,将内部缓冲区分成前后对等的两个半区。当前半区填满后产生一个ADS_EVT_BUFCHANGE事件,采集程序中的事件检查循环捕获这个事件,调用DRV_FAI_Transfer函数把数据传送到用户缓冲区;与此同时DRV_FAI_IntScanStart函数将新转换的数据放到内部缓冲区的后半部分。当后半区填满后再产生一个ADS_EVT_BUFCHANGE事件,并用DRVFAIIntScanStart函数将新转换的数据放到数据传输完毕的前半缓冲区,如此循环。[!--empirenews.page--]

4.4RawData(原始数据)和voltage(电压值)

以PCL1800为例,它的转换芯片是12位的,所以它可以把采集的电压量程分为4096段,这种方式称为量化,而RawData就是将被采集量量化后的整数值。驱动程序将量化值用3位十六进制数表示,所以RawData的示数范围就是000-fff,在内部缓冲区中的数值就是这种量化的原始数据。用户缓冲区中存放Voltage(电压值),将RawData转化为电压值由CRVFAITransfer函数完成,当PTFAITransfer的DataType=0时,不进行RawData到电压值的转化,这时候在用户缓冲区中得到的就是量化的3位十六进制整数值。

5动态采集程序涉及到驱动程序中一些参数的分析

5.1PTFAICheck结构的HalfReady域

该域说明哪半个缓冲区已满。在使用FIFO缓冲区的情况下,FIFO缓冲区和内部数据缓冲区都有半满(halffull)的情况。容易混淆此处的HalfReady是指FIFO缓冲区中的半区还是内部数据缓冲区的半区。事实上,DRVFAICheck都是返回的内部缓冲区的状态,不反映FIFO缓冲区状态;所以此处是指的内部数据缓冲区的半区。

5.2ADSEVTBUFCHANGE事件的触发时机

第一:双缓冲区方式下,在A、B两个内部缓冲区之间切换时。

第二:单缓冲区方式下,在内部数据缓冲区的两个半缓冲区间切换时。

5.3增益列表起始地址

在编写数据采集程序时,都要考虑多通道同时采集,而且都要考虑开始通道的任意性,所以通常的做法是为增益列表开辟一块增益列表存储区,从0开始每个存储单元对应一个通道的增益值,但是要注意,在起始通道不为零时不能将这个存储区的起始地址直接赋给驱动函数的“增益列表起始地址”参数,如PTFAIIntScanStart结构的GainList域;因为驱动程序是直接从“增益列表起始地址”参数表示的起始地址去提取起始通道的增益值,而不会根据“起始通道”参数在增益列表中选取对应的增益值。

5.4CheckEvent的检查周期

CheckEvent函数是在一个周期中检查是否事件发生,如果有就立即返回事件的类型,如果没有就返回一个“checkeventerror!”错误。CheckEvent函数与DRV_FAICheck函数不同,程序需要不的调用DRV_FAICheck函数来检查硬件工作的最新情况。程序调用DRV_FAICheck函数要占用计算机CPU时间,但是使用CheckEvent,只需要占用CPU调用一次CheckEvent函数的时间,就可以监视一个监视周期内的事件发生情况。在这个周期内没有事件发生就不占用CPU时间,CheckEvent函数采用同步方式检查事件的发生。PTCheckEvent结构的Milliseconds域说明了CheckEvent函数的检查周期。

6结束语

本文着重分析了在使用研华32位dll驱动程序编写动态数据采集程序时所碰到的概念及参数。通过本文读者可能加深对32位dll驱动程序的认识,从而达到更加自由,灵活使用32位dll驱动程序的目的。

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: 驱动电源

在工业自动化蓬勃发展的当下,工业电机作为核心动力设备,其驱动电源的性能直接关系到整个系统的稳定性和可靠性。其中,反电动势抑制与过流保护是驱动电源设计中至关重要的两个环节,集成化方案的设计成为提升电机驱动性能的关键。

关键字: 工业电机 驱动电源

LED 驱动电源作为 LED 照明系统的 “心脏”,其稳定性直接决定了整个照明设备的使用寿命。然而,在实际应用中,LED 驱动电源易损坏的问题却十分常见,不仅增加了维护成本,还影响了用户体验。要解决这一问题,需从设计、生...

关键字: 驱动电源 照明系统 散热

根据LED驱动电源的公式,电感内电流波动大小和电感值成反比,输出纹波和输出电容值成反比。所以加大电感值和输出电容值可以减小纹波。

关键字: LED 设计 驱动电源

电动汽车(EV)作为新能源汽车的重要代表,正逐渐成为全球汽车产业的重要发展方向。电动汽车的核心技术之一是电机驱动控制系统,而绝缘栅双极型晶体管(IGBT)作为电机驱动系统中的关键元件,其性能直接影响到电动汽车的动力性能和...

关键字: 电动汽车 新能源 驱动电源

在现代城市建设中,街道及停车场照明作为基础设施的重要组成部分,其质量和效率直接关系到城市的公共安全、居民生活质量和能源利用效率。随着科技的进步,高亮度白光发光二极管(LED)因其独特的优势逐渐取代传统光源,成为大功率区域...

关键字: 发光二极管 驱动电源 LED

LED通用照明设计工程师会遇到许多挑战,如功率密度、功率因数校正(PFC)、空间受限和可靠性等。

关键字: LED 驱动电源 功率因数校正

在LED照明技术日益普及的今天,LED驱动电源的电磁干扰(EMI)问题成为了一个不可忽视的挑战。电磁干扰不仅会影响LED灯具的正常工作,还可能对周围电子设备造成不利影响,甚至引发系统故障。因此,采取有效的硬件措施来解决L...

关键字: LED照明技术 电磁干扰 驱动电源

开关电源具有效率高的特性,而且开关电源的变压器体积比串联稳压型电源的要小得多,电源电路比较整洁,整机重量也有所下降,所以,现在的LED驱动电源

关键字: LED 驱动电源 开关电源

LED驱动电源是把电源供应转换为特定的电压电流以驱动LED发光的电压转换器,通常情况下:LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: LED 隧道灯 驱动电源
关闭