最高有效位(MSB)
指二进制中最高值的比特。在16比特的数字音频中,其第1个比特便对16bit的字的数值有最大的影响。例如,在十进制的15389这一数字中,相当于万数那1行(1)的数字便对数值的影响最大。比较与之相反的“最低有效位”(LSB)。
汇编中,比如,8位2进制数10000001,其中第一个1是MSB,第二个1是LSB。在计算机计算的时候用于判断。比如,如果是整数那么小数点(实际上是没有小数点的,但就把那一位和下一位之间看作有)在LSB后面,如果是小数小数点在MSB后面,其中MSB在有符号数中又是符号位。
LSB(Least Significant Bit)是“最低有效位”。MSB(Most Significant Bit)是“最高有效位”。
如一个地址:
1(MSB)100 0011(LSB)
在网络通信方面,大家说的更多的是:“Big-Endian”和“Small-Endian”的问题。
指的都是对于多字节的数据类型(比如4字节的32位整数),其多个字节的顺序问题,是最高字节在前(Big-Endian)还是最低字节在前(Small-Endian)。
比如对于0x12345678这个数,那么按照Small-Endian的方式,它在网络上传输(或者在内存里存储)的4个字节依次是:12 34 56 78(右为低地址)(地址的增长顺序与值的增长顺序相同,12为千万位),而Big-Endian的顺序正相反,是:78 56 34 12(右为低地址)(地址的增长顺序与值的增长顺序相反)。
MSB和LSB虽然跟这个事情看起来有点相似,但不是一回事。通常,一个芯片的管脚中,对于一个多比特的信号,比如32根的地址线,从低开始按0到31编个号。MSB就是31,LSB就是0。那么如果标记为:ADDR[31:0]就是MSB first的方式,如果标记为ADDR[0:31]就是LSB first的方式。
MSB LSB:起始地址为最高位, 最后地址为最低位。
LSB MSB:起始地址为最低位,最后地址为最高位。
比如AD中,8位,最低有效位指D0
A/D 是模拟量到数字量的转换,依靠的是模数转换器(Analog to Digital Converter),简称ADC。D/A 是数字量到模拟量的转换,依靠的是数模转换器(Digital to Analog Converter),简称 DAC。它们的道理是完全一样的,只是转换方向不同,因此我们讲解过程主要以 A/D 为例来讲解。
很多同学学到 A/D 这部分的时候,感觉是个难点,概念搞不清楚,掌握不好。我个人认为主要原因不在于技术问题,而是不太会感悟生活。我们生活中有很多很多 A/D 的例子,只是没有在单片机领域里应用而已,下面我带着大家一起感悟一下 A/D 的概念。
什么是模拟量?就是指变量在一定范围内连续变化的量,也就是在一定范围内可以取任意值。比如米尺,从 0 到 1 米之间,可以是任意值。什么是任意值,也就是可以是 1cm,也可以是 1.001cm,当然也可以 10.000„„后边有无限个小数。总之,任何两个数字之间都有无限个中间值,所以称之为连续变化的量,也就是模拟量。
而我们用的米尺上被我们人为的做上了刻度符号,每两个刻度之间的间隔是 1mm,这个刻度实际上就是我们对模拟量的数字化,由于有一定的间隔,不是连续的,所以在专业领域里我们称之为离散的。ADC 就是起到把连续的信号用离散的数字表达出来的作用。那么我们就可以使用米尺这个“ADC”来测量连续的长度或者高度这些模拟量。如图 17-1 一个简单的米尺刻度示意图。
我们往杯子里倒水,水位会随着倒入的水量的多少而变化。现在就用这个米尺来测量我们杯子里的水位的高度。水位变化是连续的,而我们只能通过尺子上的刻度来读取水位的高度,获取我们想得到的水位的数字量信息。这个过程,就可以简单理解为我们电路中的 ADC采样。
我们在选取和使用 A/D 的时候,依靠什么指标来判断很重要。由于 AD 的种类很多,分为积分型、逐次逼近型、并行/串行比较型、Σ-Δ型等多种类型。同时指标也比较多,并且有的指标还有轻微差别,在这里我是以同学们便于理解的方法去讲解,如果和某一确定类型A/D 概念和原理有差别,也不会影响实际应用。
一个 n 位的 ADC 表示这个 ADC 共有 2 的 n 次方个刻度。8 位的 ADC,输出的是从 0~255 一共 256 个数字量,也就是 2 的 8 次方个数据刻度。
基准源,也叫基准电压,是 ADC 的一个重要指标,要想把输入 ADC 的信号测量准确,那么基准源首先要准,基准源的偏差会直接导致转换结果的偏差。比如一根米尺,总长度本应该是 1 米,假定这根米尺被火烤了一下,实际变成了 1.2 米,再用这根米尺测物体长度的话自然就有了较大的偏差。假如我们的基准源应该是 5.10V,但是实际上提供的却是 4.5V,这样误把 4.5V 当成了 5.10V 来处理的话,偏差也会比较大。
分辨率是数字量变化一个最小刻度时,模拟信号的变化量,定义为满刻度量程与 2n-1 的比值。假定 5.10V 的电压系统,使用 8 位的 ADC 进行测量,那么相当于 0~255 一共 256 个刻度把 5.10V 平均分成了 255 份,那么分辨率就是 5.10/255 = 0.02V。
初学者最容易混淆的两个概念就是“分辨率”和“精度”,认为分辨率越高,则精度越高,而实际上,两者之间是没有必然联系的。分辨率是用来描述刻度划分的,而精度是用来描述准确程度的。同样一根米尺,刻度数相同,分辨率就相当,但是精度却可以相差很大,如图 17-2 所示。
图 17-2 米尺精度对比
图 17-2 表示的精度一目了然,不需多说。和 ADC 精度关系重大的两个指标是 INL(Integral NonLiner)和 DNL(Differencial NonLiner)。
INL 指的是 ADC 器件在所有的数值上对应的模拟值,和真实值之间误差最大的那一个点的误差值,是 ADC 最重要的一个精度指标,单位是 LSB。LSB(Least Significant Bit)是最低有效位的意思,那么它实际上对应的就是 ADC 的分辨率。一个基准为 5.10V 的 8 位 ADC,它的分辨率就是 0.02V,用它去测量一个电压信号,得到的结果是 100,就表示它测到的电压值是 100*0.02V=2V,假定它的 INL 是 1LSB,就表示这个电压信号真实的准确值是在1.98V~2.02V 之间的,按理想情况对应得到的数字应该是 99~101,测量误差是一个最低有效位,即 1LSB。
DNL 表示的是 ADC 相邻两个刻度之间最大的差异,单位也是 LSB。一把分辨率是 1 毫米的尺子,相邻的刻度之间并不都刚好是 1 毫米,而总是会存在或大或小的误差。同理,一个 ADC 的两个刻度线之间也不总是准确的等于分辨率,也是存在误差,这个误差就是 DNL。
一个基准为 5.10V 的 8 位 ADC,假定它的 DNL 是 0.5LSB,那么当它的转换结果从 100 增加到 101 时,理想情况下实际电压应该增加 0.02V,但 DNL 为 0.5LSB 的情况下实际电压的增加值是在 0.01~0.03V 之间。值得一提的是 DNL 并非一定小于 1LSB,很多时候它会等于或大于 1LSB,这就相当于是一定程度上的刻度紊乱,当实际电压保持不变时,ADC 得出的结果可能会在几个数值之间跳动,很大程度上就是由于这个原因(但并不完全是,因为还有无时无处不在的干扰的影响)。
转换速率,是指 ADC 每秒能进行采样转换的最大次数,单位是 sps(或 s/s、sa/s,即 samples per second),它与 ADC 完成一次从模拟到数字的转换所需要的时间互为倒数关系。ADC 的种类比较多,其中积分型的 ADC 转换时间是毫秒级的,属于低速 ADC;逐次逼近型 ADC转换时间是微妙级的,属于中速 ADC;并行/串行的 ADC 的转换时间可达到纳秒级,属于高速 ADC。
ADC 的这几个主要指标大家先熟悉一下,对于其它的,作为一个入门级别的选手来说,先不着急深入理解。以后使用过程中遇到了,再查找相关资料深入学习,当前重点是在头脑中建立一个 ADC 的基本概念。
很多A/D转换器和仪器厂商常拿分辩率来忽悠人, 很多人的确上套, 即使专业人士也常常逃不过. 其实这两者的区别很大, 但有联系.
1, 精度是接近真实值的程度, 即绝对误差或相对误差的大小.精度做到0.01%极其难
2, 分辩率是量化刻度的细度大小,分辩率做到0.00001%不很难(如24位A/D,0.0000056%)
3, 概念理解:
例1:一把1米的软尺,有1000个刻度,分辩率1毫米(分辩率0.1%),用标准尺量下绝对误差+5毫米,精度+0.5%。如果能把尺拉长20毫米,此时绝对误差+25毫米,精度降为2.5%, 可是尺还是1000个刻度,其分辨率还是1毫米(0.1%).
例2:两杆称来称真重1克的物体, 一杆的结果为1.03克, 另一杆的结果为0.8333333333333333333333333克, 哪个准呢?
4, 关系
分辩率高是精度高的必要条件,不是充分条件;分辩率高不等于精度高. 认定精度才是王道.
“精度”是用来描述物理量的准确程度,其反应的是测量值与真实值之间的误差,而“分辨率”是用来描述刻度划分的,其反应的是数值读取过程中所能读取的最小变化值。简比喻:一把常见的量程为10厘米的刻度尺,上面有100个刻度,最小能读出1毫米的有效值。那么我们就说这把尺子的分辨率是1毫米,他只能1、2、3、4……100这样读值;而它的实际精度就不得而知了,因为用这把尺读出来的2毫米,我们并不知道他与真实绝对的2毫米之间的误差值。而当我们用火来烤一下它,并且把它拉长一段,然后再考察一下它。我们不难发现,它还有100个刻度,因而它的“分辨率”还是1毫米,跟原来一样!然而,它的精度显然已经改变了。
对于编码器来说,“分辨率”除了与刻线数有关外,还会因电气信号方面的影响而改变,它是可调的,可控的,它可以随着对信号的细分而改变,细分倍数越高,分辨率越小,但是细分倍数越高,引入加大的误差就越大。而精度,更多的偏向于机械方面,一个产品生产出来后,他的精度基本已经固定(有些高精度的产品可以对信号进行补偿等来提高精度),这个数值是通过检测出来的,它与产品的做工,材料等综合性能息息相关,我们难以通过计算来得出一个具体的数值作为精度的依据,大多只能在使用的过程当中判断出精度的好坏来。
例如,对于13bit的,其码盘上的绝对位置数为:8192,则:计算出的分辨率为158角秒,也就是说,在读取数值的时候,要求数值间的跳动是158角秒,如果要读取的第一个数值是0,则第二个读取的数值要大于158,若要小于158,则我们需要选取更小的分辨率。当要读取158这个数值的时候,由于误差的存在,并不可能得到绝对的158秒,编码器所读取出来的158秒与绝对真实158秒之间的误差,就取决于精度了。所以说,精度,是在分辨率的基础上来谈的。
而并非越细分得到小的分辨率就越好,因为细分会引入误差和扩大误差,过度的细分将无法保证精度!需要多少倍的细分,能做到多少倍的细分,前提必须是在保证精度的基础上进行的,因为精度在使用前的不可见性而高倍细分是不负责任的。码盘质量越高,刻线越好,信号质量信号越好,细分后产生的误差就越小,这受到一台编码器综合性能的影响,这也就是为什么会在相同的参数下,会有不同品牌,不同价位编码器的一个原因。
例如,我们要读取的数值为1、2、4、7、8,我至少要选择1个单位的分辨率,选择2个单位的分辨率是显然不行的,因为我们读出了1这个数值,则2是读不出来的,在选择1个单位分辨率的基础上,我们读出来的1与真实绝对的1的误差就是精度。机床上的数控系统对于直光栅是有分辨率的设定的,需要读取的数值间隔小于分辨率,机床就有可能会抖动或出错等。
对于绝对式带增量信号编码器,能够精确的保持串行传输的绝对位置值与增量值同步,绝对值确切的对应一个增量信号,位置值一定在一个增量信号的正弦周期之内。如13位绝对式,带512线的增量信号,绝对位置间隔158秒,若要读取两个码盘位置中间的一个位置是不合适的,但是,我们可以通过对其所带的1Vpp增量信号进行细分,如细分100倍,则相当于在两个绝对位置之间又引入了几个细分后的位置,我们可以在绝对位置值的基础上,通过计算细分后的增量脉冲数而读取两个绝对位置之间的一个位置值,如:512线细分100倍,绝对位置1数值是0,绝对位置2数值是158,则读取这两个位置间的位置可以在位置1:数值0的基础上多出一个脉冲则是25,两个则是25x2=50……但是,带增量信号的绝对式编码器本身是不带细分的,这就要求用户能自行的对增量信号进行细分处理。
LSB在位序中表示的是最低位,在ADC中对应的是分辨率。