Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Странное вычисление температуры
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему
_Олег_
Доброго всем времени суток. Такая проблема:
при вычислении температуры на ATmega162 с DS18S20 по формуле

TEMPERATURE= TEMP_READ - 0.25 + (COUNT_PER_C - COUNT_REMAIN)/COUNT_PER_C

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

Вот таблица составленная из лога и исходник.

Спасибо за внимание, с уважением, Олег.
GDI
А сам датчик исправен? С другим не пробовали?
А где таблица с логом?
_Олег_
Цитата(GDI @ Aug 20 2008, 11:32) *
А сам датчик исправен? С другим не пробовали?
А где таблица с логом?


Вообще-то только с одним датчиком пробовал, а таблица в архиве с исходником.
GDI
анализ.xls? И что там не то? Пометить как то надо неправильные строки, а если они там все неправильные, то надо добавить с обоих краев правильные значения. В общем ничего непосвященному непонятно.
Датчики эти иногда дохнут, причем проявляться это может по разному. Попробуйте все же другой сперва.
Компилятор какой, CodeVision, судя по инклюдам? Там функции работали правильно эти, по крайней мере раньше... давно я им не пользовался... smile.gif
_Олег_
Цитата(GDI @ Aug 20 2008, 11:52) *
анализ.xls? И что там не то? Пометить как то надо неправильные строки, а если они там все неправильные, то надо добавить с обоих краев правильные значения. В общем ничего непосвященному непонятно.
Датчики эти иногда дохнут, причем проявляться это может по разному. Попробуйте все же другой сперва.
Компилятор какой, CodeVision, судя по инклюдам? Там функции работали правильно эти, по крайней мере раньше... давно я им не пользовался... smile.gif


Вот, пояснил, надеюсь сейчас будет понятнее.
GDI
Да уж, если формула неправильная, то это к Максиму претензии, но может у вас изначально не те значения идут? заголовочник то от 1820, не знаю какие отличия от 18S20. А может вам вообще применить 18B20? Он сразу с шагом 0,0625 температуру выдает. А датчики вы калибровать собираетесь, иначе зачем вам шаг уменьшать, если у этих датчиков заводская точность 0,5 градуса?
_Олег_
Цитата(GDI @ Aug 20 2008, 14:19) *
Да уж, если формула неправильная, то это к Максиму претензии, но может у вас изначально не те значения идут? заголовочник то от 1820, не знаю какие отличия от 18S20. А может вам вообще применить 18B20? Он сразу с шагом 0,0625 температуру выдает. А датчики вы калибровать собираетесь, иначе зачем вам шаг уменьшать, если у этих датчиков заводская точность 0,5 градуса?


Спасибо, DS18B20 у меня есть, но я сначала хотел разобраться с DS18S20 smile.gif. Нет я не собирался калибровать.
Мне кажется самое сомнительное место здесь:
Код
//temp_m = 10000 * temp_l + 7500 - 10000 * cnt_r / count_c
temp_l = temp_l >> 1; //сдвигаем - эквивалентно отбрасывания младшего бит 0,5 С и /2


хотя я до этого сам дошел, не совсем понятно: делить на 2 нужно всю формулу или temp_l отбрасывая младший и /2. И еще непонятно, почему COUNT_PER_C всегда 16?
GDI
При такой операции потеряется знаковый бит, нодо его сохранять отдельно.
_Олег_
Цитата(GDI @ Aug 20 2008, 15:29) *
При такой операции потеряется знаковый бит, нодо его сохранять отдельно.


но temp_l не содержит знака, это -
Код
temp_l = __ds1820_scratch_pad.temp_lsb;


а знак -
Код
t_msb = __ds1820_scratch_pad.temp_msb; //получаем знак температуры
GDI
Да, только температура там в дополнительном коде записана и нельзя просто отбросить знаковые биты.
_Олег_
Цитата(GDI @ Aug 20 2008, 15:54) *
Да, только температура там в дополнительном коде записана и нельзя просто отбросить знаковые биты.


спасибо, попробую еще поэксперементировать.
GDI
Цитата
я до этого сам дошел, не совсем понятно: делить на 2 нужно всю формулу или temp_l отбрасывая младший и /2

А зачем делить на 2? чтобы потерять лишний разряд? Храните всю температуру в signed short и операции с ним делайте и все будет нормально, и доп код автоматом учитываться будет(если сдвигом не пользоваться)
Хотя если не собираетесь калибровать , то зачем вообще все это?
zltigo
В полку неучей прибыло sad.gif http://electronix.ru/forum/index.php?showt...=23218&st=0
_Олег_
Цитата(zltigo @ Aug 20 2008, 17:05) *
В полку неучей прибыло sad.gif http://electronix.ru/forum/index.php?showt...=23218&st=0


Здорово, наверно, так ссылками кидаться smile.gif А по делу?
Там DS18B20, а не DS18S20 sad.gif и по поводу этой формулы ничего нет!

Видемо вы еще с той ветки не остыли smile.gif
zltigo
Цитата(_Олег_ @ Aug 20 2008, 17:00) *
и по поводу этой формулы ничего нет!

В том и дело, что даже владение арифметикой на 0, а подавай "формулы", которые тоже понять знания арифметики нужны. Замкнутый круг..
Цитата
Там DS18B20, а не DS18S20

Ужас сделать из 9bit 12bit слабо?
if( id[0] == DS18S20_ID )
{ // 9 -> 12 bit if 18S20
meas <<= 3;
}
Далее по тексту....
Цитата
Видемо вы еще с той ветки не остыли smile.gif

Кипячусь я не так. А это просто горькая констатация факта уровня образования...
_Олег_
Цитата(zltigo @ Aug 20 2008, 19:11) *
В том и дело, что даже владение арифметикой на 0, а подавай "формулы", которые тоже понять знания нужны. Замкнутый круг..

Ужас сделать из 9bit 12bit слабо?
if( id[0] == DS18S20_ID )
{ // 9 -> 12 bit if 18S20
meas <<= 3;
}
Далее по тексту....

Кипячусь я не так. А это просто горькая констатация факта уровня образования...


продолжайте кипятится, не буду вам мешать smile.gif
zltigo
Цитата(_Олег_ @ Aug 20 2008, 17:18) *
продолжайте кипятится

Повторяю, я совершенно не кипячусь smile.gif.
Цитата
, не буду вам мешать smile.gif

Обещаете думать, прежде, чем загромождать форум вопросами достойными начальной школы? Похвально!
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.