采集卡范文10篇

时间:2023-04-06 07:40:50

采集卡范文篇1

关键词:温度采集AD7711PC104控制器CPLD

PC104总线是一种出现已久的栈式总线,基本上属于ISA总线的变型。模块尺寸很小(90mm×96mm),多个模块通过针孔结构堆叠而成,形成的系统结构紧凑、抗冲击性能好,加上现在广泛应用的低功耗技术,使PC104总线特别适于用户自行开发特殊应用产品。

对于低速率、高精度的测量系统而言,A/D芯片AD7711是个功能完事的模拟前端。它直接从传感器接收信号,通过一个可编程的增益控制后将信号送到模拟调节器,再经滤波后输出一个16位的串行数字字。它的主要结构特点是:内部包含有一个∑-ΔA/D转换器,具有非常高的转换精度;两个通道的可编程增益前端;带内部SRAM的校正控制器,使得校正因子可读可写;时钟发生器;低通数字滤波器,具有可编程的通阻带分截点;一个双向串行通信端口,能较方便地与微处理器接口;可以单电压或双电压供电,具有较低的功耗。

对于RTD(电阻式温度检测)传感器的应用,AD7711是一款很不错的选择。本文介绍的PC104采集卡主要用于分布式温度点采集测量,上面集成了12个AD7711,形成12个通道,每个通道可以输入两路模拟信号,其中一路为单极性输入,另一路为双极性输入。

1电路原理

PC104温度采集卡主要由12个AD7711、通道控制器、PC104栈式连接器组成,其原理框图如图1所示。板卡地址输入由拨盘开关完成。串口E2PROM用来保存每个通道的校准参数和一些板卡工作参数。另外还提供了配置ROMEPC2。

通道控制器采用Altera公司的CPLD器件FLEX10K50QC240来实现。PC104主机首先初始化通道控制器,通过板卡命令对板卡进行操作,如启动、停止、设置工作参数(如中断选择、每分钟采校次数、输出因子等)。然后通道控制器对各个AD7711通道进行操作,如写AD7711的控制寄存器、读写其校准寄存器里的校正因子、读取每个通道的采样数据。通道控制器的另一个功能是模拟PC104主机的指示对串口E2PROM进行读写操作,并提供结果。

采样频率有1Hz、2Hz、4Hz、8Hz、16Hz、32Hz、64Hz等,指定每个通道每分钟等间隔采样次数。板卡的控制器提供数据缓冲能力,每个采样周期都将12个通道的数据保存在缓冲器里。在存储了若干个采样周期的数据后,向主机发出中断,让PC104总线读走数据,输出因子则指定每次中断采样周期的个数。板卡提供八个ISA中断,主机可以选择其中一个。

AD7711每次采样16位数据,所以主机PC104总线从通道控制器读取数据时,使用16位I/O访问,因此/IOCS16和SBHE信号应当被驱动,而IOCHRDY则被用来插入等待周期。由于通道控制器和AD7711都采用10MHz时钟,所以对于CPU主频比较快的PC104总线,其ALE、/IOW、/IOR、AEN等信号的有效电平脉宽是与时钟周期有关系的,此时它们的脉宽可能比板卡的时钟周期100ns要小,故不能用它们直接作为时钟使能,而应当利用它们的沿来锁存地址,并触发得到宽脉冲信号完成使能,锁存数据。

AD7711采用自时钟方式。SCLK提供串行时钟输出;SDATA是串行数据位;/DRDY的下降沿表明数据字准备好,当传送完毕时恢复到高电平;/TFS、/RFS是发送和接收数据帧同步信号;A0是地址输入,表明是对AD7711控制寄存器操作,还是对AD7711数据或校准寄存器操作。

图2

2通道控制器的设计

2.1逻辑框图

这里采用CPLD器件FLEX10K50QC240来实现通道控制器的所有逻辑。其内部逻辑原理框图如图2所示。主要的功能有:①包含有若干个控制或状态寄存器,主要用来设置工作参数和对AD7711通道进行控制;②对AD7711的数字界面提供接口;③提供足够的数据缓冲能力;④具有可编程的采样时钟发生器;⑤具有内部RAM和控制读取片外串口E2PROM的能力。

当主机的PC104总线地址被驱动时,则在ALE的下降沿锁存地址。当选中板卡地址时(这里以0x280~0x28f为例),则利用/IOW的上升沿锁存数据,并根据地址译码的不同,锁存到不同的寄存器里。这里有四个控制寄存器,即通道操作寄存器(CtlReg,0x282)、板卡命令寄存器(CmdReg,0x286)、用于串口E2PROM和内部RAM的存储器操作控制寄存器(EepReg,其中包括用于控制的16位寄存器0x288和数据寄存器0x289)及参数寄存器(ParaReg,0x280)。由于通道操作寄存器是32位,主机对同一个口地址(如0x282)连续进行两个16位写操作,因此利用两个连续的/IOW写数据。通道操作寄存器低24位是写入AD7711的数据,即24位控制字或校准数据。高8位的含义如下:

R/WF1F0CHCH3CH2CH1CH0

R/W:0表示写,1表示读。

F1,F0:00表示对AD7711控制寄存器操作,11表示对AD7711校准寄存器操作,01则是读取数据。

CHCH3CH3CH1CH0:1xxxx表示全通道操作,0xxxx表示某单通道操作。

因为分配给每块采集卡的I/O地址空间有限,所以利用板卡命令寄存器的低8位作为参数数据,高8位作为命令/参数类型。为了稳定可靠地锁存数据,参数寄存器的使能信号由板卡命令寄存器写造中信号延时两个野兔周期得到。参数类型是指采样速率、输出因子、中断号。板卡命令寄存器高8位提供的命令有启动(START)、停止、同步(驱动AD7711的/sync线)、复位、FIFO清零等命令。

图2中的粗线表示数据的流向。通道主控器(ChnMaster)与AD7711数字界面接口,负责产生AD7711的所有读写时序。一共有12个通道主控器,可以并行地工作,由通道触发电路(ChnTrigger)触发和指定串/并工作方式。它将通道操作寄存器给出的并行24位控制字或校准数据(由CtlReg.F1F0决定)转换成串行数据,由SDATA发送出去,或者读取AD7711的数据寄存器和控制/校准寄存器,将串行数据转换成24位和16位的并行数据。当通道主控器产生Rdy信号时表示接收完毕,新的数据已经获得。

根据通道操作寄存器的24~28位,有全通道和单通道工作方式。

当CH=1时,为全通道的数据采集并行工作方式。如果板卡命令START有效,可编程时钟发生器(ProgClkGen)则根据采样速率输出采样时钟。采样时钟直接或经定时器(Timer)延时后产生Tpt信号输入到通道触发电路,产生通道使能信号Ena,从而触发通道主控器开始工作。每个通道的通道主控器读取AD7711的数据,当16位数据读完时,输出Rdy信号。控制分配器(Director)接收采样时钟和Rdy信号。当所有通道的Rdy信号都收到时,输出通道选择信号到4~16多路选择器,依次选通各个通道的数据,并产生FIFO写控制信号,将每个通道的数据写入FIFO里。当采样次数达到输出因子大小时,就通过中断产生模块(IntrGen)输出一个指定的中断脉冲。PC104主机接收到中断后,读取参数寄存器(0x280)的值,其大小即为输出数据的个数。控制分配器还对主机连续读取数据的/IOR信号进行计数,若该次中断读取的数据完毕,产生中断处理结束信号,允许下次对FIFO进行写操作。

当CH=0时,由CH3CH2CH1CH0决定对哪个通道操作,一般对AD7711读写控制字和校准字时使用单通道的操作。当PC104主机写控制寄存器时,内部产生一个表示写新控制字完毕的脉冲信号,触发通道触发电路使之产生一个通道使能信号Ena,使相应的通道主控器开始工作。如果写AD7711控制/校准寄存器,则通道主控器将24位数据锁存,进行并-串转换发送出去。如果读AD7711控制/校准豁口,则通道主控器接收串行数据并转换成24位并行数据。通道操作寄存器的通道号决定多路选择器的输出,将数据锁存到通道寄存器数据锁存器(0x284)里。操作完成后,状态寄存器的busy位为0,主机就可以从地址0x284读取到相应AD7711控制/校准寄存器里的数据。

图2里还包括了内部RAM和对外部串口E2PROM。可以初始化RAM,使CPLD在上电时就保存有各通道校准参数,但是若修改固化参数,必须重新编译和对外部配置器件编程,用户主机不能修改。若将参数保存在片外的串口E2PROM,则可以对其读和写,以方便用户主机根据实际情况校准各个通道,并保存新的校准参数。

2.2通道主控器的设计

通道主控器的主要结构如图3所示,包括左移移位寄存器、/RFS和TFS生成模块、SCLK计数器。发送时,内部输入数据通过LodSht锁存,通过移位从Sdata_o输出;接收时,串行数据从Sdata_I输入,通过移位得到并行数据(24位)输出到内部。ClrSht和EnaSht分别是清零和使能信号。

2.3FIFO和RAM

FIFO提供数据缓冲能力。FLEX10K50QC240能够提供2880个逻辑单元、10个嵌入式阵列块(EAB),总计20480个RAM位。根据板卡的要求,最大的输出因子为32,它所需的最大RAM位为32×12×16=6144。每个EAB只能配置成256×8bit,深度为384、数据位宽为16的FIFO需要占用4个EAB。所以FIEX10K50QC240完全可以满足要求,实际上它可以实现最大输出因子为64所需要的FIFO缓冲。这里使用Altera公司提供的参数化模块LPM_FIFO来实现所需的模块。它是一个单时钟同步FIFO,支持同时读和写。

2.4控制分配器

控制分配器主要输出通道选择信号和FIFO的写控制信号。当条件满足时,便输出从1~12个FIFO写控制信号。这里休用状态机实现这一过程。

2.5可编程时钟发生器

采样脉冲由10MHz时钟计数分频得到,其频率由主机写到参数寄存器的参数决定。计数器的预置值与参数存在一一对应关系。方法一是采用译码器,由于输出的预置值是24位,则逻辑复杂,需占用大量的逻辑单元资源。方法二是使用查找表,采用三段8位的ROM来实现,仅占用若干RAM位,简单有效。

采集卡范文篇2

关键词:USB2.0FPFOFPGA固件程序主从系统

引言

数据采集在现代工业生产及科学研究中的重要地位日益突出,并且实时高速数据采集的要求也不断提高。在信号测量、图像处理、音频信号处理等一些高速、高精度的测量中,都需要进行高速数据采集。现在通用的高速数据采集卡一般多是PCI卡或ISA卡,这些采集卡存在很多缺点,比如安装麻烦,价格昂贵,尤其是受计算机插槽数量、地址、中断资源的限制,可扩展性差。

通用串行总线USB是用来连接设备与计算机之间的新式标准接口总线。它是一种快速、双向、同步传输、廉价的并可以实现热拔插的串行接口。USB技术是为实现计算机和通信集成而提出的一种用于扩充PC体系结构的工业标准。基于USB接口的高速数据采集卡,充分利用了USB总线的优点,它也必将被越来越多的用户所接受。

1USB数据采集卡原理

1.1USB简介

USB是英文UniversalSerialBus的缩写,中文含义是“通用串行总线”。它支持在主机与各式各样即插即用的外设之间进行数据传输。它由主机预定传输数据的标准协议,在总线上的各种设备分享USB总线带宽。当总线上的外设和主机在运行时,允许自由添加、设置、使用以及拆除一个或多个外设。USB总线技术的提出就是想利用单一的总线技术,来满足多种应用领域的需要。USB1.1协议支持两种传输速度,即低速1.5Mbps和高速12Mbps。为了在高速接口之争中占有一席之地,2000年了USB2.0协议,它向下兼容USB1.1协议,数据的最高传输速率提高到480Mbps,这就使USB对打印机和其它需要快速传递大容量数据的外设更具吸引力。

为了满足实际数据采集USB传输速度较高的需要,选择了Cypress公司的内置USB接口微控制器芯片EZUSBFX2系列,开发了具有USB接口的高速数据采集卡。

1.2系统框图

USB系统是一个主从系统,而非对等(peer-to-peer)系统。在主从系统中,命令是由主设备发出,而从设备只能接收命令,只有在主设备读取数据时,从设备才能提交数据。如图1所示,在USB控制器与电路之间需要一个FIFO,来充当数据的缓存区。那么,在USB从设备向主设备发送数据时存在一个问题:FIFO多大才能满足要求。为了满足数据采集中高速实时流数据垢应用,避免FIFO溢出,在我们的系统中,通过FPGA及SDRAM构造一个容量的FIFO(图1虚线框内所示),可以提供一个低成本并能满足高速实时流数据传输的解决方案。

图2

2USB数据采集卡硬件

2.1EZ-USBFX2(CY7C68013)芯片

Cypress公司的EZ-USBFX2系列芯片是最早符合USB2.0协议的微控制器之一,它集成了符合USB2.0协议的收发器(transceiver),串行接口引擎(SIE),增强型的8051内核以及可编程的接口。FX2系列芯片独特的结构使得数据传输速度最高可达56Mbps,最大限度地满足了USB2.0的带宽。

EZ-USBFX2的微处理器是一个增强型的8051内核,性能可达标准8051的5~10倍,并与标准8051的指令完全兼容。增强型的8051内核使用RAM世馘作程序指令和数据存储器,从而使得EZ-USBFX2具有“软”特性,也就是说,可以通过自行编写程序指令来实现所需的功能。EZ-USBFZ2使用增强型SIE/USB接口(称为USB核),通过执行USB部本身的协议来简化8051代码编写的工作。这样采用硬件完成USB塄,简化了固件代码的编制。对于固件代码的使用,主机通过软件下载的方法实现。这种方法充分利用FZ2内部的8KBRAM来装载8051代码和数据。由于EZ-USBFZ2具有重新枚举的能力,所以在初始化枚举时,用户并不需要断天设备就可以装载新的描述符。设备描述符和8051程序代码都能通过主机中的磁盘文件下载,只有制造商号、产品号和设备号从启动时从一个16字节的EEPROM下载到硬件中的。通过这种方式,可以比较容易地从主机升级软件和修改USB总线设备的固件代码。

EZ-USBFX2的通用可编程接口GPIF以及Master/Slave端点FIFO所对应的8/16位数据总线,可以很容易地实现FX2与当前一些主流通过接口(如ATA、UTOPIA、EPP、PCMCIA和大部分DSP处理器)的互连。它共有7个端点,端点0,端点1和IN和OUT,还有端点2、4、6和8。其中,前3个端点的大小是固定的64字节,后4个端点默认大小是2级512字节的FIFO,端点2和端点4默认是OUT端点,端点6和端点8默认是IN端点,而端点2和6分别可以定义为2级、3级或4级的存储器,每级的大小也可以是512字节或1024字节。从EZ-USBFX2方向来看,一个端点相当于通过总线收发数据的缓冲区,EZ-USBFX2从OUT缓冲区中读取端点数据,将通过USB传的端点数据写入IN缓冲区。它求全责备速(12Mbps)和高速(480Mbps)传输速率,并具有USB协议所规定的4种传输方式,即控制方式(controlmode)、中断传输方式(interruptmode)、批量传输方式(bulkmode)和等时传输方式(isochronousmode)。

EZ-USBFX2系列是基于RAM的“软”结构,在开发过程中允许无限制设置和升级;它支持全速USB总线吞吐量的传输,使用EZ-USBFX2进行设计,可以不受端点数、缓冲区大小和传输速度的限制;此外,其内核中做了大量的辅助指令,简化了编码,同时也加快了对USB特性的了解。基于以上EZ-USBFX2系列芯片的特性,在开发的过程中,采用了EZ-USBFX2系列中的CY7C68013芯片(128引脚),其简化结构如图2所示。

FX2可配置成三种不同的接口模式Ports、GPIFMaster和SlaveFIFO,本项目采用SlaveFIFO模式。在该模式下,外部逻辑或外部处理器直接连接到FX2的端点FIFO,GPIF没有被激活,因为外部逻辑可以直接控制FIFO,所以FIFO的基本控制信号(标志、片选、使能)由FX2的引脚引出。外部控制可以是同步或异步,可以使用内部时钟,也可以向FX2的接口提供外部时钟。

2.2FPGA芯片EP1C6-Q240

在本设计中,所用的FPGA采用Altera公司最新的CYCLONE芯片EP1C6-Q240。它是一款高速价比的FPCA芯片,工作电压为1.5V,采用0.13μm工艺技术,全铜SRAM工艺,其存储器密度可达5980个逻辑单元,包含20个128×36位的RAM块,总的RAM空间达到92160位,内嵌了2个锁相环电路和一个用于连接SDRAM的特定双数据率(deficateddatarate)接口。此外,该芯片还支持多种不同的I/O标准(包括PCI接口,可连接ASSP和ASIC设备的接口以及串行设备接口等)。

这里FPGA的作用除了与SDRAM构成一个大容量的FIFO以外,还需要完成一些控制功能。对于本文的应用,需要完成HDB3码到NRZ码的转换及数据的串并转换等。具体问题要具体分析,用户可根据自己的需求对FPGA进行编程。

2.3A/D转换芯片MAX1180

MAX1180是Maxim公司的双通道105Msps、3.3V工作电压、低功耗的高速A/D芯片,采样数据10位电平量化。它是采用差分输入,带有宽带跟踪/保持(track-and-hold)的双通道9级流水线型结构的ADCs,如图3所示。实际的芯片包括两个图示的电路,作为输入的两路通道,互不干扰。各路采样信号每半个时钟周期通过一个STAGE,完成连续转换到数据输出共需5个时钟周期。每个流水线首先通过一个1.5位的快闪ADC对输入电码量化,然后再由DAC产生一个对应于量化结果的电压并与输入电压作差,输出电压放大2倍后送到下一级流水线处理。A/D-D/A两次变化以及差分处理的目的在于进行差错校正,以保证在流水线上的各个阶段,ADC的偏移量得到补偿并且无代码丢失。

2.4硬件连接

根据系统对数据传输的速度和实时性的要求,配置CY7C68013工作的接口模式为SlaveFIFO模式。当进行数据采集时,硬件连接方式如图4所示。

A/D转换器的采样时钟同时作为CY7C68013的SlaveFIFO模式的读写控制时钟,即CY7C68013的接口时钟连接到IFCLK引脚。SCWR/SLRD是CY7C68013SlaveFIFO的写使能/读允许信号。FPGA向C7C68013SlaveFIFO提供SlaveFIFO输出允许信号SLOE,仅在数据输出时有效。FD[15:0]为16位双向数据总线。FIFOADR1:0》为端点FIFO选择信号。在数据输入时固定为00,选择的是端点2;在数据输出时固定为10,选择的是端点6。

3USB数据采集卡软件

软件设计是一个USB设备开发的必备环节。USB应用系统软件设计分为三部分:初始化软件、主机操作系统上的客户驱动程序以及主机应用程序。初始化软件是下载到控制器中的固件代码,它响应各种来自系统的USB标准请求(包括USB设备的枚举、驱动程序的选择加载等),完成连接设备和主机的任务。主机应用软件通过客户驱动程序与系统USBI(USBDeviceInterface)进行通信,其主要任务是将采集进来的数据流,根据所需处理功能的要求来完成各种基于Windows程序的处理。

3.1EZ-USBFX2的初始化

通过固件程序的调度,主机才能得到设备的描述符以及完成端点数据的传输。对于固件程序的编程,其基本结构如下:

①初始化,包括处理器和电路的初始化;

②主函数,包括完成符合设备特定要求的代码;

③中断处理,包括处理各种中断的程序代码。

总的来说,固件程序的编写有两种方式。其一,对于熟悉8051汇编语言的用户来说,可以直接利用汇编语言编写结构紧凑、高效率的固件代码;其二,EZ-USB以利用现成的固件程序框架函数,根据设备的需求添加相庆的用户,来完成特定的目的。

为了加快USB接口的开发过程,利用EZ-USBFX2提供的一些框架函数来简化用户代码,使用相应端口(端口2输入,端口6输出)利用EZ-USBFX2的SlaveFIFO结构采用此处理传输,基本的固件程序框架函数如下:

voidTD_Init(void)//该函数用来完成EZ-USBFX2的初始化

{CPUCS=0x10;//工作频率48MHz

IFCONFIG=0xC3;//决定FX2的工作模式(slaveFIFO)及相关设置

IN07VAL=bmEP2;

OUT07VAL=bmEP6;//使能端点2输入和端点6输出

EP2FIFOCFG=0x6D;//AUTOOUT=0,AUTOIN=1,WORDWIDE=1

SYNCODELAY;

EP6FIFOCFG=0x75;//AUTOOUT=1,AUTOIN=0,WORDWIDE=1

SYNCDELAY;//对端点2和端点6的配置,WORDWIDE=1配置的是使用16位数据线。

EP2CFG=0xEA;//端点2:输入、批量传输、最大包字节为1024,双缓冲

SYNCDELAY;

EP6CFG=0xAA;//端点6:输出、批量传输、最大包字节为1024、双缓冲

SYNCDELAY;

}

voidTD_Poll(void)//此函数在设备运行时反复被调用,它包括完成用户任务的函数

{

}

BOOLTD_Suspend(void)//该函数在设备进行挂起状态前调用

{

return(TRUE);

}

BOOLTD_Resume(void)//设备重启后调用

{

return(TRUE);

}

在整个固件程序中,EZ-USBFX2设备上电或复位后,首先对所有的内部状态变量初始化,随后调用TD_Init()函数,并开中断,此时固件程序不断检测控制端口0是否收到SETUP包。一旦收到,固件程序就开始调用用户函数TD_Poll(),其中用户需要完成的功能代码就在TD_Poll()函数一。调用完成后,重复检测端口0是否收到SETUP包,若有,继续执行设备请求,调用TD_Poll()函数;否则,检测USB核是否有USB挂起事件,若有,调用TD_Suspend()函数,其返为真时,检测USB核是否有重新开始事件,没有时,设备进入挂起状态,反之,调用TD_Resume(),进行下一次循环;当TD_Suspend()函数返回为假时,直接转入下次循环。

此外,固件程序框架中还定义了许多中断处理函数,当用到时可以在相应的九加入自己编写的代码,这样既清晰又便于理解,用户就可以在不用改变整个程序的前提下,仅仅通过改变相应的模块,来实现自己的功能。

3.2主机软件部分

主机软件部分包括USB客户驱动程序主和机应用程序。USB客户驱程序是支持即插即用功能的标准WDM驱动程序,它为实现控制传输、中断传输和批传输提供了标准接口函数。而主机应用程序的作用在于与操作系统相互作用,当操作系统认为有新设备接入时,就会自动调用相应的设备驱支以。加之该软件需要一个图形用户界面来控制所用的函数,这里采用VC++来编制应用程序,利用CreateFile得到USB句柄,用DeviceIoControl来向设备驱动程序发送请求,完成在EZ-USBFX2中的数据批传输的读取与写入。程序实例如下:

HANDLEDeviceHandle;

DeviceHandle=CreateFile(\\.\ezusb0,GENERIC_WRITE,

FILE_SHARE_WRITE,NULL,OPEN_EXISTING,0,NULL);

//得到设备ezusb0的句柄

DeviceIoControl(DeviceHandle,

IOCTL_EZUSB_BULK_WRITE,

LPVOIDlpInBuffer,//;输入数据存储地址指针

Sizeof(BULK_TRANSFER_CONTROL),

LPVOIDlpOutBuffer,//输出数据存储地址指针

DWORDnOutBufferSize,//输出缓存大小

LPDWORDlpBytesReturned,//接收输出数据字节计数器变量的指针

NULL);

//写数据到EZ-USBFX2设备

DeviceIoControl(DeviceHandle,IOCTL_EZUSB_BULK_READ,

LPVOIDlpInBuffer,//输入数据存储地址地

Sizeof(BULK_TRANSFER_CONTROL),

LPVOIDlpOutBuffer,//输出数据存储地址批晚霞

DWORDnOutBufferSize,//输出缓存大小

LPDWORDlpBytesReturned,//接收输出数据字节计数器变量的指针

NULL);

//从EZ-USBFX2设备中读数据

ColseHandle(DeviceHandle);//关闭USB句柄

采集卡范文篇3

关键词:数据采集PCI总线焊缝缺陷VXD

焊缝缺陷自动超声检测系统是一种重要的无损探伤设备,可用于检测平板、管道、容器等的纵、横焊缝以及接管角焊缝缺陷。与手工检测方法相比,该系统具有运行平稳、漏检率低、显示直观等优点。

在焊缝缺陷自动超声检测系统中,缺陷回波信号通常为宽度约10ns~100ns、幅值在几十μV到几十mV之间的窄脉冲。为满足缺陷回波信号的检测要求,研制了一种基于PCI总线的高速数据采集卡,它是面向超声检测应用而设计的:该卡采用转换速率为60MHz的八位高速A/D以满足数据采集的要求;为缓存A/D芯片输出的高速数据并充分利用PCI总线带宽,加入32KB的高速FIFO缓存组;同时,为满足多通道探伤的要求,设计了通道选择电路以实现通道之间的切换;此外,为调理缺陷回波信号,卡上还配有高增益高带宽放大电路。

1高速数据采集卡的工作原理

焊缝缺陷自动超声检测系统的信号采集框图如图1所示。系统的工作原理是:首先由高压脉冲发生电路发射高压脉冲;高压脉冲经换能器形成超声波信号,遇到缺陷或杂质时产生反射波,经换能器转换为电压信号,该信号经放大调理、A/D转换后,形成数字量,写入高速FIFO存储器中。最后,由PCI接口芯片将FIFO中的数据适时地写入内存。

2数据采集电路的硬件设计

2.1高增益高带宽放大电路

采用带触发的直流逆变电路产生高压脉冲,采用多路模拟通道选择电路实现通道切换以满足多通道探伤要求。模拟信号经五级放大、滤波后,作为A/D转换电路的输入。放大电路采用最高增益为80dB、带宽为15MHz且分辨率为1dB的放大器,并且采用数字电位器实现放大增益的动态调整。

2.2A/D转换电路

A/D转换电路采用美国BB公司的ADS830。该芯片的信噪比高、功耗低、非线性畸变小,广泛应用于图像处理、数字通信和视频测试系统中。ADS830的精度为八位,最高采样频率为60MHz,可满足焊缝缺陷自动超声检测系统对数据采集精度和采样频率的要求。它有共模和差模两种信号输入方式,且输出的数字量可直接与5V或3.3V芯片接口。

2.3高速FIFO存储器

高速缓存是保证高速数据不丢失的关键,确保了数据的真实性。同时,高速FIFO缓存使A/D芯片不必工作在PCI同步时钟下,提高了A/D芯片的利用率。IDT公司的存储器性能优良,且同系列存储器一般可以做到管脚级兼容,容易实现硬件设计的模块化。为方便读写数据,选择先进先出式(FIFO)的缓冲存储器IDT7205L15。其访问时间为15ns,每片容量为8K×9位。支持异步读写,并提供诸如满、半满、空等用于位扩展和深度扩展的信号。高速数据采集卡为实现8位A/D和32位PCI总线的宽度匹配,采用了位扩展技术。为加深FIFO的缓冲深度,将外加FIFO缓存与PCI接口芯片内部的FIFO相级连。

2.4基于CPLD的控制逻辑

基于CPLD的控制逻辑是高速数据采集卡的核心,它为PCI接口芯片提供满足时序要求的读写信号,同时选择模拟信号的输入通道、控制高压脉冲发生逻辑并设定放大电路的增益。此外,CPLD还能利用高速FIFO缓存的空、满标志位,配合PCI接口芯片实现DMA写操作,完成高速数据传输。Xilinx公司的XC9572XL-VQ64芯片的脚到脚延迟最大为10ns,可满足PCI总线接口时序的要求。单片XC9572XL-VQ64能满足焊缝缺陷自动超声检测系统逻辑控制的要求,且具有体积小、可靠性高、调试方便等突出优点。

图2是基于有限状态机FSM(FiniteStateMachine)方法设计的控制逻辑状态转换图。其中,RST和IRQ是由PCI接口芯片S5933输出的可由程序任意控制的两个信号,它们的高低状态同高速FIFO缓存的空、满信号一起决定了控制逻辑的六个可能的状态,图中以椭圆表示。计算机上电时,控制逻辑处于RST=IRQ=1的状态。值得一提的是,RST和IRQ信号都有适当的上拉电阻,所以不会出现高阻浮空的状态,使控制逻辑能够稳定地工作。实线是控制逻辑采用的状态转移路线,而虚线是可能的但不采用的状态转移路线。在各状态之间进行切换是很容易的,只需通过程序使RST或IRQ信号出现高或低跳变。状态转移时伴随着的电路动作见转换线旁的注释。

2.5PCI接口芯片

PCI总线协议2.1版出现以后,集成芯片商们纷纷推出了与其兼容的总线接口芯片。其中,AMCC(AppliedMicroCircuitCorperation)公司的S5933接口方便、控制灵活,软件配置简单,在高速网络接口、数字通信、高速成像等领域有着广泛应用2。S5933最突出的优点是能够作为PCI主控设备发起DMA操作,即S5933完全具备双字DMA控制器的功能。

图3是结合系统应用而绘制的S5933结构框图。由图3可知,S5933内部具有配置寄存器组和操作寄存器组,配置寄存器组用于控制S5933在PCI总线系统中的运作方式(访问延迟、能否发起主控DMA操作等)以及记录系统分配给S5933的资源信息(如中断引脚、I/O等)3,而PCI总线和外加电路之间的数据交换则通过操作寄存器组实现。以I/O资源为例,计算机上电后,系统将分配给S5933的I/O资源首地址填入基地址寄存器,此值决定了操作寄存器组在I/O空间中的映射位置(S5933的操作寄存器组缺省地映射到I/O地址空间,便于软件操作),见图3。之后,CPU只需执行简单的I/O操作就可以读写操作寄存器组,隐含的地址译码工作由S5933完成。外加电路控制逻辑则保证操作寄存器组与外加电路的正常通信。S5933提供了三种形式的外加电路接口,高速数据采集卡使用信箱(Mailbox)寄存器实现双字输出,用FIFO方式实现高速DMA写操作。

图3S5933的结构框图

3高速数据采集卡的软件设计

3.1虚拟设备驱动程序的设计

系统的控制软件工作在WINDOWS98操作系统下,为此开发了高速数据采集卡的虚拟设备驱动程序(VXD)。由S5933的结构可知,VXD需要实现双字I/O操作和物理内存管理。双字I/O的操作相对简单,调用虚拟机管理器(VMM)的SIMULATE_VM_IO例程即可,较困难的是物理内存管理。由于S5933发起的DMA操作需要物理内存的起始地址,因此必须涉及页面级的物理内存操作,故采用下述内存管理策略:

·应用程序加载VXD;

·加载成功后发送申请缓冲区的事件给VXD;

·VXD使用PAGEALLOCATE例程得到地址连续的适当长度(如四页即16K字节)的物理内存;

·锁定缓冲区并将物理地址逆映射为线性地址;

·将物理首地址填入S5933的写RAM地址寄存器;

·允许S5933进行主控DMA传输;

·传输完毕时,应用程序请求VXD释放上述物理内存。

3.2应用VXD设计数据采集程序

将VXD放在应用程序的同级目录下,则以下VC++代码就能动态加载(VXDVIEWER可验证)一个VXD:

HANDLEhDEVICE=CreateFile“\\\\.\\pathname”00NULL0FILE_FLAG_DELETE_ON_CLOSENULL;

编好的VXD为应用程序提供了若干服务例程,应用程序执行下面的代码即可调用服务例程ZHC1:

DeviceIoControlHDEVICEZHC1lpinbufferninsizelpoutbuffernoutsizeNULLNULL;

数据采集算法如下:

DO{读取写RAM字节计数器;

再次读取写RAM字节计数器;

IF计数器内容为零THEN

跳出循环进行后续数据处理;

ELSEIF两次读取的结果不同THEN

不做任何处理而进入下一次循环;

ELSE

清相应的状态标志并设置有关寄存器以从断点处续传;

ENDIF

}

采集卡范文篇4

关键词:双向CATV窄带FFSK

有线电视网(CATV)是中国普及最广的网络,在已建的宾馆、居民小区中绝大部分都已建成。因此利用已有的网络进行更广泛的功能的开发,如:影视点播、安防监控、自动抄表及其它的服务呼叫等,是一个值得研究的课题。这些功能实现的关键,是在同轴电缆中控制信令的可靠实现。

在CATV网中,由于分支较多、用户繁杂、线路老化等原因,不可避免地会造成大量的干扰信号的窜入。在实际的频谱测试中,整个其带经常被噪波干扰抬高,因此,寻找廉价且可靠的线路和传送方案变得尤为重要。为此,我们通过长期的试验和实验,研制出一成本极其低廉,性能相当可靠的工作电路和通信方案,并在实际装机运行中使用。

1硬件组成及原理框图

1.1传输通道

根据国际,数据信息只能在双向CATV网的低端通过,允许分布的频率为65MHz以下。鉴于此,我们采用的通信频率分别为:上行信号采用无线信号工作方式,频点为21.7MHz,采用窄带方式,带宽为20kHz;下行信号采用电视信号的工作方式,中心频率为38MHz,带宽为8MHz。为加强抗干扰能力,上、下行被调制的信号采用FFSK方式,速率为1.2Kb/s。

图1数据中心采集卡的通信线路原理方框图

采用此种通信方式的另一种考虑是成本及可生产化。数据采集中心与控制终端的通信系统是典型的一对多的通信,控制终端数量众多,应尽可能地设计得简单、低廉、精确;而数据采集心的采集卡则相对可靠即可。因此,在控制终端线路上的窄带发射电路,为保证频点精确且不漂移,舍弃LC振荡电路采用晶体振荡,定制晶体频率为21.7MHz,带宽为5kHz。通过对电源的控制来实现对振荡电路起振与否的控制。接收电路采用电视信号解调芯片TA7606,解调出音频FFSK信号。数据采集中心的采集卡相对应的接收电路采用窄带接收芯片MC3363。MC3363是一个由RF放大器到音频前置放大器输出的完整的FM窄带接收机。低电压双变换设计产生了用于窄带音频和数据链路的低功耗、高灵敏度和优越的图像载波抑制功能。MC3363具有较高的灵敏度,对于12dBSINAD(信号对噪声的先真比)的典型的输入值为0.3μV。输入信号先通过两级本生振荡器的差频输出到455kHz以下,然后再对信号限幅放大,最后经过正交检波输出音频范围内的有用信号。虽然CATV网是有线的,但MC3363用在此处可大大提高上行信号的灵敏度,在信噪比较低时也能接收得很好。发射电路采用电视信号的中频电路,即采用芯片MC1374,它的工作频率也是晶体通过第6脚输入的调制FFSK信号,硬件框图如图1所示。综合数据处理中心的采集卡和终端的控制卡,上行和下行信号发射的工作频率都是通过晶体振荡产生的。这种设计思路将大大方便于调试、生产。上行信号采用窄带是因为MC3363的接收性能极优,同时节省频率资源;而下行信号采用电视信号是因为成本低廉且便于调试、生产。图1是数据中心采集卡的通信线程原理方框图。

1.2控制线程

采集卡的主控制芯片采用华邦公司的W77E58,主要出于三方面的考虑:

一是工作频率高,最高可达40MHz,而且W77E58的机器工作频率只是晶体振荡频率的4分频,即40MHz的频率相当于普通MCS-51系列单片机的120MHz。由于数据处理中心的采集卡要接收及处理多个终端来的信息,快速处理数据是必需的。二是W77E58拥有2个全双工异步串口,给采集卡与数据控制中心的数据交换提供了便利。三是W77E58片内有1KB的SRAM(采用MOVX指令),无须外扩数据存储芯片。当然,W77E58不还有其它一些特点也为程序设计带来了极大的便利:双16位的数据指针、WatchDog定时器等。FFSK调制解调芯片采用Toshiba公司的TC35470。该芯片有极少的外部线程,宽电压(2.7~5.5V)和低功耗,内部抗电源干扰电路和抗噪声滤波器。TC35470采用3.58MHz晶体,CPU的5根线相连,分别为:RTM(4脚)FFSK接收解调时钟输出,RDT(5脚)FFSK接收解调数据输出,TD(11脚)FFSK发送调制时钟输出,TRD(12脚)FFSK发送调制数据输入,MSKE(13脚)FFSK解调允许输出控制脚。W77E58的双串口有各自的用途:一串口通过RS232与控制主机相连,用以数据的通信;另一串口与其它设备相连。

由于终端所在的环境千变尤化,千差万别,因此终端控制线路最关心的硬件设计是抗干扰和低功耗。为此,我们采用TI公司的MSP430系列的MSP430F1111芯片。该芯片具有ESD保护,抗干扰能力特别强,低电压的工作范围1.8~3.6V和超低功耗。它与TC35470组成终端的控制线路,可将电压设计成3V,大大节省了耗电,使锂电池供电成为可能。由于一个数据处理中心的采集卡要对应于多个终端,而多个终端共用一个上行通道,因此,MSP430F1111除了与TC35470的五根口线相连外,还须提供一口线控制电源以决定窄带晶体振荡电路是否工作。这里因为振荡频率已达21.7MHz,无法通过电子开关来实现关断。MSP430F1111剩下的8个I/O口线可用做一些开关量的输入/输出,可对一些报警信号进行检测,按钮信号读取,驱动一些控制开关。

2通信信令方式

由于CATV网络系统中众多的终端用户,采用一一“点名”的主从结构通信方式会使得整个通信周期太长。同时,在该网络用户中,大多通信事件的发起者应该是终端用户而不是数据处理中心,而且在众多用户中,在某一时刻真正需要传输数据的用户不可能很多。正因为大多通信事件的发起者是终端用户,我们何不采用随机信息上行的方案?考虑到以上各种因素,我们决定采用类似于无线集群通信的通信信令——ALOHA方式。

ALOHA信令是Motorola公司专为无线集群通信设定的控制信道通信协议,主要是针对于一个中心控制台对众多的手机用户且事件发起者为终端用户的情况,其核心内容是随机访问协议。随机访问协议的宗旨是:

*控制解决终端用户上行信号的碰撞问题;

*使终端用户的通信信息最快地上行;

*确何可靠性;

*在通信繁忙时也能保证通信有效。

当然,ALOHA控制信令的内容比较复杂,我们只采用了其中基本原理,并做了一定的修改,以适用本系统的应用环境。下面介绍其实现原理。

数据采集中心一直有信号向下发送,所以FFSK信号分成三类:

①空闲信令。该类信号一直下行,它是一种与终端约定的协议,表示紧接着的一段时间是采集卡接收终端初始上行信号的多个时钟间隙。一时间间隙表示一帧终端上行信号所需的时间长度。空闲信令本身包括空闲指令码+时间间隔数值。时间间隔数值表示紧接着的时间间隙的个数,它不是一个固定的数值。这个数据应该随着系统终端个数的多少和系统所要传输量数据多少进行最优化的设计;同时,也要随着采集卡收到要求信息交互的终端数的多少而变化。只有进行这样的变化,才能保证ALOHA随机访问协议的宗旨。根据前面硬件的设计,终端的上行信号的发射电路在平时是无电停振状态。当它要发射信号时,应给它的起振时间约为10ms,因此这一时间间隙应包括起振时间。

②应答信号。当采集卡收到终端的上行信息时,立刻给出应答信号。此应答信号包含终端地址。

③交互信令。给出应答信号后,采集卡还对信号进行分析,对于需要进一步交互的信息内容,立刻在空闲信令及时间间隙后跟上交互信令,同时跟上一帧的时间间隙以接收上行信号。交互信令也是由两个部分组成:交互指令码和需交互的终端地址。当在交互信令的时间间隔得到上行信号时也需给出应答信号。当收到上行的结束信号时,取消该地址的交互信令。

终端所发FFSK信号分成两类:

①申请上行信号。终端控制板一直通过外部中断口对数据中心采集卡的下行空闲信令进行检测。当它有数据需要上行时,根据下行的空闲信令所得的时刻与现在这一刻进行比较判断,在下一时间间隙立刻发射数据。信号发送后立刻检测采集卡的应答信号,这一定时间内若无应答信号,则说明刚才的上行信号没有被采集卡检测到,需要再一次发送申请上行信号。一般而言,数据中心得不到数据是因为有两个或两个以上的用户“同抢”时隙。这样,再一次发射信息就要采用随机发射方式:根据本机的一随机数据发和函数得到一单字节的随机数,除以时间间隙数,得一随机余数。该随机余数即为本次申请上行信号发生所占的时间间隙。之所以要有一随机数据的发生函数,是因为采集卡的下行空闲信令之后的时间间隙的个数有限,为了效地干扰。若还不成功,就需要根据信息的重要程度不同进行不的处理:报警型就要重复刚才的过程,直到收到应答信号为止;一般的信息只需重复一定次数,若还不成功就可放弃。对于那些需进一步信息交互的内容,终端单片机对采集卡的下行信号进一步检测,当检测到交互信令时,就进行下一步的信息交互。申请上行信号由两部分组成:终端地址和真正上行信息。

②交互行信号。检测到交经信令时,终端就可以发送交互的上行信号了。一帧交互上行信号可根据实际需要设计得与一帧申请上行信号不一样长。当信息交互完毕时,终端发送结束信息,以便采集卡收回该终端的交互信令时序。由于下行的交互信号中包含地址内容,因此交互上行信号只有信息内容。为了数据输送的可检验,数据的传送通过CRC校验。

采用上述通信方式,通过试验数据传送既快无好,即使碰了多个用户“同抢”的情况也能将信息顺利上达。

3软件设计

采集卡范文篇5

基于图像采集卡的视频图像处理系统

计算机图像处理系统从系统层次上可分为高、中、低档三个层次,目前一般比较普及的是低档次的系统,该系统由CCD(摄像头)、图像采集卡、计算机三个部分组成,其结构简单,应用方便,效果也比较不错,得到的图像较清晰。目前网上基于VC开发经验的文章不少,可是关于如何在VC开发平台上使用图像采集卡的文章确没发现,笔者针对在科研开发中积累的使用图像采集卡经验,介绍如何自己是如何将采集卡集成到图像开发系统中,希望能够给目前正需要利用图像采集卡开发自己的图像处理系统的朋友有所帮助。

使用的摄像机采用台湾BENTECHINDUSTRIAL有限公司生产的CV-155L黑白摄像机。该摄像机分辨率为752x582。图象采集卡我们采用北京中科院科技嘉公司开发的基于PCI总线的CA-MPE1000黑白图象采集卡。使用图像采集卡分三步,首先安装采集卡的驱动程序,并将虚拟驱动文件VxD.vxd拷贝到Windows的SYSTEM目录下;这时候就可以进入开发状态了,进入VC开发平台,生成新的项目,由于生产厂家为图像采集卡提供了以mpew32.dll、mpew32.lib命名的库文件,库中提供了初始硬件、采集图像等函数,为使用这些函数,在新项目上连接该动态库;最后一步就是采集图像并显示处理了,这一步要设置系统调色板,因为采集卡提供的是裸图形式,既纯图像数据,没有图像的规格和调色板信息,这些需要开发者自己规定实现,下面是实现的部分代码:

CTestView::CTestView()

{

W32_Init_MPE1000();//初始化采集卡

W32_Modify_Contrast(50);//下面的函数是为了对采集卡进行预设置

W32_Modify_Brightness(45);//设置亮度

W32_Set_HP_Value(945);//设置水平采集点数

wCurrent_Frame=1;//当前帧为1,获取的图像就是从这帧取得的

//设置采集信号源,仅对MPE1000有效

W32_Set_Input_Source(1);

W32_CACardParam(AD_SETHPFREQ,hpGrabFreq);

W32_Set_PAL_Range(1250,1024);//设置水平采集范围

W32_Set_VGA_Mode(1);

wGrabWinX1=0;//采集窗口的左上角的坐标

wGrabWinY1=0;

firstTime=TRUE;

bGrabMode=FRAME;

bZipMode=ZIPPLE;

/

lpDib=NULL;//存放获取的图像数据

}

CTestView::~CTestView()

{

W32_Close_MPE1000();//关闭采集卡

}

////显示采集的图象,双击鼠标采集停止

voidCTestView::OnGraboneframe()

{

//TODO:Addyourcommandhandlercodehere

wCurrent_Frame=1;

//设置采集目标为内存

W32_CACardParam(AD_SETGRABDEST,CA_GRABMEM);

//启动采集

if(lpDib!=NULL)

{

GlobalUnlock(hglbDIB);

GlobalFree(hglbDIB);

}

//分配内存

hglbDIB=GlobalAlloc(GHND,(DWORD)wImgWidth*(DWORD)wImgHeight);

lpDib=(BYTE*)GlobalLock(hglbDIB);

hdc=GetDC()->GetSafeHdc();

if(lpDib!=NULL)

{

cxDib=wImgWidth;

cyDib=wImgHeight;

SetLogicPal(hdc,cxDib,cyDib,8);

SetStretchBltMode(hdc,COLORONCOLOR);

bGrabMark=TRUE;

while(bGrabMark==TRUE)

{

if(msg.message==WM_LBUTTONDBLCLK)

bGrabMark=FALSE;

W32_ReadXMS2Buf(wCurrent_Frame,lpDib);

SetDIBitsToDevice(hdc,0,0,cxDib,cyDib,0,0,

0,cyDib,(LPSTR)lpDib,

bmi,

DIB_RGB_COLORS);

}

//停止采集

W32_CAStopCapture();

::ReleaseDC(GetSafeHwnd(),hdc);

return;

}

////将下面这个函数添加在视图类的CTestView::OnSize()函数中,就可以对系统的调色板进行设置。

voidWINAPIInitLogicPal(HDChdc,shortwidth,shortheight,WORDbitCount)

{

intj,i;

shortcxDib,cyDib;

LOGPALETTE*pLogPal;

j=256;

if((pLogPal=(LOGPALETTE*)malloc(sizeof(LOGPALETTE)+(j*sizeof(PALETTEENTRY))))==NULL)

return;

pLogPal->palVersion=0x300;

pLogPal->palNumEntries=j;

for(i=0;ipLogPal->palPalEntry[i].peRed=i;

pLogPal->palPalEntry[i].peGreen=i;

pLogPal->palPalEntry[i].peBlue=i;

pLogPal->palPalEntry[i].peFlags=0;

}

hPal=::CreatePalette(pLogPal);

deletepLogPal;

::SelectPalette(hdc,hPal,0);

::RealizePalette(hdc);

cxDib=width;cyDib=height;

if((bmi=(BITMAPINFO*)malloc(sizeof(BITMAPINFOHEADER)+j*sizeof(RGBQUAD)))==NULL)

return;

//bmi为全局变量,用于显示图像时用

bmi->bmiHeader.biSize=40;

bmi->bmiHeader.biWidth=cxDib;

bmi->bmiHeader.biHeight=cyDib;

bmi->bmiHeader.biPlanes=1;

bmi->bmiHeader.biBitCount=bitCount;

bmi->bmiHeader.biCompression=0;

bmi->bmiHeader.biSizeImage=0;

bmi->bmiHeader.biXPelsPerMeter=0;

bmi->bmiHeader.biYPelsPerMeter=0;

bmi->bmiHeader.biClrUsed=0;

bmi->bmiHeader.biClrImportant=0;

for(i=0;ibmi->bmiColors[i].rgbBlue=i;

bmi->bmiColors[i].rgbGreen=i;

bmi->bmiColors[i].rgbRed=i;

bmi->bmiColors[i].rgbReserved=0;

}

}

视频"画中画"技术

"画中画"这个概念类似与彩色电视机"画中画",就是在一幅大的图像内显示另外一幅内容不同的小的图像,小图像的尺寸大小一般地说为大图像尺寸的1/4或1/9,显示位置在大图像的右上角。这种技术不仅在电视技术中,在可视电话系统也可以发现这种技术的身影,它们都是依靠硬件来实现的,但是如何在VC开发平台上用编程语言来将该功能添加到自己开发的视频监控软件,为使用者提供更大的信息量呢?也许读者最容易想到的是首先显示大图像,然后再在一个固定位置画第二幅小图像,这种技术技术如果对于静止图像当然没有问题,但是对于视频流,由于每一秒钟需要画25幀,即25幅图像,这样一来计算机需要不停的画不停的擦除,会给用户以闪烁的感觉,如何解决这个问题呢?有的参考书上将大小图像分快显示,这种方法要将待显示的图像数据与显示位置的关系对应起来,容易出错不说,而且麻烦,且速度慢,为此,我对该方法进行了改进,得到了满意的效果。实现的代码如下:

voidpictureinpicture()

{

………………………..

CBitmapbitmap,*oldmap;

pData1=(BYTE*)newchar[biWidth*biHeight*3];//biWidth和biHeight为视频采集卡获取//的图像尺寸。

Read(pData1,bih.biWidth*bih.biHeight*3);//该函数从采集卡中获取数据

CClientDCdc(this);

m_pBMI1=newBITMAPINFO;//自定义的BMP文件信息结构,用于后面的图像显示

m_pBMI1->bmiHeader.biBitCount=24;

m_pBMI1->bmiHeader.biClrImportant=0;

m_pBMI1->bmiHeader.biClrUsed=0;

m_pBMI1->bmiHeader.biCompression=0;

m_pBMI1->bmiHeader.biHeight=biHeight;

m_pBMI1->bmiHeader.biPlanes=1;

m_pBMI1->bmiHeader.biSize=40;

m_pBMI1->bmiHeader.biSizeImage=WIDTHBYTES(biWidth*8)*biHeight*3;

m_pBMI1->bmiHeader.biWidth=biWidth;

m_pBMI1->bmiHeader.biXPelsPerMeter=0;

m_pBMI1->bmiHeader.biYPelsPerMeter=0;

////////////////////////////////////////////////////////////////////////

pData2=(BYTE*)newchar[biWidth1*biHeight1*3];//申请存放小图像的缓冲区

Read(pData2,biWidth1*biHeight1*3);////向该缓冲区读数据

m_pBMI2=newBITMAPINFO;

m_pBMI2->bmiHeader.biBitCount=24;

m_pBMI2->bmiHeader.biClrImportant=0;

m_pBMI2->bmiHeader.biClrUsed=0;

m_pBMI2->bmiHeader.biCompression=0;

m_pBMI2->bmiHeader.biHeight=biHeight1;

m_pBMI2->bmiHeader.biPlanes=1;

m_pBMI2->bmiHeader.biSize=40;

m_pBMI2->bmiHeader.biSizeImage=WIDTHBYTES(biWidth1*8)*biHeight1*3;

m_pBMI2->bmiHeader.biWidth=biWidth1;

m_pBMI2->bmiHeader.biXPelsPerMeter=0;

m_pBMI2->bmiHeader.biYPelsPerMeter=0;

//下面实现画中画的显示

CDCMemDc;

MemDc.CreateCompatibleDC(&dc);

bitmap.CreateCompatibleBitmap(&dc,biWidth,biHeight);

oldmap=MemDc.SelectObject(&bitmap);

::StretchDIBits(MemDc.m_hDC,0,0,biWidth,biHeight,0,0,—biWidth,biHeight,pData1,m_pBMI1,DIB_RGB_COLORS,SRCCOPY);//首先将大图像画在内寸上下文中

::StretchDIBits(MemDc.m_hDC,20,20,biWidth1,biHeight1,_

0,0,biWidth1,biHeight1,pData2,m_pBMI2,DIB_RGB_COLORS,SRCCOPY);//再将小图像画在内寸上下文中

::StretchBlt(dc.m_hDC,0,0,bih.biWidth,bih.biHeight,_

MemDc.m_hDC,0,0,bih.biWidth,bih.biHeight,SRCCOPY);//将结果显示在屏幕上。

MemDc.SelectObject(oldmap);

deletepData1;

deletem_pBMI1;

deletepData2;

采集卡范文篇6

基于图像采集卡的视频图像处理系统

计算机图像处理系统从系统层次上可分为高、中、低档三个层次,目前一般比较普及的是低档次的系统,该系统由CCD(摄像头)、图像采集卡、计算机三个部分组成,其结构简单,应用方便,效果也比较不错,得到的图像较清晰。目前网上基于VC开发经验的文章不少,可是关于如何在VC开发平台上使用图像采集卡的文章确没发现,笔者针对在科研开发中积累的使用图像采集卡经验,介绍如何自己是如何将采集卡集成到图像开发系统中,希望能够给目前正需要利用图像采集卡开发自己的图像处理系统的朋友有所帮助。

使用的摄像机采用台湾BENTECHINDUSTRIAL有限公司生产的CV-155L黑白摄像机。该摄像机分辨率为752x582。图象采集卡我们采用北京中科院科技嘉公司开发的基于PCI总线的CA-MPE1000黑白图象采集卡。使用图像采集卡分三步,首先安装采集卡的驱动程序,并将虚拟驱动文件VxD.vxd拷贝到Windows的SYSTEM目录下;这时候就可以进入开发状态了,进入VC开发平台,生成新的项目,由于生产厂家为图像采集卡提供了以mpew32.dll、mpew32.lib命名的库文件,库中提供了初始硬件、采集图像等函数,为使用这些函数,在新项目上连接该动态库;最后一步就是采集图像并显示处理了,这一步要设置系统调色板,因为采集卡提供的是裸图形式,既纯图像数据,没有图像的规格和调色板信息,这些需要开发者自己规定实现,下面是实现的部分代码:

CTestView::CTestView()

{

W32_Init_MPE1000();//初始化采集卡

W32_Modify_Contrast(50);//下面的函数是为了对采集卡进行预设置

W32_Modify_Brightness(45);//设置亮度

W32_Set_HP_Value(945);//设置水平采集点数

wCurrent_Frame=1;//当前帧为1,获取的图像就是从这帧取得的

//设置采集信号源,仅对MPE1000有效

W32_Set_Input_Source(1);

W32_CACardParam(AD_SETHPFREQ,hpGrabFreq);

W32_Set_PAL_Range(1250,1024);//设置水平采集范围

W32_Set_VGA_Mode(1);

wGrabWinX1=0;//采集窗口的左上角的坐标

wGrabWinY1=0;

firstTime=TRUE;

bGrabMode=FRAME;

bZipMode=ZIPPLE;

/

lpDib=NULL;//存放获取的图像数据

}

CTestView::~CTestView()

{

W32_Close_MPE1000();//关闭采集卡

}

////显示采集的图象,双击鼠标采集停止

voidCTestView::OnGraboneframe()

{

//TODO:Addyourcommandhandlercodehere

wCurrent_Frame=1;

//设置采集目标为内存

W32_CACardParam(AD_SETGRABDEST,CA_GRABMEM);

//启动采集

if(lpDib!=NULL)

{

GlobalUnlock(hglbDIB);

GlobalFree(hglbDIB);

}

//分配内存

hglbDIB=GlobalAlloc(GHND,(DWORD)wImgWidth*(DWORD)wImgHeight);

lpDib=(BYTE*)GlobalLock(hglbDIB);

hdc=GetDC()->GetSafeHdc();

if(lpDib!=NULL)

{

cxDib=wImgWidth;

cyDib=wImgHeight;

SetLogicPal(hdc,cxDib,cyDib,8);

SetStretchBltMode(hdc,COLORONCOLOR);

bGrabMark=TRUE;

while(bGrabMark==TRUE)

{

if(msg.message==WM_LBUTTONDBLCLK)

bGrabMark=FALSE;

W32_ReadXMS2Buf(wCurrent_Frame,lpDib);

SetDIBitsToDevice(hdc,0,0,cxDib,cyDib,0,0,

0,cyDib,(LPSTR)lpDib,

bmi,

DIB_RGB_COLORS);

}

//停止采集

W32_CAStopCapture();

::ReleaseDC(GetSafeHwnd(),hdc);

return;

}

////将下面这个函数添加在视图类的CTestView::OnSize()函数中,就可以对系统的调色板进行设置。

voidWINAPIInitLogicPal(HDChdc,shortwidth,shortheight,WORDbitCount)

{

intj,i;

shortcxDib,cyDib;

LOGPALETTE*pLogPal;

j=256

if((pLogPal=(LOGPALETTE*)malloc(sizeof(LOGPALETTE)+(j*sizeof(PALETTEENTRY))))==NULL)

return;

pLogPal->palVersion=0x300;

pLogPal->palNumEntries=j;

for(i=0;ipLogPal->palPalEntry[i].peRed=i;

pLogPal->palPalEntry[i].peGreen=i;

pLogPal->palPalEntry[i].peBlue=i;

pLogPal->palPalEntry[i].peFlags=0;

}

hPal=::CreatePalette(pLogPal);

deletepLogPal;

::SelectPalette(hdc,hPal,0);

::RealizePalette(hdc);

cxDib=width;cyDib=height;

if((bmi=(BITMAPINFO*)malloc(sizeof(BITMAPINFOHEADER)+j*sizeof(RGBQUAD)))==NULL)

return;

//bmi为全局变量,用于显示图像时用

bmi->bmiHeader.biSize=40;

bmi->bmiHeader.biWidth=cxDib;

bmi->bmiHeader.biHeight=cyDib;

bmi->bmiHeader.biPlanes=1;

bmi->bmiHeader.biBitCount=bitCount;

bmi->bmiHeader.biCompression=0;

bmi->bmiHeader.biSizeImage=0;

bmi->bmiHeader.biXPelsPerMeter=0;

bmi->bmiHeader.biYPelsPerMeter=0;

bmi->bmiHeader.biClrUsed=0;

bmi->bmiHeader.biClrImportant=0;

for(i=0;ibmi->bmiColors[i].rgbBlue=i;

bmi->bmiColors[i].rgbGreen=i;

bmi->bmiColors[i].rgbRed=i;

bmi->bmiColors[i].rgbReserved=0;

}

}

视频"画中画"技术

"画中画"这个概念类似与彩色电视机"画中画",就是在一幅大的图像内显示另外一幅内容不同的小的图像,小图像的尺寸大小一般地说为大图像尺寸的1/4或1/9,显示位置在大图像的右上角。这种技术不仅在电视技术中,在可视电话系统也可以发现这种技术的身影,它们都是依靠硬件来实现的,但是如何在VC开发平台上用编程语言来将该功能添加到自己开发的视频监控软件,为使用者提供更大的信息量呢?也许读者最容易想到的是首先显示大图像,然后再在一个固定位置画第二幅小图像,这种技术技术如果对于静止图像当然没有问题,但是对于视频流,由于每一秒钟需要画25幀,即25幅图像,这样一来计算机需要不停的画不停的擦除,会给用户以闪烁的感觉,如何解决这个问题呢?有的参考书上将大小图像分快显示,这种方法要将待显示的图像数据与显示位置的关系对应起来,容易出错不说,而且麻烦,且速度慢,为此,我对该方法进行了改进,得到了满意的效果。实现的代码如下:

voidpictureinpicture()

{

………………………..

CBitmapbitmap,*oldmap;

pData1=(BYTE*)newchar[biWidth*biHeight*3];//biWidth和biHeight为视频采集卡获取//的图像尺寸。

Read(pData1,bih.biWidth*bih.biHeight*3);//该函数从采集卡中获取数据

CClientDCdc(this);

m_pBMI1=newBITMAPINFO;//自定义的BMP文件信息结构,用于后面的图像显示

m_pBMI1->bmiHeader.biBitCount=24;

m_pBMI1->bmiHeader.biClrImportant=0;

m_pBMI1->bmiHeader.biClrUsed=0;

m_pBMI1->bmiHeader.biCompression=0;

m_pBMI1->bmiHeader.biHeight=biHeight;

m_pBMI1->bmiHeader.biPlanes=1;

m_pBMI1->bmiHeader.biSize=40;

m_pBMI1->bmiHeader.biSizeImage=WIDTHBYTES(biWidth*8)*biHeight*3;

m_pBMI1->bmiHeader.biWidth=biWidth;

m_pBMI1->bmiHeader.biXPelsPerMeter=0;

m_pBMI1->bmiHeader.biYPelsPerMeter=0;

////////////////////////////////////////////////////////////////////////

pData2=(BYTE*)newchar[biWidth1*biHeight1*3];//申请存放小图像的缓冲区

Read(pData2,biWidth1*biHeight1*3);////向该缓冲区读数据

m_pBMI2=newBITMAPINFO;

m_pBMI2->bmiHeader.biBitCount=24;

m_pBMI2->bmiHeader.biClrImportant=0;

m_pBMI2->bmiHeader.biClrUsed=0;

m_pBMI2->bmiHeader.biCompression=0;

m_pBMI2->bmiHeader.biHeight=biHeight1;

m_pBMI2->bmiHeader.biPlanes=1;

m_pBMI2->bmiHeader.biSize=40;

m_pBMI2->bmiHeader.biSizeImage=WIDTHBYTES(biWidth1*8)*biHeight1*3;

m_pBMI2->bmiHeader.biWidth=biWidth1;

m_pBMI2->bmiHeader.biXPelsPerMeter=0;

m_pBMI2->bmiHeader.biYPelsPerMeter=0;

//下面实现画中画的显示

CDCMemDc;

MemDc.CreateCompatibleDC(&dc);

bitmap.CreateCompatibleBitmap(&dc,biWidth,biHeight);

oldmap=MemDc.SelectObject(&bitmap);

::StretchDIBits(MemDc.m_hDC,0,0,biWidth,biHeight,0,0,—biWidth,biHeight,pData1,m_pBMI1,DIB_RGB_COLORS,SRCCOPY);//首先将大图像画在内寸上下文中

::StretchDIBits(MemDc.m_hDC,20,20,biWidth1,biHeight1,_

0,0,biWidth1,biHeight1,pData2,m_pBMI2,DIB_RGB_COLORS,SRCCOPY);//再将小图像画在内寸上下文中

::StretchBlt(dc.m_hDC,0,0,bih.biWidth,bih.biHeight,_

MemDc.m_hDC,0,0,bih.biWidth,bih.biHeight,SRCCOPY);//将结果显示在屏幕上。

MemDc.SelectObject(oldmap);

deletepData1;

deletem_pBMI1;

采集卡范文篇7

基于图像采集卡的视频图像处理系统

计算机图像处理系统从系统层次上可分为高、中、低档三个层次,目前一般比较普及的是低档次的系统,该系统由CCD(摄像头)、图像采集卡、计算机三个部分组成,其结构简单,应用方便,效果也比较不错,得到的图像较清晰。目前网上基于VC开发经验的文章不少,可是关于如何在VC开发平台上使用图像采集卡的文章确没发现,笔者针对在科研开发中积累的使用图像采集卡经验,介绍如何自己是如何将采集卡集成到图像开发系统中,希望能够给目前正需要利用图像采集卡开发自己的图像处理系统的朋友有所帮助。

使用的摄像机采用台湾BENTECHINDUSTRIAL有限公司生产的CV-155L黑白摄像机。该摄像机分辨率为752x582。图象采集卡我们采用北京中科院科技嘉公司开发的基于PCI总线的CA-MPE1000黑白图象采集卡。使用图像采集卡分三步,首先安装采集卡的驱动程序,并将虚拟驱动文件VxD.vxd拷贝到Windows的SYSTEM目录下;这时候就可以进入开发状态了,进入VC开发平台,生成新的项目,由于生产厂家为图像采集卡提供了以mpew32.dll、mpew32.lib命名的库文件,库中提供了初始硬件、采集图像等函数,为使用这些函数,在新项目上连接该动态库;最后一步就是采集图像并显示处理了,这一步要设置系统调色板,因为采集卡提供的是裸图形式,既纯图像数据,没有图像的规格和调色板信息,这些需要开发者自己规定实现,下面是实现的部分代码:

CTestView::CTestView()

{

W32_Init_MPE1000();//初始化采集卡

W32_Modify_Contrast(50);//下面的函数是为了对采集卡进行预设置

W32_Modify_Brightness(45);//设置亮度

W32_Set_HP_Value(945);//设置水平采集点数

wCurrent_Frame=1;//当前帧为1,获取的图像就是从这帧取得的

//设置采集信号源,仅对MPE1000有效

W32_Set_Input_Source(1);

W32_CACardParam(AD_SETHPFREQ,hpGrabFreq);

W32_Set_PAL_Range(1250,1024);//设置水平采集范围

W32_Set_VGA_Mode(1);

wGrabWinX1=0;//采集窗口的左上角的坐标

wGrabWinY1=0;

firstTime=TRUE;

bGrabMode=FRAME;

bZipMode=ZIPPLE;

/

lpDib=NULL;//存放获取的图像数据

}

CTestView::~CTestView()

{

W32_Close_MPE1000();//关闭采集卡

}

////显示采集的图象,双击鼠标采集停止

voidCTestView::OnGraboneframe()

{

//TODO:Addyourcommandhandlercodehere

wCurrent_Frame=1;

//设置采集目标为内存

W32_CACardParam(AD_SETGRABDEST,CA_GRABMEM);

//启动采集

if(lpDib!=NULL)

{

GlobalUnlock(hglbDIB);

GlobalFree(hglbDIB);

}

//分配内存

hglbDIB=GlobalAlloc(GHND,(DWORD)wImgWidth*(DWORD)wImgHeight);

lpDib=(BYTE*)GlobalLock(hglbDIB);

hdc=GetDC()->GetSafeHdc();

if(lpDib!=NULL)

{

cxDib=wImgWidth;

cyDib=wImgHeight;

SetLogicPal(hdc,cxDib,cyDib,8);

SetStretchBltMode(hdc,COLORONCOLOR);

bGrabMark=TRUE;

while(bGrabMark==TRUE)

{

if(msg.message==WM_LBUTTONDBLCLK)

bGrabMark=FALSE;

W32_ReadXMS2Buf(wCurrent_Frame,lpDib);

SetDIBitsToDevice(hdc,0,0,cxDib,cyDib,0,0,

0,cyDib,(LPSTR)lpDib,

bmi,

DIB_RGB_COLORS);

}

//停止采集

W32_CAStopCapture();

::ReleaseDC(GetSafeHwnd(),hdc);

return;

}

////将下面这个函数添加在视图类的CTestView::OnSize()函数中,就可以对系统的调色板进行设置。

voidWINAPIInitLogicPal(HDChdc,shortwidth,shortheight,WORDbitCount)

{

intj,i;

shortcxDib,cyDib;

LOGPALETTE*pLogPal;

j=256;

if((pLogPal=(LOGPALETTE*)malloc(sizeof(LOGPALETTE)+(j*sizeof(PALETTEENTRY))))==NULL)

return;

pLogPal->palVersion=0x300;

pLogPal->palNumEntries=j;

for(i=0;ipLogPal->palPalEntry[i].peRed=i;

pLogPal->palPalEntry[i].peGreen=i;

pLogPal->palPalEntry[i].peBlue=i;

pLogPal->palPalEntry[i].peFlags=0;

}

hPal=::CreatePalette(pLogPal);

deletepLogPal;

::SelectPalette(hdc,hPal,0);

::RealizePalette(hdc);

cxDib=width;cyDib=height;

if((bmi=(BITMAPINFO*)malloc(sizeof(BITMAPINFOHEADER)+j*sizeof(RGBQUAD)))==NULL)

return;

//bmi为全局变量,用于显示图像时用

bmi->bmiHeader.biSize=40;

bmi->bmiHeader.biWidth=cxDib;

bmi->bmiHeader.biHeight=cyDib;

bmi->bmiHeader.biPlanes=1;

bmi->bmiHeader.biBitCount=bitCount;

bmi->bmiHeader.biCompression=0;

bmi->bmiHeader.biSizeImage=0;

bmi->bmiHeader.biXPelsPerMeter=0;

bmi->bmiHeader.biYPelsPerMeter=0;

bmi->bmiHeader.biClrUsed=0;

bmi->bmiHeader.biClrImportant=0;

for(i=0;ibmi->bmiColors[i].rgbBlue=i;

bmi->bmiColors[i].rgbGreen=i;

bmi->bmiColors[i].rgbRed=i;

bmi->bmiColors[i].rgbReserved=0;

}

}

视频"画中画"技术

"画中画"这个概念类似与彩色电视机"画中画",就是在一幅大的图像内显示另外一幅内容不同的小的图像,小图像的尺寸大小一般地说为大图像尺寸的1/4或1/9,显示位置在大图像的右上角。这种技术不仅在电视技术中,在可视电话系统也可以发现这种技术的身影,它们都是依靠硬件来实现的,但是如何在VC开发平台上用编程语言来将该功能添加到自己开发的视频监控软件,为使用者提供更大的信息量呢?也许读者最容易想到的是首先显示大图像,然后再在一个固定位置画第二幅小图像,这种技术技术如果对于静止图像当然没有问题,但是对于视频流,由于每一秒钟需要画25幀,即25幅图像,这样一来计算机需要不停的画不停的擦除,会给用户以闪烁的感觉,如何解决这个问题呢?有的参考书上将大小图像分快显示,这种方法要将待显示的图像数据与显示位置的关系对应起来,容易出错不说,而且麻烦,且速度慢,为此,我对该方法进行了改进,得到了满意的效果。实现的代码如下:

voidpictureinpicture()

{

………………………..

CBitmapbitmap,*oldmap;

pData1=(BYTE*)newchar[biWidth*biHeight*3];//biWidth和biHeight为视频采集卡获取//的图像尺寸。

Read(pData1,bih.biWidth*bih.biHeight*3);//该函数从采集卡中获取数据

CClientDCdc(this);

m_pBMI1=newBITMAPINFO;//自定义的BMP文件信息结构,用于后面的图像显示

m_pBMI1->bmiHeader.biBitCount=24;

m_pBMI1->bmiHeader.biClrImportant=0;

m_pBMI1->bmiHeader.biClrUsed=0;

m_pBMI1->bmiHeader.biCompression=0;

m_pBMI1->bmiHeader.biHeight=biHeight;

m_pBMI1->bmiHeader.biPlanes=1;

m_pBMI1->bmiHeader.biSize=40;

m_pBMI1->bmiHeader.biSizeImage=WIDTHBYTES(biWidth*8)*biHeight*3;

m_pBMI1->bmiHeader.biWidth=biWidth

;

m_pBMI1->bmiHeader.biXPelsPerMeter=0;

m_pBMI1->bmiHeader.biYPelsPerMeter=0;

////////////////////////////////////////////////////////////////////////

pData2=(BYTE*)newchar[biWidth1*biHeight1*3];//申请存放小图像的缓冲区

Read(pData2,biWidth1*biHeight1*3);////向该缓冲区读数据

m_pBMI2=newBITMAPINFO;

m_pBMI2->bmiHeader.biBitCount=24;

m_pBMI2->bm

iHeader.biClrImportant=0;

m_pBMI2->bmiHeader.biClrUsed=0;

m_pBMI2->bmiHeader.biCompression=0;

m_pBMI2->bmiHeader.biHeight=biHeight1;

m_pBMI2->bmiHeader.biPlanes=1;

m_pBMI2->bmiHeader.biSize=40;

m_pBMI2->bmiHeader.biSizeImage=WIDTHBYTES(biWidth1*8)*biHeight1*3;

m_pBMI2->bmiHeader.biWidth=biWidth1;

m_pBMI2->bmiHeader.biXPelsPerMeter=0;

m_pBMI2->bmiHeader.biYPelsPerMeter=0;

//下面实现画中画的显示

CDCMemDc;

MemDc.CreateCompatibleDC(&dc);

bitmap.CreateCompatibleBitmap(&dc,biWidth,biHeight);

oldmap=MemDc.SelectObject(&bitmap);

::StretchDIBits(MemDc.m_hDC,0,0,biWidth,biHeight,0,0,—biWidth,biHeight,pData1,m_pBMI1,DIB_RGB_COLORS,SRCCOPY);//首先将大图像画在内寸上下文中

::StretchDIBits(MemDc.m_hDC,20,20,biWidth1,biHeight1,_

0,0,biWidth1,biHeight1,pData2,m_pBMI2,DIB_RGB_COLORS,SRCCOPY);//再将小图像画在内寸上下文中

::StretchBlt(dc.m_hDC,0,0,bih.biWidth,bih.biHeight,_

MemDc.m_hDC,0,0,bih.biWidth,bih.biHeight,SRCCOPY);//将结果显示在屏幕上。

MemDc.SelectObject(oldmap);

deletepData1;

deletem_pBMI1;

deletepData2;

采集卡范文篇8

关键词:雷达视频数据采集PCIPC机

在传统的雷达显示终端中所涉及到的视频信号是模拟的,随着计算机技术和IC技术的不断发展,使这种模拟信号的数字化成为可能,使得雷达视频的存储和远距离传输成为可能,并在实际中得到越来越多的应用。在基于这种技术背景下开展了相应的研究。

1视频采集方案可行性分析

方案的设计主要考虑雷达视频带宽,即距离分辨率。在采集卡部分影响带宽的数据瓶颈在于三方面:AD采样量化、FIFO读写速度和PCI的DMA速度。硬件方案中采用TLC5540,最高采样率可以达到40MHz,采样深度为8bits;FIFO采用IDT72V36100,最高读写速度可以达到133MHz;计算机PCI总线的数据带宽可达到532Mbps,在实际中,由于受硬件环境,如主机板和CPU的影响,采用133Mbps的PCI卡。在PC机部分数据瓶颈主要在于磁盘数据访问速度,普通磁盘的数据访问速度为40Mbps。若数字化雷达视频带宽达到30Mbps、量化深度为8bits,则数据采样率为30MHz,距离分辨率为300,000,000/2/30,000,000=5m,这样的分辨率能够满足一般的导航和警戒雷达。若量化深度降低,则距离分辨率将进一步提高。由以上分析可见所采用方案能够满足视频的带宽要求。

2系统实现的关键点

2.1方案中的雷达视频数据流程和结构

对于30MHz带宽的数字化雷达视频信号要求实时传输,合理地安排数据的流程非常重要。其流程如图1所示。

由底层到应用程序,雷达数据主要经过三个数据传输过程。(1)由数据采集卡至设备驱动,在数据采集卡中采用了双FIFO技术,通过DMA单个FIFO一次传输一帧雷达数据,即一个主脉冲正程的雷达回波信号。这里双FIFO的作用在于信号的实时传送,采集卡对FIF01写入时,驱动程序通过DMA将FIFO2的数据传入BLK2中,此为数据通道CH2,CHl为FIFO1与BLK2之间的通道。在系统中,CH1和CH2分时复用一个DMA通道。(2)驱动程序和显示应用模块的数据交互,采用了乒乓存储区的技术,如图1所示。当DMA占用BLKl时,显示应用程序将BLK2中的雷达视频数据读入,进行数据合并、抗异步干扰处理,并实时显示。(3)驱动模块与数据存储模块的数据交互,这个交互过程和上面相似,不过,对于BLKl、BLK2的访问都要和显示应用程序分时进行。

在时序上,各个数据通道的详细分时关系如图2所示。

如图2所示,在第N+1个主脉冲回波内,数据采集卡将AD变换之后实时数字雷达信号写入FIFO2中(数据排队),通过DMA将FIFO2的数据传入BLKl(CHl),同时将BLK2的数据传入显示应用模块(CH4)和数据存储模块(CH6)。

由于在CHl~CH6中传送的数字化雷达视频数据都有特定的时序,且都是实时数据,故通道中的数据帧格式相对简单,帧头没有同步头和差错控制。帧格式如图3所示。

图4

在帧头高字位给出13位方位码,同时预留出高3位,用以传输方位码的特征信息,如正北信号、扇区信号和图元信号,这些信号在硬件(数据采集卡)中容易实现,能节省软件的处理时间。在目前的系统中,这些特征信息还用不到,在具体到雷达数据的分析时,这些信息能起到很重要的作用。帧头的低字位给出距离信息,包括低4位的量程信息和高12位的距离采样深度。

2.2数据采集卡的实现

雷达数据采集卡在本系统中起到基石的作用,它将由雷达接收机送下来的模拟视频信号采样量化,经过量程归并后,相对于主脉冲对齐,然后加入帧头信息,通过DMA传输给驱动程序。数据采集卡的功能结构如图4所示。

图5

数据采集卡共有七个主要模块:PCI总线控制模块采用通用芯片PCI9080桥接本地总线和PCI总线;本地总线控制模块CM负责卡内控制信号和状态信号的交互;SYN为外部方位码和主脉冲的同步模块,它根据主脉冲产生AD的采样时钟和量程归并时钟;AD采用TLC5540对雷达视频信号进行采样量化;MERGE模块为量程归并模块;PACK模块将由SYN和MERGE模块送来的方位码和视频数据打包成帧,并排队送入FIFO;FIFO模块将帧结构的雷达数据通过DMA传给驱动程序。在硬件的实现上采用了可编程器件CPLD。

2.3用CPLD实现双FIFO控制

采集卡中数字化雷达视频信号在推入FIFO之前要经过打包成帧的处理,这个处理过程通过一片EPM7128SLC84—10实现。其内部的控制逻辑如图5所示。

图6

图3中,数据帧的帧头包含方位信息和数据量以及量程信息,这一部分的处理在图5的head模块中实现;视频量化深度为8位,并行推入FIFO为16位,这就需要将数据移位合并,这个过程在body模块中通过两个8位D触发器阵列实现;在主脉冲前沿需要将帧头信息插入,这个逻辑控制通过clk模块中的一个状态机实现。状态机的转移图如图6所示。

图7

状态机的时钟为数据推入时钟d_merge_clk,状态转移通过主脉冲mainpulse_syn和帧数据时钟d_pack_clk控制,其中d_pack_clk通过d_merge_clk二分频得到。通过mainpulse的上升沿判断进入新的一帧数据,通过d_pack_clk的前两个时钟周期(head_sel=1,2)插入帧头。状态机的逻辑仿真如图7所示。

对于双FIFO的乒乓操作,也是通过一个状态机实现的。状态机转移图如图8所示。

状态机的时钟为d_merge_clk,通过主脉冲main—pulse_syn控制状态转移,对FIFO1和FIFO2进行轮询操作。状态机的逻辑仿真如图9所示。

采集卡范文篇9

电力电缆测试信号消噪以及电缆测距的具体方法

小波消噪的原理。小波分析独特的时频局部性质与非平稳信号处理的需求十分之相符合,所以,小波变换就是基于传统的傅立叶变换不能满足非平稳信号处理的要求而产生的。又因为计算机处理所采用的是数字模式,这样便促使实际应用中应该首先对连续的小波变换进行离散化。通过小波变化所进行的分析就是将原始的信号分解成为高频信号与低频信号,继而采用一系列方法对高频信号中的噪声部分进行处理,最后再通过小波的重构而从中获取真实平滑的信号。小波分析法角度的奇异点检测。因为电力电缆故障测试信号中有关于故障点的各种信息,对这些信息的检测是故障测试信号冲起始点的检测,所以,电力电缆故障测距的精确度同起始点的检测精度有着直接的关系。对于脉冲波形起始点的检测有许多中方法,如目测法、斜率法以及小波分析法等。现着重介绍小波分析法对奇异点的检测。小波分析法检测奇异点的基本原理是根据信号奇异点同脉冲起始点之间的关系,然后通过小波的变换对信号奇异点的敏感性进行分析,继而针对不同类型的电力电缆来变换电信号,且采用模极大值对电力电缆的故障特征进行描述,这样一来便能及时检测出信号的奇异点并找出故障。因为不同的小波适应与不同的范围,所以,为了检测准确性的进一步提高就应该合理选取小波。电力电缆中的故障信号变化多端,采用小波变化分析需要提取的是突变的平稳信号,所以小波的选取不仅要考虑到其均匀性还要选择具有频域与时域的带通滤波性好紧支撑性能。

基于LABVIEW的电力电缆测距系统设计

早在1986年美国国家仪器公司就提出了虚拟仪器,其以计算机为基本核心,软件设计是其最为关键且复杂的部分。当前的各类虚拟仪器软件之中,LABVIEW所采用的图形化语言结构拥有强大的分析、显示和测量功能,与此同时还有着极高的开发效率,所以LAB-VIEW日益得以广泛的使用。系统软件模块的设计。本文设计的电力电缆故障测距系统如图1所示。本程序设计具有两种功能,即有自动测距和手动测距,自动测距有着较高的精度,其判断结果十分客观,具体的分析方法是通过小波分析来分析故障信号,继而找到脉冲波形的起始点,最终确定故障的距离。手动测距则时常会被人为因素所影响,存在较大的误差,手动测距是用光标确定放电脉冲和反射脉冲的起始点,然后计算这两点直接的时间差,从而确定出故障距离。系统硬件组成设计。我们可以从图1中得出,改系统的硬件主要由信号源设备、传感器、数据采集卡以及计算机构成。其检测电力电缆的故障主要是把信号源设备加到电力电缆上,传感器把信号传送给数据采集卡,数据采集卡把信号再传输给计算机进行处理、存储和显示等。由此可见数据采集卡和计算机是本系统的硬件基础,其中数据采集卡的性能对故障测试系统的精度、采样速率等主要指标造成直接影响,为了与行波传播速度快的特点相适应,本系统中所选取采集卡具有高速的采样频率。

本文作者:张喜富工作单位:兴凯湖电业局云山供电局

采集卡范文篇10

关键词:机械手;小波分析;LabVIEW;阈值;触滑觉传感器

1引言

随着现代工厂自动化和智能化以及工业4.0的发展,机械手爪在工业生产过程中有了更高要求。在机械手的触觉滑觉研究方法中,主要有触觉传感器自适应模糊控制、多感知空间控制和力外环控制等。我们采用小波分析技术对滑动信号进行变换,将细节系数作为特征值,同时设定合理的阈值判断有无产生滑动并做进一步处理。滑动信号的特点是随机和非平稳性的,用傅里叶变换难以得到其良好的局部特性,采用小波变换的方法可以很好的得到信号在时域和频域上的特征。

2传感器的选型与检测装置

2.1滑觉传感器。触觉检测是机械手基本的检测环节,而滑觉检测传感器是实现机械手柔性抓取的关键。机械手传感器具有模仿人手的接触觉、滑动觉和温度觉等等,目前常用的有压电式、压阻式等,也有将PVDF压电式与光电原理结合起来的触滑觉传感器[1]。我们实验中考虑到PVDF压电传感器的触觉信号和滑觉信号比较难以分离,我们选用FSR-402压阻传感器,该传感器可以对接触物表面进行静态和动态压力测量,可以较好的区分触觉信号和滑觉信号,同时其工作温度在-25℃~70℃,对环境抗干扰能力强。2.2USB数据采集卡与采集装置。数据采集卡(DAQ)是从传感器等设备收集模拟或者数字信号的装置,如果说传感器相当于人的触觉等感知层,那么采集卡就相当于人的神经网络传输中枢-脊椎,而上位机就相当于人的大脑。我们本次所使用的采集卡通过USB接入上位机,有16路单端/8路差分模拟输入通道,2路单端模拟输出通道,6路数字输入/输出通道,PWM输入频率在1-1MHz,输出频率在1-1MHz,占空比1%-99%,同时工作温度在-20℃~70℃,能较好适应严苛环境。。我们的采集卡通过USB连接到上位机,由其供应5V直流电源,我们从采集卡引出5V的电源线给压阻传感器供电。由于该款采集卡简化了增益编程功能等,模拟量输入信号需要事先调整到0-3.3V以内,在这种情况下我们设计了信号调理电路将较大的电压信号通过降压变换到0-3.3V范围内以满足要求。我们将传感器串联一个10KΩ的电阻,通过信号线向AD输入电压变化的范围。

3信号的小波变换与LabVIEW处理

3.1基于小波变换的信号处理。相比于傅里叶变换不得不用大量级数去拟合突变信号,通过小波变换,我们可以很好处理滑动产生的瞬时时变信号并从中提取出有用的信息,在处理过程中,我们需要将连续的小波变换进行离散化,通过采集的数据可以看到滑觉信号分布在信号的高频部分,经过小波变换后可以分解得到信号的高频成分,也就是细节分量。首先我们要定义一些信号和用到的滤波器[2]:x[n]:离散的输入信号g[n]:低通滤波器h[n]:高通滤波器↓Q:降采样滤波器通过阶层架构,我们可以看到怎么将一个离散信号进行小波变换:架构中的第α层:小波分析中,常用到来自低通滤波器的近似分量和来自高通滤波器的细节分量,高频分量包含信息的细节和差别[3-4],在机械手检测滑动过程中,一旦滑动发生高频部分会出现明显的频谱信息,我们用小波变换的细节分量作为特征值并设定合理的阈值来判断有无滑动。3.2LabVIEW软件采集与处理实验。我们通过设置把LabVIEW提供的动态连接库函数将数据采集卡附有的.dll库函数形式文件连接起来,实现对采集卡的控制和信号采集[5-6]。我们分别设置高通滤波器序列值为-0.707和0.707,低通滤波器的序列值设为0.707和0.707,将输入信号分别与高低通滤波器卷积后再进行抽样分别得到细节分量和近似分量,若我们小波分解2层,就将近似分量继续分解为高频细节分量和低频近似分量,如要继续分解以此类推[7-8]。通过一系列实验可以看到,传感器接触物体时,细节分量为较小波动的负值,传感器与物体分离时,细节分量为较小波动的正值。夹持物体发生滑动时,细节分量有较大幅值变化,并且有正负范围的波动。可以看到滑动和夹持两类细节分量的较大差别,通过设定合理的阈值可以判断滑动的有无。

4结束语