在某些ADC / DAC器件中,它们是以2的补码形式输出/输入数据的选项。
用二进制补码形式表示数字数据有什么优势?当您可以简单地使用直接的二进制代码并节省转换时间时?
在某些ADC / DAC器件中,它们是以2的补码形式输出/输入数据的选项。
用二进制补码形式表示数字数据有什么优势?当您可以简单地使用直接的二进制代码并节省转换时间时?
Answers:
带符号整数的二进制补码表示很容易在硬件中操作。例如,取反(即x = -x)可以简单地通过翻转数字中的所有位并加一个来执行。在原始二进制文件中(例如使用符号位)执行相同的操作通常会涉及很多工作,因为您必须将流中的某些位视为特殊位。加法运算也一样-负数的加法运算与正数的加法运算相同,因此不需要其他逻辑(不需要双关语)来处理负数情况。
虽然这并不意味着从您的角度来看更容易,但作为此数据的使用者,它的确减轻了设备的设计工作量和复杂性,因此可能使其更便宜。
ADC可以转换数据(例如,输入电压介于0至5V之间),并且您需要对数据进行无符号(0V = 0、5V = max代码)或有符号(2.5V = 0、0V = max -ve,5V = max) + ve)。
除了2的补码是用于签名数据的最通用的计算机表示形式之外,上述两种格式之间的转换也非常简单:只需反转MSB!
添加到ADC的内部逻辑中这是非常便宜的,并在数据表上为ADC提供了另一个卖点...
在该问题中,似乎暗示ADC以2的补码形式返回值所花费的时间要比直接二进制形式花费的时间更长。尽管在某些特定的ADC实现中可能会出现这种情况,但通常情况并非如此(例如MSP430系列微控制器的ADC外设片上器件将以直接二进制或2的补码形式报告该值,但实际上在两种情况下都需要相同数量的循环)。
这样一来,在2的补码和直接二进制之间的选择主要取决于换能器的工作方式以及您希望如何处理数据。
在直接二进制模式下,ADC为您提供一个数字,该数字表示所测量的模拟量(实际上始终为电压)的大小与满量程参考量之间的比率。例如,一个10位ADC可以返回0到1023(含)之间的值。如果您测量的电压(例如1.25伏)是ADC参考电压(例如2.50伏)的一半,那么您读取的二进制代码将是您可以读取的最大值的一半-因此,约为512,受ADC中的舍入和非线性影响。
例如,假设您有一个传感器,可以报告油箱中的火箭燃料量。0V表示油箱为空,而2.5V电压表示油箱已满。因此,您只需将换能器连接到ADC,然后就可以使用!
但是请注意,在上一段中,无法测量负电压。如果我们想测量火箭燃料进出油箱的流量(并且我们有一个传感器来测量)怎么办?ADC无法测量负数,因此我们遇到了问题。但是,有一种简单的方法可以使用2的补码模式来伪造它:在这种情况下,传感器输出被重新偏置,以使零点位于ADC的两个参考电压之间。换句话说,正向流量由1.25V至2.50V之间的电压表示,负向流量由1.25V至0V表示-因此流入储罐的ADC代码为512至1023,而流出的则表示感谢511到0(直接二进制格式)的代码。
现在这很不方便。在执行任何操作之前,我们必须从每次测量中减去512,这样得出的数字范围为-512至+511。2的补码模式的要点是它可以为您完成此操作!
但是,您仍然可能希望将直接二进制文件与产生带符号结果的换能器一起使用。例如,您的传感器可能具有差分输出:在这种情况下,您无论如何都要从非反相输出中减去反相输出,因此使用2的补码没有任何优势。
两者的互补系统正在使用中,因为它源于简单的硬件自然运行的方式。例如,以您的汽车的里程表为例,该里程表已重置为零。然后将齿轮倒档,并向后行驶1英里(实际上请不要这样做)。里程表(如果是机械的话)将从0000滚动到9999。两者的补码系统的行为类似。
请注意,在这里我并没有真正提供任何新信息,只是里程表示例可能会有所帮助-它帮助我了解了我年轻时二补码系统的原理。在那之后,我很容易直观地接受加法器,减法器等与两者的补码系统一起很好地工作。
是的,我的日产里程表确实以这种方式工作。
其他人已经回答了为什么二进制补码对计算机硬件方便。但是,您似乎在问为什么A / D会输出二进制补码而不是“直接二进制”(无论您认为那是什么意思)。
大多数A / D确实会输出一个简单的无符号二进制值,范围是0到2 N -1,其中N是A / D转换成的位数。请注意,这也可以被视为二进制补码符号,只是值永远不会为负。如果仅处理正数,则大多数二进制表示形式都是相同的。这包括二进制补码和符号幅度。
一些A / D,特别是内置在微控制器中的A / D,可以选择为其范围的下半部分生成负值。在测量双极性信号时,这可能是一个明显的优势。
至少在微控制器中,这通常很愚蠢。在某些情况下,您可能无需任何转换就直接使用A / D值。在这种情况下,您已经将所有其他值转换为A / D范围。将其限制为所有非负数实际上可以简化事情。
否则,您将无论如何都要对A / D读数应用一定的缩放比例和偏移量,以使其成为内部用于值的任何单位。同样,直接从A / D出来的无符号值也没有不利之处。实际上,我通常在进行任何缩放和偏移之前对原始值进行一些低通滤波。知道这些值永远不会为负,会稍微简化计算。对无符号值进行缩放有时也会使事情变得简单一些。
我记不起100多个微控制器项目中的任何一种情况,在这些项目中,我以无符号输出格式使用A / D。
因此,要回答A / D输出“二进制恭维”的优点是什么,有两个答案:
在专用硬件中,具有负值指示负输入电压可能会有一些优势,在这种情况下,二进制补码是处理值范围的最简单方法。请注意,如果输入电压范围不对称于0,那么这种优势就消失了。
您所说的“直接二进制代码”是什么?我假设您的意思是有一个符号位,负号为“ 1”,正号为“ 0”(反之亦然)。与二元补码相比,这有两个缺点,它们还没有被提及:一个在当今基本上无关紧要,另一个很重要。
基本上不相关的一个是您可以表示一个更少的数字-即8位中的255个数字。当您拥有32位或64位时,这是无关紧要的,但是当您只有4位或6位工作时,这很重要。
更为重要的是,现在有两种方法可以表示相同的数字-具体来说,0-+0和-0,但+0和-0是相同的数字,因此您的实现需要确保您没有比较这些数字每次进行相等性检查时都将数字编号。