1.1 MATLAB的数据采集工具箱
MATLAB环境下的数据采集工具箱可以简化和加快数据的采集工作,使用这种工具箱更容易将实验测量、数据分析和可视化的应用集合在一起。数据采集工具箱提供了一整套的命令和函数,通过调用这些命令和函数,可以直接控制各种与PC兼容的硬件设备的数据采集和通信。
1.1.1 数据采集工具箱简介
MATLAB环境下的数据采集工具箱可以简化和加快数据的采集工作,使用这种工具箱更容易将实验测量、数据分析和可视化的应用集合在一起。数据采集工具箱提供了一整套的命令和函数,通过调用这些命令和函数,可以直接控制各种与PC兼容的硬件设备的数据采集和通信。
每一种厂商的硬件数据采集设备的内部特性对MATLAB接口来说都是透明的。无论使用一个或几个硬件设备,数据采集工具箱会向所有的硬件设备提供单一的和统一的接口。使用一整套熟悉的MATLAB命令可以对单个接口板进行访问并对它的属性进行完全的控制。
因为数据采集工具箱集成在MATLAB之中,所以在进行数据采集的同时,可以对采集的数据进行实时分析,或者存储后进行处理,或者针对数据分析的需要对测试条件的设立进行不断更新,还可以利用MathWorks的特殊应用工具箱和Simulink工具箱的功能提供额外的分析和建模能力。应用数据采集工具箱提供的函数和命令可以控制任何类型的数据采集。例如,在硬件设备运行时,可以获取事件信息,评估采集状态,定义触发器和回访状态,预览数据以及进行实时分析,可以设置和显示所有的硬件特性以满足用户的技术指标。
1.数据采集工具箱组件
数据采集工具箱包含有三种组件:M文件函数(M-File Functions)、数据采集引擎(Data Acquisition Engine)和硬件驱动接口(Hardware Driver Adaptors)。MATLAB程序通过这三种组件实现与数据采集硬件(Data Acquisition Hardware)的互连与信息传递,它们之间的关系如图1-1所示。
图1-1 MATLAB数据采集工具箱提供的三种组件与硬件之间的关系图
在MATLAB工具箱、硬件驱动程序和硬件之间传递的信息内容包括属性值(Property Values)、数据(Data)和事件(Event)。通过属性值可以配置数据采集程序的设置;数据是我们要采集的信号(或者要输出的信号);事件由数据采集系统底层应用产生,可以用来触发指定的回调函数。
1)M文件函数(M-File Functions)
任何一个MATLAB的应用程序都必须使用M文件。进行数据采集之前,我们必须在MATLAB环境下调用一个或一些由M文件所构成的函数,以完成特定的数据采集任务。
在数据采集应用系统中,使用M文件可以实现以下功能:
- • 创建设备对象,为硬件提供功能性的通路和控制数据采集过程;
- • 通过将信息传递给硬件或从硬件获取信息来控制采集过程;
- • 通过来自硬件的特定信息获得数据采集过程中的一些状态。
2)数据采集引擎(Data Acquisition Engine)
数据采集引擎是MEX文档格式的动态链接库(DLL)文件。数据采集引擎的功能如下:
- • 存储设备对象以及其属性值,用于控制数据采集;
- • 控制事件同步;
- • 负责采集数据的存储以及数据的输出。
当DAQ引擎执行数据采集任务时,MATLAB能够用于分析所获得的数据等其他工作,这就是说,DAQ引擎或MATLAB是异步工作的。
3)硬件驱动接口(Hardware Driver Adaptors)
硬件驱动接口负责在数据采集引擎和硬件驱动程序之间传递信息。在使用MATLAB的数据采集工具箱进行数据采集之前必须在操作系统里装上数据采集硬件的驱动程序。目前,MATLAB的数据采集工具箱提供的数据采集硬件接口有以下7种。
- • windows:支持系统声卡;
- • parallel:支持系统并口;
- • nidaq:支持NI(National Instruments)的产品;
- • mcc:支持Measurement Computing产品;
- • keithley:支持Keithley产品;
- • hpel432:支持Agilent Technologies产品;
- • advantech:支持Advantech产品。
2.检查数据采集工具箱信息
1)查看一般信息
可以使用daqhwinfo命令获得数据采集工具箱的信息。
>>out=daqhwinfo out= ToolboxName: 'Data Acquisition Toolbox' ToolboxVersion: '2.7 (R14SP3)' MATLABVersion: '7.1 (R14SP3)' InstalledAdaptors: {4x1 cell}
从中可以看出,InstalledAdaptors里包含的是系统已经安装了的数据采集硬件,可用如下命令进行详细查看。
>> out.InstalledAdaptors ans= 'advantech' 'nidaq' 'parallel' 'winsound'
由上可以看到计算机里除了安装了声卡,以外还安装了其他数据采集设备。
2)查看硬件信息
要查看某一硬件的具体信息,使用带参数的daqhwinfo即可,可用下面的命令查看声卡的具体信息。
>> out=daqhwinfo('winsound') out= AdaptorDllName: [1x64 char] AdaptorDllVersion: '2.7 (R14SP3)' AdaptorName: 'winsound' BoardNames: {'Realtek AC97 Audio'} InstalledBoardIds: {'0'} ObjectConstructorName: {1x3 cell}
由上可以看出,ObjectConstructorName里面包含有声卡支持的设备对象创建函数名。用下面命令可以查看具体的创建函数。
>> out.ObjectConstructorName(:) ans= 'analoginput('winsound',0)' 'analogoutput('winsound',0)' ''
从显示的信息中可知,这款声卡支持模拟输入和模拟输出,并且还提示了应该如下创建对象:
- • 创建输入对象ai=analoginput('winsound');
- • 创建输出对象ao=analogoutput('winsound')。
3)查看设备对象信息
要查看某一特定设备对象的信息,使用已经创建的设备对象作为参数调用函数daqhwinfo即可,运行如下命令。
>>ai=analoginput('winsound'); >> out=daqhwinfo(ai) out= AdaptorName: 'winsound' Bits: 16 Coupling: {'AC Coupled'} DeviceName: 'Realtek AC97 Audio' DifferentialIDs: [] Gains: [] ID: '0' InputRanges: [-1 1] MaxSampleRate: 44100 MinSampleRate: 8000 NativeDataType: 'int16' Polarity: {'Bipolar'} SampleType: 'SimultaneousSample' SingleEndedIDs: [1 2] SubsystemType: 'AnalogInput' TotalChannels: 2 VendorDriverDescription: 'Windows Multimedia Driver' VendorDriverVersion: '5.10'
由上面信息可以看出,使用的这款声卡(c-Medlia Wave Device)的输入设备对象所支持的最低采样频率是8kHz,最高采样频率是44.lkHz,转换位数是16位,输入范围为-1~1V,双极性,两个通道。
1.1.2 数据采集工具箱函数
本节按照功能归类列出数据采集工具箱的所有函数,以便读者参考。设备对象分为以下三种类型。
- • AI:analog input,模拟输入;
- • AO:analog output,模拟输出;
- • DIO:digital I/O,数字量输入/输出。
1)创建设备对象的函数
创建设备对象的函数见表1-1。
表1-1 创建设备对象的函数
2)增加通道或线路的函数
增加通道或线路的函数见表1-2。
表1-2 增加通道或线路的函数
3)读取或设置属性值的函数
读取或设置属性值的函数见表1-3。
表1-3 读取或设置属性值的函数
4)执行函数
执行函数见表1-4。
表1-4 执行函数
5)数据函数
数据函数见表1-5。
表1-5 数据函数
续表
6)帮助函数
帮助函数见表1-6。
表1-6 帮助函数
7)通用函数
通用函数见表1-7。
表1-7 通用函数
1.1.3 数据采集输入设备的对象属性
数据采集输入设备的对象属性可以分为公共属性和通道属性两类,公共属性作用于所有通道,而通道属性只作用于当前通道。
1.公共属性
根据用途不同,公共属性又可分为以下几类。
1)基本配置属性
- • SamplesPerTrigger:每次触发的采样数目;
- • SampleRate:采样频率;
- • TriggerType:触发方式。
2)存放属性
- • LogFileName:存放信息的文件名;
- • Logging:数据是否保存内存或文件;
- • LoggingMode:采集数据的保存模式;
- • LogToDiskMode:数据、事件和硬件信息的保存模式。
3)触发属性
- • InitialTriggerTime:首次触发的绝对时间;
- •mAnualTriggerHwon:手动触发启动设备;
- • TriggerFcn:触发时的回调函数;
- • TriggerChannel:触发通道;
- • TriggerConditlon:触发条件;
- • TriggerConditionValue:触发条件值;
- • TriggerDelay:触发到保存数据间的延时;
- • TriggerDelay Units:触发延时单位;
- • TriggerRepeat:触发的重复次数;
- • TriggersExecuted:已经执行了的触发次数;
- • TriggerType:触发方式。
4)状态属性
- • Logging:正在存放数据;
- • Running:设备正在运行;
- • SamplesAcquired:需要的采样点数;
- • SamplesAvailable:引擎中的有效采样点数。
5)回调属性
- • DataMissedFen:丢失数据时回调函数;
- • InputOverRangeFcn:输入超过设定范围时回调函数;
- • RuntimeErrorFcn:运行时错误函数;
- • StartFcn:启动时回调函数;
- • StopFcn:停止时回调函数;
- • TimerFcn:定时器回调函数;
- • TimerPeriod:定时器周期;
- • TriggerFcn:触发时回调函数。
6)通用属性
- • BufferingConfig:为每个通道开辟的缓冲区(内存)大小;
- • BufferingMode:开辟缓冲区的方式;
- • Channel:对象的通道;
- • EventLog:对象事件日志;
- • Name:对象的描述名称;
- • Tag:对象的身份标签(ID);
- • Timeout:设置读取数据的超时;
- • Type:对象类型;
- • UserData:与对象关联的数据。
2.通道属性
- • ChannelName:通道的描述名称;
- • HwChannel:对应的硬件通道号;
- • Index:MATLAB中的指数;
- • InputRange:输入范围;
- • NativeOffset:原始数据与双精度型(double)数据互换时的偏移量;
- • NativeScaling:原始数据与双精度型(double)数据互换时的比例因子;
- • Parent:父对象(设备对象);
- • SensorRange:传感器的输入范围;
- • Type:通道类型;
- • Units:工程单位;
- • UnitsRange:工程单位的范围。
1.1.4 MATLAB数据采集步骤
在MATLAB中提供了数据采集工具箱,调用该工具箱使MATLAB可以控制NI的DAQ采集卡,完成采集与分析任务。MATLAB通过NI-DAQ控制NI的采集卡,在编程、调试与使用前,应正确安装采集卡的驱动程序,并在NI-MAX中对采集卡做好设置,使其能够正常工作。
1.通过MATLAB编程实现MATLAB与NI采集卡的连接
MATLAB将NI采集卡等设备都作为对象处理,其后的一切操作与硬件不直接相关,而是通过对该对象的操作来作用于硬件设备的。而对于该系统来说,用NI采集卡采集数据,实际上输入/输出的都是模拟信号,因此在MATLAB中,只要使用相应的语句就可以很容易地实现MATLAB与NI采集卡的连接。
MATLAB中有analoginput语句,专门用于建立模拟信号输入,其语法为:
AI=analoginput('adaptor',ID)
其中,adaptor是硬件设备的对应名称,MATLAB所支持的硬件设备包括advantech、hpel432、keithley、mcc、nidaq和winsound。ID则是硬件设备的标识,如果硬件设备是声卡,则ID标识可以不要。对于该系统,由于是用NI采集卡作为采集硬件设备,则用以下语句:
AI=analoginput('nidaqr',1)
就可以使MATLAB在众多的PC硬件中找到NI采集卡,并创建一个模拟数据的采集目标。此处ID在不同配置的机器下可能不同,可自行设定。
当一个输入目标被创建之后,它不可能占用所有的硬件信号通道。为了操控硬件设备,必须创建一条专用的通道用于模拟信号数据的传输。这就要用到MATLAB中的addchannel语句。其语法一般为:
chan=addchannel(obj,hwch)
其中,obj是模拟输入或输出的目标,在这里是上述的“AI”;hwch是指定设备的ID数量。对于该系统,指定hwch为1。所以创建数据传输通道的语句如下:
chan=addchannel(AI,1)
2.设置采样频率和采样时间以及采样点数
对于设定采样时间、频率和采样点数,可以由以下语句完成:
duration=2; Fs=8000; Blocksize=duration*Fs;
考虑到以后在设计图形用户界面的时候可以在界面上对它们进行设置,所以可利用MATLAB中的set语句对它们进行赋值。其语法格式为:
set(object,'property',value);
在该系统中,object为AI,property为SampleRate,而value取为8000,即
set(AI,'SampleRate',8000);
当要设置采样点数时,object为AI,property为SamplesPer Trigger,而value为duration*ActualRate,即
set(AI,'SamplesPer Trigger',duration*ActualRate);
而在此之后则可以使用get语句将设定好的值传送给变量,其基本语法格式为:
get(ob,'PropertyName')
其中,ob为目标名称,在这里为AI,PropertyName为数值来源名称,在这里为SampleRate和SamplesPer Trigger,即
ActualRate=get(AI,'SampleRate'); blocksize=get(AI,'SamplesPer TfiggeI');
所以该部分的全部语句为:
duration=2; %设定采样时间(单位:s) set(AI,'SampleRate',8000); %采样频率设置为8kHz ActualRate=get(AI,'SampleRate'); set(AI,'SamplesPer Trigger',duration 3 ActualRate); blocksize=get(AI,'SamplesPer TfiggeI'); %设置数据块大小(也就是采样点数) Fs=ActualRate
3.设置触发方式
在MATLAB中,Manual为手动触发,Immediate为自动触发,Software为软件触发,Hardware为硬件触发。
由于要随时采集数据,所以该系统采用手动触发方式,其MATLAB语句为:
set(AI,'Trigger Type','Manual');
4.开始采集数据
当NI采集卡的数据采集参数设置完成后,即可启动该设备进行数据采集,其语句格式为:
start(AI); trigger(AI); data=getdata(AI);
5.停止并删除NI采集卡设备
当数据采集完成后,NI采集卡设备仍然保留在系统中,为了清除该设备,应使用如下命令:
stop(AI); delete(AI);
其中,stop命令将停止NI采集卡设备运行;delete命令将从系统中删除NI采集卡设备。若在退出数据采集任务之前,未执行上述两条语句,在退出数据采集任务之后,系统中将仍然保留NI采集卡设备,在下一次启动数据采集任务时系统将会发出NI采集卡设备在使用中的错误信息。因此,在退出数据采集任务之前,必须执行上述两个命令来删除NI采集卡设备。
6.绘制采集数据的时域和频谱波形
在MATLAB的二维绘图指令中,最重要、最基本的指令是plot,其他许多特殊的绘图指令都是以它为基础形成的。作为绘制线性坐标平面图形的函数plot,对于不同的输入参数,该函数用不同的形式可以实现不同的功能。
1)绘制时域波形
绘制时域波形可以使用plot(x)命令,plot将以该向量元素的下标为横坐标,元素值为纵坐标绘制一条连续曲线。下面是时域波形的绘制程序:
axes(handlesl time_axes2); %确立该图在界面上的位置 plot(data); %绘制时域波形; gridon; %加坐标网格 ylabel('voltage(V)'); %y轴名称为voltage(V)。
2)绘制频谱波形
要绘制频谱波形,可使用命令plot(x,y),y是同维向量,polt将绘制出以x,y元素为横、纵坐标的曲线。
首先进行快速傅里叶变换。傅里叶变换具有明确的物理意义,即变换域反映了信号包含的频率内容,因此傅里叶变换是信息处理中最基本也是最常用的变换。MATLAB提供函数daqdocfft来实现这个功能,其格式为:
"f,mag"=daqdoefft(data,Fs,blocksize);
其中,data是采集到的数据;Fs为采样频率;blocksize为采样点数。
为了更好地观察频谱波形,该系统还使用了grid on命令,该命令主要用于在坐标平面上加上网格,从而更有利于观察和分析。下面是绘制频谱波形的程序。
"f,mag"=daqdocfft(data,Fs,blocksize); %进行FFT(快速傅里叶变换) axes(handleslf requency_axesl); %确立该图在界面上的位置 plot(f,mag); %绘制频谱图 grid on; %加坐标网格 ylabel('magnitude(dB)'); %y轴名称为magnitude(dB) xlabel('frequency(Hz)'); %x轴名称为frequency(Hz)
7.保存数据
MATLAB的数据保存语句比较简单,这里只是先保存一下,在界面设计中将把数据打包成文件进行保存。其格式为:
save('wave','data');save FS;Save blocksize;