分享

深入理解数据采集卡中AD模数转换分辨率

 青山代码yyf 2023-01-05 发布于广西

大家好,这里是云脉冲科技,今天来为大家讲解一下电子技术中常见的AD转换中的分辨率。

一、 AD转换概念

AD转换,也称为模数转换。是指将模拟信号转换为数字信号的过程,通常是依靠AD转换器来实现。

AD转换器也可称为ADC,这里的C是convertor,指转换器。

在AD转换过程中,通常要经过采样→保持→量化→编码四个过程。不过这四个过程通常不用人为的去设计操控,通过AD转换器的工作即可帮我们完成。

当我们把模拟信号转换为数字信号之后,就可以在电脑上用软件对信号进行处理。例如我们可以将采集得到的模拟电压量转换为数字形式显示,以此方便我们监测电压。

二、 AD转换精度

在AD转换中,有一个重要的参数,那便是转换精度。

转换精度主要可以分为理论转换精度和实际转换精度。

理论转换精度,我们也可以称为AD转换器的分辨率。一般我们可以按位数将AD转换器分为4位、6位、8位…等等。位数越高,分辨率也就越高。一般来说,n位的AD转换器的分辨率为2的n次方。

例如:4位的AD转换器分辨率为2^4。12位的转换器为2^12。

假如量程是5V,用12位的转换器采集电压时,能采集得到的最小电压值为5/2^12=1.2(mV)

这1.2mv就是该12位AD转换器的最大测量长度,也就是量程定下来了以后,12位即把这个量程分成4096等分,每一等分是:

量程 / 4096

如果我们想让最大测量长度变得更小,精度更高,我们可以增加AD转换器的位数。例如使用16位的AD转换器进行采集,这样就会变为:

5/2^16=0.08(mV)

实际转换精度,主要由转换误差来决定。众所周知,电路中的元件并不可能完全达到理论上的转换精度,所以就会存在转换误差,我们在计算转换精度时,要将转换误差考虑进去。而转换误差通常会标明在元器件说明上。

三、 AD转换实验

接下来我们动手实验一下使用AD转换器。首先来说明一下实验要用到的器材,这里使用的是两张云脉冲出品的数据采集卡,型号分别.是USB_DAQ V1.2和USB2560 V1.1。前者搭载了一块12位的AD转换器,如图1。后者搭载了一块16位的AD转换器,如图2。                     

图1
图2

数据采集卡准备好之后,我们就可以开始实验了。本次实验,我们主要对比两张采集卡之间,AD转换精度的区别。

首先我们打开Visual Studio,创建一个C#窗体应用程序,并设置好组件,用三个Button控制板卡开启和AD采集,用两个Timer对两张板卡进行循环采集,最后用两个Textbox分别显示两张板卡各自采集电压后得到的数值。如图3。

图3

然后,我们进入后台代码编写区域。用DllImport指令将两张板卡要用到的函数各自导入。两张板卡需要导入的都是:打开板卡函数,关闭板卡函数以及单次AD采集函数。如图4。

图4

接下来,我们给三个Button按钮写入点击事件,分别是打开/关闭板卡、开启12位ADC采集并启动计时器、开启16位ADC采集并启动计时器。这里我两张卡用的都是±5V量程,关于板卡详细使用说明可以查阅使用手册,代码如下:

int w = 0;

        private void Start_Bt_Click(object sender, EventArgs e)

            //开启板卡按钮

        {

            if(w==0)

            {

                int x = OpenUsbV12();

                int y = openUSB();  //开启两张板卡

                if(x==0 && y==0)

                {

                    MessageBox.Show('板卡启动成功', '提示');

                    Start_Bt.Text = '关闭板卡';

                    w = 1;

                }

                else

                {

                    MessageBox.Show('板卡启动失败', '提示');

                }

            }

            else

            {

                ADC12_timer.Enabled = false;

                ADC16_timer.Enabled = false;

                CloseUsbV12();

                closeUSB();  //关闭两张板卡

                Start_Bt.Text = '开启板卡';

                w = 0;

            }

        }

        int ADC12 = 0;

        private void ADC12_Start_Click(object sender, EventArgs e)

            //12位AD转换器启动

        {

            if(ADC12==0)

            {

                ADC12_timer.Enabled = true;

                ADC12 = 1;

            }

            else

            {

                ADC12_timer.Enabled = false;

                ADC12 = 0;

            }

        }

        int ADC16 = 0;

        private void ADC16_Start_Click(object sender, EventArgs e)

            //16位AD转换器启动

        {

            if (ADC16 == 0)

            {

                ADC16_timer.Enabled = true;

                ADC16 = 1;

            }

            else

            {

                ADC16_timer.Enabled = false;

                ADC16 = 0;

            }

        }

        private void ADC12_timer_Tick(object sender, EventArgs e)

            //12位ADC计时器

        {

            unsafe

            {

                float adResult = 0;

                ADSingleV12(1, 0, 2, &adResult);

                adResult = adResult * 1000f;  //转换为毫伏

                ADC12_Textbox.Text = adResult.ToString();  //在Textbox内显示电压数值

            }

        }

        private void ADC16_timer_Tick(object sender, EventArgs e)

            //16位ADC计时器

        {

            unsafe

            {

                float[] ad_value = new float[8];  //设定一个八位数组

                fixed (float* ad = ad_value)

                {

                    float ad_value1 = 0;

                    ad_single(0, 0, 1, &ad[0]);  //用16位ADC进行采集

                    ad_value1 = ad[0];

                    ad_value1 = ad_value1 * 1000f;  //转换为毫伏

                    ADC16_Textbox.Text = ad_value1.ToString();

                }

            }

        }

代码编写完成后,我们找来一节1.5V的七号电池,测量它两端的电压,结果如图5。

图5

由图7可知,两张卡都采集到了正确的电压值。但如果持续观察数值就会发现,12位ADC的波动会达到毫伏数值的个位,而16位ADC的波动则是在小数点后一位,由此可见,16位ADC相比与12位ADC的分辨率更高,也就是精度更高。

实验完成后,记得关闭板卡。

那么以上便是本次实验的全部内容,感谢大家阅读。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多