大家好,这里是云脉冲科技,今天来为大家讲解一下电子技术中常见的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。 数据采集卡准备好之后,我们就可以开始实验了。本次实验,我们主要对比两张采集卡之间,AD转换精度的区别。 首先我们打开Visual Studio,创建一个C#窗体应用程序,并设置好组件,用三个Button控制板卡开启和AD采集,用两个Timer对两张板卡进行循环采集,最后用两个Textbox分别显示两张板卡各自采集电压后得到的数值。如图3。 然后,我们进入后台代码编写区域。用DllImport指令将两张板卡要用到的函数各自导入。两张板卡需要导入的都是:打开板卡函数,关闭板卡函数以及单次AD采集函数。如图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。 由图7可知,两张卡都采集到了正确的电压值。但如果持续观察数值就会发现,12位ADC的波动会达到毫伏数值的个位,而16位ADC的波动则是在小数点后一位,由此可见,16位ADC相比与12位ADC的分辨率更高,也就是精度更高。 实验完成后,记得关闭板卡。 那么以上便是本次实验的全部内容,感谢大家阅读。 |
|