Мини пирометр

Rate this item
(1 Vote)

Прежде чем начать

Прежде чем читать эту статью рекомендуем вам ознакомится со следующей теорией:

Что такое пирометр и где его можно использовать

Пирометр, или его равнозначные названия – инфракрасный термометр - это точный инженерный прибор нового поколения для бесконтактного и быстрого измерения температурных показателей на расстоянии от исследуемого объекта. В основе его работы лежит принцип определения по тепловому излучению практически любого объекта температурного значения его поверхности.




Пирометр находит широкое применение как в бытовых процессах, так и в различных промышленных отраслях. Мгновенное и точное измерение температуры, а самое главное на расстоянии от поверхности, вот его основное преимущество, по сравнению с другими приборами измерения температуры.

С этим прибором можно измерить температуру:

  • молока в детской бутылочке или горячего чая

  • воды в ванной

  • масла при жарке во фритюре

  • компонентов в изготавливаемом приборе

  • моторов квадрокоптера

  • детали в автомобиле

  • воздуха на улице

  • внутри холодильника или морозилки

  • поверхности моря

{product id=38}

Постановка задачи, требования к прибору

Основные требования к прибору.

  • Компактный размер, карманный вариант

  • Питание от аккумулятора, автоматическое отключение по окончанию измерения

  • Высокая абсолютная и относительная точность измерений

  • Автоматическая компенсация внешней температуры

  • Индикация измеренных данных на компактном индикаторе

Подбор компонентов для самодельного пирометра

Выбираем датчик ИК излучения

Практически все пирометры содержат оптическую систему для увеличения разрешения (расстояния на котором работает прибор). Сделать ее в домашних условиях достаточно сложно, поэтому будем делать прибор без нее. Нам понадобится датчик ИК излучения, желательно цифровой и с минимальным оптическим разрешением.

Компания Melexis как раз выпускает такие датчики. Серия MLX90614 имеет очень хорошие параметры. Данный датчик представляет собой сочетание в одном 4-контактном корпусе ТО-39 инфракрасного высокочувствительного детектора на термоэлементах и специализированного стандартного формирователя сигналов. Этот термометр включает в себя малошумящий усилитель, 17-разрядный аналого-цифровой преобразователь и мощный процессор цифровых сигналов. Он откалиброван на заводе-изготовителе с возможностью использования на цифровом выходе широтно-импульсной модуляции (ШИМ) и системной шины управления (SMBus — I2C). К датчику идёт подробный datasheet, в котором подробно описано как работает датчик и какие у него есть модификации. Подберём нужную модификацию датчика из возможных вариантов.




Так как прибор должен работать от аккумуляторов, то необходима версия датчика на 3 вольта. За это отвечает первая буква в номере датчика — B или D.

Вторая буква определяет возможность автоматической температурной компенсации внешней температуры — очень полезная функция, она повышает точность измерений, особенно вне дома. Выбираем этот тип датчика — вторая буква C.

Третья — определяет оптическое разрешение датчика. Чем меньше поле обзора, тем дороже датчик, а значит с большего расстояния можно измерять температуру небольших объектов. Разрешение определяется углом конуса поля обзора датчика. Есть датчики с углом 80 градусов, 35 градусов, 10 градусов и 5 градусов. Выберем датчик серии C — угол 35 градусов, он имеет вот такой график области обзора (датчик с углом в 5 градусов стоит очень дорого).




Грубо можно сказать, что с расстояния в 20см область обзора датчика равна окружности диаметром 15см. Это не самый лучший результат, но его достаточно для домашнего использования. А учитывая размер прибора и его стоимость, польза его неоспорима.

Выбираем датчик — MLX90614ESF-BCC. Иногда проще купить датчик MLX90614ESF-ACF, он может обойдись даже дешевле, но он на 5В. Для повышения напряжения до 5В можно использовать простые конденсаторные повышающие микросхемы. Потребляемый ток самого датчика очень небольшой.

Выдавать показания датчик может по шине I2C или через PWM выход. Будем использовать I2C, как более удобный и функциональный вариант (есть возможность настроить коэффициент отражения поверхности).

Датчик определяет температуру в диапазоне от -70 градусов до 380. Погрешность измерения отображена в следующей таблице. Наибольшую точность он имеет в диапазоне от 0 до 60 градусов.




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

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

Индикатор

Пользоваться прибором будем в основном в помещении, так что отлично подойдёт светодиодный индикатор, уже знакомый по прибору Кухонный таймер.




На данном индикаторе всего три разряда, не очень удобно показывать отрицательные температуры. Будем использовать вместо минуса две светящиеся точки.

Микроконтроллер

Возьмём уже знакомый по другим приборам, самый дешёвый вариант — STM8S003F3. Все что нужно у него есть.

Аккумулятор

Питаться прибор будет от аккумулятора. Потребление за счёт включения индикатора в режиме неполной яркости в рабочем режиме составляет около 1-2 мА. Достаточно будет самого маленького аккумулятора, например LIR2032. Плату будем делать как можно меньше, поэтому заряжать будем через внешний разъем с помощью небольшой отдельной платы зарядки. Саму зарядную микросхему размещать внутри прибора не будем.

В данном приборе используется схема отключения питания самим микроконтроллером. Таким образом, тратиться энергия будет только во время работы прибора. Можно не заботиться о защите аккумулятора от глубокого разряда. То есть схема контроля разряда тоже не нужна.

Регулятор питания

Так как на аккумуляторе максимально может быть 4.2В, а для датчика максимальное напряжение составляет 3.6В, то необходим регулятор питания. Возьмём серию NCP603 на 3.3 вольта.

Подбираем корпус

Корпус возьмём аналогично кухонному таймеру «Sanhe 20-31». Датчик будет плотно держаться на своих выводах, дополнительного крепления не нужно. Разъёмов, кроме подключения аккумулятора не нужно.

Составляем схему




На данной схеме обратим внимание на механизм включения и выключения прибора тактовой кнопкой. При нажатии на тактовую кнопку на входе 3 ENABLE регулятора питания NCP551 появляется напряжение 3.08В при напряжении аккумулятора 3.7В (делитель напряжения 10к и 50к). Такое напряжение включает регулятор, и питание подаётся на МК. МК переключает вывод 14 в HIGH, и таким образом удерживает регулятор включённым. В случае если необходимо выключить прибор, например при простое более 30 сек, МК подаёт на вывод 14 сигнал LOW и регулятор выключается обесточивая всю схему.

Управляющий вывод одновременно является входом для ADC микроконтроллера, что позволяет, используя внутреннюю подтяжку (около 40к) различать напряжение при нажатии кнопки и удержании микроконтроллером. Таким образом, данная кнопка становится доступной и для работы прибора. Отметим, что не во всех микроконтроллерах можно производить изменения с помощью ADC, когда одновременно включена подтяжка вывода. В этом случае необходимо очень быстро переключить вывод в режим чистого ADC, измерить напряжение и вернуть поддержку обратно. У регулятора, как правило, есть время срабатывания выхода Enable и его обычно достаточно для такой быстрой операции.

При таком использовании регулятора важно посмотреть в datasheet такой параметр как ток потребления самого регулятора (Quiescent Current) в режиме выключения:


Для данного регулятора он составляет максимум 1 мкА, а обычно составляет всего 100 нА. Это очень мало, гораздо меньше чем работающий микроконтроллер в режиме сна.

Такая схема позволяет не ставить схему защиты аккумулятора от глубокого разряда. Так как на одном заряде аккумулятора прибора хватает более чем на 300 непрерывных измерений в течение 30 секунд, то заряжать его придётся очень редко. Схему зарядки аккумулятора в этом приборе использовать не будем. Заряжать аккумулятор будет отдельная плата.

Печатную плату вы сможете найти в проекте на github.

Программа

Программа для STM8 написана в среде ST Visual develop IDE. Полный проект вы можете скачать с github данного прибора, папка pirometr. В статье мы разберём ключевые моменты работы программы.

Общая логика работы программы

  1. При включении производится настройка ADC, I2C, тактирования процессора, прерываний, выводов и система переходит в рабочий режим

  2. Производятся непрерывные измерения (каждые 500мс) и отображение результата на индикаторе

  3. Через 30с простоя прибор выключается

  4. В случае нажатия на кнопку прибор показывает последнее измерение в течение 3с и выключается (очень удобно если нужно куда-то подлезть и произвести измерение, а потом посмотреть результат)

Инициализация

Установим частоту работы микроконтроллера в 2 МГц и отключим всю периферию, кроме ADC, I2C, TIM1 TIM2 и TIM4. Настроим выходы управления индикатором.

  1. //питание - оставляем только нужнуюпериферию!
  2. CLK->PCKENR1 =CLK_PCKENR1_TIM4+CLK_PCKENR1_TIM2+CLK_PCKENR1_I2C+CLK_PCKENR1_TIM1;
  3. CLK->PCKENR2 = 0b01111111;
  4.  
  5. CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV8);//2mghэнергосбережение
  6.  
  7. //индикатор
  8. GPIO_Init(GPIOD,GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6,GPIO_MODE_OUT_PP_HIGH_SLOW);
  9. GPIO_Init(GPIOA,GPIO_PIN_1|GPIO_PIN_2,GPIO_MODE_OUT_PP_HIGH_SLOW);
  10. GPIO_Init(GPIOC,GPIO_PIN_3|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7,GPIO_MODE_OUT_PP_HIGH_SLOW);
  11.  

Теперь настроим ADC и подключим PULL UP на выводе ADC. Таким образом регулятор будет удерживаться во включённом состоянии.

  1. //ADC кнопки
  2. ADC1_DeInit();
  3.  
  4. ADC1_Init(ADC1_CONVERSIONMODE_SINGLE, ADC1_CHANNEL_2,ADC1_PRESSEL_FCPU_D2, \
  5. ADC1_EXTTRIG_TIM, DISABLE, ADC1_ALIGN_RIGHT,ADC1_SCHMITTTRIG_CHANNEL2,\
  6. ENABLE);
  7. ADC1_Cmd(DISABLE);
  8.  
  9. GPIO_Init(GPIOC,GPIO_PIN_4,GPIO_MODE_IN_PU_NO_IT);//кнопка!
  10.  

Инициализируем таймеры и I2C.

  1. TIM4_TimeBaseInit(TIM4_PRESCALER_8, 249);
  2. TIM4_ClearFlag(TIM4_FLAG_UPDATE);
  3. TIM4_ITConfig(TIM4_IT_UPDATE, ENABLE);
  4. TIM4->IER |= (uint8_t)TIM4_IT_UPDATE;
  5.  
  6. enableInterrupts();
  7. TIM4_Cmd(ENABLE);
  8.  
  9. TIM2_TimeBaseInit(TIM2_PRESCALER_8, 249);
  10. TIM2_ClearFlag(TIM2_FLAG_UPDATE);
  11. TIM2_ITConfig(TIM2_IT_UPDATE, ENABLE);
  12. TIM2->IER |= (uint8_t)TIM2_IT_UPDATE;
  13. TIM2_Cmd(ENABLE);
  14.  
  15. I2C_Cmd( ENABLE);
  16. I2C_Init(I2C_MAX_STANDARD_FREQ, (uint8_t)0xA0, I2C_DUTYCYCLE_2,I2C_ACK_CURR, I2C_ADDMODE_7BIT, 7); I2C_Init(I2C_MAX_STANDARD_FREQ,(uint8_t)0xA0, I2C_DUTYCYCLE_2, I2C_ACK_CURR, I2C_ADDMODE_7BIT, 7);
  17.  

Подождём немного и инициализируем ИК датчик. Прибор готов к работе.

  1. Delay(1000);
  2. mlxinit();
  3.  
  4. ind[0]=1;
  5. ind[1]=2;
  6. ind[3]=3;
  7. tchk[1]=1;
  8.  

В качестве инициализации датчика прочитаем из его EEPROM данные Tomax и Tomin. Находятся они по адресам 0x0 и 0x1, а для доступа к EEPROM используется пятый бит.


Драйвер I2C используем аналогично прибору Измеритель УФ индекса и температуры. Получается вот такой код.

  1. int mlxinit(void)
  2. {
  3. buff[0] = (uint8_t) 0x20;
  4. if( ! I2C_writenbyte((uint8_t)MLXaddr, buff, 1,1) )
  5. {
  6. I2C->CR2 |= I2C_CR2_STOP;//I2C_GenerateSTOP(ENABLE);
  7. return 0;
  8. };
  9.  
  10. if (! I2C_readnbyte((uint8_t)MLXaddr, buff, 3,1) )
  11. {
  12. return 0;
  13. };
  14.  
  15. tomax = (u16) (buff[1]<<8) | buff[0];
  16.  
  17. buff[0] = (uint8_t) 0x21;
  18. if( ! I2C_writenbyte((uint8_t)MLXaddr, buff, 1,1) )
  19. {
  20. I2C->CR2 |= I2C_CR2_STOP;//I2C_GenerateSTOP(ENABLE);
  21. return 0;
  22. };
  23.  
  24. if (! I2C_readnbyte((uint8_t)MLXaddr, buff, 3,1) )
  25. {
  26. return 0;
  27. };
  28.  
  29. tomin = (u16) (buff[1]<<8) | buff[0];
  30.  
  31. return 1;
  32. }
  33.  

Приступаем к основной программе.

Обработка кнопок и индикатор

Обработку кнопок и управление индикатором возьмём из проекта кухонный таймер.

Таймеры

TIM2 — используется для управления индикатором.

TIM4 — основной миллисекундный таймер и управление кнопкой.

Обработка кнопки с помощью ADC

Для того чтобы понять, что кнопка нажата необходимо получить напряжение на входе управления регулятором. Как было ранее рассмотрено в схеме, при нажатии на кнопку напряжение будет составлять около 3В, а при отпущенной кнопке около 1.5В (за счет делителя с резистором PULL UP).

Кнопка опрашивается каждые 50мс, за это отвечает макрос KNDTIME.

  1. ADC1_Cmd(ENABLE);
  2. ADC1_StartConversion();
  3. while( ADC1_GetFlagStatus(ADC1_FLAG_EOC) == RESET);
  4. ADC1_Cmd(DISABLE);
  5. adcval = ADC1_GetConversionValue();
  6.  
  7. if (adcval > 700 )
  8. knall = GPIO_PIN_0;
  9.  
  10. knint(0, ~knall, GPIO_PIN_0);
  11.  

Стартуем измерение ADC, ждём пока оно закончится и сравниваем полученное значение с граничной величиной. Если значение больше 2.5В - то кнопка нажата. Вот так просто реализуется опрос кнопки с помощью ADC.

Получение данных с датчика

За получение данных отвечает функция mlxdata().

  1. int mlxdata(void)
  2. {
  3. buff[0] = (uint8_t) 0x06;
  4. if( ! I2C_writenbyte((uint8_t)MLXaddr, buff, 1,1) )
  5. {
  6. I2C->CR2 |= I2C_CR2_STOP;//I2C_GenerateSTOP(ENABLE);
  7. return 0;
  8. };
  9.  
  10. if (! I2C_readnbyte((uint8_t)MLXaddr, buff, 3,1) )
  11. {
  12. return 0;
  13. };
  14.  
  15. ta = (u16) (buff[1]<<8) | buff[0];
  16.  
  17. buff[0] = (uint8_t) 0x07;
  18. if( ! I2C_writenbyte((uint8_t)MLXaddr, buff, 1,1) )
  19. {
  20. I2C->CR2 |= I2C_CR2_STOP;//I2C_GenerateSTOP(ENABLE);
  21. return 0;
  22. };
  23.  
  24. if (! I2C_readnbyte((uint8_t)MLXaddr, buff, 3,1) )
  25. {
  26. return 0;
  27. };
  28.  
  29. tobj= (u16) (buff[1]<<8) | buff[0];
  30.  
  31. temp1 = (ta - 0x2DE4) * 0.02f - 38.2f;
  32. temp2 = (tobj) * 0.02f - 273.15f;
  33.  
  34. return 1;
  35. }
  36.  

Процедура очень простая, читаем данные из RAM датчика по адресам 0x6, 0x7 и 0x8.


И получаем температуру объекта и параметры для линейной аппроксимации. Далее согласно советам из datasheet производим вычисления. Нам нужна температура объекта — temp2.

Основная программа

В основной программе обработаем различные ситуации.

  1. if (timevykl==0) {
  2. ADC1_Cmd(DISABLE);
  3. GPIO_Init(GPIOC,GPIO_PIN_4,GPIO_MODE_OUT_PP_LOW_SLOW);//vykl!!
  4. }
  5.  

Если пришло время выключить прибор, то просто отключаем периферию ADC и опускаем вывод на LOW.

  1. if (kn[0] == KNONE) {
  2. kn[0]=0;
  3. Delay(3000);
  4. ADC1_Cmd(DISABLE);
  5. GPIO_Init(GPIOC,GPIO_PIN_4,GPIO_MODE_OUT_PP_LOW_SLOW);//vykl!!
  6. halt();
  7. }
  8.  

Если нажали кнопку, то оставим на индикаторе в течение 3 секунд последнее измерение и выключим прибор.

  1. if (timemcp==0) {
  2. mlxdata();
  3.  
  4. tchk[0]=0;
  5. tchk[1]=0;
  6. tchk[2]=0;
  7. if (temp2<0) {
  8. temp2 = -temp2;
  9. tchk[0]=1;
  10. }
  11. if (temp2<100) {
  12. shownumber(temp2*10);
  13. tchk[1]=1;
  14. } else {
  15. shownumber(temp2);
  16. tchk[2]=1;
  17. }
  18.  
  19. timemcp=500;
  20. }
  21.  

И сам вывод информации на индикатор. Каждые 500 мс считываем новые значения датчика и выводим на индикатор. Так как здесь нет отдельного разряда для отображения минуса, то отрицательные температуры обозначаем двумя точками. Например -10 градусов выводим как «1.0.». Температуры меньше 100 градусов показываем с точностью до одной десятой, а выше в целых градусах.

Как изготовить домашний пирометр

Делаем плату и все запаиваем

  1. Подготовить или приобрести необходимые инструменты: все для пайки, ST-LINK (будет нужен для программирования и отладки МК)

  2. Внимательно прочитать статьи из раздела Обязательная теория.

  3. Скачать необходимые файлы по данному прибору с github.

  4. Изготовить плату для прибора самостоятельно (это совсем несложно, в нашей инструкции все подробно описано).

  5. Приобрести все необходимые комплектующие.

  6. Запаять все компоненты на плату, смотри наше видео.

  7. Плата готова!

Для программирования вам понадобятся провода мама-мама. Вы можете их сделать сами из данного набора. Во время программирования, можно сразу подключить питание с ST-Link, вместо аккумулятора и SWIM вывод.

Размещение ИК датчика в корпусе

Для размещения датчика в корпусе необходимо аккуратно сделать на плате вырез, чтобы датчик поместился в корпусе. На трассировке для этого специально выделена область без меди.


Вывод программирования удобно сделать проводом припаяв к нему один пин разъем мама и одев его в термоусадку.


Приобретённые навыки

Схемотехника: Включение выключение прибора тактовой кнопкой, I2C, типовая схема подключения STM8, работа с кнопками.

Программирование: I2C, работа с ИК датчиком температуры, миллисекундный таймер, динамическая индикация светодиодного индикатора, включение выключение тактовой кнопкой.

Самостоятельная работа

Вы можете расширить функционал прибора в части измерения температуры объекта — добавить возможность учитывать различный коэффициент диффузии поверхности объекта.

---

Read 4510 times