大家好,这里是云脉冲科技,今天来为大家讲解一下电子技术中常见的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的分辨率更高,也就是精度更高。
实验完成后,记得关闭板卡。
那么以上便是本次实验的全部内容,感谢大家阅读。