Я пытаюсь понять формат данных I2C 24-битного ACD (LTC2485).
В спецификации сказано, что он возвращает 4 байта (32-битное целое число), но неясно, где находятся 24 бита, которые я ищу.
Вот чего я не понимаю:
Роль битов 31 и 30
Два старших значащих бита (30, 31) используются для индикации превышения или недостаточности диапазона. Они также используются, чтобы сказать, в какой «четверти» полного диапазона находится сигнал.
В документации сказано: если установлен бит 31, то сигнал находится между 0 В и +Vref, в противном случае сигнал находится между -Vref и 0 В.
Я понимаю это так: если сигнал находится между 0 В и + Vref, код находится между 2 ^ 23 и 2 ^ 24, а если сигнал находится между -Vref и 0 В, код находится между 0 и 2 ^ 23.
Аналогичные рассуждения можно использовать для бита 30 и Vref/2. Вот как работает двоичное число. Оба бита могут использоваться, чтобы указать, в какой «четверти» полного диапазона находится сигнал.
Исходя из этого, я предполагаю, что бит 31 — это бит 23 сигнала, бит 30 соответствует биту 22 и так далее. Таким образом, первые три байта должны быть моим 24-битным кодом.
Однако в документации позже говорится:
Второй бит является старшим битом (MSB) результата.
Что будет означать, что результат сдвинут на один бит. Но позже:
Функции этих двух битов приведены в таблице 1. Следующие 24 бита содержат результаты преобразования в двоичном формате с дополнением до двух. Оставшиеся шесть битов являются младшими подмладшими битами ниже 24-битного уровня.
Что указывало бы на то, что результат сдвинут на два бита, а биты 31 и 30 избыточны (см. мое объяснение выше).
И, наконец, приведенный пример кода использует... 32 бита вместо 24.
signed int32 x;
// Reading X
x ^= 0x80000000;
voltage = (float) x;
voltage = voltage * 5.0 / 2147483648.0;// Multiply by Vref, divide by 2^31
В результате я чувствую себя потерянным. Учитывая 4 байта, которые я получаю (давайте назовем их байтами от 0 до 3 в порядке поиска), как мне получить напряжение, измеренное АЦП? Какова роль «Оставшихся шести битов являются Sub LSB ниже 24-битного уровня»?
Спасибо, что прочитали меня. Документация части доступна здесь . Пояснения к формату данных I2C приведены на стр. 15.
LTC2485 представляет собой преобразователь «24-битный знак плюс». Итак, официально в представлении дополнения до 2 25 бит.
Дополнение до 2 — это биты от 30 до 0. Младшие 6 битов не являются частью 25 битов (своего рода бонусные мусорные биты, которые, вероятно, не имеют большого значения в большинстве ситуаций).
Бит 31 является более или менее ** дополнением к биту 30 при нормальных условиях, когда вход находится в пределах нормального рабочего диапазона** ( ). Если биты 30/31 совпадают, а результирующие биты соответствуют показанным в таблице 3 (все нули с обоими высокими или все 1 с обоими низкими), вы знаете, что входное напряжение больше или меньше, чем опорное напряжение (условие превышения диапазона).
Часто это указывает на сломанный датчик или аналогичную проблему, поэтому вам нужно решить ее надлежащим образом.
** за исключением возможной разницы сразу при нулевом вводе.
Таким образом, ваш 25-битный результат со знаком можно получить, сдвинув влево 32-битное число на один бит и маскируя наименее значимые (теперь) 7 бит.
Наименее значащие 6 бит будут в значительной степени полностью шумовыми, но если вы выполняете вычисления с двойной точностью или 64-битной смещенной фиксированной точкой, их использование, вероятно, не требует дополнительных затрат (вы можете рассматривать результат как результат). 31-битное число со знаком после сдвига влево). ENOB (эквивалентное число битов) большинства АЦП не лучше 20 бит, и это в идеальных условиях.
Бит 31 является знаковым битом = здесь он ВЫСОКИЙ, если измеренное напряжение положительное (>= 0 В), в противном случае он НИЗКИЙ. Это не часть фактической стоимости. Следовательно x ^= 0x80000000;
, он очищает этот бит от считанного значения.
Допустим, вы подключаете 1,5-вольтовую батарею к входу вашего датчика, при этом + подключен к контакту Vin+ , этот бит будет ВЫСОКИМ. Затем поменяйте стороны батареи: подключите полюс + к Vin- пину, бит 31 будет НИЗКИМ.
Что касается бита 30, важная часть заключается If both bits are LOW, the input voltage is below –FS and the following 24 bits are set to HIGH to indicate an underrange condition
в том, что вам просто нужно проверить эти две возможности, а затем просмотреть биты с 29 по 6, которые представляют собой интересные 24 бита вашего результата.
Я должен признать, что The remaining six bits are Sub LSBs below the 24-bit level
часть немного неясна. Может это бессмысленный шум?
Чтобы ответить на ваш вопрос о том, какие биты какие, я думаю, таблица данных довольно ясна. Всякий раз, когда вы выполняете цикл чтения I 2 C, вы читаете 32 бита данных (4 байта), и эти биты — это биты, перечисленные слева направо в таблице 3.
Способ, которым вы знаете, что преобразование готов, зависит от того, подтверждает ли устройство байт адреса.
ПитерГ
Спехро Пефхани
Скотт Сейдман