控制系统硬件设计方法.doc_第1页
控制系统硬件设计方法.doc_第2页
控制系统硬件设计方法.doc_第3页
控制系统硬件设计方法.doc_第4页
控制系统硬件设计方法.doc_第5页
已阅读5页,还剩27页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

MATLAB 7.0的新特性1第章控制系统硬件设计方法1.1 MATLAB控制设计方法简介子曰:“工欲善其事,必先利其器”。在计算机技术日新月异的今天,计算机已同人们的日常工作和生活越来越密切地联系在一起。而在工程计算领域中,计算机技术的应用正逐步将科技人员从繁重的计算工作中解放出来。为了满足用户对工程数学计算的要求,一些软件公司相继推出了一批数学类科技应用软件,如MATLAB、Xmath、Mathematica、Maple等。其中,Mathworks公司推出的MATLAB以其强大的功能和易用性受到越来越多的科技工作者的欢迎,因而MATLAB被称为“科学便笺式”的工程计算语言。MATLAB由主程序和功能各异的工具箱组成,其基本数据结构是矩阵。正如MATLAB的名字“矩阵实验室”,MATLAB起初主要是用来对矩阵进行操作的。但是经过不断的发展,MATLAB的工具箱涵盖自动控制、信号处理等科学技术的各个方面,它成为人们进行各领域计算的得力助手。大家知道,对控制系统进行仿真与计算机辅助设计的工作可以认为是四个阶段的有机结合,即系统建模、分析、设计与在线仿真与完善的过程。首先需要给系统建立起数学模型,然后根据数学模型进行仿真分析。在系统分析时如果发现与实际系统不符,则可能是系统的数学模型有问题,需要重新建立模型后再进行分析。建立起准确的数学模型,并分析了系统的性质后,就可以根据要求给系统设计控制器,设计后可以对系统在控制器作用下的性质进行分析,如果不理想则应重新设计控制器,然后返回分析过程,直至获得满意的控制结果。但是,很多情况下,现场情况是很复杂的,单纯的软件仿真往往不能反映真实的情况,这时就需要在线仿真,或称为系统原形的方法,现场修改设计。在控制系统的设计与应用中,对于工程技术人员而言,主要的困难有两个:一是算法设计,这个困难已经由于matlab的广泛应用而部分得到解决。二是算法与实际系统的联合调节。做控制的人对于电子设计一般不太熟悉,虽然matlab提供了一些著名的厂商的接口卡,可以直接在Simulink环境下使用,但是价格昂贵,缺乏技术细节。本章以笔者设计的采集卡为例,详细介绍数据采集系统硬件的设计细节。同时,也详细介绍了matlab本身提供的数据采集工具箱。这样,从应用到核心都可以有所了解,便于读者对此问题的深入理解。本章结合作者实际经验,详细介绍matlab环境下的硬件使用,并设计出价格便宜的AD、DA、IO接口卡,采用USB接口,能够满足大部分仿真和试验的要求。值得说明的是,本采集卡已经在河南南阳理工学院自动控制实验室投入使用,可以在matlab和simulink环境下进行所有自动控制课程实验,并且非常适合本科生的毕业设计,也适合广大工程技术人员做在线调试时使用。本章各节的内容如下:1、数据存取工具箱的整体介绍2、matlab数据存取工具箱中计算机并口的使用3、如何在数据存取工具箱中利用声卡进行采集数据采集4、基于matlab的串行数据采集开发板设计5、基于matlab的USB接口数据采集卡设计1.2 MATLAB数据存取工具箱简介Matlab数据采集工具箱是一组M-File 函数集和MEX-File 等动态链接链接库所组成的, 专门用在数据采集方面的一组函数库。它提供了以下主要的功能:1. 以相同的指令操作模拟输入(AI), 模拟输出(AO), 数字输出入(DIO)和同步模拟输出入转换各式功能, 不会因不同硬件而产生不同的指令. 2. 一个实时数据采集环境, 被测量的数据不需经由转换可直接进入MATLAB 直接进行分析. 3. 支持一些大的数据采集卡的厂商, 如: National Instruments等。4、支持计算机内部的声卡、串口和并口5、 支持事件驱动(Event-driven)的数据采集。经过不断的发展,MATLB现已自成体系。数据采集工具箱包括三个模块: (1)M-File 用户程序, (2)数据采集引擎(Data Acquisition Engine),(3)硬件驱动程序接口(Hardware Driver Adaptors)。如图1-1所示, 这些模块允许使用者在MATLAB 内和使用者的数据采集硬件之间交换数据。图1-1 matlab工具箱的软件模块读者要特别注意理解队列的作用。为了增加采集速度,matlab在应用环境到采集卡之间建立了一个数据采集引擎,核心问题就是队列。这个问题会在以后的小节中不断说明。1.3 计算机并行接口在matlab中的使用并行接口,简称并口,也就是LPT接口,是采用并行通信协议的扩展接口。Matlab数据存取工具箱提供了对并口的操作。这样,使用者可以很方便的使用并口进行数字信号的读写。并口的输入/输出电平为05伏TTL。并口的数据传输率比串口快8倍,标准并口的数据传输率为1Mbps,一般用来连接打印机、扫描仪等。有些电子爱好者使用并口设计出虚拟逻辑分析仪。Matlab提供了非常方便的操作并口的指令。对于做控制系统的设计者而言,主要是利用并口的输入、输出电平来控制外部信号。本节首先介绍并口的硬件定义,然后介绍matlab中对并口的操作方法,最后设计两个基本的实验来使读者实际应用并口。1.3.1 并口特性简介接口使用是 25 针 D 形接头,如图1-2所示。所谓 “ 并行 ” ,是指 8 位数据同时通过并行线进行传送,这样数据传送速度大大提高,但并行传送的线路长度受到限制,因为长度增加,干扰就会增加,容易出错。 图 1-2 并行接口并行接口LPT由8位双向数据线,4位控制线,5位状态线和8位地线组成。通常情况下并口可以由软件控制来操作外围设备。所以定义了很多诸如握手、应答等信号。但是,在matlab中,对于做控制的技术人员,可以将并口作为一个很好的双向输入输出设备,从而利用matlab来控制外围设备。也就是说,将并口作为典型的DIO子系统来用,可以节省很多买专用板卡的开支。注意:并行接口输出的是TTL标准的逻辑电平,输入信号也要符合TTL标准。这种特性可以使接口容易应用在电子设计中。大部分的PC并行接口能吸收和输出12mA左右的电流,如应用时小于或大于这个值,应使用缓冲电路。设计人员要特别注意如果要和外部控制电路连接,如控制电机运转等,要设计好驱动电路,避免烧毁并口。并口的各个管脚定义见表1-1。由于并口的设计原本是用于像打印机一类的设备,所以很多信号在控制中不一定有用。因此,最常用的是2-9这8位双向IO口,其中,9是最高位。Matlab将这些信号分为3大类:2-9为第一类,用于传输数据,定义PortID为0。10-13和15为第二类,用于表示状态,定义PortID为1。1, 14, 16和17为第三类,用于控制,定义PortID为2。为了便于记忆,matlab依照这种分类对端口的ID作了重新定义。可以使用matlab提供的daqhwinfo函数察看详细信息。针脚I/O信号寄存器1输入/输出nStrobe选通控制2双向Data0数据位7数据3双向Data0数据位6数据4双向Data0数据位5数据5双向Data0数据位4数据6双向Data0数据位3数据7双向Data0数据位2数据8双向Data0数据位1数据9双向Data0数据位0数据10输入nAck确认状态11输入Busy忙状态12输入Pager-Out状态13输入Select选择状态14输入/输出nAuto-Linefeed控制15输入nError/nFault状态16输入/输出nInitialize初始化控制17输入/输出nSelect-Printer控制 18-25地线Ground信号地 表1-1 例1-1:显示已安装的输入输出设备信息。out = daqhwinfo; %这是matlab提供的函数out.InstalledAdaptors则显示:ans = parallel winsound说明:笔者的计算机上matlab可以识别的设备只有并口和声卡。NI的卡maltab也可以识别,只是太贵了!例1-2:使用daqhwinfo察看并口特性。out = daqhwinfo(parallel) %显示并口的信息。则显示:out = AdaptorDllName: D:MATLAB7toolboxdaqdaqprivatemwparallel.dll AdaptorDllVersion: 2.5 (R14) AdaptorName: parallel BoardNames: PC Parallel Port Hardware InstalledBoardIds: LPT1 ObjectConstructorName: digitalio(parallel,LPT1)例1-3:建立并显示并口对象的详细信息parport = digitalio(parallel,LPT1) ; %使用digitalio函数建立一个DIO对象。out = daqhwinfo(parport); %显示此对象的详细信息则显示:out = AdaptorName: parallel DeviceName: PC Parallel Port Hardware ID: LPT1 Port: 1x3 struct SubsystemType: DigitalIO TotalLines: 17 VendorDriverDescription: Win I/O VendorDriverVersion: 1.3 out.Port(1) %显示第一类信号的详细信息则显示:ans = ID: 0 LineIDs: 0 1 2 3 4 5 6 7 Direction: in/out Config: port注意:此处ID为零就是代表第一类实际管脚为2-9的双向IO口。Matlab起名为LineIDs: 0 1 2 3 4 5 6 7,大概是为了便于记忆。依次类推,如果输入out.Port(2),则输出的是5个并口状态IO口的信息。1.3.2 并口应用函数及实例上一节已经对并口的特性有了一个基本了解,这一节我们首先介绍matlab如何利用并口输入输出数据,然后做两个实例。 Matlab对DIO子系统的读写分为三步:1、建立数字IO对象。2、添加将要使用的IO对象。3、读写这些IO管脚信号。分别对应四个函数:1、函数名称:digitalio函数功能:创建数字IO对象函数用法:DIO = digitalio(adaptor,ID)其中,adaptor是硬件适配器的名称,matlab支持像研华、NI等公司的板卡。还有就是计算机自带的声卡和并口等。ID是设备标识号。DIO是数字IO设备对象。在本节的应用中,可写为:DIO = digitalio(parallel,LPT1);2、函数名称:addline函数语法:lines = addline(obj,hwline,direction)lines = addline(obj,hwline,port,direction) 函数功能:添加将要使用的IO口。即要用到的信号线。 其中,obj是数字IO对象名称,hwline是硬件设备ID号。Direction是设定信号的方向。 3、函数名称:putvalue函数功能:写端口函数语法:putvalue(obj,data)putvalue(obj.Line(index),data) 其中,obj是数字IO对象名称,data是要写入的数据。可以使用二进制写为:putvalue(dio,0 0 1 1),或十进制写为putvalue(dio,3)。这里的line是在addline函数中产生的,代表具体管脚的名称。 4、函数名称:getvalue函数功能:读端口函数语法:out = getvalue(obj)out = getvalue(obj.Line(index) 其中,obj是数字IO对象名称,out为读出的数据。下面列举两个例子来介绍如何使用并口。在应用之前,首先要搞清楚硬件结构。如前所述,外部引脚3被matlab分为第一类lines,lineID号为1。为了读出并口的第三脚数据,要搞清楚实际引脚位置,并做一个并口连接线。常见的并口接头有两种,如图1-3所示。其中第二种可以直接压排线,比较方便。做实验的时候要特别注意引线号不能搞错了。 图1-3 并口接头好在接头引脚处会标明,字迹很小,仔细辩认即可。值得注意的是,18-25的8根线都是地线,需要连接在一起,这是基于抗干扰的考虑。这8根地线恰好将8位信号线间隔排列。由于做控制的技术人员多数是利用并口作IO口,所以并口的2-9管脚比较方便,既可以单独控制输入输出,也可以一起使用,作8位的数据传输。这个例子将使用它。 例1-4:写0 1 0 1 0 1 0 1 到并口2-9管脚。Matlab指令如下: dio = digitalio(parallel,LPT1);%创建并口对象 addline(dio,0:7,out);%设定0-7八位输出管脚 putvalue(dio,1);%发送十进制数据1到输出。使用万用表测量,就会发现,并口管脚2的电平为5V,其它3-9管脚为0V。也可以使用二进制发送同样的数据: putvalue(dio,1 0 0 0 0 0 0 0 );%发送二进制数据1到输出。 delete(dio);%删除对象注意:在这里,前面的数为低位。例1-5:读出并口外部引脚3的电平。这个例子是对1位数据进行操作。 dio = digitalio(parallel,LPT1);%创建并口对象 addline(dio,1,in);%设定lineID=1即第三管脚为输出管脚 out=getvalue(dio);%接收外界数据 由于只有一位的数据,其结果要么为0,要么为1。取决于外部电平。总之,充分利用并口可以做很多IO控制的工作,是一个多快好省的方法。网上有网友使用并口做跑马灯和逻辑分析仪,很有意思。1.4 计算机声卡在matlab中的使用计算机数据采集系统在工业控制和测试上是必不可少的。目前市场上有不少计算机数据采集卡,但它们的价格高昂。另一方面目前的计算机都配有声卡,而且它们的价格低廉,质量却不差。利用声卡对交流信号采集在一些振动测试仪和噪声测试仪中已经可以见到。Matlab数据采集工具箱提供了对声卡的支持,如果能够充分利用声卡,将能在不花任何代价的情况下,完成很多试验。同时,声卡的控制方法在matlab数据采集工具箱中和matlab支持的其它采集卡完全一致。因此,笔者重点以声卡为例,讲解数据采集工具箱的应用。当然,声卡在数据采集时也有致命的缺点。那就是不能输入、输出直流信号,限制了这种方法在某些领域的应用。Matlb提供了较强的声卡采集的能力,按照采集方法,用途的不同,笔者将其分为三类:第一类是静态采集,第二类是动态采集,第三类是利用simulink。1.4.1 声卡的静态数据采集 如果在数据采集过程中,测控技术人员仅仅是为了读取数据,观察波形,分析频谱,不需要实时运算并在线控制,可以使用matlab提供的音频操作函数。其中最重要的有4个。下面将详细介绍。(1) 函数名称:wavrecord函数功能:将声卡采集的数据录入matlab函数语法:y = wavrecord(n,Fs)y = wavrecord(.,ch)y = wavrecord(.,dtype) 参数描述:n为要抽样的点数,ch为通道数,因为声卡有两个通道,所以ch可以为1或2,分别代表左右声道。Fs为采样频率,在PC中,典型的声卡采样频率为 8000, 11025, 22500和44100点/秒。采样后的数据y都以矩阵的形式存放在matlab的workspace中。数据类型可以为double (缺省值), single, int16或uint8。(2) 函数名称:wavplay 函数功能:播放matlab的workspace中的声音矩阵。 函数语法:wavplay(y,Fs)wavplay(.,mode) 参数描述:y为声音数据,Fs为播放时的采样频率,此值应该和录音时的采样频率一致,这样播放的声音才不失真。Mode参数有两种:async和sync,其中async为缺省模式,此参数控制matlab的命令行在声音开始后立刻有效。如果采用sync,则matlab的命令行在播放完声音后才有效。(3) 函数名称:wavwrite函数功能:将声卡采集的数据存盘函数语法:wavwrite(y,filename)wavwrite(y,Fs,filename) 说明:第一种语法是将声音矩阵的数据直接存入文件名为filename的硬盘文件中。第二种除了纪录声音数据外,还要纪录采样频率的信息。(4) 函数名称:wavread函数功能:读取硬盘上的声音文件。(.wav)函数语法:y = wavread(filename)y,Fs,bits = wavread(filename). = wavread(filename,N). = wavread(filename,N1 N2). = wavread(filename,size)函数说明:wavread支持多通道数据采集,并且支持读取直到32 bits/抽样点24 bits/抽样点的.wav 文件。 y = wavread(filename) 读取指定硬盘文件,返回音频数据y。y的幅度范围应该在-1,+1。这是由硬件决定的。因为在设计声卡时,规定声卡录音的峰峰值为1V。所以超出这个范围的数据是无效的。 y,Fs,bits = wavread(filename) 返回抽样频率 Fs,每个通道的bit数和音频数据y。 其它详细用法读者可以参照matlab的帮助。例1-5:请使用matlab采集一段声音数据并进行FFT分析。Fs=8000;%设定采样频率。n=Fs*1;%设定采样长度为1S。 y = wavrecord(n,Fs,1);%正在采集左声道数据 wavplay(y,Fs);播放刚才采集的数据 yfft = abs(fft(y,512);%进行512点的fft变换f = Fs*(0:256)/512;%计算对应的真实频率plot(f,yfft(1:257);%画出频谱图。xlabel(frequency (Hz);测试此程序如下。打开matlab的data acquisition toolbox,执行function gernerater程序。这个程序是matlab提供的一个虚拟信号发生器,可以将声卡作为一个模拟输出设备,输出设定的信号。我们利用声卡产生一个1000Hz的正弦波信号。设置方法如图1-4。 图1-4 matlab自带的虚拟声卡信号发生器再设置MIC,也就是相当于传感器(Sensor)。连接好MIC与声卡的输入端。在这里,声卡的录音输入插空相当于一个AD采集卡,MIC用来采集虚拟信号发生器产生的1000Hz音频信号。而音箱在虚拟信号发生器的作用下相当于声源(Data Source)。系统连接如图1-5。图1-5 利用声卡采集声源产生的1000Hz信号执行例1-5程序后,画图1-6。从图上可以清晰的看出,在1000Hz的频率上有一个明显的峰值,正是我们利用声卡播放产生的信号。而在2000Hz处的小峰则是某种原因引起的谐波失真。图1-6 声卡采集数据的FFT分析1.4.2 声卡的动态数据采集上一小节提到的是静态的采集方法,但却有很大的局限性。所有的音频信号处理必须在录音完成之后进行,无法实时处理信号,也无法设定一个开始域值,导致录到的信号不一定是想要的信号。换言之,这种方法是串行的,单线程的,静态的。对于一个实时采集系统,必须在采集的同时能够对数据进行处理,matlab的数据采集工具箱提供了另一套实时的采集方法。这套方法也适合matlab支持的采集卡。对于大多数读者而言,使用声卡来作为数据输入设备并以此理解matlab的数据采集工具箱是一个不错的主意。更何况声卡的精度较高,采集速度也足够。对于一个典型的数据采集系统,在matlab中需要以下四步完成数据的采集工作。1、建立一个模拟输入的matlab设备对象。2、增加输入通道到这个对象。3、配置输入通道的属性4、采集数据以下将按照这四个步骤详细说明所使用的函数。1.4.2.1 声卡的设备对象先从建立声卡设备对象的函数讲起。1、函数名称:analoginput函数功能:创建声卡设备对象函数语法:AI = analoginput(adaptor)AI = analoginput(adaptor,ID) 参数描述:adaptor是硬件设备名,支持声卡、并口、NI采集卡等。在本节,我们使用声卡winsound 。ID是硬件设备辨识号。如果是声卡可以省略。AI是所创建的对象。例1-6:创建一个声卡对象。在matlab下输入:AI = analoginput(winsound);则自动产生一个名为AI的数据对象。 2、函数名称:analoginput函数功能:创建声卡设备对象函数语法:chans = addchannel(obj,hwch)chans = addchannel(obj,hwch,index)chans = addchannel(obj,hwch,names)chans = addchannel(obj,hwch,index,names)参数描述:obj是模拟输入对象。hwch是指定的需要增加的通道ID。可以使用matlab的数组表示。例1-7:增加声卡的左声道为AD输入通道。在matlab下输入: AI = analoginput(winsound);addchannel(AI,1);则AI对象中将使用声卡的左通道进行数据采集。例1-8:增加声卡左右两个通道为AD输入。 AI = analoginput(winsound);addchannel(AI,1:2);%使用matlab的向量数组。则AI对象中可以使用声卡的左右两个通道同时进行数据采集。1.4.2.2 配置输入通道的属性配置输入通道的属性涉及的问题比较多。首先,matlab将属性分为common properties(通用属性) 和 channel properties(通道属性)两种。通用属性涉及所有的通道的特性,而通道属性仅仅与每个通道有关。图1-7详细描述了通用属性和通道属性的区别。图1-7 matlab通道属性分类图在此基础上,通用属性和通道属性和通道属性又可细分为基本属性和特定设备属性。我们使用一个目录图1-8来表示这种区别。基本属性是所有采集卡都具有的属性,而特定设备属性与实际的采集卡有关,不同的硬件有不同的属性。例如,声卡就具有BitsPerSample的特定设备属性。这个属性用来设定声卡采集的数据是多少位。 图1-8 基本属性和特定设备属性的分类目录图最常用的几个基本属性如下:1、 SampleRate:用来设定通道的采样率。需要注意的是,这个采样率与硬件有关。对于声卡,采样率的范围是8000-48000。我们可以使用propinfo 函数的ConstraintValue值来观察相应硬件的采样范围。例1-9:观察自己计算机声卡的采样率范围,并设置采样率。在matlab下输入: ai = analoginput(winsound);addchannel(ai,1:2);%创建两个通道的声卡对象。rates = propinfo(ai,SampleRate);rates.ConstraintValue %观察此对象的采样率允许范围。ans =8000 44100set(ai,SampleRate,44100);%设置声卡的采样率get(ai,SampleRate,44100);%获取对象属性,即观察采样率44100 %显示数据就是刚才设置的数据2、 Trigger Types:触发方式所谓触发方式实际上是信号开始被采集的方式。常见的有超前触发、立即触发、滞后触发等。所谓超前触发实际上是指当设定的条件被满足以后,存储在内存队列里的数据多取出一些,从触发前开始提取。Matlab使用TriggerType函数对此属性进行设定。Matlab所支持的三种触发方式分别是:Immediate(立即触发)、Manual(人工触发)、Software(软件触发)。其中,Immediate是指一但采集开始执行,触发就立即执行,即数据立刻被采集处理。Manual是指当采集开始时并不立刻采集数据,一旦触发函数trigger被执行时才开始采集数据(触发函数及开始函数的使用后面会讲到)。软件触发有多种触发条件,需要使用触发条件TriggerCondition和触发条件值TriggerConditionValue两个函数。分别介绍如下。 A、函数名称:TriggerCondition函数功能:设置触发条件函数语法:set(ai,TriggerCondition,触发条件) 说明:触发条件有很多种,简述如下:1、Rising:此触发条件是指信号达到触发值并处于处于上升期时开始触发。2、Falling:指信号在下降沿时达到触发值会被触发。此条件和上一个条件正好在方向上相反。3、Leaving:当信号离开指定范围时被触发。4、Entering:当信号进入指定范围时被触发。B、函数名称:TriggerConditionValue函数功能:设置触发条件值函数语法:set(ai,TriggerConditionValue,触发条件值)说明:此函数应该和TriggerCondition函数联合使用,共同设置输入信号的触发条件。如果模拟输入不止一个通道,还要设置使用哪一个通道进行触发。TriggerChannel函数就是完成这个功能的。触发通道的指定必须在设置触发条件之前。C、函数名称:TriggerChannel函数功能:设置触发通道函数语法:set(ai,TriggerChannel,指定某通道)为了便于理解,举例如下。例1-10:试对两个声音通道进行采样,并使用右声道的数据作为触发条件。触发条件是:信号处于下降过程中并且信号值为0.2V时触发。在matlab下输入,ai = analoginput(winsound);%建立声卡采集对象ch = addchannel(ai,1:2);%添加两个通道set(ai,SampleRate,44100);%设定采样率set(ai,TriggerChannel,ch(2)%设定右声道为触发通道set(ai,TriggerType,Software)%设定触发方式为软件设定set(ai,TriggerCondition,Falling)%设定为下降时触发set(ai,TriggerConditionValue,0.2)%设定触发值为0.2V输入通道的属性还有很多,这里不再一一说明。有兴趣者请参阅matlab的帮助。1.4.2.3 采集数据配置完之后,应该启动采集卡进行数据的采集了。在matlab中,数据的采集分为三步:1、 开始采集2、 保存采集数据3、 停止采集分别用到以下几个函数。第一步:函数名称:start函数功能:开始采集函数语法:start(obj);%obj为采集对象说明:配合前面所讲的属性,采集卡在不同的触发条件下开始工作。例如,如果触发类型设为Immediate(立即触发),则执行start函数后立刻开始采集数据。如果设为人工触发,则执行start函数后并不立即启动,需要在执行trigger函数后才能开始采集。如果设定为软件触发,则按照前面所讲的触发条件满足时开始采集。如本章开始所述,数据采集是一个实时性要求很高的应用。一般情况下,为了保证在采集传输过程中数据不丢失,要使用多线程和数据队列的方法。如果在采集的过程中需要观察采集的数据,但是并不想停止数据的采集,既不希望影响队列的数据,可以使用peekdata函数。函数名称:peekdata函数功能:观察队列数据函数语法:data = peekdata(obj,samples);函数参数:obj为采集对象,samples为想要观察的采样点的数目。Data为输出的数据。例1-11:使用peekdat观察matlab数据引擎队列中 100个数据。ai = analoginput(winsound) ; % 创建声卡对象。addchannel(ai); %设定采样率set(ai,SampleRate,8000) %设定采样率set(ai,SamplesPerTrigger,8000)%触发时间设为1S,因为每秒的采样率被设定为8000个点。这个属性也很有用。如果将8000改为inf的话,采集将一直进行,直到人为停止。data = peekdata(ai,100);%在队列中取出100各数据看看。注意:由于peekdata的优先级较低,而且并不想打断队列采集的实时运行,所以peekdata所观察的数据不一定是队列中的最新数据。第二步:保存数据函数名称:getdata函数功能:从数据引擎里(队列中)取出所得到的数据函数语法:data = getdata(obj)data = getdata(obj,samples)data = getdata(obj,type)data = getdata(obj,samples,type)data,time = getdata(.)data,time,abstime = getdata(.)data,time,abstime,events = getdata(.)函数参数:sample代表要读取的点数。Type代表输出数据的数据类型,可以是双精度数或者是自然数。Time是一个与采样点对应的时间序列向量。Events是指三种事件:开始事件、触发事件和停止事件。使用方法如下:假定读者安装有Ni的数据采集卡(美国国家仪器公司,matlab直接支持),执行以下程序,就可以采集1S的数据并且存入matlab的数据空间。例1-12:4通道连续采集1S数据。ai = analoginput(nidaq,1);addchannel(ai,0:3);%4个通道同时采集set(ai,SampleRate,1000)set(ai,SamplesPerTrigger,1000) %采集1Sstart(ai);%开始采集data,time,abstime,events = getdata(ai);%读取采集数据到matlab内存EventType = events(3).Type;%获取事件3的数据类型。事件1是开始事件、2是触发事件,3是停止事件。EventData = events(3).Data;当然,如果读者想将数据存到硬盘中去,可以使用LoggingMode属性。这个属性可以设置将采集的数据存到硬盘还是内存。默认状态是存入内存了。即放在matlab的工作空间。如果数据已经存入硬盘,读者想把数据读取出来的话。可以使用daqread函数。使用方法如下:函数名称:daqread函数功能:读取硬盘中的daq数据文件函数语法:data = daqread(file)data = daqread(file,PropertyName,PropertyValue,.)data,time = daqread(.)data,time,abstime = daqread(.)data,time,abstime,events = daqread(.)data,time,abstime,events,daqinfo = daqread(.)daqinfo = daqread(file,info)说明:daq文件是matlab专门为保存采集数据设计的文件。包含有多种采集信息。如触发事件,采样事件等等。下面举例说明。例1-13:假设使用NI的数据采集卡对4路信号进行采集,时间为1S。并且要将采集到的数据存入硬盘。注:matlab支持的硬件的使用方法都是基本一样的,此处只要把nidaq换成winsound就可以使用声卡进行同样的工作。ai = analoginput(nidaq,1);%创建对象chans = addchannel(ai,0:3);%加入4路采集通道set(ai,SampleRate,1000);%采样率设为1000。ActualRate = get(ai,SampleRate);%获取采样率set(ai,SamplesPerTrigger,ActualRate)%采样1Sset(ai,LoggingMode,Disk&Memory)%将采到的数据存盘及存入内存set(ai,LogFileName,data.daq); %定义文件名start(ai); %开始采集data,time = daqread(data.daq) ; %读取所有硬盘数据data = daqread(data.daq,Samples,500 1000);%读取从500点到1000点的数据。如果想读取时间为0-0.5秒之间的数据。使用下面的语句。data = daqread(data.daq,Time,0 0.5,Channels,1 2);第三步:停止采集停止采集很简单,运行stop(obj)函数即可。一旦stop函数被运行,运行函数和存盘函数的所有属性就会被关闭,直到下一次重新开始为止。例1-14:使用实时处理的方法分析声源所发出的声音频率。我们依然利用声卡信号发生器产生一个周期为440Hz的信号,连接好MIC与声卡的输入端。在这里,声卡相当于一个AD采集卡,MIC用来采集虚拟信号发生器产生的440Hz音频信号。系统连接如下图1-9。图1-9 实时采集系统连接图程序如下:AI = analoginput(winsound);%定义声卡对象duration = 1; %采样时间为1Sset(AI,SampleRate,8000);%设定采样速率ActualRate = get(AI,SampleRate);%得到采样率数据set(AI,SamplesPerTrigger,duration*ActualRate);%设定采样长度set(AI,TriggerType,Manual);%设置触发方式为人工触发blocksize = get(AI,SamplesPerTrigger);%读取触发的数据块大小Fs = ActualRate;%对采样率重新命名,便于调用函数start(AI);%启动采集。注意:此时并未触发。trigger(AI);%开始采集data = getdata(AI);%读取采集到的全部数据delete(AI);%清除对象clear AI;%以上是采集数据的程序,matlab为数据采集提供了比较方便的模式,比较灵活。通过不同属性的设置,可以在不同条件下应用。如可以设置为信号大于某个强度才触发。下面的函数完成了对数据的处理,寻找出声源的频率。function f,mag = daqdocfft(data,Fs,blocksize) % 计算采集数据的FFT,从而寻找声源频率xfft = abs(fft(data);%避免数据为零index = find(xfft = 0);xfft(index) = 1e-17;mag = 20*log10(xfft);%使用dB的形式表示mag = mag(1:floor(blocksize/2);f = (0:length(mag)-1)*Fs/blocksize;f = f(:);grid on ylabel(Magnitude (dB);%设定坐标xlabel(Frequency (Hz);title(Frequency Components of Tuning Fork)%调用此函数可以计算出频率与幅度值。画图1-10如下:plot(f,mag)grid on ylabel(Magnitude (dB)xlabel(Frequency (Hz)title(Frequency Components of Tuning Fork);则可以很明显的看出在440Hz处有一个峰值。图1-10 实时声卡采集FFT分析如果希望程序能自动寻找出声源频率,可以使用以下命令;ymax,maxindex= max(mag);maxindex;%寻找对应纵坐标最大点的横坐标。maxindex = 441实际测量到的声源频率为441Hz。143 声卡的输出上一节讲到了利用matlab进行声卡实时数据采集的例子,这一节将利用声卡进行数据的输出,例如如何利用声卡输出一个正弦波。由于在操作流程上,输入和输出的操作差不多,所以本节就以例子为主,简要进行说明。读者要注意的是,虽然讲的仅仅是声卡的AD/DA操作,但是实际上这些方法与步骤也适合matlab支持的所有其它的数据采集卡。利用声卡输出数据的步骤如下:1、建立一个模拟输出的matlab设备对象。2、增加输出通道到这个对象。3、配置输出通道的属性4、设定输出数据5、利用声卡输出具体的过程与函数请读者参照matlab的帮助。值得注意的是触发条件的设定。输出设备的触发是指在什么样的条件下将设定的数据实际输出。一般来说,这样的触发属性的设置于所使用的DA输出卡关系很大。例如有些卡就可以有一个外部触发电平接口,当外部有一个触发电平时,开始输出数据。例1-14:利用声卡输出1S的正弦波数据。速率为8000点/S。AO = analogoutput(winsound);%建立声卡输出对象chans = addchannel(AO,1);%利用声卡的1通道duration = 1;%设定输出时间为1Sset(AO,SampleRate,8000);%设定输出采样率为8000点/SActualRate = get(AO,SampleRate);%获取采样率数据len = ActualRate*duration;%得到要输出的点数set(AO,RepeatOutput,4);%重复输出4次data = sin(linspace(0,2*pi*500,len);%设定要输出的数据为正弦波putdata(AO,data)%放8000个正弦波点到数据引擎队列putdata(AO,data) %再次放8000个正弦波点到数据引擎队列start(AO);%开始从队列中输出数据waittilstop(AO,11);%等待输出完毕delete(AO);%删除对象clear AO;%清除对象注:虽然定义的输出时间为1S,但是由于使用了两个putdata函数,同时又使用了RepeatOutput属性重复输出了4次,所以本程序实际输出的时间为10S。这里用到了两个函数需要注意一下:函数名称:putdata函数功能:向数据引擎里(队列中)存放将要输出的数据函数语法:

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论