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

Цифровые датчики температуры объединяют в одном кристалле собственно датчик, АЦП, и последовательный интерфейс. Они охватывают достаточно широкий диапазон измеряемых температур, имеют хорошую точность и разрешающую способность, не требуют использования внешних компонентов, легко подключаются к микроконтроллерам, имеют маленький размер и низкую стоимость.

В результате исследования 10 цифровых датчиков от семи производителей, выяснилось, что все они дают на выходе данные в дополнительном до двух формате со знаком. Температурный диапазон может иметь значение –25°С...+85°С или –40°С...+125°С, точность 0,5°С...2°С или 2°С...4°С, и разрядность выходных данных 9...13 Бит с разрешением 0,5°С...0,0312°С. Время преобразования для микросхем составляет 26...750 мсек, и они используют SPI (serial-peripheral interface), I2C (inter-integrated-circuit), или 1-Wire интерфейс. Напряжение питания составляет 1,5 В...3,6 или 3 В...5,5 В, и стоимость находится в диапазоне $0,80 до $2,10 (в партиях от 1000 штук).

Все эти датчики требуют подключения к микроконтроллерам; следовательно, важным являются размер, скорость работы и время создания встроенного программного обеспечения. При стандартном подходе используется язык высокого уровня и компилятор. Время разработки оказывается коротким, и реализация даже сложных алгоритмов не вызывает трудностей. Однако, компилятор генерирует машинные коды которые занимают больше памяти и выполняются с меньшей скоростью, чем коды, написанные на ассемблере. Кроме того, IDE (интегрированная среда разработки) компиляторов имеет стоимость в сотни долларов, в то время как для разработки программ на языке ассемблера многие компании предлагают бесплатные IDE.

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

Рассмотрим датчик TMP121 от компании Texas Instruments. Он выдает 13-битные данные в 16-битном фрейме с разрешением 0,0625°C/Бит. Следовательно, его передаточная функция будет иметь вид tC=0,0625хNS, где tC – температура в градусах Цельсия и NS – данные датчика, после удаления трех незначащих старших битов. Приведенное выше уравнение можно легко преобразовать к виду:

         (1)

Чтобы преобразовать считанные данные в градусы Фаренгейта, используется следующее уравнение: tF=[(9/5)хtC+32]

Заменяя tC на его значение из приведенного выше уравнения получим:

           (2)


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

Была протестирована схема с популярным микроконтроллером 68HC11 компании Motorola. Кроме датчика и контроллера, она содержит переключатель единиц измерения и символьный ЖКИ. Разрешение дисплея составляет 0,1°. Ядром демонстрационной программы является бесконечный цикл, в котором микроконтроллер 68HC11 использует функцию выхода-компаратора, чтобы генерировать прямоугольный сигнал с периодом 1 сек и заполнением 50%.

Сигнал OC2 присоединяется к входу  датчика и управляет его работой. Когда на выводе  присутствует потенциал высокого логического уровня, датчик измеряет температуру. Микроконтроллер HC11 не делает ничего за исключением отображения буквы M на ЖКИ. Когда на выводе  появляется потенциал низкого логического уровня, последнее измеренное значение загружается в сдвиговый регистр внутри датчика. Микроконтроллер HC11 стирает букву M с дисплея, читает состояние переключателя и данные с датчика, обрабатывает данные, и отображает измеренное значение температуры.

Уравнения 1 и 2 служат основой для двух вариантов исходного кода. Листинг 1 генерирует машинный код размером 981 байт. Листинг 2 генерирует машинный код размером 392 байта. Несмотря на то, что в листинге на языке C используется только целочисленная арифметика, результирующему коду для выполнения задачи необходимо в 2,5 раза больше памяти. Это соотношение будет больше 10, если в коде на языке C использовать арифметику с плавающей точкой.

Выгода очевидна: модифицированные уравнения 1 и  2, а также использование для программирования языка ассемблера позволяет выбрать для решения задачи микроконтроллер с меньшим объемом памяти и уменьшить общую стоимость разработки.

2009-07-14