Меню

Infrared temperature sensor бесконтактный ик датчик температуры интерфейс i2c

Infrared Temperature Sensor, Бесконкатный ИК датчик температуры, интерфейс I2C

Описание

Infrared Temperature Sensor – это бесконтактный датчик температуры который позволяет измерять температуру удаленных или труднодоступных объектов. Также измеряет среднюю температуру по площади.

Особенности:
— Измеряет температуру поверхности объекта, не касаясь его, в зависимости от испускаемых ИК-волн цели;
— Бесконтактный, высокая точность, высокое разрешение, быстрая реакция;
— Откалиброван, с компенсацией градиента температуры;
— Встроенная схема преобразования уровня напряжения позволяет напрямую подключаться к системам MCU 3.3 В / 5 В.

Спецификация:

— Напряжение питания: 3.3. 5 В;
— Диапазон измерения (площадь): +40. +85 °C;
— Диапазон измерения (объект): -70. +380 °C;
— Разрешение: 0.02 °C;
— Точность: ± 0.5 °C (0. +50 °C);
— Поле зрения (FOV): 35 °;
— Размер: 28 мм x 16 мм;
— Размер монтажных отверстий: 2.0 мм.

Применение:
— Высокоточное измерение температуры без контакта;
— Промышленный контроль температуры;
— Контроль температуры бытовой техники.

Комплектация:

1 х Датчик (Infrared Temperature Sensor)
1 х Провод (PH2.0 4PIN wire)

Источник

STM32 и бесконтактный датчик температуры MLX90614. Подключение по I2C

Датчик MLX90614 — это датчик с бесконтактным считыванием температуры объекта посредством приема и преобразования инфракрасного излучения. Он умеет работать в трех режимах: термостат, ШИМ выход и SMBus. В режиме термостат датчику не требуется контроллер, он просто держит температуру в заданных пределах, управляя драйвером нагрузки открытым стоком. В режиме ШИМ на выходе датчика появляется сигнал ШИМ, скважность которого зависит от температуры. В целях подключения к контроллеру наиболее интересен режим SMBus. Так как этот протокол электрически и сигнально совместим с I2C мы будем работать с датчиком, используя аппаратный I2C. О нем и пойдет речь в данной статье. Все режимы датчика настраиваются записью в определенные ячейки EEPROM. По умолчанию датчик находится в режиме SMBus.

Внешний вид и схема подключения

В подключении датчика нет ничего сложного. У меня есть плата «Синяя таблетка» с контроллером STM32F103C8T6 на борту, вот к ней и будем подключать датчик. У этого контроллера 2 аппаратных интерфейса I2C. Для датчика будет использоваться первый на выводах по умолчанию. Это PB6 — SCL, PB7 — SDA. При подключении необходимо не забыть подтянуть эти выводы к питанию внешними резисторами, у меня их сопротивление 4.7 кОм.

Программная часть

Весь код я решил оформить в виде библиотеки, состоящей из двух файлов: mlx90614.h и mlx90614.c . Также в проекте используется библиотека системного таймера для задержек и библиотека LCD дисплея A2004 для вывода температуры. Они описаны в прошлой статье.

Читайте также:  Ультразвуковой датчик ветра wmt52

Начнем с заголовочного файла.

В начале подключаем заголовочный файл для своего контроллера. У меня это stm32f1xx.h. Стандартная библиотека СИ stdio.h нужна для того, чтобы переводить дробные числа в char массив для вывода на LCD. delay.h — библиотека для организации задержек.

Далее идут константы для инициализации аппаратного I2C. В последствии в коде они подставятся в нужные регистры. Это сделано для того, чтобы меняя частоту тактирования изменить только макроопределение F_APB1, а не копаться в коде и исправлять на новое значение.

Далее идем в даташит и узнаем, что датчик имеет две разные памяти: RAM и EEPROM. RAM используется для считывания температуры. Внутренний процессор датчика считывает температуру с сенсоров, обрабатывает и кладет в ячейки RAM температуру в Кельвинах. В первых двух ячейках хранится «сырая температура». Я не понял что она из себя представляет. В следующих ячейках температура кристалла датчика, температура первого и второго сенсора. Датчики MLX90614 бывают с одним и двумя датчиками. У меня с одним, поэтому температура будет читаться с первого сенсора. В EEPROM конфигурируется работа датчика. Для удобства запишем адресацию памяти в заголовочном файле в виде макроопределений.

Также из документации к датчику переносим команды, с которыми он умеет работать.

С макроопределениями закончили. Теперь нужно определить функции, с помощью которых контроллер будет взаимодействовать с датчиком. Чтобы комфортно работать с датчиком нужно уметь считывать температуру и считывать и изменять адрес устройства, так как на шине I2C может быть несколько таких датчиков, а адрес по умолчанию у всех одинаковый — 5A. Я задумывал в своем устройстве использовать два таких датчика, но почитав форумы понял, что они для моих целей не подходят. Так как датчики уже были у меня я решил написать под них библиотеку на будущее.

Итак определяем функции:

Инициализация I2C для работы с датчиком

double getTempMlx90614Double( uint16t address, uint8t ram_address )

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

void getTempMlx90614CharArray( uint16t address, uint8t ram_address, char* buf )

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

Читайте также:  Разъем датчика скорости форд фокус 1 2003

uint16t getAddrFromEEPROM( uint16t address )

Возвращает адрес датчика, записанный в его EEPROM. Принимает текущий адрес датчика.

int setAddrToEEPROM ( uint16t address, uint16t new_address )

Записывает адрес датчика в EEPROM. Применяется для изменения адреса датчика.

uint16t readEEPROM( uint16t address, uint16t eepromaddress )

Универсальная функция чтения EEPROM

void writeEEPROM ( uint16t address, uint16t eepromaddress, uint16t data )

Универсальная функция записи в EEPROM

С заголовочным файлом закончили. Самое время написать реализации функций.

Из комментариев в функции понятно что в ней делается. Единственное следует обратить внимание на F_APB1, CCR_VALUE и TRISE_VALUE они берутся из заголовочного файла, там и рассчитываются исходя из заданной частоты тактирования. Так же важно отключить модуль I2C перед настройкой регистра CCR ( это указано в документации на контроллер ) и разрешить ACK после запуска модуля I2C , иначе ACK работать не будет.

Здесь следует обратить внимание, что адрес датчика сдвигается на 1 бит влево, а потом в первый бит адреса записывается 1 для чтения, 0 — для записи. В документации на датчик не очень очевидно освещен процесс передачи адреса по I2C. И там не понятно почему обращаемся по адресу 5A, а на временной диаграмме B4 для записи и B5 для чтения. Принимая во внимание тот факт, что мы сдвигаем адрес влево и прибавляем бит режима доступа, все встает на свои места. Еще есть одна тонкость. В старшем бите старшего байта передается бит ошибки. Его необходимо удалить перед дальнейшей обработкой, что мы и делаем перед сдвигом в старший байт — (temp & 0x007F).

Получить значение температуры конечно хорошо, но еще лучше вывести это значение на LCD, например. Для этого есть простенькая функция void getTempMlx90614CharArray, которая просто преобразует полученное значение из предыдущей функции в char массив, используя для этого функцию стандартной библиотеки СИ sprintf(), которая объявлена в файле stdio.h

Общий алгоритм чтения из RAM датчика выглядит так:

Передаем адрес датчика, сдвинутый на 1 бит влево плюс бит записи (первый). Для записи — 0

Передаем адрес RAM откуда читать плюс команда доступа к RAM. Адресом RAM может быть температура кристалла датчика или температура одного из двух инфракрасных сенсоров.

Передаем адрес датчика сдвинутый на 1 влево плюс бит чтения.

Теперь мы умеем читать температуру из датчика. Осталось реализовать возможность менять адрес, чтобы можно было вешать несколько датчиков на шину. Но перед этим напишем две вспомогательные функции для работы с EEPROM для записи и чтения.

Читайте также:  Как снять датчик кислорода лансер 10

Алгоритм чтения из EEPROM выглядит следующим образом:

Передаем адрес датчика, сдвинутый на 1 бит влево плюс бит записи (первый). Для записи — 0

Передаем адрес EEPROM откуда читать плюс команда доступа к EEPROM ( определена в заголовочном файле )

Передаем адрес датчика плюс бит чтения

Функция чтения из EEPROM

Чтение из EEPROM осуществляется по аналогичному алгоритму чтения из RAM. Разница только в командах выбора памяти и адресах этой памяти.

С записью немного иначе. Алгоритм следующий:

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

Передаем адрес EEPROM плюс команда выбора EEPROM памяти

Передаем PEC (байт контрольной суммы )

Здесь повторный старт не используется, а сразу пишется два байта адреса. Обратите внимание, что адрес использует только младший байт, поэтому в старший пишутся нули.

Функция записи в EEPROM

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

Функция чтения адреса датчика

Тут все просто. Функция принимает текущий адрес датчика, читает с помощью readEEPROM() текущий адрес из EEPROM и возвращает его.

С записью нового адреса в EEPROM немного сложнее. Даташит на MLX90614 рекомендует следующий алгоритм записи в EEPROM:

Запись в ячейку нулей, тем самым эффективно стирая ее

Пишем новое значение ячейки

Читаем ячейку для сравнения с исходным значением, чтобы убедиться, что записано без ошибок

От себя дополню. Новый адрес датчика будет использоваться только после выключения и повторного включения питания датчика. В связи с этим необходимо предусмотреть отдельный пин контроллера, который будет управлять включением и выключением датчика через, например, транзистор. Здесь возникает вопрос — зачем вообще нужен режим сна, если все равно для работы с EEPROM необходимо управлять питанием датчика? Не проще ли тогда просто отключать питание? Поэтому я не стал реализовывать режим сна, так как в таких обстоятельствах он не имеет смысла. Так же в этой статье я не рассматриваю управление питанием, так как реализовать его не сложно в реальном проекте.

Функция записи в EEPROM

И наконец пришло время опробовать работу библиотеки. Для этого пишем небольшой скетч в main() функции проекта

Источник

Adblock
detector