Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: уточните про ds1820
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему
NikP
Прочитал в форуме об использовании ds1820,
у народа все хорошо и быстро получается, решил
попробовать. Получилась непонятка.

Для простоты и кратости взял для пересчета в
температуру TEMP_LSB*0.5 . Однако на индикатор
выводятся цифры, далекие от того что кажет
градусник на стенке . Показания стабильные
(т.е. цифры не "скачут"), однако при простом нагревании
датчика рукой цифра меняется странно: увеличивается,
уменьшается по очереди пока не установится. Непонятно- то ли с программой
не то, то ли датчик барахлит. Подтягивающий резистор сначала стоял
как рекомендован 4,7 к, затем пробовал 1 к, 100к (как было у одного
участника форума) не помогает. Голову сломал - причины не вижу.
Поделитесь мыслями, кому не жалко.
Заранее благодарен.

Микросхема SiLsbs C8051F320. Питание от внешнего источника
(не паразитное). Операция чтения бита
организована так:

Вывод на шину "0"
Задержка 5мкс
Вывод 1 - "5 вольт"
Задержка 5мкс
Чтение состояния шины
AndryG
Причин может быть куча:
- не выдерживаете "время преобразования" между стартом преборазования и чтения температуры (результат преборазования)
- ошибки в преборазовании результата
- ошибки в выводе инфы

Попробуйте увеличить время преобразования и данные бросьте на терминал компа в их "первоначальном" виде - увидите, что глючит.

Для начала можно организовать шину на UART ... на gaw.ru есть хороший перевод аппноте для AVR ... там расписаны тайминги, скорости и т.д. Так Вы будете уверены, что тайминги верные.
SALOME
Цитата(NikP @ Jun 25 2007, 12:14) *
Однако на индикатор
выводятся цифры, далекие от того что кажет
градусник на стенке . Показания стабильные
(т.е. цифры не "скачут"), однако при простом нагревании
датчика рукой цифра меняется странно: увеличивается,
уменьшается по очереди пока не установится.

У меня сейчас на столе стоит DS1820. Правде обмен с ним делается через СОМ порт компа посредством фирменного интерфейса. Как то мы принесли сразу четыре разных термометра и все они показывали разную температуру +-3 градуса. Кому верить - непонятно. Но думаю прибор точнее.
По поводу реакции на изменение температуры - она как и принято у температурных датчиков - замедленная, но строго направленная либо плавно увеличивается, либо плавно уменьшается. Скачки тут маловероятны. Скорее всего дело в конвертации результатов преобразования в процессоре - ведь данные по шине идут в цифре. Ошибки в передачи данных вызвали бы полный хаос, а у Вас более менее упорядочено, но только странновато smile.gif .
NikP
Большое спасибо всем откликнувшимся.
После попыток поработать с изменяемыми
временными параметрами еще раз посмотрел
на программу. Оказалось, что считывал данные
"наизнанку", т.е. при приеме с ds1820 первым
идет младший бит байта и т.д., а я умудрился
поставить его старшим - отсюда проблемы.
Приношу извинения за то, что отнял время
своей бестолковостью и невнимательностью.
SALOME
Цитата(NikP @ Jun 28 2007, 17:00) *
Приношу извинения за то, что отнял время

спасибо за обратную связь - копим опыт...
sergeus
Про ds1820 неплохо написано на http://www.radioded.ru . Очень хороший исходник c комментариями на ассемблере для AvrStudio http://radioded.ru/index.php?option=com_co...9&Itemid=33
adc
Еще добавлю что DS1820 - снят с производства, в кристалле микросхемы DS18S20 устранены ошибки механизма преобразования, присущие компоненту DS1820. источн: http://www.elin.ru/1-Wire/?topic=components2
DS18B20 - аналог DS1820 , но без ошибок , разрядность результата 9-12 бит
DS18S20 - разрядность результата 9 бит. На практике простая замена DS18S20/DS1820 на DS18B20 без изменения кода программы не получится. См. таблицу в приложенном файле.
Удачи!
Tiny
Сделал на DS1820 термометр. В CodeVision для этого есть готовые функции. Программа получается давольно простая. Но дискретность 0,5 не устраивает. В даташите указана формула для вычисления температуры с дискретностью 0,1.
TEMPERATURE=TEMP_READ-0.25+(COUNT_PER_C - COUNT_REMAIN)/COUNT_PER_C
Нужно отбросить младший бит из измеренной температуры, и подставить в формулу данные из SCRATCHPAD ( 6-й, 7-й байты)

Правда, не знаю есть ли смысл ведь, если я не ошибаюсь точность 0,5. Решил попробывать.
В библиотеке ds1820.h есть
Цитата
extern struct __ds1820_scratch_pad_struct
{
unsigned char temp_lsb,temp_msb,
temp_high,temp_low,
res1,res2,
cnt_rem,cnt_c,
crc;
} __ds1820_scratch_pad;

Похоже это те самые данные, которые нужно обработать.

Кто-нибудь пробывал? Как это описать?
Tiny
Так и не разобрался, как включить этот режим и нигде не нашел. Поставил DS18B20. У него разрядность 12бит. Выдает готовые значения с дискретностью 0,1Град. Только почему-то мне пришлось значение температуры умножить на 10. Иначе на индикаторе были только целые числа и дискретность 1Град.
domowoj
Ребята, а кто знает что за цифири прописаны на крпусе ds18b20
после/ниже маркировки - 0439С2281АЕ.
Если код, то цифр не хватает.
Dog Pawlowa
Цитата(domowoj @ Jul 21 2008, 04:58) *
Ребята, а кто знает что за цифири прописаны на крпусе ds18b20
после/ниже маркировки - 0439С2281АЕ.
Если код, то цифр не хватает.

Скорее первые четыре цифры означают время производства - 39-ая неделя 2004 года.
Tiny
Люди, кто знает, насколько точен DS18B20?
Я сравнивал показания с спиртовыми термометрами, но у них самих огромный разброс. Поместил в один корпус датчик и ртутный термометр - данные отличаются на пару градусов. Если поместить градусник в отверстие корпуса, так чтобы ртутный кончик был внутри, а большая часть с наружи, то показания сближаются.
По данным у него точность должна быть не хуже 0,5 градуса. Кому верить? Как проверить? Пока я программно вычел из полученных данных 2 градуса, но это не выход. Как-то же они используются. Может его калибровать нужно?
Использую готовые функции CodeVision

Цитата
#asm("cli");
TEMPR=ds18b20_temperature(&rom_code[0][0]);
#asm("sei");
J='+';
PORTA.0 = 1; //отключен минус
if (TEMPR<0)
{
J='-';
TEMPR=-TEMPR;
PORTA.0 = 0; //включить '-'
};

REZULT = TEMPR*10-20; //Показать температуру
//Умножить на 10 тк. в indilat() отбросятся дробные части
//-20 т.к по ртутным градусникам получалась ошибка на 2гр
indikat(); //функция разложения числа на 3 цыфры для динамической индикации

Функция динамической индикации отбросит дробную часть, поэтому я умножил резултат на 10. Получаю температуру 372. После 2-го 7-сегментного индикатора светится запятая. Врезултате индицируется 37,2
_Олег_
Цитата(Tiny @ Jul 15 2008, 00:36) *
Сделал на DS1820 термометр. В CodeVision для этого есть готовые функции. Программа получается давольно простая. Но дискретность 0,5 не устраивает. В даташите указана формула для вычисления температуры с дискретностью 0,1.
TEMPERATURE=TEMP_READ-0.25+(COUNT_PER_C - COUNT_REMAIN)/COUNT_PER_C
Нужно отбросить младший бит из измеренной температуры, и подставить в формулу данные из SCRATCHPAD ( 6-й, 7-й байты)

Правда, не знаю есть ли смысл ведь, если я не ошибаюсь точность 0,5. Решил попробывать.
В библиотеке ds1820.h есть

Похоже это те самые данные, которые нужно обработать.

Кто-нибудь пробывал? Как это описать?


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