Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Алгоритм отображения температуры
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
Vitek885
Как создать видимость "точного" термометра (до 0.1)?
Замеряю температуру с дискретностью 1 градус, а хотелось бы отображать с десятыми долями
К примеру при температуре отображаю 10.0 в это время замеры показывают 11 и надо плавно (10.1-10.2-10.3....11.0) изменить показания. Не могу придумать как добится плавности (без ускорений и замедлений) и "достоверности".
PS: требуют замер до десятых долей градуса а у датчика в измеряемом диапазоне (-50 ...+110) точность 2 %
Eladar
Скользящий фильтр из 12 значений - как только пришол три раза подряд замер 11 градусов - с каждым последующим выводом на индикатор прибавлять 0,1 градуса...(12 замеров - для того, что бы убедиться, что там именно 11 градусов, а не просто дискретик бьется...)
Vitek885
Цитата(Eladar @ Jul 14 2009, 14:50) *
Скользящий фильтр из 12 значений - как только пришол три раза подряд замер 11 градусов - с каждым последующим выводом на индикатор прибавлять 0,1 градуса...(12 замеров - для того, что бы убедиться, что там именно 11 градусов, а не просто дискретик бьется...)


Если я правильно понял, то это не обеспечит плавности
К примеру температура повышается на 1 град. в минуту, а замеры идут каждую секунду, тогда дисплей оттикает десятые за 10 сек а потом 50 сек будет показывать 11.0
Lexdaw
Так это точность измерения 2% а дискрету можно выводить любую хоть 0.01 С
Vitek885
Цитата(Lexdaw @ Jul 14 2009, 16:01) *
Так это точность измерения 2% а дискрету можно выводить любую хоть 0.01 С

Pазрядности встроенного в ATMega АЦП нехванит для такой дискретности, из-за нелинейности датчика на 1 единицу АЦП будет приходится от 0,4 до 1,2 градуса температуры. Вот и надо как то забить эти пробелы в показаниях.
rezident
Цитата(Vitek885 @ Jul 14 2009, 17:43) *
Если я правильно понял, то это не обеспечит плавности
К примеру температура повышается на 1 град. в минуту, а замеры идут каждую секунду, тогда дисплей оттикает десятые за 10 сек а потом 50 сек будет показывать 11.0
Правильно. При глубине буфера для скользящего среднего в 10 отсчетов и частоте сэмплирования 1Гц время установления выходного значения 10 секунд. А вы разве не так хотели? Хотите более глубокой фильтрации увеличивайте размер буфера или проводите децимацию (прореживание) отсчетов.
MrYuran
Цитата(Vitek885 @ Jul 14 2009, 15:43) *
Если я правильно понял, то это не обеспечит плавности
К примеру температура повышается на 1 град. в минуту, а замеры идут каждую секунду, тогда дисплей оттикает десятые за 10 сек а потом 50 сек будет показывать 11.0

У вас температура ступеньками чтоли меняется?
Или плавно ползёт?
Если плавно, то и показания будут так же плавно меняться, а если ступеньками - то скруглёнными ступеньками.
Ещё есть техника оверсемплинга, когда к полезному сигналу подмешивают белый шум и усредняют.
Можно поднять разрешение АЦП на пару разрядов.
А может, просто поменять схему измерения?
Природу ведь не обманешь
rezident
Цитата(MrYuran @ Jul 14 2009, 18:37) *
Ещё есть техника оверсемплинга, когда к полезному сигналу подмешивают белый шум и усредняют.
Лучше не белый шум (который еще фиг получишь) подмешивать, а внеполосный (т.е. вне полосы измеряемого сигнала).
Vitek885
Цитата(MrYuran @ Jul 14 2009, 16:37) *
У вас температура ступеньками чтоли меняется?
Или плавно ползёт?

Ползет

Цитата
техника оверсемплинга... белый шум...внеполосный

Наверно надо было сказать что я начинающий))
Можно поподробнее, для чего и как это делается
Vishv
Если не секрет - что за датчик ? Что надо измерять (условия измерения температуры)?
Vitek885
Цитата(Vishv @ Jul 15 2009, 22:57) *
Если не секрет - что за датчик ? Что надо измерять (условия измерения температуры)?

Датчик NTC;
Марки незнаю есть только это
Vishv
Судя по всему это резистивный (м.б. полупроводниковый) датчик. Еще раз - условия применения (вода, воздух, масло, инертные газы, агрессивные среды)?
Если условия более менее нормальные, ну например измерение температуры наружной плверхности батарей то можно применить готовый датчик температуры (при условии, что в системе, как я понял есть микропроцессор) DS1624 (-55 - +125 град., точность - лучше 0,1 град.)
Tanya
Цитата(Vitek885 @ Jul 14 2009, 17:01) *
Наверно надо было сказать что я начинающий))
Можно поподробнее, для чего и как это делается

Вы бы лучше просветили общественность, зачем Вам все это... для чего, и как... Эта Ваша Видимость...
Кого Вы хотите обмануть? Или Сами обманываться рады?
Еще раз - зачем?
Vitek885
Цитата(Vishv @ Jul 16 2009, 22:06) *
Еще раз - условия применения

один датчик меряет температуру воздуха, второй температуру на охлаждающей поверхности
Цитата(Vishv @ Jul 16 2009, 22:06) *
можно применить готовый датчик температуры (при условии, что в системе, как я понял есть микропроцессор) DS1624 (-55 - +125 град., точность - лучше 0,1 град.)

Только этот датчик, иного не дано(((

Цитата(Tanya @ Jul 17 2009, 00:23) *
Вы бы лучше просветили общественность, зачем Вам все это... для чего, и как... Эта Ваша Видимость...
Кого Вы хотите обмануть? Или Сами обманываться рады?
Еще раз - зачем?

Извеняюсь за невольную скрытность))
Необходимо собрать контроллер холодильной камеры.
Уже используемые неподходят, либо по функционалу либо по цене.
Поэтому пытаюсь создать что-то подобное (наверное больше ради самообразования, чем ради выгоды, т.к. интересно и вдруг пригодится)
В готовом контроллере температура измеряется 10 разрядным АЦП меги16, с дискретностью 0,1 градус. Исходя из параметров датчика и разрядности АЦП я думаю что в нем применяется какой-то алгоритм отображения температуры. Хотя принаблюдении за изменением температуры по этому контроллеру, каких либо "аномалий" не заметил (скачков, тормозов)
Или все таки можно замерить температуру, с необходимой дискретностью в диапазоне -50..+110 данным видом датчика
Еще раз извеняюсь, но я начинающий, светодиодом помигал, напрядение встоенным а мегу АЦП померял хочу двигатся дальше
Leonmezon
Цитата(Vitek885 @ Jul 14 2009, 16:18) *
Разрядности встроенного в ATMega АЦП нехванит для такой дискретности, из-за нелинейности датчика на 1 единицу АЦП будет приходится от 0,4 до 1,2 градуса температуры. Вот и надо как то забить эти пробелы в показаниях.

Неверно посчитали, получаться 1 разряд АЦП равен 0,15 град. С - теоретически, реально можно получить 0,2 град. С (в вблизи нуля и максимального значения точность снижается у АЦП ATmega).
ДЛя того чтобы получить 0,1 град надо разрешение АЦП не хуже 11 бит - два варианта или использовать 12 бит внешние или используя встроенное АЦП алгоритмом повысить разрядность с 10 бит до 12 бит (необходим запас).
Vitek885
Цитата(Leonmezon @ Jul 18 2009, 19:05) *
Неверно посчитали, получаться 1 разряд АЦП равен 0,15 град. С .

Это если бы характеристика датчика была бы линейной, а она не линейная
см. вложение в 11 посте
Цитата(Leonmezon @ Jul 18 2009, 19:05) *
или используя встроенное АЦП алгоритмом повысить разрядность с 10 бит до 12 бит (необходим запас).

можно подробнее про этот алгоритм
Dog Pawlowa
Цитата(Vitek885 @ Jul 18 2009, 17:45) *
...Еще раз извеняюсь, но я начинающий, светодиодом помигал, напрядение встоенным а мегу АЦП померял хочу двигатся дальше

Все делаете правильно, и постановка задачи стандартная - сделать вид, что прибор работает хорошо.
Одно непонятно - почему точность всего лишь 1 градус. Даже с фиговым датчиком и встроенным АЦП должно получиться лучше. Огласите схему подключения, диапазон температуры и прочее. Что-то тут не так.
Vitek885
Цитата(Dog Pawlowa @ Jul 18 2009, 23:06) *
Все делаете правильно, и постановка задачи стандартная - сделать вид, что прибор работает хорошо.
Одно непонятно - почему точность всего лишь 1 градус. Даже с фиговым датчиком и встроенным АЦП должно получиться лучше. Огласите схему подключения, диапазон температуры и прочее. Что-то тут не так.

Я рассуждал так
Сопротивление латчика при -50С 329200 Ом, при +110С 757Ом, надо работать во всем диапазоне температур.
Весь диапазон измерений 329200-757=328443 Ом
10 разрядный АЦП может замерить 1024 значения, значит на значение АЦП приходится 328443/1024=320,75 Ом

Значит изменение температуры с -45 до -50 включает в себя (329200-247500)/320,75=254 измерения АЦП т.е. дискретность даже выше чем 0,1 градус
Зато изменение температуры с +105 по +110 вызовет изменение сопротивления датчика на 857-757= 100 Ом, а так как "чувствительность" АЦП - 320 ом, то здесь десятыми долями градуса даже и не пахнет
Если я ошибся просьба указать где
Dog Pawlowa
Цитата(Vitek885 @ Jul 19 2009, 06:44) *
Я рассуждал так

Вы не все рассказали. Вы используете делитель или генератор тока?
Если делитель, то рассуждения не совсем корректны, потому что датчик включен последовательно с резистором, который привносит компенсирующую нелинейность. Т.е. "чувствительность АЦП" по сопротивлению исходно непостоянна.
kolisnichenko_r
Можно применить усилитель с управляемым коэфициентом усиления. На отрицательных температурах, один коэф. усиления, на положительных - другой.
=AK=
(кросс-пост в http://www.microchip.su/)

При измерении температуры, поскольку она меняется медленно, возможны всякие красивые трюки и фокусы.

Во-первых, можно легко и просто увеличить эквивалентную разрядность АЦП, тем самым увеличив разрешение. В "общем виде" для этого ко входному сигналу надо подмешать ма-аленькую долю сигнала от некого ЦАП-чика, а потом проделать серию A/D преобразований, последовательно увеличивая сигнал на выходе ЦАП-а и суммируя результат. Например, если АЦП 8-битный, и в наличии есть 3-битный ЦАП, то разрядность АЦП можно увеличить до 11 бит, если сигнал с выхода ЦАПа подмешать на вход АЦП с такой пропорции, чтобы 1 шаг ЦАП-а соответствовал 1/8 от одного шага АЦП.

В случае с NTC этот фокус производится при помощи 3 резисторов с дискретных выходов мелкоконтроллера на вход АЦП. Вернее, при помощи 5 высокоомных резисторов одного номинала: старший разряд - два резистора в параллель, средний разряд - один резистор, младший разряд - два резистора последовательно. Конечно, величина пропорции подмешивания в каждый момент отчасти зависит от величины сопротивления NTC, т.е. от температуры. Поэтому разогнать до 11 бит во всем диапазоне не получится, но примерно 10-битное разрешение вытягивается без проблем. У меня такой "разогнанный" термометр чувствувал, когда я подносил к термистору руку на расстояние ~20 см.

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

Если "на пальцах", то сделать можно так (как вариант).
- Измеряете температуру "разогнанным" (шумным) АЦП, получившееся значение обозначим X (что есть сумма 8 последовательных измерений при пошаговом нарастании кода на выходе 3-битного псевдо-ЦАПа)
- Измеренному значению X верите не безоговорочно, а чуть-чуть, скажем всего на 1/16. То есть, текущее значение температуры вычисляете так:

T = T - T/16 + X

Понятно, что самое первое значение 11-битной температуры загоняете в 16-битную переменную напрямую:

T = X*16, или, если на си, то T = (X << 4);

А все последующие уже вычисляете по "недоверчивой" формуле

T = T - (T >> 4) + X;

В сумме у вас получится примерно 14-битное разрешение на 8-битном АЦП. Вуаля!
rezident
Цитата(=AK= @ Jul 20 2009, 18:23) *
(кросс-пост в http://www.microchip.su/)
Это надо уметь написать так, чтобы не было ничего понятно, но зато создавалась иллюзия простоты реализации. sad.gif
=AK=
Цитата(rezident @ Jul 21 2009, 04:12) *
Это надо уметь написать так, чтобы не было ничего понятно, но зато создавалась иллюзия простоты реализации.


1. Схема подключения датчика понятна? Если не сильно углубляться в нюансы: NTC термистор одним концом подключен к питанию, вторым - к эталонному резистору Rref. Эталонный резистор вторым концом подключен к земле. АЦП в качестве опорного напряжения использует питание. Точка соединения термистора и эталонного резистора заведена на вход АЦП, но не напрямую, а через резистор Rs величиной в несколько кОм. Этот дополнительный резистор не обязателен, но он полезен для того, чтобы сгладить вариации сопротивления источника сигнала. Зачем это нужно - см. п.2.

2. Устройство псевдо-ЦАПа понятно? 3 разряда любого порта ввода-вывода микроконтроллера настроены на вывод. Обозначим их DAC0 (младший бит ЦАПа), DAC1 и DAC2 (старший бит).
- Между DAC0 и входом АЦП стоит цепочка из двух последовательно включенных высокоомных резисторов номинала Rx, в сумме 2*Rx.
- Между DAC1 и входом АЦП включен один резистор номинала Rx.
- Между DAC2 и входом АЦП включены два резистора номинала Rx в параллель, в сумме Rx/2.
Номинал Rx соотносится с Rref и Rs таким образом, чтобы при изменении сигнала на выходе DAC0 из 0 в 1 (или из 1 в 0) сигнал на входе АЦП менялся чуть больше, чем на 1/8 от его дискретности. Например, при питании в 5 В и разрядности АЦП 10 бит дискретность АЦП составляет примерно 4.9 мВ. Значит, резисторы надо выбрать так, чтобы при изменении DAC0 сигнал на входе АЦП сдвинyлся примерно на 0.62 мВ.

3. Как получить результат от "разогнанного АЦП" - понятно? По шагам:
3.1. Устанавливаем DAC2=0, DAC1=0, DAC0=0. Делаем АЦП преобразование, результат заносим в 16-битную переменную Х.
3.2. Устанавливаем DAC2=0, DAC1=0, DAC0=1. Делаем АЦП преобразование, результат прибавляем к 16-битной переменной Х.
3.3. Устанавливаем DAC2=0, DAC1=1, DAC0=0. Делаем АЦП преобразование, результат прибавляем к 16-битной переменной Х.
...
3.8. Устанавливаем DAC2=1, DAC1=1, DAC0=1. Делаем АЦП преобразование, результат прибавляем к 16-битной переменной Х.
Если АЦП 10-битный, в переменной Х получился 13-битный результат.

4. Как сделать псевдо-фильтр Калмана (или максимально упрощенный tracking g-h filter, если угодно) - понятно?
4.1. При инициализации делаем первое АЦП-преобразование (как в п.3), умножаем результат X на 8 (т.е. сдвигаем 13-битный результат X на 3 разряда влево (X << 3)) и запоминаем в 16-битной переменной Т. То есть, "вес" переменной Т в восемь раз больше, чем "вес" одного измерения X.
4.2. Все последующие результаты X, полученные от АЦП п.3, добавляем к Т без сдвига, предварительно вычтя из T одну восьмую. Одна восьмaя получается, если T сдвинуть вправо на 3 разряда. На cи это выглядит так:

T = T - (T >> 3) + X;

Естественно, чтобы успевать отследить колебания температуры, измерения надо теперь делать в несколько раз чаще.
rezident
=AK=, вы меня не поняли. sad.gif Я имел в виду, что описание вашего алгоритма нужно было бы предварить методологической частью. Т.е. описанием "откуда что берется", "что от чего зависит" и "почему делаем именно так, как делаем". Топикстартер в начале темы просил функцию визуализации промежуточных (дробных) "виртуальных" значений измеряемой величины. А сейчас речь пошла о математических приемах при реализации увеличения разрядности АЦП для получения этих недостающих дробных значений. Но вы описываете алгоритм без пояснения критериев его применимости (частота оцифровки/оверсэмплинга, частота генерируемого "шума", время измерения, период фильтрации, время готовности результата и т.п.). Вот это и было сутью моего замечания к вашему посту #21.
=AK=
Цитата(rezident @ Jul 22 2009, 04:05) *
вы описываете алгоритм без пояснения критериев его применимости (частота оцифровки/оверсэмплинга, частота генерируемого "шума", время измерения, период фильтрации, время готовности результата и т.п.).

Эти вопросы были в достаточной, на мой взгляд, степени были освещены в данной теме ранее, в том числе вами. Что касается следящих фильтров, упомянутых в п.4, то я дал ссылку на книгу (она, кстати, есть на ftp), кому интересно - прочтет.

После ваших разъяснений мне стало непонятным: что вы имели ввиду, говоря об "иллюзии простоты реализации"? Это стало звучать так, будто вы знаете еще более простые, но эффективные методы. Интересно было бы ознакомиться, если это не секрет.
Troll
Цитата(Vitek885 @ Jul 19 2009, 10:44) *
10 разрядный АЦП может замерить 1024 значения, значит на значение АЦП приходится 328443/1024=320,75 Ом
Обычно это называется цена/значение единицы младшего разряда.

Цитата(Vitek885 @ Jul 19 2009, 10:44) *
Значит изменение температуры с -45 до -50
Зато изменение температуры с +105 по +110 вызовет изменение сопротивления датчика на 857-757= 100 Ом,
В обоих случаях разница dC = 5. И разница в Омах, тоже должна быть одинаковой. У Вас значения температуры это числа со знаком.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.