|
Странное вычисление температуры, Проблема с отрицательными значениями |
|
|
|
Aug 20 2008, 06:53
|

Частый гость
 
Группа: Участник
Сообщений: 89
Регистрация: 5-10-07
Пользователь №: 31 098

|
Доброго всем времени суток. Такая проблема: при вычислении температуры на ATmega162 с DS18S20 по формуле TEMPERATURE= TEMP_READ - 0.25 + (COUNT_PER_C - COUNT_REMAIN)/COUNT_PER_C получаю странные результаты в отрицательной области, а именно: при увеличении температуры по формуле получается уменьшение, а затем скачком повышение! В положительной области все нормально. Вот таблица составленная из лога и исходник. Спасибо за внимание, с уважением, Олег.
Прикрепленные файлы
v1.183.rar ( 93.94 килобайт )
Кол-во скачиваний: 45
|
|
|
|
|
Aug 20 2008, 07:40
|

Частый гость
 
Группа: Участник
Сообщений: 89
Регистрация: 5-10-07
Пользователь №: 31 098

|
Цитата(GDI @ Aug 20 2008, 11:32)  А сам датчик исправен? С другим не пробовали? А где таблица с логом? Вообще-то только с одним датчиком пробовал, а таблица в архиве с исходником.
|
|
|
|
|
Aug 20 2008, 09:08
|

Частый гость
 
Группа: Участник
Сообщений: 89
Регистрация: 5-10-07
Пользователь №: 31 098

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

Частый гость
 
Группа: Участник
Сообщений: 89
Регистрация: 5-10-07
Пользователь №: 31 098

|
Цитата(GDI @ Aug 20 2008, 14:19)  Да уж, если формула неправильная, то это к Максиму претензии, но может у вас изначально не те значения идут? заголовочник то от 1820, не знаю какие отличия от 18S20. А может вам вообще применить 18B20? Он сразу с шагом 0,0625 температуру выдает. А датчики вы калибровать собираетесь, иначе зачем вам шаг уменьшать, если у этих датчиков заводская точность 0,5 градуса? Спасибо, DS18B20 у меня есть, но я сначала хотел разобраться с DS18S20  . Нет я не собирался калибровать. Мне кажется самое сомнительное место здесь: Код //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?
Сообщение отредактировал _Олег_ - Aug 20 2008, 10:49
|
|
|
|
|
Aug 20 2008, 11:39
|

Частый гость
 
Группа: Участник
Сообщений: 89
Регистрация: 5-10-07
Пользователь №: 31 098

|
Цитата(GDI @ Aug 20 2008, 15:29)  При такой операции потеряется знаковый бит, нодо его сохранять отдельно. но temp_l не содержит знака, это - Код temp_l = __ds1820_scratch_pad.temp_lsb; а знак - Код t_msb = __ds1820_scratch_pad.temp_msb; //получаем знак температуры
|
|
|
|
|
Aug 20 2008, 12:00
|

Частый гость
 
Группа: Участник
Сообщений: 89
Регистрация: 5-10-07
Пользователь №: 31 098

|
Цитата(GDI @ Aug 20 2008, 15:54)  Да, только температура там в дополнительном коде записана и нельзя просто отбросить знаковые биты. спасибо, попробую еще поэксперементировать.
|
|
|
|
|
Aug 20 2008, 12:33
|
Профессионал
    
Группа: Свой
Сообщений: 1 235
Регистрация: 14-05-05
Из: Санкт-Петербург
Пользователь №: 5 008

|
Цитата я до этого сам дошел, не совсем понятно: делить на 2 нужно всю формулу или temp_l отбрасывая младший и /2 А зачем делить на 2? чтобы потерять лишний разряд? Храните всю температуру в signed short и операции с ним делайте и все будет нормально, и доп код автоматом учитываться будет(если сдвигом не пользоваться) Хотя если не собираетесь калибровать , то зачем вообще все это?
--------------------
|
|
|
|
|
Aug 20 2008, 15:00
|

Частый гость
 
Группа: Участник
Сообщений: 89
Регистрация: 5-10-07
Пользователь №: 31 098

|
Цитата(zltigo @ Aug 20 2008, 17:05)  Здорово, наверно, так ссылками кидаться  А по делу? Там DS18B20, а не DS18S20  и по поводу этой формулы ничего нет! Видемо вы еще с той ветки не остыли
Сообщение отредактировал _Олег_ - Aug 20 2008, 15:02
|
|
|
|
|
Aug 20 2008, 15:11
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(_Олег_ @ Aug 20 2008, 17:00)  и по поводу этой формулы ничего нет! В том и дело, что даже владение арифметикой на 0, а подавай "формулы", которые тоже понять знания арифметики нужны. Замкнутый круг.. Цитата Там DS18B20, а не DS18S20 Ужас сделать из 9bit 12bit слабо? if( id[0] == DS18S20_ID ) { // 9 -> 12 bit if 18S20 meas <<= 3; } Далее по тексту.... Цитата Видемо вы еще с той ветки не остыли  Кипячусь я не так. А это просто горькая констатация факта уровня образования...
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|