Датчики
Преобразование кода цифровых датчиков температуры.
Цифровые датчики температуры формируют выходную информацию в виде многоразрядного двоичного кода. В его состав, как правило, входят целая и дробная части, а также знак. Данная статья посвящена преобразованию подобного кода в удобочитаемое цифровое значение, пригодное для дальнейшей обработки, либо вывода на дисплей.
Значение температуры в современных полупроводниковых датчиках, как правило, представлено в обычном двоичном коде, длина которого может достигать 16 бит. Старшие 8 бит отводятся под целое значение в диапазоне от –55°C до 125°C. При этом самый старший бит старшего байта отвечает за знак температуры. Младший байт содержит дробную часть измеренного значения. В зависимости от разрешения термометра в младшем байте могут использоваться от 1 до 8 бит. В некоторых высокоточных моделях с расширенным диапазоном измерения, например ADT7410, под целое значение отводится не 8 а 9 бит кода. Данный факт необходимо учитывать при реализации преобразования. Ниже будет рассматриваться только распространенный вариант с 8-ми битным целым значением.
Наиболее простые и дешевые датчики, такие как DS1621 или LM75 реализуют 9-битовый цифровой код. В этом случае используется только старший бит младшего байта, обеспечивая разрешение 0.5°C. Популярный датчик DS18B20 может иметь 12-битовый код, что позволяет отображать температуру с разрешением до 0.0625°C. Для ADT7410, такое же разрешение будет реализовано 13-битным кодом. Незначащие биты температуры, как правило, заполняются нулями.
Задачей преобразования двоичного кода температуры является получение цифрового значения для дальнейшей обработки или индикации. В первом случае необходимый результат должен быть представлен в виде числа с плавающей точкой, во втором - в виде набора десятичных цифр или BCD-кода.
Пример кода 12-ти разрядного датчика температуры
Двоичный код | Значение температуры |
01111101 00000000 | 125,0°C |
01011111 11110000 | 95,9375°C |
01000101 10010000 | 69,5625°C |
00111111 10000000 | 63,5°C |
00101010 10100000 | 42,625°C |
00100001 01100000 | 33,375°C |
00011011 01110000 | 27,4375°C |
00011001 00000000 | 25,0°C |
00000001 00010000 | 1,0625°C |
00000000 00000000 | 0°C |
11111111 10000000 | -0,5°C |
11110110 11100000 | -9,125°C |
11101000 11110000 | -23,0625°C |
11011111 00000000 | -33,0°C |
11010011 00010000 | -44,9375°C |
Преобразование целого значения
Наиболее простым случаем преобразования, будет вариант, при котором достаточно только целого значения градусов. В этом случае младший байт можно отбросить. Далее необходимо определить знак числа, с помощью считывания старшего бита. Если этот бит равен 0, то температура положительна, и значение двоичного кода равно искомому числу. Если старший бит равен 1 – температура по шкале Цельсия отрицательна, и необходимо найти двоичное дополнение числа до 1. Для этого код побитно инвертируется и к полученному значению добавляется 1. Ниже будет показано, как свести данную операцию к вычитанию. Для дальнейшего использования следует учесть, что найденное значение должно сопровождаться знаком «минус».
Преобразование температуры с дробной частью
Более сложное преобразование потребуется для учета дробной части. Опять же здесь следует обратить внимание на разрядность полученного кода (или уменьшить ее до нужного значения). Так, для 9-ти разрядного кода, достаточно к вышеописанному примеру добавить 0.5°C. Если используется код большей разрядности, то наиболее естественным преобразованием будет умножение числа на цену младшего разряда. Для 12-ти разрядного варианта формулы преобразования будут иметь следующий вид:
Для положительной температуры t°C=(ADC Code)* 0.0625
Для отрицательной температуры t°C=(not(ADC Code)+1)* 0.0625
С целью нахождения температуры необходимо выполнить следующую последовательность:
- проверить знак числа
- если «минус», то найти двоичное дополнение путем побитовой инверсии и прибавления 1.
- избавиться от незначащих разрядов, путем сдвига вправо на число незначащих бит
- умножить на разрешение кода.
Описанный вариант преобразования требует использования операций с плавающей запятой. Между тем существуют варианты, сводящиеся к простым арифметическим операциям. При их использовании двоичное дополнение находится вычитанием максимально-возможного числа используемой разрядности. Необходимо учесть что незначащие биты должны быть удалены.
12-ти битный код
Положительная температура t°C = ADC Code / 16
Отрицательная температура (знаковый бит присутствует) t°C = (ADC Code −4096)/16
Отрицательная температура (знаковый бит удален) t°C = (ADC Code – 2048)/16
9-ти битный код
Положительная температура t°C = ADC Code/2
Отрицательная температура (знаковый бит присутствует) t°C = (ADC Code– 512)/2
Отрицательная температура (знаковый бит удален) t°C = (ADC Code – 256)/2
8-ми битный код (только целые значения):
Положительная температура = ADC Code
Отрицательная температура (знаковый бит присутствует) t°C = ADC Code – 256
Отрицательная температура (знаковый бит удален) t°C = ADC Code – 128
Преобразование температуры без использования операций с плавающей точкой
Результат большинства формул опять же представлен в виде дробного числа. Если преобразования требуются только для отображения измеренного значения температуры, и необходимо отображать дробную часть, то можно полностью обойтись без чисел с плавающей запятой. Результат будет представлен в виде целого числа, а разработчик, в этом случае, должен принять меры по установке десятичного разделителя на экране. Положение разделителя между предпоследним и последним знаком, что соответствует разрешению 0.1°C. Выводить температуру с точностью выше 0.1°C, при использовании большинства дешевых датчиков, особого смысла не имеет.
Ниже приведены формулы преобразования для 9-ти и 12-ти разрядного кода. Следует учесть, что незначащие разряды младшего байта должны быть удалены, а результат будет представлять собой двоичное значение температуры умноженное на 10. Последнее необходимо перевести в BCD-код, для отображения на экране с предустановленной запятой.
Для 9-ти битного кода формулы будут иметь вид:
Положительная температура t°C = ADC Code*5
Отрицательная температура (знаковый бит присутствует) t°C = -(ADC Code– 512)*5
Отрицательная температура (знаковый бит удален) t°C = -(ADC Code – 256)*5
Заключительную операцию умножения можно представить в виде циклического сложения, результатом которого будет 16-ти разрядное число.
12-ти битный код:
Положительная температура t°C = (ADC Code /2) + (ADC Code /8)
Отрицательная температура (знаковый бит присутствует) t°C = -((ADC Code −4096)/2)+ ((ADC Code −4096)/8))
Отрицательная температура (знаковый бит удален) t°C = -((ADC Code −2048)/2)+ ((ADC Code −2048)/8))
Операция деления в данном случае может быть заменена сдвиг на количество разрядов степени двойки. Так при делении на два, сдвиг производится на один разряд, при делении на 8 – на три.