Датчики

Преобразование кода цифровых датчиков температуры.

Цифровые датчики температуры формируют выходную информацию в виде многоразрядного двоичного кода. В его состав, как правило, входят целая и дробная части, а также знак. Данная статья посвящена преобразованию подобного кода в удобочитаемое цифровое значение, пригодное для дальнейшей обработки, либо вывода на дисплей.

Значение температуры в современных полупроводниковых датчиках, как правило, представлено в обычном двоичном коде, длина которого может достигать 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. Ниже будет показано, как свести данную операцию к вычитанию. Для дальнейшего использования следует учесть, что найденное значение должно сопровождаться знаком «минус».

Пример преобразования 8-ми разрядного кода

8-ми разрядный код температуры равен 1110011b. Старший бит равен 1, следовательно, температура отрицательна. Находим дополнение до 1.

not(11100111b)+1 = 00011000b + 1 = 00011001b

Полученное число в десятичной системе равно: 00011001b = 25d

С учетом знака результат равен: t°C= - 25°C

 

Преобразование температуры с дробной частью

Более сложное преобразование потребуется для учета дробной части. Опять же здесь следует обратить внимание на разрядность полученного кода (или уменьшить ее до нужного значения). Так, для 9-ти разрядного кода, достаточно к вышеописанному примеру добавить 0.5°C. Если используется код большей разрядности, то наиболее естественным преобразованием будет умножение числа на цену младшего разряда. Для 12-ти разрядного варианта формулы преобразования будут иметь следующий вид:

Для положительной температуры t°C=(ADC Code)* 0.0625

Для отрицательной температуры t°C=(not(ADC Code)+1)* 0.0625

С целью нахождения температуры необходимо выполнить следующую последовательность:

- проверить знак числа

- если «минус», то найти двоичное дополнение путем побитовой инверсии и прибавления 1.

- избавиться от незначащих разрядов, путем сдвига вправо на число незначащих бит

- умножить на разрешение кода.

 

Пример преобразования 12-ти разрядного кода

12-ти разрядный код температуры равен 11100110 11110000b. По старшему биту сразу видно, что температура отрицательна. Необходимо найти дополнение, которое будет равно:

not(11100110 11110000b)+1 = 00011001 00001111b + 1 = 00011001 00010000b

Следующим действием будет сдвиг вправо на 4 бита, результат которого равен:

0001 10010001b = 401d

Умножив полученное значение на разрешение датчика, равное в данном случае 0.0625°C, можно получить искомую температуру в виде числа с плавающей точкой.

t°C =401d * 0.0625d = 25.0625°C

 

Описанный вариант преобразования требует использования операций с плавающей запятой. Между тем существуют варианты, сводящиеся к простым арифметическим операциям. При их использовании двоичное дополнение находится вычитанием максимально-возможного числа используемой разрядности. Необходимо учесть что незначащие биты должны быть удалены.

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

Пример упрощенного преобразования

Для вышеприведенного примера 12-ти разрядного кода температуры равного 11100110 11110000b, потребуются следующие действия::

- удаляются незначащие биты: 11100110 11110000b ~ 11100110 1111b = 3695d

- выполняются вычисления по формуле t°C = (ADC Code −4096)/16:

t°C = (ADC Code −4096)/16 = (3695d – 4096d)/16d = (-401)/16 = -25.0625°C

Результат t°C = -25.0625°C аналогичен первому варианту преобразования.

 

Преобразование температуры без использования операций с плавающей точкой

Результат большинства формул опять же представлен в виде дробного числа. Если преобразования требуются только для отображения измеренного значения температуры, и необходимо отображать дробную часть, то можно полностью обойтись без чисел с плавающей запятой. Результат будет представлен в виде целого числа, а разработчик, в этом случае, должен принять меры по установке десятичного разделителя на экране. Положение разделителя между предпоследним и последним знаком, что соответствует разрешению 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 – на три.

 

Пример преобразования без использования операций с плавающей точкой

Пусть исходный код АЦП равен: 00100110 11100000b, что соответствует значению 38,875d

- сокращаем исходный код до 12 разрядов: 001001101110b

- сдвигаем полученное число вправо на один разряд: 001001101110b >> 1 = 000100110111b

- сдвигаем полученное число вправо на три разряда: 001001101110b >> 3d = 000001001101b

- складываем результаты сдвигов: 000100110111b + 000001001101b = 110000100b

- переводим результат в десятичный формат: 110000100b = 388d

Если установить запятую между последним и предпоследним разрядом, получим t°C = 38,8°C. Некоторые проблемы с округлением, но в остальном результат соответствует реальному.

 

 

You have no rights to post comments