ADC相关参数之---INL和DNL

原文链接:https://www.cnblogs.com/raymon-tec/p/4995698.html

笔者最近在做的一个项目中,用到一片16位的高分辨率的芯片,借此再学习一下由于ADC和DAC的相关知识,以此巩固。

      关于ADC的精度和分辨率将在另外一篇博客讨论,分辨率不等于精度。

     一块精度0.2%(或常说的准确度0.2级)的四位半万用表,测得A点电压1.0000V,B电压1.0005V,可以分出B比A高0.0005V,但A点电压的真实值可能在0.9980~1.0020之间不确定。

       那么,既然数字万用表存在着精度和分辨率两个指标,那么,对于ADC和DAC,除了分辨率以外,也存在精度的指标。模数器件的精度指标是用积分非线性度(Interger NonLiner)即INL值来表示。也有的器件手册用 Linearity error 来表示。他表示了ADC器件在所有的数值点上对应的模拟值,和真实值之间误差最大的那一点的误差值。也就是,输出数值偏离线性最大的距离。单位是LSB(即最低位所表示的量)。

       比如12位ADC:TLC2543,INL值为1LSB。那么,如果基准4.095V,给定数字量1000,输出电压在1V,那么,真实电压值可能分布在0.999~1.001V之间。对于DAC也是类似的。比如DAC7512,INL值为8LSB,那么,如果基准4.095V,给定数字量1000,那么输出电压可能是0.992~1.008V之间。

      下面再说DNL值。理论上说,模数器件相邻量个数据之间,模拟量的差值都是一样的。就相一把疏密均匀的尺子。但实际并不如此。一把分辨率1毫米的尺子,相邻两刻度之间也不可能都是1毫米整。那么,ADC相邻两刻度之间最大的差异就叫差分非线性值(Differencial NonLiner)。DNL值如果大于1,那么这个ADC甚至不能保证是单调的,输入电压增大,在某个点数值反而会减小。这种现象在SAR(逐位比较)型ADC中很常见。 
     举个例子,某12位ADC,INL=8LSB,DNL=3LSB(性能比较差),基准4.095V,测A电压读数1000,测B电压度数1200。那么,可判断B点电压比A点高197~203mV。而不是准确的200mV。对于DAC也是一样的,某DAC的DNL值3LSB。那么,如果数字量增加200,实际电压增加量可能在197~203mV之间。

      很多分辨率相同的ADC,价格却相差很多。除了速度、温度等级等原因之外,就是INL、DNL这两个值的差异了。比如AD574,贵得很,但它的INL值就能做到0.5LSB,这在SAR型ADC中已经很不容易了。换个便宜的2543吧,速度和分辨率都一样,但INL值只有1~1.5LSB,精度下降了3倍。 
     另外,工艺和原理也决定了精度。比如SAR型ADC,由于采用了R-2R或C-2C型结构,使得高权值电阻的一点点误差,将造成末位好几位的误差。在SAR型ADC的2^n点附近,比如128、1024、2048、切换权值点阻,误差是最大的。1024值对应的电压甚至可能会比1023值对应电压要小。这就是很多SAR型器件DNL值会超过1的原因。但SAR型ADC的INL值都很小,因为权值电阻的误差不会累加。 
    和SAR型器件完全相反的是阶梯电阻型模数/数模器件。比如TLC5510、DAC7512等低价模数器件。比如7512,它由4095个电阻串联而成。每个点阻都会有误差,一般电阻误差5%左右,当然不会离谱到100%,更不可能出现负数。因此这类器件的DNL值都很小,保证单调。但是,每个电阻的误差,串联后会累加,因此INL值很大,线性度差。

     这里要提一下双积分ADC,它的原理就能保证线性。比如ICL7135,它在40000字的量程内,能做0.5LSB的INL值(线性度达到1/80000 !!)和0.01LSB的DNL值.这两个指标在7135的10倍价钱内,是不容易被其他模数器件超越的。所以7135这一类双积分ADC特别适合用在数字电压表等需要线性误差非常小的场合。 
     还要特别提一下基准源。基准源是测量精度的重要保证。基准的关键指标是温飘,一般用ppm/K来表示。假设某基准30ppm/K,系统在20~70度之间工作,温度跨度50度,那么,会引起基准电压30*50=1500ppm的漂移,从而带来0.15%的误差。温漂越小的基准源越贵,比如30ppm/K的431,七毛钱;20ppm/K的385,1块5;10ppm/K的MC1403,4块5;1ppm/K的LM399,14元;0.5ppm/K的LM199,130元。 
该死的教科书害了一代学生。在ADC电路中的基准源不能直接接电源VCC,这里要考虑基准电压的稳定度。其中常用的基准源电压可由TL431提供。 
       最后说一下Sigma-Delta型ADC,它比较特殊,对于精度,一般用直接用线性度表示,比如0.0015%.不说差分非线性值,而直接用有效分辨率来表示。此外,Sigma-Delta型ADC还存许多怪脾气,难伺候。 

总结: 
     (1)INL(Interger NonLinear,Linearity error)精度。理解为单值数据误差,对应该点模拟数据由于元器件及结构造成的不能精确测量产生的误差。 
     (2)DNL(Differential NonLinear)差分非线性值。理解为刻度间的差值,即对每个模拟数据按点量化,由于量化产生的误差。 
例子: 
     (1)INL,精度 
     比如12位ADC:假设基准Vref=4.095V,那么1LSB=Vref/2^12=0.001V。如果精度为1LSB,则它的单值测量误差0.001V*1=0.001V,比如测量结果1.000V,实际在1.000+/-0.001V范围。如果精度为8LSB,则他的单值测量误差0.001V*8=0.008V,比如测量结果1.000V,实际在1.000+/-0.008V范围 
(2)DNL,差分非线性值 
     比如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.001V/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)之间的某一个数。

  • 1
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: ADC是模数转换器中最常用的电路之一,对于需要将模拟信号转换为数字信号的应用,如数据采集、仪器控制等,都需要使用ADC进行模数转换。DNL(差分非线性度)和INL(积分非线性度)是评估ADC性能的重要指标,下面将对计算DNLINL的代码进行介绍。 DNL的计算代码如下: ``` n = 12 # 量化位数 Vfs = 5.0 # 满量程电压 LSB = Vfs / (2 ** n) # 最小量化步进 d = [] # 存放输入数据 for i in range(2 ** n): d.append((i + 0.5) * LSB) # 输入数据为等间距分布的电压 v = [] # 存放ADC输出电压 for i in range(2 ** n): v.append(adc(d[i])) # 执行ADC转换,获取输出电压 DNL = [] # 存放DNL值 for i in range(2 ** (n-1)): DNL.append((v[i+1]-v[i])/LSB-1) # 计算差分非线性度值 ``` INL的计算代码如下: ``` L = [-Vfs / 2] # 左端点为-Vfs/2 for i in range(2 ** n - 1): L.append(L[-1] + LSB) # 生成量化电平序列 v = [] # 存放ADC输出电压 for i in range(2 ** n): v.append(adc(L[i])) # 执行ADC转换,获取输出电压 INL = [] # 存放INL值 for i in range(2 ** n): INL.append((v[i] - (i * LSB + L[0])) / LSB) # 计算积分非线性度值 ``` 以上两段代码可以根据实际情况进行修改,其中`adc`为执行ADC转换的函数,可以根据具体的ADC芯片选择相应的驱动库进行编写。需要注意的是,在应用中,通常需要进行多次采样来获取稳定的DNLINL值,因此需要将以上代码放置在循环中进行多次执行。 ### 回答2: ADC(模数转换器)是一种电子设备,能够将模拟信号转换成数字信号。其中,DNL(差分非线性度)和INL(积分非线性度)是评估ADC质量的两个重要指标。 计算DNL的代码如下: 1.设定参考电压(Vref) 2.设定动态范围(Vmax和Vmin) 3.将Vref按照量化位数divider进行等分(Vstep = Vref / 2^divider) 4.将输入电压逐渐增加,用计算机记录下每个量化电平对应的数字值 5.计算输出的数字信号与理论值的差值,即为DNLDNL = |(数字信号输出 - 理论值)/ Vstep - 1|) 计算INL的代码如下: 1.按照DNL的方法获取所有量化电平对应的数字值 2.按照这些数字值的顺序计算它们与理论值的差值,这就是INL 3.如果INL的最大值超过了1 LSB,说明ADC的质量可能存在问题 需要注意的是,以上代码仅适用于基础的ADC单元,实际应用中可能需要考虑更多的因素并进行修改。 ### 回答3: ADC(模数转换器)是将连续信号转换为数字信号的重要电子元件,也是模拟电路和数字电路之间的重要接口。在ADC中,数字化误差是一个不可避免的问题,其中最常见的误差包括DNL(差分非线性度)和INL(积分非线性度)。下面我们将介绍如何计算ADCDNLINLDNLADC输出码之间的差异。DNL计算公式如下: DNL = (V_i - V_{i-1} - 1) / LSB 其中,V_i是量化器在第i个码上的输出电压,V_{i-1}是第i-1个码的输出电压,而LSB则是最低有效位的大小。 INLADC输出码值和理想输出直线之间的误差,也可视为ADC输出值的累计误差。INL计算公式如下: INL = (V_i - V_d) / LSB - i 其中,V_i是量化器在第i个码上的输出电压,而V_d则是理想输出直线在第i个码上的电压值,i为第i个码。该公式中,INL的单位为LSB。 计算DNLINL的步骤如下: 首先,将ADC输出的数字信号转换为模拟信号,并将其测量。将测量结果与ADC量化器的数字输出值一一对应,并标记每个输入电压对应的ADC输出值。 接下来,使用上述公式来计算DNLINL。可以使用MATLAB、Python等软件来计算,但需要使用自己的数字输入值和相应的电源,以便获得准确的结果。 总之,DNLINL是衡量ADC性能的重要指标,它们的计算可以帮助我们了解ADC的精度和线性度。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值