1、引言
数据采集系统涉及多学科,所研究的对象是物理或生物等各种非电或电信号。根据各种非电或电信号的特征,利用相应的归一化技术,将其转换为可真实反映事物特 征的电信号后,经A/D转换器转换为计算机可识别的有限长二进制数字编码,以此作为研究自然科学和实现工业实时控制的重要依据,实现对宏观和微观自然科学 的量化认识,典型的数据采集系统组成如图1所示。
在采集过程中,将传感器获取的参数通过A/D转换送入内存,然后由CPU对其进行分析、运算和处理,如数字滤波、量纲变换、误差修正、数字显示等。在本文 中,尝试通过利用MATLAB的数据采集工具箱对自主设计的数据采集系统[1]进行模拟仿真,结果实现了对设计系统的模拟操作检验与数据分析。为了满足实 时采集的要求,采用了Compilier编译器[2],Compilier以M语言编制的程序为输入,可以根据需要生成独立运行的应用程序或可以被 C/C++程序调用的动态链接库文件[3]。它支持MATLAB所有的内部函数,可使程序变得简洁高效。
Figure 1 典型数据采集系统的组成
2、数据采集工具箱介绍
在MATLAB数据采集工具箱里集成了数据采集的M文件格式的函数和MEX文件格式的动态链接库。其主要特征[4][5]如下:
(1) 提供了将实时测量数据从数据采集硬件采集到MATLAB中的框架。
(2) 支持模拟量输入(AI)、模拟量输出(AO)以及数字量I/O子系统,包括模拟量I/O实时变换。
(3) 支持PC声卡和业界非常流行的数据采集设备如NI卡、并行口(LPT1-LPT3)、Keithley卡等。
(4) 采用事件驱动模式进行数据采集。数据采集工具箱由三部分组成:M文件格式的函数、数据采集引擎和硬件驱动,如图2所示。这些组成部分使得MATLAB与数据采集硬件之间的信息传递成为可能。
Figure 2 数据采集引擎与硬件驱动
3、数据采集过程
3.1 数据采集的基本步骤
(1)创建设备的一个对象。对象创建函数列表如下:
Table 1 对象创建函数列表
(2)添加通道或数据线。模拟量I/O对象中用应添加通道,而数字量I/O对象中应添加数据线,与添加通道或数据线有关的函数列表如下:
Table 2 与添加通道或数据线有关的函数列表
(3)配置属性。属性分为公共属性和通道/数据线属性,而两者又再被分为基本属性与设备特有属性。其中公共属性为返回设备对象的所有可配置的公共属性 名及其可能的属性值,应将对象作为Set函数的输入参数;要返回设备对象的所有公共属性及其当前值或为显示某个属性的当前值,应将对象或属性名作为Get 函数的输入参数。对于通道/数据线属性,则使用Channel(Line)属性。
(4)获取或输出数据。包括启动设备对象,记录或发送数据及停 止设备对象三个步骤。其中启动设备执行Start函数、提取记录数据使用Getdata函数、发送数据前的数据排列使用Putdata函数、停止使用用 Stop函数;另外运行状态用Running属性标识、记录状态由Logging属性标识、发送状态由Sending属性标识,其取值均为On或Off。 对于数字量I/O对象,该部分处理有所不同。
(5)清除。当不再需要设备对象时,应使用删除函数Delete将设备对象从内存中清除,并使用清除命令Clear将对象从MATLAB工作空间中清除。
3.2 应用实例与分析
3.2.1 MATLAB对RS232 的串口通信设计
MATLAB是一个跨平台软件,而此处使用的是自主设计的数据采集卡,因此不具备直接访问的能力。但MATLAB的面向对象技术,已用一个对象把计算机串 口封装起来,只要用Serial函数创建串口对象即可[6]。关键语句为:s=serial(‘COM1’,‘BaudRate’,9600)。 MATLAB封装的串口对象支持对串口的异步读写操作,通过对异步读写设置,PC在执行读写串口函数时能立即返回,不必等待串口把数据串输完毕。当指定数 据传输结束时就触发事件,执行事件回调函数,对事件回调函数编程,进行数据处理,这样可以大大提高数据处理的效率。
MEX是MATLAB的可执行程序,是MATLAB调用其它语言编写的程序或算法的接口,在Windows环境下是扩展名为DLL的动态链接库。对MEX 编译器进行配置的方法是:在MATLAB命令窗口中运行mex-setup,选择VC6.0++作为编译器。用C语言编写端口读、写的操作程序,程序包含 有头文件mex.h和mexFunction函数,mexFunction函数中nelhs表示输出变量的个数,plhs包含指向输出变量指针的数 组,nrhs表示输入变量的个数,prhs包含指向输入变量指针的数组。接口编形成的MEX文件与参考文献[7][8]类似,在此不再累述。
3.2.2 数据采集与分析
(1)数据读取的MATLAB实现
主要代码为:
%读取通道数及总数据量
fid=fopen(‘cardiogram.add’,‘r’);
Status=fseek(fid,56,‘bof’);
nDataChNum=fread(fid,1,‘long’);
status=fseek(fid,204, ‘bof’);
nAllDataLength=fread(fid,1, ‘long’);
%按通道数循环读出各通道起始地址
status=fseek(fid,76, ‘bof’);%
for i=1: nDataChNum
pChannelAdr(i)=fread(fid,1, ‘long’)
end
%按通道数循环读出各通道数据
for i=1:nDataChNum
status=fseek(fid,pChannelAdr(i)+360, ‘bof’)
nSegNum=fread(fid,1, ‘log’)
status=fseek(fid,pChannelAdr(i)+160*nSegNum+1024, ‘bof’);
data=fread(fid,nAllDataLength, ‘short’);
end
sta=fclose(fid);
(2)数据处理与图形绘制
利用MATLAB的图形用户接口,通过编程可以很方便地构建数据采集与分析的用户交互界面。将数据采集系统采集的实际心电图信号,用RS232导入到PC 中。在MATLAB环境下,运行以上已经编好的程序,即可得到如下的模拟实验结果。不过要说明的是,此处使用的数据采集系统是八通道同步采集,而仿真时仅 使用的是其中一个通道进行的操作。
figure 3 实际心电图信号的采集与处理效果图
4、结语
使用自主开发的数据采集系统,通过合理运用串口及MTLAB强大的数值计算和分析功能,实现了基于MATLAB的实时数据处理和分析。通过模拟实验表明,该方法对于其它类似采集卡依然实用,具有一定的应用价值和发展前景。