zoukankan      html  css  js  c++  java
  • AD转换参数INL和DNL

    1、INL精度(Interger Nonliner,Linearity error),积分线性度:ADC在所有的数值点上对应的模拟值和真实值之间误差最大的那一点的误差值。即输出偏离线性的最大距离,单位LSB。

    说明:理解为单值数据误差,对应该点模拟数据由于元器件及结构造成的不能精确测量产生的误差。

    例子:比如12位ADC:假设基准Vref=4.095V,那么1LSB=Vref/2^12=0.001V。如果精度为1LSB,则它单值测量误差0.001V*1=0.001,比如测量结果为1.000V,实际在1.000+/-0.001V范围。如果精度为8LSB,则它的单值测量误差0.001*8=0.008V,假如结果为1.000V,实际在1.000+/-0.008范围。

    2、DNL(Differential Nonlinear),差分非线性值,理解为刻度间的差值,即对每个模拟数据按点量化,由于量化产生的误差。

    例子:比如12位ADC,假设基准vref=4.095V,那么1LSB=Vref/2^12=0.001V.不考虑精度,即精度为0LSB。没有单值误差。如果DNL=3LSB=0.001V*3=0.003V,假设A实际电压为1.001V,B实际电压为1.003V。理论上A点读数1.001/1LSB=1001,B点读数1.003V/1LSB=1003,B-A=2,B>A,但由于DNL=3LSB=0.003V,模拟数据间的量化误差有0.003V,那么B-A会在-1(2-3=-1)到+5(2+3=5)之间的某一个数。

    注:要保证没有丢码和单调的转移函数,ADC的DNL必须小于1LSB。


    3、ADC的动态范围:动态范围=20*log(最大的数/最小的数)

    ADC的转换位数决定动态范围,由于AD转换器的位数限制,一般输入信号的动态范围都比较小。

    14位,动态范围=20log(2^14/1)=84.29db

    4、matlab算法:

    clear
    clf

    % %----------------------------------------------------------
    format long e
    a=textread('FMD-1222-5000n-V3-1-nofib-no-light.txt','%s');%以字符形式打开文件
    c=hex2dec(a)'; %16进制转化为10进制数,存入alpha矩阵
    %mm=2^10;
    mm=2^10;
    x=round(c);
    b=sort(x);
    k=zeros(mm,1);

    for i=1:mm,
    for j=1:length(b),
    if (b(j)==i-1)
    k(i)=k(i) + 1;
    end
    end
    end

    avg=(length(b)-k(1)-k(mm))/(mm-2);
    k(1)=avg;
    k(mm)=avg;

    inl=zeros(mm-1,1);
    dnl=zeros(mm-1,1);
    for i=1:length(k),
    dnl(i)=(k(i)-avg)/avg;
    end
    for i=2:length(dnl),
    inl(1)=dnl(1);
    inl(i)=dnl(i)+inl(i-1);
    end
    tt=0:mm-1;

    subplot(2,1,1);plot(tt,dnl);
    title('DNL OF ADC FMD-1222-5000n-V3-1-nofib-no-light 10Khz');
    xlabel('decimal code');
    ylabel('DNL(LSB)');
    axis([0 1200 -1 2]);
    grid on;

    附录:

    摘录,有助于理解INL和DNL:

    ADC(DAC)的线性度(INL和DNL)的一点理解

    作者:xjb37

             大家在使用ADC的时候,往往最关注位数,而对ADC的线性度往往会忽略。

             其实这个线性度也是ADC非常重要的指标,ADC(或DAC,其实ADC也是由DAC组成的)线性度指标有两个:

            INL:翻译过来叫“积分非线性”,指的是ADC整体的非线性程度。

            DNL:翻译过来叫“微分非线性”,指的是ADC局部(细节)的非线性程度。

            我们通常讲的“线性度”都是指“积分非线性”,积分非线性一般以百分比给出,或者以位数给出。举个例子:AD7705(16位)的datasheet上说有0.003%的非线性。1LSB为1/65535=0.0015%,所以也可说AD7705有2LSB的非线性。“微分非线性”不常用, AD7705的datasheet上说:“16位无失码”,那就是说明它的微分非线性小于1LSB。

              再举个例子:有一把10厘米的尺子,分度为1mm(分辨率,相当于ADC的1LSB),那总共有100小格(满量程为100LSB,7位ADC都不到)。

             “微分非线性”指的是,每一小格长度和理想的一小格长度(定为1mm)之间的误差。就是说这把尺子有疏有密,假设这把尺子有些小格的长度分别为: 0.8mm, 0.9mm, 1.0mm1.1mm1.3mm。那么 1.3mm的小格对应的“微分非线性”为:1.3mm1mm = 0.3mm,0.8mm的小格对应的“微分非线性”为0.8mm1mm = -0.2mm,取绝对值就是0.2mm。取最大的误差值0.3mm(也就是0.3LSB)定义为这把尺子的“微分非线性”。

             “积分非线性”是微分非线性误差的积累,是某一长段区间(有可能在3cm处,也有可能在5cm处有最大误差)和真实长度的误差。“积分”就是对一段区间内的“微分”求代数和嘛(离散域)。

             好的微分非线性并不能保证有一个好的积分非线性,因为假如微分非线性的误差很小,但都是正的,那积分非线性就会很大(假如尺子有100小格,每一小格的的微分非线性误差累加起来就很大)。但是好的积分非线性可以保证有一个好的微分非线性。

             有些人会问,假如有一把尺子的每一小格都是0.9mm,这时INL和DNL为多少?这时候格子的疏密是均匀的,DNL为0mmINL也为0%,也就是线性度非常理想(我这里把理想一小格长度定为0.9mm)。但是这样的尺子是不准确的,我们说这把尺子有一个增益误差(这里就是0.9倍)。就是说你用这把尺寸量到一个物体长度读数为10CM,需要再乘上0.9这个系数,物体的真实尺寸为10CM*0.9=9CM。我们使用一些ADC时,常常要做增益校准,做的就是这个事(用一个标准的信号源,把这个0.9的系数给算出来,存到单片机或者E2PROM里面)。

            

             说到这里大家对ADC线性度概念应该可以明白一些了,但是如何把一个ADC芯片的线性度测量出来,那可不是容易的事。特别是高位数的ADC,比如16位,笨一点的办法,就是测65536个点,计算得到积分非线性,如果是24位的ADC,估计一两年之内都测不完。

  • 相关阅读:
    php实现导出excel功能(转)
    nginx + php-fpm 开启 PATH_INFO 模式
    openEuler安装mariadb后进程查看有[ERROR] mysqld: Server GSSAPI错误
    CentOS 8开放防火墙端口
    ssh连接PVE下debian11的LXC容器非常慢之解决方法
    debian11安装SRS教程
    用python下载网页或图片
    解决Debian vim鼠标无法选中、复制问题
    在Ubuntu系统中安装pymssql
    Mariadb设置允许远程链接
  • 原文地址:https://www.cnblogs.com/loves6036/p/5068849.html
Copyright © 2011-2022 走看看