реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> И снова DS18B20, Непонятен результат измерения
Igor26
сообщение Feb 3 2006, 07:46
Сообщение #1


Знающий
****

Группа: Свой
Сообщений: 521
Регистрация: 10-02-05
Пользователь №: 2 544



В описании на DS18B20 сказано, что значение положительной температуры - это один байт (нулевой).
Если его значение разделить на два, то получаем целое значение температуры в градусах Цельсия.
Если значение измеряемой температуры становится отрицательным, то первый байт становится 0xFF.
Измеряю комнатную температуру и вижу примерно следующие значения: нулевой байт=0xD7,
первый байт=0x01.(как видим, значение температуры - ДВА байта!!!) Значение измеряемой температуры получается 235 градусов! Вытащил датчик за окно. Значение начало добросовестно линейно уменьшаться и при переходе через ноль первый байт, опять же добросовестно,
становится 0xFF. CRC во всех случаях равна нулю. Второй датчик ведет себя точно так же.
Попробовал читать из DS1990. Правильно читает сто из ста.
Вопрос в следуещем. Так как же перевести то, что прочел из датчика в реальные градусы Цельсия или
Фаренгейта???

Сообщение отредактировал Igor26 - Feb 3 2006, 07:48
Go to the top of the page
 
+Quote Post
Сергей_
сообщение Feb 3 2006, 08:31
Сообщение #2


Участник
*

Группа: Validating
Сообщений: 26
Регистрация: 18-12-05
Пользователь №: 12 357



Если мне не изменяет память - значение температуры представляет собой 2 байта.
Правые четыре бита младшего байта это дробное значение температуры, левые четыре бита старшего байта это знак температуры (0-"+", 1-"-"), все что посередине целое значение температуры
Go to the top of the page
 
+Quote Post
Rst7
сообщение Feb 3 2006, 09:16
Сообщение #3


Йа моск ;)
******

Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610



Цитата(Igor26 @ Feb 3 2006, 09:46) *
В описании на DS18B20 сказано, что значение положительной температуры - это один байт (нулевой).
Если его значение разделить на два, то получаем целое значение температуры в градусах Цельсия.
Если значение измеряемой температуры становится отрицательным, то первый байт становится 0xFF.
Измеряю комнатную температуру и вижу примерно следующие значения: нулевой байт=0xD7,
первый байт=0x01.(как видим, значение температуры - ДВА байта!!!) Значение измеряемой температуры получается 235 градусов! Вытащил датчик за окно. Значение начало добросовестно линейно уменьшаться и при переходе через ноль первый байт, опять же добросовестно,
становится 0xFF. CRC во всех случаях равна нулю. Второй датчик ведет себя точно так же.
Попробовал читать из DS1990. Правильно читает сто из ста.
Вопрос в следуещем. Так как же перевести то, что прочел из датчика в реальные градусы Цельсия или
Фаренгейта???


Берешь эти 2 байта как целое со знаком (int) и делишь на 16 (или двигаешь вправо на 4, например t>>=4).

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


--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
Go to the top of the page
 
+Quote Post
Георгий
сообщение Feb 3 2006, 09:33
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 269
Регистрация: 17-11-05
Из: Киров-Москва
Пользователь №: 10 957



Получилось 29 градусов. Жарковато однако в комнате!


--------------------
Обычно последним смеется тот, кто хуже соображает!
Go to the top of the page
 
+Quote Post
Igor26
сообщение Feb 3 2006, 10:29
Сообщение #5


Знающий
****

Группа: Свой
Сообщений: 521
Регистрация: 10-02-05
Пользователь №: 2 544



В датащите об этом ни строчки!!!
Go to the top of the page
 
+Quote Post
Rst7
сообщение Feb 3 2006, 11:13
Сообщение #6


Йа моск ;)
******

Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610



Цитата(Igor26 @ Feb 3 2006, 12:29) *
В датащите об этом ни строчки!!!


Плохо смотрите. Там конечно не написано так же прямо, как я написал. Там есть табличка (пардон за форматирование):

Temperature/Data Relationships Table 2

MSb 2^3 2^2 2^1 2^0 2^-1 2^-2 2^-3 2^-4 LSB
MSb S S S S S 2^6 2^5 2^4 MSB

(unit = °C)

TEMPERATURE DIGITAL OUTPUT DIGITAL OUTPUT
(Binary) (Hex)
+125°C 0000 0111 1101 0000 07D0h
+85°C 0000 0101 0101 0000 0550h*
+25.0625°C 0000 0001 1001 0001 0191h
+10.125°C 0000 0000 1010 0010 00A2h
+0.5°C 0000 0000 0000 1000 0008h
0°C 0000 0000 0000 0000 0000h
-0.5°C 1111 1111 1111 1000 FFF8h
-10.125°C 1111 1111 0101 1110 FF5Eh
-25.0625°C 1111 1110 0110 1111 FF6Fh
-55°C 1111 1100 1001 0000 FC90h
*The power on reset register value is +85°C.


--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
Go to the top of the page
 
+Quote Post
ALexx
сообщение Feb 3 2006, 12:41
Сообщение #7


Местный
***

Группа: Свой
Сообщений: 243
Регистрация: 22-09-04
Из: Burbach, Germany
Пользователь №: 704



Преобразование считанного из датчика значения выполняю так:

//-----------------------------------------------------
// Temperature Conversion to Degrees Subroutine
//
// Parameter: none
// Returns: Current temperature in degrees*10000(12 bit resolution)
// Bit 31 - Sign of temperature
//
//-----------------------------------------------------
unsigned long CurrentTemp(void)
{ unsigned long TV;
bit Sign;
if((TermoRAM.Temperature & 0xf800) == 0xf800){ //Negative temperature
TV=~TermoRAM.Temperature; TV&=0x0000ffff; TV++; Sign=1;}
else {TV=TermoRAM.Temperature; TV&=0x0000ffff; Sign=0;}

TV*=625; //(TV*10000/16)
if (Sign) TV|=0x80000000;
return(TV);
}

Структура TermoRAM периодически заполняется в основной программе. Формат ее следующий:

struct ScratchPad{
unsigned int Temperature;
unsigned char TLReg;
unsigned char THReg;
unsigned char Config;
unsigned char CRC;
};

struct ScratchPad TermoRAM;
Go to the top of the page
 
+Quote Post
Igor26
сообщение Feb 3 2006, 13:15
Сообщение #8


Знающий
****

Группа: Свой
Сообщений: 521
Регистрация: 10-02-05
Пользователь №: 2 544



Цитата(Rst7 @ Feb 3 2006, 14:13) *
Цитата(Igor26 @ Feb 3 2006, 12:29) *

В датащите об этом ни строчки!!!


Плохо смотрите. Там конечно не написано так же прямо, как я написал. Там есть табличка (пардон за форматирование):

Temperature/Data Relationships Table 2

MSb 2^3 2^2 2^1 2^0 2^-1 2^-2 2^-3 2^-4 LSB
MSb S S S S S 2^6 2^5 2^4 MSB

(unit = °C)

TEMPERATURE DIGITAL OUTPUT DIGITAL OUTPUT
(Binary) (Hex)
+125°C 0000 0111 1101 0000 07D0h
+85°C 0000 0101 0101 0000 0550h*
+25.0625°C 0000 0001 1001 0001 0191h
+10.125°C 0000 0000 1010 0010 00A2h
+0.5°C 0000 0000 0000 1000 0008h
0°C 0000 0000 0000 0000 0000h
-0.5°C 1111 1111 1111 1000 FFF8h
-10.125°C 1111 1111 0101 1110 FF5Eh
-25.0625°C 1111 1110 0110 1111 FF6Fh
-55°C 1111 1100 1001 0000 FC90h
*The power on reset register value is +85°C.

Я даташите видел табличку типа:
85С =0xAA
25C =0x32
и т.д.
Пожалуйста, ткните носом на страницу даташита, где эта табличка.
Может быть у меня старый даташит.
ALexx спасибо за пример. Вечером попробую.

Спасибо всем ответившим cheers.gif
Go to the top of the page
 
+Quote Post
Igor26
сообщение Feb 3 2006, 19:04
Сообщение #9


Знающий
****

Группа: Свой
Сообщений: 521
Регистрация: 10-02-05
Пользователь №: 2 544



Ещё раз всем спасибо!!! Действительно, делением на 16 значения ,считанного из датчика, проблему решило(Rst7 мой Вамa14.gif ), а c примером от ALess всё ясно, как работать с отрицательными значениями! a14.gif
Уважаемые модераторы, тему можно закрывать.
Go to the top of the page
 
+Quote Post
ROC
сообщение Feb 3 2006, 22:56
Сообщение #10


Частый гость
**

Группа: Свой
Сообщений: 157
Регистрация: 14-11-04
Из: Санкт-Петербург
Пользователь №: 1 125



Цитата(Igor26 @ Feb 3 2006, 22:04) *
Ещё раз всем спасибо!!! Действительно, делением на 16 значения ,считанного из датчика, проблему решило(Rst7 мой Вамa14.gif ), а c примером от ALess всё ясно, как работать с отрицательными значениями! a14.gif
Уважаемые модераторы, тему можно закрывать.

Кгхм...
Не поторопились, уважаемый? Делением на 16 проблему не решить, Там реально сначала нужно умножить на 10, а вот потом уже делить на 16, а то Ваши результаты будут врать ровно в 10 раз.


--------------------
WBR,
ROC.
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Feb 3 2006, 23:25
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Давольно давно использовал, но смутно помню что в даташите (тогда ещё была просто 1820) была приведена методика как получить более точное значение температуры. Можно обеспечить точность 0.1 градуса. Я пробовал и в принципе получалось. Правда необходимости не было и я загрубил до 0.5. Но даташит действительно запутанный. Половину методом проб делал. smile.gif
Go to the top of the page
 
+Quote Post
Rst7
сообщение Feb 4 2006, 07:36
Сообщение #12


Йа моск ;)
******

Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610



Цитата(ROC @ Feb 4 2006, 00:56) *
Кгхм...
Не поторопились, уважаемый? Делением на 16 проблему не решить, Там реально сначала нужно умножить на 10, а вот потом уже делить на 16, а то Ваши результаты будут врать ровно в 10 раз.


Обоснуй!

ЗЫ У меня это дело в измерителе уже года 4 работает, если бы оно в 10 раз врало - хрен бы я метрологию прошел wink.gif


--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
Go to the top of the page
 
+Quote Post
Kovrov
сообщение Feb 4 2006, 09:11
Сообщение #13


Мастер-фломастер
****

Группа: Свой
Сообщений: 611
Регистрация: 29-12-05
Пользователь №: 12 700



че то я не врубаюсь
вам какая точность то нужна?
если измерение в цельсиях и до градуса то попросту
результат сдвигаем 1 раз вправо (деление на 2) и учитываем сдвинутую еденицу для округления
или для 0,5 град после запятой
с отрицательными температурами чуть сложней но тоже просто!
если более высокая точность используем непосредственный счетчик датчика и масштабируем онный под свои нужды....


--------------------
Вон ПОПОВ, клоун клоуном, а радио изобрел!!
Go to the top of the page
 
+Quote Post
ROC
сообщение Feb 4 2006, 13:59
Сообщение #14


Частый гость
**

Группа: Свой
Сообщений: 157
Регистрация: 14-11-04
Из: Санкт-Петербург
Пользователь №: 1 125



Цитата(Rst7 @ Feb 4 2006, 10:36) *
Цитата(ROC @ Feb 4 2006, 00:56) *

Кгхм...
Не поторопились, уважаемый? Делением на 16 проблему не решить, Там реально сначала нужно умножить на 10, а вот потом уже делить на 16, а то Ваши результаты будут врать ровно в 10 раз.


Обоснуй!

ЗЫ У меня это дело в измерителе уже года 4 работает, если бы оно в 10 раз врало - хрен бы я метрологию прошел wink.gif

Упс...
Да, лажанулся sad.gif
В код посмотрел, а в комментарии - нет smile.gif

На самом деле в даташите на DS18B20 вполне прозрачно написано:
(код на Bascom AVR)
Код
R = &HFF
1wwrite &HCC                                                  'команда skip ROM
1wwrite &H44                                                  'команда "ConvertT"
Waitms 250                                                     ' ждем 250 ms
Waitms 250                                                     ' ждем 250 ms
1wreset                                                          
1wwrite &HCC                                                  'команда skip ROM
1wwrite &HBE                                                  'команда read

B1 = 1wread()                                                 'читаем 2 байта из термометра
B2 = 1wread()

1wrreset                                                          

If B2 >= 248 Then                                             'Т выше нуля? Нет?
B1 = R - B1                                                  
B2 = R - B2                                                  
Sign = "-"
Else                                                              'Т выше нуля? Да!
Sign = "+"
End If
T1 = B1 / 16                                                  
T2 = B2 * 16                                                  
T1 = T1 + T2


--------------------
WBR,
ROC.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 06:29
Рейтинг@Mail.ru


Страница сгенерированна за 0.01475 секунд с 7
ELECTRONIX ©2004-2016