Jump to content
binarick

Измеряю Температуру

Recommended Posts

Здравствуйте уважаемые.

Я недавно в теме.

Понадобилось измерить температуру с помощью атмеги8

и всё бы было здорово если бы можно было использовать цифровой датчик. но у меня температура 360 Цельсия

потому придётся выбрать аналоговый датчик температуры (термистор).

может у когонить есть пример кода на с++ (это чтобы не разжёвывать) гугл не помог не или плохо искал

или мои вопросы

1. у аналоговых датчиков линейная зависимость сопротивления от температуры ?

2. по какому принципу можно получить температуру с аналогового датчика ? про работу АЦП не нужно объяснять мне, смутно но понимаю.

не понимаю что сделать когда я получил напряжение с датчика на АЦП как мне величину этого напряжения перевести в градусы ?

зы: Пишу проект на CodeVisionAVR 3.12 хоть и смотрел уроки на тюбе но атмел студии всё сложнее т.к. там нет мастеров генерации кода. Для меня лично как ламера в AVR это выручает до нельзя тк. мне не оч бы хотелось вникать в тонкости работы с lcd либо adc.

Далее мучаю протеус 8,1

Если необходимо выложу сюда

Спасибо за ваше время и ответы.

Share this post


Link to post
Share on other sites

Зависимость указывается в даташите на термистор.

Напряжение на АЦП ты получаешь с делителя напряжения, одним из плечей которого является термистор. Это напряжение однозначно зависит от напряжения перед делителем (должно быть постоянным и стабильным) и сопротивления термистора. Сопротивление однозначно зависит от температуры и калибровка (указание сопротивления для конкретных температур) тоже указана в даташите.

Вот пример для одного из NTC NTC-MF52AT 10K 3950 1%.pdf

В соответствии со всем этим ты связываешь температуру и выходное значение АЦП в МК.

Share this post


Link to post
Share on other sites

Ага буду искать датащит с табличкой зависимости t от r

понял про плечи сейчас реализую

но у меня есть lcd на котором не плохо было бы отображать текущую температуру.... и тут у меня ступор

как в коде это реализовать ?

приходит на ум только тупой способ какой то, если напряжение ацп = x тогда t = у и куча куча таких условий.....

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

Может существует другой способ ? формула или чтото такое

Edited by binarick

Share this post


Link to post
Share on other sites

Литиевые батарейки Fanso для систем телеметрии и дистанционного контроля

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

Подробнее

Если зависимость можно описать формулой - используй формулу. Если нет, то можешь брать два ближайших значения и аппроксимировать.

Например точно известно, что при 110° сопротивление 1кОм, а при 111° 0.9кОм. Тогда при сопротивлении 0.91кОм будет 110.9°.

То есть тут уже чистая математика и возможности твоего АЦП.

Share this post


Link to post
Share on other sites

Эх беда.

попытаюсь найти датчик с линейной зависимостью если такой вообще существует.

Share this post


Link to post
Share on other sites
                     

Приглашаем на вебинар Решения для построения ультразвуковых счетчиков жидкостей и газов на базе MSP430

Компэл совместно с Texas Instruments 23 октября 2019 приглашают на вебинар, посвященный системам-на-кристалле для построения ультразвуковых расходомеров жидкостей и газов на базе ядра MSP430. Вебинар проводит Йоханн Ципперер – эксперт по ультразвуковым технологиям, непосредственно участвовавший в создании данного решения. На вебинаре компания Texas Instruments представит однокристальное решение, позволяющее создавать точные недорогие счетчики жидкостей и газов.

Подробнее...

Что вам даст датчик с линейной зависимостью? На выходе делителя напряжение все равно не будет линейным.

Возьмите платиновый терморезистор типа PT-100 http://e-voron.dp.ua/catalog/015715 , высокая точность, сопротивление меняется по формуле Rt = Rо (1+0,00385 t) http://www.micropik.com/PDF/pt100.pdf

Share this post


Link to post
Share on other sites

IMHO на 360 градусов уже хромель-копелевую термопару нужно применять, а это уже специализированая обвязка. Термисторы такие бывают, но неизвестно насколько они легкодоставаемы и полагаю, что стОят они немало. Тот-же PT100 ~ 1000руб. А линейность - нелинейность, всё-равно калибровать нужно, ну или по таблице выборку делать с аппроксимацией, как уже написали.

Edited by shindbad

Share this post


Link to post
Share on other sites

Что вам даст датчик с линейной зависимостью? На выходе делителя напряжение все равно не будет линейным.

Возьмите платиновый терморезистор типа PT-100 http://e-voron.dp.ua/catalog/015715 , высокая точность, сопротивление меняется по формуле Rt = Rо (1+0,00385 t) http://www.micropik.com/PDF/pt100.pdf

предполагаю что формула на линейную зависимость будет проще

Вот спасибо за датчик. ща поискаю где добыть можно ли. жесть до 850 цельсия )))

IMHO на 360 градусов уже хромель-копелевую термопару нужно применять, а это уже специализированая обвязка. Термисторы такие бывают, но неизвестно насколько они легкодоставаемы и полагаю, что стОят они немало. Тот-же PT100 ~ 1000руб. А линейность - нелинейность, всё-равно калибровать нужно, ну или по таблице выборку делать с аппроксимацией, как уже написали.

деньги не имеют значения.

когда вник зачем мост сопротивлений нужен понял что калибровки не избежать.

насчёт легкодоступности пока абсолютно всё что когда либо требовалось покупал на алиэкспрессе.

Share this post


Link to post
Share on other sites

IMHO на 360 градусов уже хромель-копелевую термопару нужно применять, а это уже специализированая обвязка. Термисторы такие бывают, но неизвестно насколько они легкодоставаемы и полагаю, что стОят они немало. Тот-же PT100 ~ 1000руб. А линейность - нелинейность, всё-равно калибровать нужно, ну или по таблице выборку делать с аппроксимацией, как уже написали.

Не знаю, где вы увидели 1000 рублей, 2 доллара за датчик в виде резистора, 6 - в виде щупа http://www.aliexpress.com/premium/pt100.html?ltype=wholesale&d=y&origin=y&SearchText=pt100&initiative_id=AS_20150211011757&isViewCP=y&catId=523

Вот спасибо за датчик. ща поискаю где добыть можно ли. жесть до 850 цельсия )))

Не дефицит. И калибровать не прийдется, раз дана точность, то будет соответствовать формуле (и таблице соотв)

Share this post


Link to post
Share on other sites

Да примерно там-же:

http://russian.alibaba.com/goods/pt100-temperature-sensor.html

И как-то мне слабо верится, что "платиновый" датчик стоимостью $2-6, вообще содержит платину. Уж что-что, а писать китайцы хорошо умеют.

Share this post


Link to post
Share on other sites

Я попробую эти дешманские штуки потом отпишусь если не забуду

статейку нарыл по моей темке как раз

http://www.rlocman.r....html?di=151518

как обидно что там код на ассемблере.... я в нём ни бумбум.....

был бы хорошим велосипедом еслиб на с++

Edited by binarick

Share this post


Link to post
Share on other sites

поищите самодельные паяльные станции. там и датчики. там и исходники....

Share this post


Link to post
Share on other sites

Поищи в гугле самодельную паяльную станцию на атмеге8.

Там и схема и прога на СИ. И обвязки для термопары один операционник.

И термопару самому можно сделать.

Вот и опоздал уже.

Edited by croc19

Share this post


Link to post
Share on other sites

ищу пока только на термопарах попадаются схемки (нада кстати подумать в этом направлении)

хотя в коде как я понимаю различий не будет

если правильно понимаю термопара это тотже термистор но с обвязкой в виде усилителя

Edited by binarick

Share this post


Link to post
Share on other sites

вот функция кусочно-линейной аппроксимации термистора

uint32_t TempConvert (uint32_t T)
{
if (T<545) return 0;
if (T < 652) return ((T-545)*1000/215+2000)/10;
if (T < 783) return ((T-652)*1000/261+2500)/10;
if (T < 929) return ((T-783)*1000/293+3000)/10;
if (T < 1091)return ((T-929)*1000/324+3500)/10;
if (T < 1266)return ((T-1091)*1000/349+4000)/10;
if (T < 1453)return ((T-1266)*1000/374+4500)/10;
if (T < 1652)return ((T-1453)*1000/398+5000)/10;
if (T < 1858)return ((T-1652)*1000/412+5500)/10;
if (T < 2067)return ((T-1858)*1000/418+6000)/10;
if (T < 2277)return ((T-2067)*1000/419+6500)/10;
if (T < 2485)return ((T-2277)*1000/416+7000)/10;
if (T < 2688)return ((T-2485)*1000/406+7500)/10;
if (T < 2885)return ((T-2688)*1000/393+8000)/10;
if (T < 3072)return ((T-2885)*1000/374+8500)/10;
}

сигнал с делителя напряжения.

на примере первой строки if

При 20С сигнал на АЦП (расчетный по даташиту) 545 мВ, при 25С 652 мВ. T - текущее значение на ЦАП, 1000 просто коэффициент, чтобы математика была целочисленной, 215 - это значение в миливольтах на градус в этом промежутке (652-545)/5 умноженное на 10 чтобы избавиться опять же от десятичной точки. 2000 это 20 градусов умноженые на 100, так как у нас все в одном масштабе. / 10, чтобы получить значение в градусах с одним знаком после запятой (например 24,5). Идея понятна? То есть эта строчка на выходе дает нечто похожее на к примеру 245 если температура 24,5. Потом мы это число при помощи sprintf переводим в строку, добавляем точку куда надо, плюсуем в конец символ "С" и выводим как строковую константу на дисплей. Получается так как на фото. Нижняя строка (символ С не добавлял, место для отладки экономил, чтобы 3 температуры поместились ровно)

функция вывода на экран выглядит так

sprintf(str_buf_V, "%03u", _Actual.Temp1);
str_buf[0] = str_buf_V[0];
str_buf[1] = str_buf_V[1];
str_buf[2] = 0x2E;
str_buf[3] = str_buf_V[2];
str_buf[4] = str_buf_V[3];
MT_WH1602_SetDDRAMAddress(0x41);
while (MT_WH1602_ReadBusy()!=FALSE);
lcd_write_str(str_buf);

думаю тут комментарии излишни. Немного не феньшуй конечно, но работает очень быстро. А для меня главное не красота методов, а скорость и эффективность

комментария стоит только эта строка. В ней копируется завершающий ноль ('\0'), чтобы вывод на экран знал где конец строки

str_buf[4] = str_buf_V[3];

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

post-183933-0-11029900-1423664571_thumb.jpg

Edited by mail_robot

Share this post


Link to post
Share on other sites
вот функция кусочно-линейной аппроксимации термистора
Проще формулу вычислить по точкам и забить её в программу.

Вот Ваша зависимость :

y = -3E-05x2 + 0,3671x + 25,119

Где

y - температура, умноженная на 10.

x - значение в милливольтах на АЦП

А вот график в екселе с функцией :Книга1.rar

Share this post


Link to post
Share on other sites

да конечно мы в курсе за формулы аппроксимации, НО

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

не все что красиво на бумаге красиво ложится на реальный камень

Edited by mail_robot

Share this post


Link to post
Share on other sites

И что ? Вы куда-то торопитесь и выводите информацию на дисплей с скоростью 10000 раз в секунду ?

По поводу памяти. Тут ещё спорный вопрос, что займёт больше места, функция или Ваша "простыня"...

Share this post


Link to post
Share on other sites

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

Можете в принципе делать как хотите, если все устраивает. Я уже все эти методы давно испробовал, поэтому гдето обхожусь простынями, а гдето полиномами. Зависит конечно от задачи. Но на всякий пожарный стараюсь все таки ресурсы экономить. И в моих программах вы не увидите в процедурном коде функций типа delay_ms или наподобие. У меня весь код пролетается насквозь за один проход без остановок и за гарантированное время (касается и антидребезга и всяких звуоквых сигналов, и даже вывода на дисплей), даже если ресурсов камня с избытком

Edited by mail_robot

Share this post


Link to post
Share on other sites

Join the conversation

You are posting as a guest. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...

  • Similar Content

    • By Профан
      Заказал своей даме в подарок плойку из Китая.Пришла быстро,но при первом использовании от волос пошел дым. Я взял тестер с термопарой,зажал в плойке и начал регулировать температуру. Температура при любых показаниях на дисплее(должно регулироваться 80-210 градусов) была ~196. Спор с продавцом я проиграл и решил попробовать оживить ее с вашей помощью. Проверил симиcтор (BT137),он рабочий. Куда еще копать ?



    • By foster08
      Здравствуйте, недавно стал счастливым обладателем мультиметра UT61A, и заметил одну любопытную вещь. В описании семейства мультиметров UT61 сказано: Измерение температуры только в моделях UT61B UT61C . Если поставить в UT61A переключатель режимов измерения между uA и mA то на экране мультиметра появится режим измерения температуры. Но измерить температуру не получается. Я пробовал устанавливать щупы для измерения температуры согласно инструкции в гнезда COM (3-ие  гнездо слево)  и mA,uA (2-ое гнездо слево). В качестве датчика температуры подключал резисторы разного номинала, но показания на экране UT61A не менялись и были равны 0. В интернете искал схему моделей UT61B и UT61C. Но так и не нашёл схемы для моделей B и C, только для E. Но в ней нет режима измерения температуры. 
      Есть ли у Вас какие-нибудь мысли по реализации режима измерения температуры в моделе UT61A?
    • By Терентенко Андрей
      Добрый день! Имею следующую ситуацию : на базе  PIC16f676  создал приблуду для "управления нештатной магнитолой с руля", а именно  сигнал с руля это 4,8в и в зависимости от нажатой кнопки падает дискретной до 0.8в мк с помощью АЦП отслеживает  на магнитолу паралельно кнопкам кинул оптрони которыми управляет МК. Питание от LM с фильтрующими конденсаторами. При тестових прогонах всё работало как надо (программно реализовано защиту от дребезга аж на 0.1 сек в поисках решений) и в машине  и от штатного БП . Но заметил закономерность сейчас на улице - 2 и при первом запуске минут 5, МК "шумит" несоотвецтвует нажатия на руле кнопке  на магнитоле ! Сигнал с руля смотрел стабильный без дребезга , притом когда тестил вынес магнитолу подключил всё работало гуд но пока устанавливал закручивал она остыла и начинались эти тацы . Кто что подскажет? МК или ЛМ могут так реагировать на температуру ? Прошу прощения у модераторов за повторение теми (может в этом разделе будет актуальней)
    • Guest Максим
      By Guest Максим
      Очень нужно собрать простое аналоговое устройство для измерения температуры воздуха. Идея в том, что у меня на даче функцию сигнализации выполняет китайский GPS трекер. Можно управлять и получать информацию по смс. У него есть опция - подключение аналогового датчика уровня топлива. Этот датчик показывает сколько топлива в баке (0вольт - 0%бака и 5вольт - 100%). Хочу собрать схемку для получения температуры (0вольт -  -40градусов и 5вольт - +100градусов). Будет приходить по запросу смс с текстом OIL: XX%.
      Наткнулся на датчик температуры lm335 (измеряет от -40 до +100), но не могу сообразить как подключить чтобы получить вывод в диапазоне 0-5в.
      Требования:
      1) питание 12в
      2) вывод в диапазоне 0-5в (от -40 до +100 градусов Цельсия)

      Заранее всем кто откликнется - спасибо

    • By Abracas
      Необходим датчик кторый будет включать сигнализацию при превышении допустимой температуры( дизельный двигатель) желательно беспроводной, а ещё лучше взаимодействие с андроидом.
       На двигателе присутствует родной датчик который просто отображает температуру, может есть какое то устройство которое можно просто к нему присоединить? 
      (Готов на вознаграждение за создание)
×
×
  • Create New...