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

 
 
> 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
 
Start new topic
Ответов
masterpc
сообщение Feb 6 2008, 08:21
Сообщение #2


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

Группа: Участник
Сообщений: 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
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 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
Сообщение #4


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

Группа: Участник
Сообщений: 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
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 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
Сообщение #6


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

Группа: Участник
Сообщений: 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
Сообщение #7


Местный
***

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



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

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


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

Группа: Участник
Сообщений: 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

Сообщений в этой теме
- masterpc   ds18b20 меряет не более 85 градусов   Feb 5 2008, 14:17
- - GrayCat   Цитата(masterpc @ Feb 5 2008, 16:17) Може...   Feb 5 2008, 20:11
- - yung   Цитата(masterpc @ Feb 5 2008, 17:17) Всем...   Feb 6 2008, 06:05
|- - GrayCat   Цитата(yung @ Feb 6 2008, 08:05) Может, с...   Feb 6 2008, 06:45
- - MTh   Меряет, причем на УРА! Первый результат, даже ...   Feb 6 2008, 08:13
||- - zltigo   Цитата(masterpc @ Feb 6 2008, 12:37) Ну с...   Feb 6 2008, 10:04
||- - masterpc   Цитата(zltigo @ Feb 6 2008, 12:04) Только...   Feb 6 2008, 10:11
||- - zltigo   Цитата(masterpc @ Feb 6 2008, 13:11) не д...   Feb 6 2008, 10:20
||- - masterpc   Цитата(zltigo @ Feb 6 2008, 12:20) И дейс...   Feb 6 2008, 10:24
||- - zltigo   Цитата(masterpc @ Feb 6 2008, 13:24) Сейч...   Feb 6 2008, 10:44
|- - zltigo   Цитата(MTh @ Feb 6 2008, 12:17) каждый, н...   Feb 6 2008, 09:32
- - masterpc   Большое спасибо!!! Обязательно попробу...   Feb 6 2008, 10:52
- - masterpc   Разобрался с причиной - неправильно было организо...   Feb 6 2008, 12:56
|- - GrayCat   Цитата(masterpc @ Feb 6 2008, 14:56) Разо...   Feb 6 2008, 22:33
|- - MTh   Цитата(masterpc @ Feb 6 2008, 15:56) Разо...   Feb 8 2008, 09:04
|- - masterpc   Цитата(MTh @ Feb 8 2008, 11:04) А можно п...   Feb 8 2008, 12:40
- - Krik99   У меня в протэусе всё работает, а на железе датчик...   May 17 2008, 16:10
- - masterpc   Может с такотовой частотой процика связано? В прот...   May 17 2008, 19:39
- - Kass   Цитата(Krik99 @ May 17 2008, 19:10) датчи...   May 24 2008, 21:37


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

 


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


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