EDN首页   博客首页

日志档案

发表于 2008-9-6 19:51:19

6

标签: 数据采集卡  USB  虚拟仪器  LabVIEW  示波器  24位采集卡  

24bit,100Ksps,双通道同步采样——MSP高动态范围USB数据采集卡测评

24bit,100Ksps,双通道同步采样:

MSP高动态范围USB数据采集卡测评

一、采集卡简介

        随着PC技术的发展和虚拟仪器技术的推广,数据采集卡逐渐被应用于越来越广的领域。然而高性能采集卡的价格始终居高不下,让很多希望以低成本搭建虚拟仪器系统的朋友望而兴叹。为了为朋友们提供一个高性价比的选择,我们特别开发了这款兼顾高速和高分辨率的USB数据采集卡,希望能为需要的朋友帮上一点小忙。

该卡的主要特点如下:

1、高分辨率。一般的数据采集卡所选用的分辨率大多为10位、12位,好一点的可以做到16位,而本卡为24位的超高分辨率。其理论分辨能力高达千万分之一,有效分辨能力达百万分之一。而10位的数据采集卡最高也只能达到千分之一的分辨率,差距显而易见。

        高分辨率直接带来的好处就是高动态范围,即用同一块采集卡,对万分之一伏到几伏范围内任何电压波动都可以准确的采集到,非常适用于对辐值相差比较大的混合信号的采集和分析。

        目前市场上也有一些24位的高端数据采集卡出售,但其价格一般都非常高。

2、高速。在高分辨率的情况下,往往会牺牲采集速度,有很多高分辨率的采集设备,有效分辨率做的非常高,但采样速度一般只有每秒几十次甚至每秒几次,不能适用于中频信号的采集。而本卡在保证高分辨率的情况下,速度可达近10万次每秒,带宽高达50KHz,足以适用于绝大部分实验室和工业现场的数据采集需要。既满足了高分辨率,又满足了高速,本卡才可算为真正实用的24位数据采集卡。

       高速带来的另一个好处是可以通过过采样的方式进一步提高有效分辨率,即牺牲采样速度来压制噪声。实测效果显示,在10sps情况下,噪声可以被控制在微伏量级,在1sps的情况下,噪声仅为的1微伏,效果极为惊人。

3、可选的大量程或微量程。根据不同的使用需要,本卡提供±10、±1、±0.1等不同量程,大量程可用于对大动态范围的信号做采集,微量程可用于采集极其微弱的小信号而无须外部放大,极大的减轻了用户的前端信号调理工作。

4、两通道同步采样。本卡提供两路同步采样通道,两通道间无采样延迟,非常适合对两路信号进行相位分析。

5、差分信号输入。与单端输入相比,差分输入避免了地电位波动造成的误差,且可抑制共模电压,极大的提高了采集精度。

6、板载一路数字信号输入\输。可以用来作为外触发或控制外部设备(如继电器)。

7、本采集卡采用USB接口通讯。即插即用,USB供电,无须外部电源,非常适合用于笔记本等移动PC设备。

8、上位机软件系统提供DLL。支持LABVIEW等专业测量测试编程平台,且提供相关子VI和例子程序,使用户拿到卡后直接可以进行基本应用而无须花费大量时间开发采集软件。本卡将陆续开发配套的示波器、数据记录仪等相关软件,为用户提供全套的应用方案。

9、本卡电路板为黑色,卡体十分高贵美观,且体积小巧,便于携带。

点击看大图

 

 

二、性能测试

1、0输入(输入短接)RMS噪声测试

        在输入端短接的情况下,我们来对采集到的噪声信号进行分析。

        首先在时域中做一个直观的感受。

点击看大图

        上图是在±1V量程下,满量程显示的显示情况,可以看到信号是0V位置笔直的一条直线。

点击看大图

        上图是在±1mV的显示范围内的波形图,可以看到在48.83Ksps的采样率下,两路信号清晰可见,经过调整偏置归零后,可见RMS噪声辐值半径大概在50微伏左右。

         下面看看频谱的情况:

点击看大图

97.66Ksps采样率模式下

        可见,在97.66Ksps采样率模式下,绝大部分范围内RMS噪声低于-130dB,这样的表现非常出色,何况是在近百K采样率的情况下。

2、动态测试:±10V量程,通道0接入100Hz幅值为10V的正弦信号,通道1短接。

        首先看一下时域波形。

点击看大图

        第0路信号可以看到清晰完整的标准正弦波,信号辐值为10V,细节处很光滑,看不到毛刺或阶梯状的量化误差,这是高分辨率的效果。

点击看大图

        再来看通道1,虽然通道0输入了10V的大电压,通道1仍然保持着平稳的直线,并没有受到干扰,说明通道间的隔离效果很好。

3、通过过采样法,在10sps采样率下得到的超低噪声

        本采集卡具备很高的采样率,这就意味着可以通过过采样的方法进一步压低噪声。在48.86Ksps的实际采样率下,通过对4736个点做平均可以得到10sps下的过采样信号。通过实际测试,发现该方法可以极大的压制噪声,提高有效分辨率。实测情况下,噪声频谱达到了惊人的-150dB,RMS噪声仅在几个微伏的范围内波动,实在让人惊叹。

点击看大图

三、上位机软件资源

1、简单易用的DLL

        为了便于用户使用采集卡,我们把复杂的硬件驱动和数据处理封装在了动态链接库中,用户只需要通过简单的函数和参数传递,就可以直接从DLL中读到真实的电压数据,无须再关心如何与硬件做通讯和解码ADC数据。而且DLL为通用链接库,无论是VC、VB、LABVIEW、MATLAB还是其他高级编程语言都可以自由的调用,极大的提高了采集卡的适用性。

        DLL中仅包括四个函数,分别为设置采样率、读取数据、设置CON模式和设置CON电平。其中最主要的是设置采样率函数和读取数据函数,下面以该函数为例讲解如何在VC、VB及LABVIEW下进行数据采集。

       函数定义如下:

       设置采样率 int SetSampleRate(int Modal, int DeviceNumber)      

       Modal :0sleep 197.66k 248.33k 319.53k 49.766k 54.883k 60.976k sps)。

       DeviceNumber:设备序号,最多支持10个设备同时连接,默认值为0。

      函数返回值:1(设置成功);0(设置失败)。

 

      读取数据   int GetVoltage(float * DataArray0,  float * DataArray1,  int ArraySize, float range0,  float range1,  float Offset0,  float Offset1, int DeviceNumber)

      DataArray0,DataArray1:保存通道0和通道1数据的缓存数组,大小必须大于ArraySize参数值,取数组首地址的指针作为参数传递。函数运行成功后,数组里的数据将被更新,更新后的数据即是采集卡得到的电压数据。

      ArraySize:缓存数组的大小,运行一次函数每个通道将读取ArraySize大小的数据点。ArraySize大小无限制,但必须为64的整数倍,否则采集会出错。

      range0,range1:通道0和通道1的最大正量程,如1,10。如果需要对数据进行整体放大或缩小处理,可以直接将系数乘以最大正量程后作为range参数输入。

      Offset0,Offset1:同道0和通道1的偏置电压,用来给波形调零或统一加上或减去一个值。

       返回值:0(读取失败);1(当前CON值为低电平);2(当前CON值为高电平)。

 

VC:

#define Sleep 0

#define 97.66Ksps 1

#define 48.86Ksps 2 

int SetSampleRate(int Modal)  //输出实时模拟信号
{
 HINSTANCE hDll;
 hDll=LoadLibrary("HighSpeed 24bit DAQCard.dll");
 typedef int(*lpSSR)(int Modal, int DeviceNumber);
 if(NULL==hDll)
 {
  AfxMessageBox("Cann't find DLL");
  return 0;
 }

 lpSSR SampleRate=(lpSSR)GetProcAddress(hDll,"SetSampleRate");

 if(NULL==SampleRate)
 {
  AfxMessageBox("Cann't find <SetSampleRate> function");
  return 0;
 }

 return SampleRate(Modal,0);
}

#define DF_range0 10         //量程和偏置值

#define DF_range1 10

#define DF_Offset0 0

#define DF_Offset1 0

int GetVol(float *DataArray0, float *DataArray01, int ArraySize)  //输出实时模拟信号
{
 HINSTANCE hDll;
 hDll=LoadLibrary("HighSpeed 24bit DAQCard.dll");
 typedef int(*lpGV)(float * DataArray0,  float * DataArray1,  int ArraySize, float range0,  float range1,  float Offset0,  float Offset1, int DeviceNumber);
 if(NULL==hDll)
 {
  AfxMessageBox("Cann't find DLL");
  return 0;
 }

 lpGV GetVoltage=(lpGV)GetProcAddress(hDll,"GetVoltage");

 if(NULL==GetVoltage)
 {
  AfxMessageBox("Cann't find <GetVoltage> function");
  return 0;
 }

 return GetVoltage(DataArray0,DataArray1,ArraySize,DF_range0, DF_range1,DF_Offset0, DF_Offset1, 0);
}

 

#define DF_ArraySize 64*16   //1024 

float TEST(void)

{

float DataArray0[DF_ArraySize ];    //缓存数组

float DataArray1[DF_ArraySize ];

int i = 0;

SetSampleRate(48.86Ksps );

GetVol(DataArray0,DataArray1,128);  //先读一次128个数据,清缓存

GetVol(DataArray0,DataArray1,DF_ArraySize); 

/////////////////////此处添加对数据的处理语句,如:

float Sum = 0;

for(i = 0; i  < DF_ArraySize ; i++)Sum = Sum + DataArray0[i];

Sum = Sum/DF_ArraySize;

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

SetSampleRate(sleep );

return Sum;

}

 

VB

        VB中需要对DLL及函数做如下声明:

(例)  Private Declare Function SetSampleRate Lib "HighSpeed 24bit DAQCard.dll" (ByVal Modal As Integer, ByVal DeviceNumber As Integer) As Integer

       声明后即可正常调用

 

LABVIEW

        首先,在LABVIEW新建一个VI中调用DLL,选择相应的函数并配置参数后,将DLL运行方式设定为“可重入执行”模式即可。然后将该VI配置为子VI,并配置好相关接口。此时可在主VI中调用该子VI,并像其他VI函数一样使用即可。

        相关子VI已在采集卡配套资料中附带,用户可进行调用和参考。

如:采集数据的LABVIEW子VI

点击看大图

本卡已在淘宝上出售,淘宝网址:http://shop34880090.taobao.com/  

咨询邮箱:blackeyes1983@163.com

系统分类: 虚拟仪器   |   用户分类: USB数据采集卡   |   来源: 原创   |   【推荐给朋友】   |   【添加到收藏夹】

    阅读(620)    回复(1)  

投一票您将和博主都有获奖机会!

  • BrowserCh

    2008-9-26 12:14:33

    楼主 您好 真的很厉害 佩服! 正在做毕业设计 非常偶然的机会让我做这个东西跟您的差不多吧 正在看USB的部分 我用st的stm32做的 正在准备中 stm32内部有12位的adc 还有USB控制器 所以用他来做比较的方便 还希望能得到您的指点 还有您的修改的那个虚拟的示波器真的很酷 能不能传给我一份 我的邮箱:chwcumt@126.com 先谢谢了