1.2 数据采集卡MATLAB编程
本节从实用的角度出发,详细介绍了在MATLAB软件环境下,如何利用研华的数据采集与控制多功能板卡实现数据采集。还对使用MATLAB 数据采集工具箱和研华PCI-1710进行数据采集的相关设置进行了介绍。
1.2.1 概述
1.MATLAB的功能
MATLAB可以为算法开发、系统级设计和模拟提供技术计算环境之外,还可以通过其数据采集工具箱和仪器控制工具箱提供一个测试和测量环境。这样开发人员就可以使用相同的环境(语言)来开发(或模拟)和获取分析测量数据。
MATLAB数据采集工具箱(又称为DAQ工具箱)提供以下功能,它们可以将用于数据采集的传统测量编程环境发展为一种用于数据分析的应用环境。
- • 用于工业DAQ板卡的接口;
- • 单路/多路模拟量输入(AI或A/D)、模拟量输出(AO或D/A)和数字量输入/输出;
- • 用于数据测量、分析和可视化的集成环境;
- • DAQ板卡可输出MATLAB生成的测试信号;
- • 硬件、软件触发功能;
- • 使用MATLAB和其他工具箱的无缝开发环境。
本节对DAQ工具箱的基本功能模拟量输入(AI或A/D)和模拟量输出(AO或D/A)的基本使用方法进行了简要介绍。有关DAQ工具箱的高级使用,请参见随工具箱附带的“数据采集工具箱用户指南”。
在使用MATLAB进行数据采集之前,请检查是否配置以下文档、软件和硬件:MATLAB测量套件启动CD-ROM;MATLAB数据采集工具箱;MATLAB原始计算器;推荐的数据采集板卡(即DAQ板卡);连接电缆和端子板。
2.软件安装
有关DAQ工具箱的安装,请参见“MATLAB安装指南”。有关如何安装DAQ板卡、连接电缆和端子板以及验证操作的方法,请参见随DAQ板卡附带的用户手册。
安装完Advantech DevicemAnger、PCI-1710HG驱动程序和例程后,请将“MATLAB测量套件启动CD-ROM”的“Programs and Data”文件夹下所有例程的整个文件夹复制到工作目录下,并将MATLAB的当前目录移动到复制的“Programs and Data”文件夹下。
双击“MATLAB测量套件启动CD-ROM”中研华文件夹下的文件“mwAdvantech.exe”,选择如下所示的压缩文件目标文件夹,单击“Unzip”按钮继续安装:
$<MATLABroot>\toolbox\daq\daq\private
其中,$<MATLABroot>是指MATLAB的安装文件夹。如果您不清楚安装文件夹,请启动MATLAB并在命令行中输入以下内容:
>>MATLABroot ans= C:\MATLAB
解压缩过程结束后,在命令行中输入以下内容:
>> daqregister ('advantech') >> rehash toolboxcache
3.DAQ板卡验证
如何确定MATLAB能够识别已安装的DAQ板卡呢?这里假定已经安装了MATLAB/DAQ工具箱、DAQ板卡供应商提供的驱动程序和附件工具。
使用函数daqhwinfo验证DAQ板卡。启动MATLAB后,输入以下命令行获取有关DAQ工具箱的信息:
>> out=daqhwinfo
然后使用以下命令显示安装的DAQ板卡的适配器列表:
>> out=InstalledAdaptors
为了使用DAQ板卡,DAQ工具箱提供了一个专门的适配器,可将DAQ工具箱对应到每个驱动程序。
只有安装了相应板卡的驱动程序后,才会在适配器列表中显示它的适配器名。
如果DAQ板卡的适配器名没有在列表中显示,请确定是否正确安装了DAQ板卡的驱动程序和附件工具。可通过DAQ板卡的附件工具(Advantech DevicemAnager)检查板卡是否可用,可以使用此工具来确定DAQ板卡的安装是否正确。
要显示DAQ板卡的属性,将板卡适配器的名称设为参数daqhwinfo。
>> out=daqhwinfo ('advantech') out= AdaptorDllName: [1x53 char] AdaptorDllVersion:'Version 2.2' AdaptorName:'advantech' BoardNames: {'PCI-1710'} InstalledBoardIds: {'0'} ObjectConstructorName: {1x3 cell}
BoardNames 包括DAQ工具箱可使用的DAQ板卡的型号名。DAQ板卡有一个用户可配置的识别码(被叫做ID),它显示在InstalledBoardIds中。这样即使PC中安装了多块DAQ板卡,每块DAQ板卡也可以独立控制。有关ID的设置,请参见DAQ板卡的用户手册。如果DAQ板卡在InstalledBoardIds中没有显示,请确定其对应的驱动程序和附件的安装是否正确。这里使用的DAQ板卡为研华的PCI-1710,其ID号为0。
1.2.2 模拟量输入(AI或A/D)
如何将DAQ板卡测量的模拟量输入数据传送到MATLAB的DAQ工具箱呢?在这里,我们介绍一些使用信号波的模拟量输入功能,这些信号波是由测量套件捆绑的“daqfcngentm.m”输出的。
1.电缆连接
首先,将端子块上的模拟量输出通道0连接到模拟量输入通道0,连接模拟量输出GND到模拟量输入GND,这里的模拟量为单端输入。建议使用随包装附带的连接电缆。
当输入为单端时,测量DAQ板卡输入电位和GND的电位差。DAQ板卡支持差分和单端两类输入。DAQ工具箱可选择任何一种输入,输入选择取决于所选择的测量系统。
2.启动daqfcngen.m
启动daqfcngen.m。请输入以下命令,此时显示图1-2所示的对话框。
>> daqfcngen
使用DAQ板卡,函数“daqfcngentm.m”可以输出信号波、方波、三角波等。要将模拟量输入作为信号源,请进行如下配置:
① 在“Select an analog output channel”中,从下拉菜单中选择要使用的DAQ板卡。从列表中选择Channel0。选中SampleRate复选框并设为100Hz。
② 将Frequency设为10Hz。如果使用的是研华PCI-1710,将DCOffset设为2V。
③ 单击“Start”按钮。
此配置可以从端子板的模拟输出通道0输出频率为10Hz、幅度为1V的信号波。
图1-2 An Example Function Gerneratot对话框
3.通过DAQ工具箱采集数据
下面介绍如何采集来自信号波的数据,此数据使用DAQ工具箱输出。数据采集的一般流程为:创建接口对象→配置测量通道→配置属性→开始测量→数据采集→停止测量并删除对象。
1)创建接口对象
使用函数analoginput为DAQ板卡创建一个接口对象,如下所示。
>> ai=analoginput ('advantech',0) Display Summary of Analog Input (AI) Object Using'PCI-1710'. Acquisition Parameters: 1000 samples per second on each channel. 1000 samples per trigger on each channel. 1sec. of data to be logged upon START. Log data to'Memory' on trigger. Trigger Parameters: 1'Immediate' trigger (s) on START. Engine status: Waiting for START. 0 samples acquired since starting. 0 samples available for GETDATA. AI object contains no channels.
这样,变量ai就有了一个对应于研华DAQ板卡的新模拟量输入对象(称为AI对象)。在这里,函数analoginput的第一个参数为适配器名称的单引号字符串,第二个参数为获取的ID 编号。在MATLAB 中,字符串使用单引号。
2)配置测量通道
函数addchannel用来配置有效通道。如果使用通道0,输入以下命令:
>> ichan=addchannel (ai,0);
其中,函数addchannel的第一个参数为AI Object,第二个参数为Channel Number。此时将会创建一个对象(称为通道对象),以对应于加入变量ichan中的通道。
3)配置属性
创建完AI Object 和Channel Object 后,就可以配置这些对象以执行正确的操作。要配置对象,请编辑与该对象有关的属性,可以使用函数get显示与对象有关的属性。
>> get (ai) >> get (ichan)
AIObject的属性:InputType,选择差分或单端输入;SampleRate,选择采样率;SamplesPerTrigger,选择开始测量后一共测量多少个点。
Channel Object的属性:* InputRange,设定测量范围。
函数set用于配置每个属性。例如,如果要将AI Object的采样速率设置为500Hz,请输入以下命令。
>> set (ai,'SampleRate',500);
如果一个属性(如AI Object的InputType)有一个有限的设置值,则可以在不需要第三个参数的情况下,通过以下命令显示设置值的列表。
>> set (ai,'InputType') [ {SingleEnded} | Differential ]
显示列表中的{ }表示它是一个默认的设定值。按照如下所示设定AI Object的属性。
>> set (ai,'InputType','SingleEnded'); >> set (ai,'SampleRate',500); >> set (ai,'SamplesPerTrigger',500);
在上面的例子中,输入类型、采样速率和采样触发次数(采集数据量)被分别设定为单端、500Hz和500点。这样将在测量开始后1s内采集500点的数据。
下一步配置Channel Object,首先使用函数daqhwinfo显示设置值列表。
>> daqhwinfo (ai,'InputRanges') ans= 0 5.0000e+000 0 1.0000e+000 0 1.0000e-001 0 2.0000e-002 -5.0000e+000 5.0000e+000 -1.0000e+000 1.0000e+000 -1.0000e-001 1.0000e-001 -1.0000e-002 2.0000e-002
由于输出信号波的幅值为1V,请设定测量范围,这样就可以正确测量被测信号。在此例子中,从上面的列表中选择[-5 5],并输入下面的命令:
>> set (ichan,'InputRange',[-5 5]);
如果不考虑某些参数的设置,例如信号频率、幅值、测量周期等,则不能获得获得所需的测量数据。
4)开始测量
配置完属性并开始测量后,就可以获得所需的测量数据。使用函数start启动测量。使用AI Object作为参数输入以下命令:
>> start (ai);
根据SampleRate和SamplesPerTrigger属性的设置,测量时间必须为1s,但还需要进行初始化,因此需要几秒才会停止。
5)数据采集
将获取的测量数据发送到MATLAB的工作区。它有一个缓冲区,用来临时保存DAQ板卡采集的数据。如果使用函数getdata,缓冲区中的数据将被发送到工作区。在工作区保存数据后,缓冲区中的数据将被删除。例如,以下命令将保存所有500点的数据。
>> [data,time]=getdata (ai,500);
在上面的例子中,变量data获得500点的测量数据,变量time获得采样数据的时间。要使用函数plot检查测量数据,输入以下命令:
>> plot (time,data);
然后会显示图1-3所示的画面。可以看到1s的采样数据和10Hz的信号波。
图1-3 输出信号波
6)停止测量并删除对象
函数stop用于停止测量,使用AI Object 作为参数输入以下命令:
>> stop (ai);
测量完成后,可以通过函数delete删除AI对象。使用AIObject作为参数输入以下命令:
>> delete (ai);
当删除AIObject 后,ChannelObject也同时被自动删除。但尽管已经删除了对象,工作区中依然会保留变量。因此,如果要删除变量,请使用函数clear。
当要退出daqfcngentm.m的GUI画面时,单击“Stop”按钮,然后单击“Close”按钮即可。当使用函数clear删除变量时,工作区中不再有变量,但是对象并未删除。例如,当创建一个AI Object后,使用函数clear删除它的变量,如下所示:
>> ai=analoginput ('advantech',0); >> clear ai
在上面的例子中,即使工作区中没有变量,但MATLAB的存储器中依然会存在对象。可以使用函数daqfind查找并恢复MATLAB存储器中的对象。在上面的例子中,使用函数daqfind将函数clear删除的变量ai的AI Object 恢复为变量obj。
>> obj=daqfind;
在这种情况下,用户无法实时控制任何对象,程序运行也会出现混乱,因此建议删除不需要的对象。函数daqreset可以一次删除所有对象。
>> daqreset
4.创建M-File
MATLAB可以创建一个称为M-File的程序,该程序包含所有从命令行执行的命令。M-File创建为data_meas.m,添加到测量套件中。当从命令行输入data_meas时,所有执行的命令都会运行。如果再次输入daqfcngentm.m,执行data_meas.m。
5.使用帮助
下面介绍DAQ工具箱功能的帮助。
使用函数daqhelp显示Help。如果您输入以下命令,屏幕中将显示DAQ工具箱函数的列表。
>> daqhelp
要显示每个函数的帮助,选择函数名作为函数daqhelp的参数。例如,输入以下命令显示函数analoginput的帮助。
>> daqhelp ('analoginput')
函数daqhelp还能显示与每个对象有关的属性。例如,如果您要显示PropertySampleRate的帮助,将该对象变量名作为第一个参数,输入以下命令:
>> daqhelp (ai,'SampleRate')
1.2.3 模拟量输出(AO或D/A)
下面介绍在MATLAB的DAQ工具箱中,如何从DAQ板卡输出模拟量数据。本节将对各个模拟量输出函数进行介绍,DAQ板卡输出通过MATLAB的命令行产生的信号波。
本节中的电缆连接与1.2.2节相同。
本节介绍如何使用DAQ工具箱输出数据。数据输出的一般流程为:创建接口对象→配置输出通道→配置属性→生成数据和标记→开始输出→停止输出并删除对象。
1.创建接口对象
函数analogoutput为DAQ板卡创建一个接口对象,如下所示。
>> ao=analogoutput ('advantech',0) Display Summary of Analog Output (AO) Object Using'PCI-1710'. Output Parameters: 1000 samples per second on each channel. Trigger Parameters: 1'Immediate' trigger on START. Engine status: Waiting for START. 0 total sec. of data currently queued for START. 0 samples currently queued by PUTDATA. 0 samples sent to output device since START. AO object contains no channels.
这样,变量ao就有了一个对应于研华DAQ板卡的新模拟量输出对象(称为AO对象)。
2.配置输出通道
函数addchannel用于配置有效通道,如果使用通道0,输入以下命令:
>> ochan=addchannel (ao,0);
之后,Channel Object 被加入到变量ochan中。
3.配置属性
创建完AO Object和Channel Object后,就可以配置这些对象以执行正确的测量。要设定对象并编辑与该对象有关的属性,可以使用函数get显示与对象有关的属性。
>> get (ao) >> get (ochan)
现在介绍Analog Output的基本属性和输出信号波的设置。
AO Object的属性:RepeatOutput,设置重复输出数据的次数;SampleRate,选择采样率。
Channel Object的属性:OutputRange,设置输出范围。
函数set用来配置每个属性。要输出信号波,按如下所示配置AO Object的属性。
>> set (ao,'RepeatOutput',Inf); >> set (ao,'SampleRate',100);
在此设置中,循环采集次数和采样率被分别设置为Inf和100Hz。这样将在1s之内输出100点的数据,并且数据输出会重复有限的次数。
下一步设置Channel Object。首先使用函数daqhwinfo显示设置值列表。
>> daqhwinfo (ao,'OutputRanges') ans=-10 10-10 10
可以根据输出数据选择并设置最佳的范围,也可使用默认的设置。
4.生成数据和标记
现在,生成从DAQ板卡输出的信号波和标记。DAQ工具箱标记指将其缓冲区时间信息保存到输出数据中。如果数据没有标记,则无法使用Analog Output。
首先从0到0.99(间隔为0.01s)共生成100个点的数据,采样速率为100Hz,因此100个点的数据的输出将在1s内完成。
下一步通过函数sin生成输出数据y,这样它的频率和幅度分别为5Hz和1V。在这里,数据必须为列向量,因此使用(')生成时间数据t。
>> t=(0: 0.01: 0.99); >> y=sin (2 * pi * t * 5); >> plot (t,y);
要标记生成的数据y,输入函数putdata,如下所示。
>> putdata (ao,y);
如果使用研华PCI-1710,偏移输出为+2V,输入以下命令:
>> putdata (ao,y +2);
5.开始输出
设置完属性和标记数据后,就可以输出生成的数据。使用函数start开始输出。使用AO Object作为参数输入以下命令:
>> start (ao);
根据RepeatOutput和SampleRate Properties的设置,将反复输出5Hz/1V的信号波。
6.停止输出并删除对象
下面介绍如何停止输出并删除对象,但不要停止输出并删除对象。函数stop用于停止测量,使用AO Object作为参数输入以下命令:
>> stop (ao);
输出完成后,可以通过函数delete删除对象。使用AI Object作为参数输入以下命令:
>> delete (ao);
可使用1.2.2节中生成的data_meas.m来确认输出的数据。
>> data_meas
在此例子中,输出侧的采样率(500Hz)高于输入侧的采样率(100Hz)。
1.2.4 使用触发器功能
上面MATLAB生成的信号波数据相位与模拟量输入生成的信号波数据相位之间有所不同。这是因为模拟量输入采集的时间是执行函数start的时间。在此情况下,使用触发器功能设置数据采集的开始时间。
对于模拟量输入,在执行函数start之后触发器启动时开始采集数据。默认设置为Immediate Trigger,这意味着触发器在执行函数start后立即启动。MATLAB支持除Immediate Trigger之外的多种触发方式,但此文档只介绍软件触发,有关其他触发方式的详情,请参见“数据采集工具箱用户指南”。
可以使用AI Object的TriggerType属性来设置触发器。如果要修改为软件触发,使用函数set输入以下命令:
>> set (ai,'TriggerType','Software');
然后可以通过将通道的Channel Object设置为TriggerChannel属性来选择要触发的模拟量输入通道。
>> set (ai,'TriggerChannel',ichan);
此例子设置为触发器Channel 0,它是信号波自身的数据。无论是否使用软件触发,请设置以下属性:
- • TriggerCondition,设置触发器执行条件,如上升沿/下降沿等;
- • TriggerConditionValue,设置触发电压值;
- • TriggerDelay,设置触发后开始采集数据的时间;
- • TriggerRepeat,设置重复触发的次数。
为了使触发器更加稳定,将TriggerConditionValue 属性设置为t=-0.001。如果使用研华PCI-1710,输入“set (ai,'TriggerConditionValue',value +2)”;而不是“set(ai,'TriggerConditionValue',value)”;
>> value=sin (2 * pi * -0.001 * 5) >> set (ai,'TriggerConditionValue',value);
如果将TriggerDelay属性设为负值(-),可以提前开始采集数据。如果输入以下命令,则会开始测量并显示采集的数据。
>> start (ai); >> [data,time]=getdata (ai); >> plot (t,y,time,data);
输入以下命令以停止模拟量输出并删除对象。
>> stop (ao); >> delete (ao);
1.2.5 使用事件和回调
通过使用由不同事件调用的回调,DAQ工具箱可以创建更多的高级应用。本节创建一个获取daqfcngentm.m输出信号波形的M-File,每次获取一定数量的采样后计算并显示最大值和最小值之间的差,最后显示所有获取的信号波形。
创建的M-File为data_meas.m,添加到测量套件中,可以通过将Adaptor Name和ID分别设置为第一个和第二个参数来执行此M-File。
首先运行daqfcngentm.m,并设定与1.2.4节中相同的设置,以输出信号波形,在本节中将频率设为1Hz;然后显示peakmeas.m的内容,左侧的数字为行号。
M-File: peakmeas.m 1 function peakmeas (adaptor,id) 2 data=[]; 3 4 ai=analoginput (adaptor,id); 5 ichan=addchannel (ai,0); 6 set (ichan,'InputRange',[-5 5]); 7 8 set (ai,'SamplesPerTrigger',5000); 9 set (ai,'InputType','SingleEnded'); 10 set (ai,'SampleRate',500); 11set (ai,'StopFcn',@stop_plot); 12 set (ai,'SamplesAcquiredFcn',{@view_meas}); 13 set (ai,'SamplesAcquiredFcnCount',500); 14 set (ai,'UserData',data); 15 16 start (ai); 17 18 function stop_plot (obj,event) 19 data=get (obj,'UserData'); 20 figure; plot (data); 21 delete (obj); 22 clear all; 23 24 function view_meas (obj,event) 25 data=get (obj,'UserData'); 26 buff=getdata (obj,500); 27mAxval=max (buff); 28 minval=min (buff); 29 ppdata=maxval – minval 30 data=[data; buff]; 31set (obj,'UserData',data);
peakmeas.m中使用事件或回调的部分为StopFcn中的第11行和SamplesAcquiredFcn中的第12行。当发生显示测量结束(如执行函数Stop,通过函数SamplesPerTrigger设定的结束测量等)的事件时,StopFcn属性选择一种要回调的函数,将@添加到要回调的函数名开头。在上面的例子中,为了回调函数stop_plot,我们将@stop_plot 设定为StopFcn属性。
要回调的函数显示在18~22行。第18行定义了要回调的函数,并选择obj和event作为输入参数。无论何时使用回调功能,这些变量都必须是固定的。obj必须使用生成的对象替换,event必须使用事件内容替换。这样,在第21行使用函数delete删除了发生为事件的对象(第4行创建的ai对象)。
通过第13行SamplesAcquiredFcnCount设定的采样数量被测量之后,SamplesAcquiredFcn属性选择要回调的函数,在此例子中,view_meas被选为要回调的函数。如果设定函数名旁边的变量名,可以将变量关联到要回调的函数。第24~31行显示了要回调的函数。在第14行,通过将温度数据的变量data设置为UserData,更新在view_plot中测量的温度数据。在获取并更新变量data(被函数get、view_plot设为UserData属性)之后,再次将变量数据设置为UserData属性。在此情况下,如果要使用在主函数和回调函数之间使用相同的变量,使用UserData property 属性就更为方便。
有关DAQ工具箱的高级使用,请参见随工具箱附带的“数据采集工具箱用户指南”。