一部のADC / DACデバイスでは、2の補数形式でデータを出力/入力するオプションがあります。
デジタルデータを2の補数形式で表現する利点は何ですか?単純なバイナリコードを使用して変換時間を節約できる場合
一部のADC / DACデバイスでは、2の補数形式でデータを出力/入力するオプションがあります。
デジタルデータを2の補数形式で表現する利点は何ですか?単純なバイナリコードを使用して変換時間を節約できる場合
回答:
符号付き整数の2の補数表現は、ハードウェアで簡単に操作できます。たとえば、否定(つまりx = -x)は、数値のすべてのビットを反転させて1を加算するだけで実行できます。ストリーム内の特定のビットを特別なものとして処理する必要があるため、生のバイナリで同じ操作を実行する(たとえば符号ビットを使用する)には、通常、より多くの作業が必要になります。加算についても同様です-負の数の加算操作は正の数の加算操作と同じであるため、負のケースを処理するために追加のロジック(しゃれなし)は必要ありません。
これはあなたの観点から見れば簡単なことを意味するわけではありませんが、このデータの消費者としては、デバイスの設計労力と複雑さを軽減し、おそらくそれをより安くします。
ADCはデータを変換できます(たとえば、0〜5Vの入力電圧)。データは符号なし(0V = 0、5V = maxコード)または符号付き(2.5V = 0、0V = max -ve、5V = max)のいずれかが必要です。 + ve)。
署名付きデータの最も一般的なコンピューター表現である2の補数に加えて、上記の2つの形式間の変換は完全に簡単です。単にMSBを反転するだけです!
これは、ADCの内部ロジックに追加するのが非常に安く、ADCにデータシート上の別のセールスポイントを提供します...
負の数の表現で数学を実行する必要がある場合、2の補数を使用すると、「signed int」データ型と一致するオフセットバイナリよりも簡単になります。コンパイラーは、その対処方法を知っているだけです。それ以外の場合は、時計の刻みを前後に変換することに費やします。
質問では、ADCがストレートバイナリよりも2の補数形式で値を返すのに時間がかかることが暗示されているようです。これはADCの特定の実装の場合に当てはまりますが、一般的にはそうではありません(たとえば、MSP430シリーズのマイクロコントローラーには、値をストレートバイナリまたは2の補数で報告するADC周辺機器がオンチップで搭載されていますが、両方のケースで同じサイクル数を取ります)。
それが邪魔にならないように、2の補数とストレートバイナリのどちらを選択するかは、ほとんどの場合、トランスデューサの動作とデータの処理方法に依存します。
ストレートバイナリモードでは、ADCは測定されたアナログ量の大きさ(実質的に常に電圧)とフルスケールの基準量との比率を表す数値を提供します。たとえば、10ビットADCは0〜1023(両端を含む)の値を返すことができます。ADCの基準電圧(たとえば2.50ボルト)の半分である電圧(たとえば1.25ボルト)を測定すると、読み取るバイナリコードは読み取ることができる最大値の半分になります(つまり、512程度)。 ADCの丸めと非線形性の影響を受けます。
たとえば、タンク内のロケット燃料の量を報告するトランスデューサーがあるとします。0Vはタンクが空であることを意味し、2.5Vボルトは満杯であることを意味します。トランスデューサをADCに接続するだけで、すぐに使用できます!
ただし、上記の段落では、負の電圧を測定する方法はありません。タンクに出入りするロケット燃料の流れを測定したい場合(そして、それを行うためのトランスデューサーがあった場合)ADCは負の数を測定できないため、問題があります。ただし、2の補数モードを使用して簡単に偽造する方法があります。この場合、トランスデューサーの出力は、ゼロ点がADCの2つの基準電圧の中間になるように再バイアスされます。言い換えると、正のフローは1.25Vから2.50Vの電圧で表され、負のフローは1.25Vから0Vで表されるため、タンクへのフローは512から1023のADCコードを生成し、感謝の流れからのフローは511〜0のコード(ストレートバイナリ形式)。
今では非常に不便です。何かを行う前に、各測定値から512を差し引く必要があります。これにより、-512〜+511の範囲の数値が得られます。2の補数モードのポイントは、あなたのためにこれを行うということです!
ただし、符号付きの結果を生成するトランスデューサーでストレートバイナリを使用することもできます。たとえば、トランスデューサに差動出力がある場合があります。この場合、とにかく非反転出力から反転出力を減算する必要があるため、2の補数を使用する利点はありません。
2つの補数システムが使用されています。これは、単純なハードウェアが自然にどのように動作するかに起因するためです。例えば、ゼロにリセットした車の走行距離計を考えてください。次に、ギアをリバースに入れ、1マイル後方にドライブします(実際にはこれを行わないでください)。走行距離計(機械式の場合)は0000から9999まで回転します。2の補数システムは同様に動作します。
ここで新しい情報を実際に提供するのではなく、誰かが役立つと思われる走行距離計の例だけを提供していることに注意してください-若いときに2の補数システムの原理を理解するのに役立ちました。その後、加算器、減算器などが2の補数システムでうまく機能することを直感的に受け入れるのは簡単でした。
はい、私の日産の走行距離計はこのように機能します。
他の人は、なぜ2の補数バイナリがコンピューターハードウェアに便利なのか、すでに答えています。ただし、A / Dが「ストレートバイナリ」ではなく2の補数を出力する理由を尋ねているようです(実際に何を意味していると思うにしても)。
ほとんどのA / Dは、0〜2 N -1の範囲の単純な符号なしバイナリ値を出力します。ここで、NはA / Dが変換するビット数です。これは2の補数表記と見なすこともできますが、値が負になることはありません。正数のみを扱う場合、ほとんどのバイナリ表現は同じです。これには、2の賛辞と符号の大きさが含まれます。
一部のA / D、特にマイクロコントローラに組み込まれているA / Dには、その範囲の下半分に負の値を生成するオプションがあります。これは、バイポーラ信号を測定するときに認識できる利点です。
少なくともマイクロコントローラーでは、これは一般に愚かなことです。場合によっては、変換せずにA / D値を直接使用できます。その場合、他のすべての値はすでにA / D範囲に変換されています。それをすべての非負数に制限すると、実際に物事が単純化されます。
それ以外の場合は、A / D読み取り値に何らかのスケーリングとオフセットを適用して、内部的に値に使用する単位にそれらを取得します。ここでも、A / Dから直接出力される符号なしの値にはマイナス面はありません。実際、スケーリングとオフセットを行う前に、通常、生の値にローパスフィルタリングを適用します。これらの値が負になることは決してないので、計算が少し簡単になります。符号なしの値でスケーリングを行うと、物事が少し簡単になることもあります。
符号なしの出力形式以外でA / Dを使用した100以上のマイクロコントローラープロジェクトで、1つのケースを思い出すことはできません。
A / Dが「2つの賛辞」を出力することの利点は何かという質問に答えるには、2つの答えがあります。
専用ハードウェアでは、負の値が負の入力電圧であることを示す利点があります。この場合、値の範囲を処理する最も簡単な方法は2の補数です。入力電圧範囲が0を中心に対称でない場合、この利点はなくなります。
この「ストレートバイナリコード」とは何ですか?負の場合は '1'、正の場合は '0'(またはその逆)の符号ビットを持つことを意味すると仮定します。これには、まだ言及されていない2つの補数に対する2つの不利な点があります。1つは最近ほとんど関係がない、もう1つは重要です。
主に無関係なのは、1つ少ない数字、つまり8ビットで255の数字を表現できることです。これは、32ビットまたは64ビットを使用している場合はほとんど関係ありませんが、使用する4ビットまたは6ビットが少ない場合は問題になります。
もっと重要なのは、同じ数字を表す2つの方法があることです。具体的には、0-+0と-0ですが、+ 0と-0は同じ数字なので、実装ではこれらを比較しないことを確認する必要があります同等性チェックを行うたびに番号が付けられます。