В некоторых устройствах АЦП / ЦАП есть опции для вывода / ввода данных в форме дополнения 2.
Каковы преимущества представления цифровых данных в форме дополнения двух, когда вы можете просто иметь прямой двоичный код и сэкономить время преобразования?
Ответы:
Двойное представление целых чисел со знаком легко манипулировать аппаратно. Например, отрицание (то есть x = -x ) может быть выполнено простым переключением всех битов в числе и добавлением единицы. Выполнение той же операции в необработанном двоичном файле (например, со знаковым битом) обычно требует гораздо больше работы, потому что вы должны обрабатывать определенные биты в потоке как особые. То же самое касается сложения - операция добавления для отрицательных чисел идентична операции добавления для положительных чисел, поэтому для обработки отрицательного регистра не требуется никакой дополнительной логики (без каламбура).
Хотя это и не означает, что с вашей точки зрения это проще, но как пользователь, использующий эти данные, он уменьшает трудоемкость проектирования и усложняет устройство, что, вероятно, делает его более дешевым.
источник
АЦП может преобразовывать данные (скажем, входные напряжения от 0 до 5 В), и вам необходимо, чтобы эти данные были без знака (0 В = 0, 5 В = макс. Код) или со знаком (2,5 В = 0, 0 В = макс. -Ve, 5 В = макс. анолит).
В дополнение к тому, что дополнение 2 является самым распространенным компьютерным представлением для подписанных данных, преобразование между двумя описанными выше форматами является совершенно тривиальным: просто инвертируйте MSB!
Это невероятно дешево добавить к внутренней логике АЦП и дает АЦП еще одну точку продаж в таблице ...
источник
Если вам нужно выполнить математику для представлений отрицательных чисел, добавление двойки делает это проще, чем двоичное смещение, которое будет соответствовать типу данных «sign int». Ваш компилятор просто знает, как с этим справиться. В противном случае вы тратите тики часов, конвертируя их назад и вперед.
источник
В этом вопросе, по-видимому, подразумевается, что для АЦП требуется больше времени, чтобы вернуть значение в форме дополнения 2, чем в прямом двоичном формате. Хотя это может иметь место в какой-то конкретной реализации АЦП, в целом это не так (например, микроконтроллеры серии MSP430 имеют встроенную в чип периферийную АЦП, которая сообщает значение в прямом двоичном коде или дополнении 2, но это занимает одинаковое количество циклов в обоих случаях).
При этом выбор между комплементом 2 и прямым двоичным кодом в основном сводится к тому, как работают ваши преобразователи и как вам нравится обрабатывать ваши данные.
В прямом двоичном режиме АЦП дает вам число, которое представляет собой соотношение между величиной измеренной аналоговой величины (практически всегда напряжением) и эталонной величиной полной шкалы. Например, 10-разрядный АЦП может возвращать значения от 0 до 1023 (включительно). Если измерить напряжение (скажем, 1,25 вольта), которая составляет половину от опорного напряжения АЦП (скажем, 2,50 вольта), двоичный код чтения будет составлять половину от максимального значения вы можете прочитать - так, 512, или около того, с учетом округления и нелинейностей в АЦП.
Например, предположим, у вас есть датчик, который сообщает количество ракетного топлива в баке. 0 В означает, что бак пуст, а 2,5 В означает, что он заполнен. Таким образом, вы просто подключаете преобразователь к вашему АЦП, и все!
Но обратите внимание, что в приведенном выше параграфе нет способа измерить отрицательные напряжения. Что если бы мы хотели измерить поток ракетного топлива в бак и из него (и для этого у нас был датчик)? АЦП не может измерять отрицательные числа, поэтому у нас проблема. Однако есть простой способ подделать его, используя режим дополнения 2: В этом случае выходной сигнал датчика смещается так, что нулевая точка находится посередине между двумя опорными напряжениями АЦП. Другими словами, положительные потоки представлены напряжениями от 1,25 В до 2,50 В, а отрицательные потоки представлены напряжениями от 1,25 В до 0 В, поэтому потоки в бак будут давать коды АЦП от 512 до 1023, а потоки из блока питания будут давать коды от 511 до 0 (в прямом двоичном формате).
Теперь это ужасно неудобно. Мы должны вычесть 512 из каждого измерения, прежде чем что-либо делать с ним, что дает числа в диапазоне от -512 до +511. Суть режима дополнения 2 в том, что он делает это для вас!
Тем не менее, вы все еще можете использовать прямой двоичный файл с датчиком, который выдает результаты со знаком. Например, ваш преобразователь может иметь дифференциальные выходы: в этом случае вы все равно захотите вычесть инвертированный выход из неинвертированного выхода, так что нет никакого преимущества в использовании дополнения 2.
источник
Используется система комплемента двух, потому что она проистекает из того, как просто работает аппаратное обеспечение. Например, одометр автомобиля, который вы обнулили. Затем включите передачу задним ходом и двигайтесь назад на 1 милю (пожалуйста, не делайте этого на самом деле). Ваш одометр (если он механический) будет катиться с 0000 до 9999. Система дополнения двух ведет себя аналогично.
Пожалуйста, обратите внимание, что я не предлагаю здесь никакой новой информации, только пример одометра, который кто-то может найти полезным - он помог мне понять обоснование системы дополнения двоих, когда я был молодым. После этого мне было легко интуитивно принять, что сумматоры, вычитатели и т. Д. Хорошо работают с системой дополнения двух.
И да, одометр моего Nissan работает таким образом.
источник
Другие уже ответили, почему двоичный код с комплиментами удобен для компьютерного оборудования. Тем не менее, вы, похоже, спрашиваете, почему A / D будет выводить комплимент для двух, а не «прямой двоичный код» (что, по вашему мнению, действительно означает).
Большинство A / D выводят простое двоичное значение без знака в диапазоне от 0 до 2 N -1, где N - количество битов, в которые A / D преобразуется. Обратите внимание, что это также может считаться двойной комплиментарной нотацией, просто значения никогда не бывают отрицательными. Если вы имеете дело только с положительными числами, то большинство двоичных представлений одинаковы. Это включает в себя два комплимента и знак величины.
Некоторые АЦП, особенно встроенные в микроконтроллеры, имеют возможность создавать отрицательные значения для нижней половины своего диапазона. Это может быть ощутимым преимуществом при измерении биполярного сигнала.
По крайней мере, в микроконтроллере это вообще глупо. В некоторых случаях вы можете использовать A / D-значения напрямую без какого-либо преобразования. В этом случае вы уже преобразовали все остальные значения в диапазон A / D. Ограничение на все неотрицательные числа на самом деле упрощает вещи.
В противном случае вы все равно будете применять некоторое масштабирование и смещение к показаниям АЦП, чтобы получить их в любых единицах измерения, которые вы используете для внутренних значений. Здесь также нет недостатка в значениях без знака, поступающих непосредственно из A / D. Фактически я обычно применяю некоторую фильтрацию нижних частот к необработанным значениям перед любым масштабированием и смещением. Знание этих значений никогда не будет отрицательным, что немного упрощает вычисления. Выполнение масштабирования беззнаковых значений также иногда упрощает задачу.
Я не могу вспомнить ни одного случая в более чем 100 проектах микроконтроллеров, где я использовал A / D в любом формате, кроме как без знака.
Итак, чтобы ответить на вопрос о том, какие преимущества дает аналого-цифровой вывод «комплимента», есть два ответа:
В выделенном оборудовании может быть некоторое преимущество, если отрицательные значения указывают на отрицательное входное напряжение, и в этом случае комплимент от двух является самым простым способом справиться с диапазоном значений. Обратите внимание, что если диапазон входного напряжения не симметричен относительно 0, то это преимущество исчезнет.
источник
О каком «прямом двоичном коде» ты говоришь? Я предполагаю, что вы имеете в виду наличие знака «1» для отрицательного и «0» для положительного (или наоборот ). Это имеет еще два недостатка по сравнению с дополнением к двум, которые еще не были упомянуты: один в значительной степени не имеет значения в наши дни, а другой важный.
В значительной степени не имеет значения, что вы можете представить на одно меньшее число - то есть 255 чисел в 8 битах. Это довольно неуместно, когда у вас есть 32 или 64 бита, но важно, когда у вас было всего 4 или 6 бит для работы.
Более важным является то, что теперь есть два способа представления одного и того же числа - в частности, 0 - +0 и -0, но +0 и -0 - это одно и то же число, поэтому ваша реализация должна убедиться, что вы не сравниваете эти числа каждый раз, когда вы делаете проверку на равенство.
источник