Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Измерение температуры терморезистором.
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
Stanislav_S
Стоит задача измерить температуру терморезистором, точность 3 градуса устроит, диапазон 0 - 100 градусов. Собственно интересуют как люди решают сию задачу. воевать с логарифмами не хочется посему наверно остается табличный путь, собственно вопрос как построить таблицу наиболее оптимальным образом, либо есть какие то другие варианты решения? Памяти не очень много, поэтому строить таблицу на всю шкалу АЦП (10 - бит) не очень хочется.
Designer56
Сейчас на вскидку не помнится таблицы из Гост на терморезисторы, но вроде бы для такой точности (3% приведенной к диапазону погрешности) корректировать нелинейность характеристики не имеет смысла.
Stanislav_S
Цитата(Designer56 @ Jun 4 2009, 21:24) *
Сейчас на вскидку не помнится таблицы из Гост на терморезисторы, но вроде бы для такой точности (3% приведенной к диапазону погрешности) корректировать нелинейность характеристики не имеет смысла.

Черт, неправильно тему назвал, мерять надо термистором crying.gif вряд ли на него есть готовые таблицы smile.gif
Designer56
Так у термистора разброс характеристик от экземпляра к экземпляру будет +- километр....

Кстати, для вашего диапазона температур вполне подойдет полупроводниковый датчик- только простой, без АЦП и интерфейса, в металлостеклянном корпусе ТО 18.
Microwatt
Цитата(Stanislav_S @ Jun 4 2009, 20:49) *
Черт, неправильно тему назвал, мерять надо термистором crying.gif вряд ли на него есть готовые таблицы smile.gif

Проще пареной репы.
KTY 82/83
Stanislav_S
Цитата(Microwatt @ Jun 4 2009, 23:47) *
Проще пареной репы.
KTY 82/83

Неплохо, но тип термистора задан заказчиком и менять его нельзя.
Dog Pawlowa
Цитата(Stanislav_S @ Jun 4 2009, 19:40) *
собственно вопрос как построить таблицу наиболее оптимальным образом, либо есть какие то другие варианты решения?

1. Выберите терморезистор.
2. Посмотрите в даташит и найдите там таблицу.
3. Выберите нужный интервал температуры между значениями таблицы.
4. Напишите процедуру кусочно-линейной аппроксимации.

Я использую интервал 1 градус для точных измерений и 5 градусов для неточных.
Успехов.
Stanislav_S
Цитата(Dog Pawlowa @ Jun 5 2009, 00:38) *
1. Выберите терморезистор.
2. Посмотрите в даташит и найдите там таблицу.
3. Выберите нужный интервал температуры между значениями таблицы.
4. Напишите процедуру кусочно-линейной аппроксимации.

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

А небольшой пример можно? Собственно что смущает, посчитать напряжение на входе АЦП я могу, соответственно могу посчитать код из АЦП, далее разбиваю на диапазоны и вызываю функцию апроксимации с заранее посчитаными коэфициентами k и b для данного диапазона примерно так? Просто в таком случае кода будет много одних проверок 20 штук ( если по 5 градусов делить0, или я что то упустил?
rezident
Цитата(Stanislav_S @ Jun 5 2009, 03:34) *
далее разбиваю на диапазоны и вызываю функцию апроксимации с заранее посчитаными коэфициентами k и b для данного диапазона примерно так? Просто в таком случае кода будет много одних проверок 20 штук ( если по 5 градусов делить0, или я что то упустил?
В таблице должны лежать не "заранее посчитаные коэфициенты k и b", а экспериментально полученные данные: сопротивление (либо напряжение, если ток через терморезистор стабилизирован) и температура. Расчет по таблице ведется так
Temp=(T[idx]-T[idx-1])/(R[idx]-R[idx-1])*(Rval-R[idx-1])+T[idx-1],
где Rval - входной параметр для процедуры кусочно-линейной аппроксимации, Temp - результат, а T и R это значения из таблицы, взятые со смещением idx так, чтобы R[idx]>=Rval>R[idx-1], либо R[idx]>Rval>=R[idx-1]. Для ускорения перебора значений R можно держать значение idx в локальной переменной типа static. Если при переборе упираемся в границы таблицы, то принимаем вверху таблицы idx=TBLMAXSIZE-1, внизу: idx-1=0. Соответственно таблица аппроксимации не менее чем из двух строк должна состоять.
Dog Pawlowa
Цитата(Stanislav_S @ Jun 5 2009, 00:34) *
Просто в таком случае кода будет много одних проверок 20 штук ( если по 5 градусов делить0, или я что то упустил?

Ну не Вы же будете проверять, а микроконтроллер smile.gif Температурные процессы - достаточно медленные, всегда можно делать расчет температуры в такое место, где он не мешает.
barabek
Цитата(Stanislav_S @ Jun 5 2009, 08:34) *
Просто в таком случае кода будет много одних проверок 20 штук ( если по 5 градусов делить0, или я что то упустил?

Можно методом половинного деления ( или как , забыл :-), этот термин называется ) . Как в ацп. Тогда на 32 диапазона нужно 5 проверок для выбора нужных соседних значении из таблицы
galjoen
Методом половинного деления (в пределах между двумя табличными точками) это будет та-же линейная интерполяция только с ограниченной, кол-вом приближений, точностью. Преимущество только в том, что не будет деления (деление на 2 заменяется сдвигом).

Можно использовать не линейную, а параболическую интерполяцию. Это позволить хранить гораздо меньше табличных данных при той-же точности. И это не сильно сложнее/дольше, если таки хранить коэффициенты. Там нужно будет вычислять не только отклонение от ближайшей табличной точки, но и квадрат этого отклонения. И помножать и отклонение и его квадрат на соотв-е коэффициенты. А вот эти коэффициенты посчитать 1 раз.
Вообще рекомендую сначала эту задачу решить на компьютере, а уже потом переносить в контроллер.
Stanislav_S
Цитата(galjoen @ Jun 5 2009, 17:57) *
Методом половинного деления (в пределах между двумя табличными точками) это будет та-же линейная интерполяция только с ограниченной, кол-вом приближений, точностью. Преимущество только в том, что не будет деления (деление на 2 заменяется сдвигом).

Можно использовать не линейную, а параболическую интерполяцию. Это позволить хранить гораздо меньше табличных данных при той-же точности. И это не сильно сложнее/дольше, если таки хранить коэффициенты. Там нужно будет вычислять не только отклонение от ближайшей табличной точки, но и квадрат этого отклонения. И помножать и отклонение и его квадрат на соотв-е коэффициенты. А вот эти коэффициенты посчитать 1 раз.
Вообще рекомендую сначала эту задачу решить на компьютере, а уже потом переносить в контроллер.

А поподробнее можно? А то я эту интерполяцию подзабыл если честно.
galjoen
Цитата(Stanislav_S @ Jun 5 2009, 20:41) *
А поподробнее можно? А то я эту интерполяцию подзабыл если честно.

Так вот и есть повод вспомнить (самому). И уже после этого задавать конкретные вопросы...
barabek
Цитата(galjoen @ Jun 6 2009, 00:57) *
Методом половинного деления (в пределах между двумя табличными точками) это будет та-же линейная интерполяция только с ограниченной, кол-вом приближений, точностью. Преимущество только в том, что не будет деления (деление на 2 заменяется сдвигом).

может мы о разном говорим? Я говорю о поиске поддиапазона. Вопрос был в поиске соседних ячеек таблицы (не внутри этого поддиапазона). Автор вроде собирается их все последовательно перебирать. Я же говорю вот о чем. Допустим имеем 32 строки в таблице (неважно линейно или нелинейно они расположены относительно температуры или сопротивления). Проверяем середину таблицы на больше-меньше текущему R. Далее выбранную половину еще пополам и т.д. А уже после окончания поиска соседних ячеек пусть делает что угодно - хоть линейную, хоть нелинейную интерполяцию по коэффициентам границ поддиапазона, все зависит сколько он будет хранить коэффициентов в столбцах таблицы (сколько мерный будет массив)

Цитата(Stanislav_S @ Jun 6 2009, 03:41) *
А поподробнее можно? А то я эту интерполяцию подзабыл если честно.

Берете EXEL и строите линии тренда с отображением формулы на кривой. Заодно можно рационально разбить диапазон на поддиапазоны smile.gif. Там и вспомните.
Но такой подход возможен, если потом не потребуется калибровка на месте.
xemul
Если тип термистора, заданный заказчиком, имеет линейность R(T), сопоставимую с KTY82, то для требуемой точности в диапазоне 0..100 С удастся обойтись калибровкой в одной точке и линейной интерполяцией R(T). А если у него еще и начальный разброс сопротивления ~<1%, то можно обойтись и без калибровки.
DpInRock
Я лично делаю так.
Записываю в память eeprom таблицу через 5 градусов.
Если значение АЦП попадает между значениями таблицы (а это так и происходит), то просто делаю расчет температуры по соотношениям значений из таблицы и полученного значения температуры. Чисто пропорционально. Т.е. линейно на данном участке.
Естественно, таблицу беру из даташита. Еще у Эпкоса есть специальная программа для получения таблиц...
Stanislav_S
Цитата(xemul @ Jun 6 2009, 12:30) *
Если тип термистора, заданный заказчиком, имеет линейность R(T), сопоставимую с KTY82, то для требуемой точности в диапазоне 0..100 С удастся обойтись калибровкой в одной точке и линейной интерполяцией R(T). А если у него еще и начальный разброс сопротивления ~<1%, то можно обойтись и без калибровки.

Термистор такой, с линейной интерполяцией получилось довольно хорошо. Всем спасибо за советы и помощь.
Microwatt
Цитата(DpInRock @ Jun 6 2009, 16:30) *
Я лично делаю так.
Записываю в память eeprom таблицу через 5 градусов.
Если значение АЦП попадает между значениями таблицы (а это так и происходит), то просто делаю расчет температуры по соотношениям значений из таблицы и полученного значения температуры.

Простенько и со вкусом. Полагаю, даже через 10С опорные точки можно прописать. Линейная интерполяция даст точность.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.