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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> ds18b20 меряет не более 85 градусов
masterpc
сообщение Feb 5 2008, 14:17
Сообщение #1


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

Группа: Участник
Сообщений: 124
Регистрация: 1-03-07
Из: Винница
Пользователь №: 25 788



Всем привет! Столкнулся со следующим явлением - датчик 18В20 (6 датчиков) в макете измеряют температуру не более 85,5 градусов, по достижении 85,5 градусов показания не увеличиваются. Поставил другие два датчика такого же типа - все нормально меряет . Поставил первые датчики на другой прибор - меряют нормально, как и положено. Алгоритм вроде правильный. Может быть кто подскажет где в таких случаях нужно искать поганку?

Сообщение отредактировал masterpc - Feb 5 2008, 14:18
Go to the top of the page
 
+Quote Post
GrayCat
сообщение Feb 5 2008, 20:11
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 263
Регистрация: 7-10-05
Из: UA
Пользователь №: 9 342



Цитата(masterpc @ Feb 5 2008, 16:17) *
Может быть кто подскажет где в таких случаях нужно искать поганку?

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

Кроме того, питание паразитное или полное? Если паразитное, то после подачи команды на преобразование температуры какому-либо датчику (или всем через "Skip ROM") нельзя давать команды остальным датчикам - для "преобразующего" это ведь будет потеря питания!


--------------------
Gray©at
Go to the top of the page
 
+Quote Post
yung
сообщение Feb 6 2008, 06:05
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 207
Регистрация: 25-03-05
Из: Рязань
Пользователь №: 3 669



Цитата(masterpc @ Feb 5 2008, 17:17) *
Всем привет! Столкнулся со следующим явлением - датчик 18В20 (6 датчиков) в макете измеряют температуру не более 85,5 градусов, по достижении 85,5 градусов показания не увеличиваются. Поставил другие два датчика такого же типа - все нормально меряет . Поставил первые датчики на другой прибор - меряют нормально, как и положено. Алгоритм вроде правильный. Может быть кто подскажет где в таких случаях нужно искать поганку?


Может, совпадение, конечно... Когда-то делал себе термометр для подвала на 18В20. При проверке подогрел зажигалкой (сам дурак, знаю) и перестарался. Так вот, после умирания датчика, код от него после пересчета в градусы получался 85 (десятые доли у меня не выводились).
Go to the top of the page
 
+Quote Post
GrayCat
сообщение Feb 6 2008, 06:45
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 263
Регистрация: 7-10-05
Из: UA
Пользователь №: 9 342



Цитата(yung @ Feb 6 2008, 08:05) *
Может, совпадение, конечно...
[...]
код от него после пересчета в градусы получался 85

Это не совпадение: "85" это его значение "по умолчанию", т.е. когда не произошло преобразования температуры вообще.
Код
85 == 0x55 == 0b01010101
это так в Далласе прикололись...


--------------------
Gray©at
Go to the top of the page
 
+Quote Post
MTh
сообщение Feb 6 2008, 08:13
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 234
Регистрация: 28-02-06
Из: Иркутск
Пользователь №: 14 771



Меряет, причем на УРА!
Первый результат, даже если дать комманду на преобразование всегда будет 85 градусов. Т.е. грубо говоря, надо дать команду на конвертацию, подождать а потом снова выдать команду. Тогда уже будет реальная температура.
Go to the top of the page
 
+Quote Post
masterpc
сообщение Feb 6 2008, 08:21
Сообщение #6


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

Группа: Участник
Сообщений: 124
Регистрация: 1-03-07
Из: Винница
Пользователь №: 25 788



Итак по порядку:
- время опроса увеличивал вдвое, результат тот же. Пробовал уменьшать, тогда действительно, иногда датчик не успевал померять температуру и выводил 85 градусов. Но здесь имеет случай, когда он или не успевает померять значения температуры выше 85,56 градусов, или имеет место сброс датчика.
- питание паразитное, на шине 4 датчика. Работа с ними осуществляется следующим образом: команда преоьбразования температуры для всех датчиков, потом считывание температуры по очереди со всех датчиков, используя адресацию. т.е когда отвечает один датчик остальные молчат.

Было бы понятно, если бы температура выше 85 градусов лежала в другом байте, но это не так. Целые значения температуры лежат в двух младших байтах. Вот привожу кусок кода, где я преобразую считанные данные в температуру:



void out_curent_temp (byte i) {


byte buf1, buf2, znak;
int TEMPERATURE;
float buf3=0;




//*********************************************************
buf1 = sens[i][0];
buf2 = sens[i][1];
buf1 = (buf1 >> 4);
buf2 = (buf2 << 4);

TEMPERATURE = buf1|buf2;
znak=sens[i][1];
znak&=0xF0;
if(znak!=0) TEMPERATURE=~TEMPERATURE;

TEMPERATURE=TEMPERATURE*10;
//*********************************************************

buf1 = sens[i][6];
buf2 = sens[i][7];

buf3=0.25+(float)(buf2-buf1)/buf2;
TEMPERATURE=TEMPERATURE+(byte)(buf3*10);

Out_digit_LCD(2, 2, TEMPERATURE);

}


Умножение на 10 делаю для удобства реализации вывода чисел с плавающей запятой, чтобы использовать только целочисленные типы.

Цитата(MTh @ Feb 6 2008, 10:13) *
Меряет, причем на УРА!
Первый результат, даже если дать комманду на преобразование всегда будет 85 градусов. Т.е. грубо говоря, надо дать команду на конвертацию, подождать а потом снова выдать команду. Тогда уже будет реальная температура.


А чем это можно объяснить?
Go to the top of the page
 
+Quote Post
MTh
сообщение Feb 6 2008, 09:17
Сообщение #7


Местный
***

Группа: Свой
Сообщений: 234
Регистрация: 28-02-06
Из: Иркутск
Пользователь №: 14 771



Цитата(masterpc @ Feb 6 2008, 11:21) *
А чем это можно объяснить?


Если я все правильно понимаю, так задумано производителем... Зачем - вопрос... В любом случае практика показывает, что со второго чтения данные идут верные. Я использовал в своих проектах в сумме около 10 DS18B20 и каждый, на первой конвертации и считывании давал температуру 85 градусов.



Цитата(masterpc @ Feb 6 2008, 11:21) *
Было бы понятно, если бы температура выше 85 градусов лежала в другом байте, но это не так. Целые значения температуры лежат в двух младших байтах.


Вообще-то для температуры там отведено два байта всего... Старшая тетрада старшего байта отвечает за знак, младшая старшего байта и старшая младшего байта за целую часть, младшая младшего байта за дробную часть...

Компилятор какой используешь?
В CV AVR есть готовые библиотеки... правда там есть неудобство...

Я на асме писал работу с B20 - никаких проблем не было, кроме собственных кривых рук и первоначального непонимания некоторых моментов. biggrin.gif

Цитата
- время опроса увеличивал вдвое, результат тот же. Пробовал уменьшать, тогда действительно, иногда датчик не успевал померять температуру и выводил 85 градусов. Но здесь имеет случай, когда он или не успевает померять значения температуры выше 85,56 градусов, или имеет место сброс датчика.


Время опроса?? Наверное имеется ввиду время конвертации? Оно четко прописано в даташите и зависит от установленного разрешения.

Я же говорил о том, что надо дать команду на конвертацию, подождать (750 мСек максимум), потом снова дать команду на конвертацию опять подождать (те же 750 мСек) и только тогда, считав данные, Вы должны получить реальную температуру.

Сообщение отредактировал MTh - Feb 6 2008, 09:20
Go to the top of the page
 
+Quote Post
masterpc
сообщение Feb 6 2008, 09:19
Сообщение #8


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

Группа: Участник
Сообщений: 124
Регистрация: 1-03-07
Из: Винница
Пользователь №: 25 788



Странно... Ну у меня чуть не так, у меня меряет причем все датчики, но не более 85,5 градусов. Я попробую как Вы мне посоветовали, правда не хочется ждать два раза по 750 мсек, тем более, что первый прибор, который я сделал использует такие же датчики, только там не паразитное питание и на шине только один датчик. так вот там такого вообще не наблюдалось...
Я пишу в ИАРе.

Сообщение отредактировал masterpc - Feb 6 2008, 09:24
Go to the top of the page
 
+Quote Post
MTh
сообщение Feb 6 2008, 09:22
Сообщение #9


Местный
***

Группа: Свой
Сообщений: 234
Регистрация: 28-02-06
Из: Иркутск
Пользователь №: 14 771



Цитата(masterpc @ Feb 6 2008, 12:19) *
Странно... Ну у меня чуть не так, у меня меряет причем все датчики, но не более 85,5 градусов. Я попробую как Вы мне посоветовали, только еще вопрос - какую паузу выдерживать между командами конвертации?
Я пишу в ИАРе.

см выше )))

А насчет того что не меряет выше... протокол сам реализовывал или готовый использовал?
Go to the top of the page
 
+Quote Post
masterpc
сообщение Feb 6 2008, 09:27
Сообщение #10


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

Группа: Участник
Сообщений: 124
Регистрация: 1-03-07
Из: Винница
Пользователь №: 25 788



Цитата(MTh @ Feb 6 2008, 11:22) *
см выше )))

А насчет того что не меряет выше... протокол сам реализовывал или готовый использовал?


Использовал готовый. Прикол в том, что есть два датчика которые меряюют как раз правильно, свыше 100 градусов.
Go to the top of the page
 
+Quote Post
MTh
сообщение Feb 6 2008, 09:31
Сообщение #11


Местный
***

Группа: Свой
Сообщений: 234
Регистрация: 28-02-06
Из: Иркутск
Пользователь №: 14 771



Цитата(masterpc @ Feb 6 2008, 12:27) *
Использовал готовый. Прикол в том, что есть два датчика которые меряюют как раз правильно, свыше 100 градусов.

Прошу прощения (первый пост читал невнимательно). Тогда дело точно не в протоколе. Скорее всего в железе... попробуй поменять датчики. И проверь маркировку...
Go to the top of the page
 
+Quote Post
zltigo
сообщение Feb 6 2008, 09:32
Сообщение #12


Гуру
******

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



Цитата(MTh @ Feb 6 2008, 12:17) *
каждый, на первой конвертации и считывании давал температуру 85 градусов.

Ничего подобного.
Цитата
Вообще-то для температуры там отведено два байта всего... Старшая тетрада старшего байта отвечает за знак, младшая старшего байта и старшая младшего байта за целую часть, младшая младшего байта за дробную часть...

К чему вся эта бодяга с "отвечает"??? Это число. Просто 12 (или 9bit )число. Не надо никаких разборок - просто умножте это число на шаг измерения температуры. Для получения в например, десятых градуса - соответственно результат поделите и округлите. И бога ради никаких float - ну совсем ни к чему они sad.gif
P.S.
Приведенный исходник читать не стал - там что-то уж совсем, извините sad.gif, умопомрачительное.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
masterpc
сообщение Feb 6 2008, 09:37
Сообщение #13


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

Группа: Участник
Сообщений: 124
Регистрация: 1-03-07
Из: Винница
Пользователь №: 25 788



Цитата(MTh @ Feb 6 2008, 11:31) *
Прошу прощения (первый пост читал невнимательно). Тогда дело точно не в протоколе. Скорее всего в железе... попробуй поменять датчики. И проверь маркировку...


Те датчики, которые в макете меряют не более 85,на приборе который описан выше меряют нормально smile.gif

Цитата(zltigo @ Feb 6 2008, 11:32) *
Ничего подобного.

К чему вся эта бодяга с "отвечает"??? Это число. Просто 12 (или 9bit )число. Не надо никаких разборок - просто умножте это число на шаг измерения температуры. Для получения в например, десятых градуса - соответственно результат поделите и округлите. И бога ради никаких float - ну совсем ни к чему они sad.gif
P.S.
Приведенный исходник читать не стал - там что-то уж совсем, извините sad.gif, умопомрачительное.


Ну согласен, что дробную часть вычисляю дедовским способом для датчика 1820 которые уже сняты с производства, тем не менее это тоже верный способ. Я выводил на индикатор два младших байта полученные с датчика, нагревал датчик до температуры свыше 85 градусов и в результате каждый раз я получал значение 0х55. Так причем тут алгоритм преобразования?

Сообщение отредактировал masterpc - Feb 6 2008, 09:44
Go to the top of the page
 
+Quote Post
zltigo
сообщение Feb 6 2008, 10:04
Сообщение #14


Гуру
******

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



Цитата(masterpc @ Feb 6 2008, 12:37) *
Ну согласен, что дробную часть вычисляю дедовским способом...

Только не надо возводить напраслину на дедов - они арифметику знали.
Цитата
Так причем тут алгоритм преобразования?

Притом, что лично Вы его зачем-то привели. Зачем??? При той мути, что там написана, вынужден признать, что получить на выходе цены на дрова в Бангалоре вместо температуры вполне можно.
Посему, совершенно безотносительно к тому, "работает" или нет, начните с написания пары строчек
(пары а не того феерического нагромождения манипуляций) для получения температуры в десятых градусах цельсия из считанных из датчика двух байт.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
masterpc
сообщение Feb 6 2008, 10:11
Сообщение #15


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

Группа: Участник
Сообщений: 124
Регистрация: 1-03-07
Из: Винница
Пользователь №: 25 788



Цитата(zltigo @ Feb 6 2008, 12:04) *
Только не надо возводить напраслину на дедов - они арифметику знали.

Притом, что лично Вы его зачем-то привели. Зачем??? При той мути, что там написана, вынужден признать, что получить на выходе цены на дрова в Бангалоре вместо температуры вполне можно.
Посему, совершенно безотносительно к тому, "работает" или нет, начните с написания пары строчек
(пары а не того феерического нагромождения манипуляций) для получения температуры в десятых градусах цельсия из считанных из датчика двух байт.


Давайте не будем ругаться, то, что Вы относитесь к группе "супермодераторы" не дает Вам права так невежественно относится к людям которые имеют меньше опыта в данном вопросе.

А теперь по существу, забудем про код который приведен выше. Я ничего не делая с полученным массивом байтов из датчика выводил значения двух младших байтов на индикатор. И максимум, что я мог получить, это 0х0550.

Сообщение отредактировал masterpc - Feb 6 2008, 10:20
Go to the top of the page
 
+Quote Post

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

 


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


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