Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: датчик ds18s20 точность измерения и разрешение.
Форум разработчиков электроники ELECTRONIX.ru > Аналоговая и цифровая техника, прикладная электроника > Метрология, датчики, измерительная техника
zheka
Для этого датчика указано: +/- 0,5 и 9 бит соответственно.

Правильно ли я понял, что данный датчик может зафиксировать изменение температуры на 1/16 градуса, при этом абсолютное значение будет отличаться на 0,5 гр.С, или я губу раскатал?
Electrovoicer
из практики абсолютная ошибка у него побольше 0.5С, а главная неприятная особенность, что он уплывает со временем. попадались экземпляры, уплывшие за год на 1.5С. а так да, разрешение сравнительно высокое
zheka
Ну это можно откалибровать.
ТОгда такой вопрос - я думаю, что уплывание обусловлено физическими изменениями элементе. В таком случае при порче этого элемента не теряется ли чувствительность вообще? То есть при изменении на 1 градус датчик показывает изменение на 0,9...
zheka
На схемах вывод DQ соединен с плюсом питания через резистор.
А можно вместо него:

Код
DDRD=0x00;
PORTD=0xFF;


?

И еще вопрос - у меня датчик DS18b20 , в codevision пример на ds1820. Что надо поменять в программе?

Я поменял family_code с 0x10 на 0x28, согласно мануалу.
Резистор не подключал, а вставил код, как указано выше (ну нету под рукой резистора - магазины закрыты, до завтра не утерплю...).

пытаюсь определить устройство:
Код
devices=w1_search(0xf0,rom_code);
sprintf(s,"%u , DS1820\nDevice detected",devices);


Устройство не определяется.
zheka
Не могу запустить датчик DS18B20.
Опишу картину.

Вначале я подключилдатчик к микроконтроллеру ATMega8 и перепробовал из нескольких примеров код инициализации датчика. Не работало.


Напомню сведения из DataSheet:
Нажмите для просмотра прикрепленного файла

То есть, надо подать импульс 480 мкс,подождать 15-60 мкс, после чего последует импульс от датчика длиной 60-240 мкс.
А мой контроллер не ловит этот импульс. Начинаю ковыряться, выясняю, что импульс от датчика есть, но следует ранее чем через 15 мкс.. и заканчивается ранее чем через 60 мкс.

Подключаю осциллограф. Вот картина (прошу обратить внимание - инвертирована по сравнению с даташитом):

Нажмите для просмотра прикрепленного файла
сразу же после тестового импульса появляется импульс датчика, очень короткий. То есть датчик отзывается, но как-то вяло.



Дай-ка думаю, попробую его опросить. Посылаю код 0XF0 - поиск ROM code - отвечает гад - один бит выдает в линию.
На остальные команды не реагирует.

Нажмите для просмотра прикрепленного файла




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



Вот фрагменты программы:
Код
  #define DQW     PORTD.0
  #define DQR     PIND.0
  #define DQD     DDRD.0


///////////////////////////


    
unsigned char ow_reset(void)
{

unsigned char presence;
    DQW = 0;
        DQD = 1;  
    delay_us(500);
    DQD = 0;            
    delay_us(70);
    presence=DQD;      
    delay_us(450);    
    return(presence);


}    


void main ()
{
while (1)
{

    ow_reset();
    write_byte(0xF0);

    for(k = 0; k < 9; k++)
    {
        get[k] = read_byte();
    }


}
}


Подключаю так:

Нажмите для просмотра прикрепленного файла


Что посоветуете? Неисправность датчика? Не могу пока проверить - датчик один, а в магазинах обещают подвезти бог знает когда...
zheka
Сорри, на схеме у 7805 не +5, а +9 вольт
AndyBig
На первый взгляд у Вас все правильно. Вполне возможно, что неисправен сам датчик.
ogogogogogogogogogo
Хм.. а у меня другая проблема:

Купил я датчик DS18b20 - снимаю с него показания программой, написанной под DS1820 - все без проблем.

Скачиваю из интернета код-пример под DS18b20 - запускаю...
В общем форматирование строки согласно примерам из CodeVision, а именно:

printf("t%u=%+.3f\xf8C\n\r",i+1, ds18b20_temperature(&rom_codes[i++][0]));

или

sprintf(lcd_buffer,"t%u=%+.3f\xdfC",j++,ds18b20_temperature(&rom_code[i][0]));

выводит буквенно-цифровой бред на экран. И на изменение температуры показания на экране никак не реагируют.

Ставлю старый формат, как для DS1820 - sprintf(s,"t%u=%c%i.%u\xdfC",i,j,temp/10,temp%10); температуру показывает в 10 раз меньшую, но зато она хотя бы изменяется на экране.


Как правильно отформатировать строку?
AndyBig
Никогда не заморачивался с функцией sprintf в мегах... По-моему много проще написать свою функцию вывода чисел.
ogogogogogogogogogo
Простите, мне проще работать с тем, что уже есть. Я вывожу результат на индикатор.

Вот код из ds18b20.lib:

Код
float ds18b20_temperature(unsigned char *addr)
{
unsigned char resolution;
if (ds18b20_read_spd(addr)==0) return -9999;
resolution=(__ds18b20_scratch_pad.conf_register>>5) & 3;
if (ds18b20_select(addr)==0) return -9999;
w1_write(0x44);
delay_ms(conv_delay[resolution]);
if (ds18b20_read_spd(addr)==0) return -9999;
w1_init();
return (*((int *) &__ds18b20_scratch_pad.temp_lsb) & bit_mask[resolution])*0.0625;
}


То есть возвращает она вот чего: return (*((int *) &__ds18b20_scratch_pad.temp_lsb) & bit_mask

Как это переварить?
sprintf(s,"%f", temp) не выводит ничего.
Miron
У ds18b20 не 9 бит а от 9 до 12 выбирается это регистром конфигурации в самом датчике
по умолчанию 12 бит
точность разделена на пределы по температуре -10 до +70 ----- 0,5 гр.С
за этим диапазоном погрешность растет аш до 2 градусов
разрешения от него действительно можно получить 1/16

кстати в последних DataSheet про точтость указывают только предел где 0,5 гр.С
Miron
Похоже что у вас звенит задний фронт
посмотрите подробней схему включения
не забыли насчет подтягивающего резистора?
может у вас паразитная емкость где стдит
Такое обычно бывает на длинных линиях

Звон убирается схемкой драйвера линии
за счет более пологоо фронта
Miron
Что то я сразу внивание не обратил у вас на осцоллограмме импульс
сброса почему то 1 а он то должен быть 0

линия всегда должна находится в 1

посмотрите внимательно DS
импульс 480 мкс выдается 0
потом вы поднимаете на линии 1
ждете 15-60 мкс
и читаете импульс присутствия
AndyBig
Цитата
у вас на осцоллограмме импульс
сброса почему то 1 а он то должен быть 0

Автор же предупредил, что осциллограмма инверитрована.
Цитата
Похоже что у вас звенит задний фронт

Тоже врядли - слишком большой сигнал (да и задержка до него слишком большая).
ogogogogogogogogogo
А по-моему у него та же проблема, что и у меня была - с кварцем. Все на вид правильно, однако стоит проверить , соответствуют ли временные задержки указанным. Если zheka не опытней, чем я, то он наверняка тоже CKSEL не прошил.

А вот у меня другие проблемы. У же говорил, что код-пример из CodeVision Выдает буквенно-цифровой бред. Вот я выдрал код функции, измеряющей температуру:
Код
float ds18b20_temperature(unsigned char *addr)
{
unsigned char resolution;
if (ds18b20_read_spd(addr)==0) return -9999;
resolution=(__ds18b20_scratch_pad.conf_register>>5) & 3;
if (ds18b20_select(addr)==0) return -9999;
w1_write(0x44);
delay_ms(conv_delay[resolution]);
if (ds18b20_read_spd(addr)==0) return -9999;
w1_init();
return (*((int *) &__ds18b20_scratch_pad.temp_lsb) & bit_mask[resolution])*0.0625;
}


Что-то я не вижу там обработки заявленного __ds18b20_scratch_pad.temp_msb (старшего байта). Нет его (temp_msb) упоминания и во всех других файлах имеющих отношение к демо-проекту. Может я не прав, конечно... Но если прав - объясните, как доработать функцию, чтобы она полностью обрабатывала ответ датчика.
Miron
Да извеняюсь не обратил внимания

Но осцилограммы мне все равно не нравятся
у меня они ровненькие ну как DS прямо и все работает

Еще для проверки связи с датчиком пользоваться командой 0хF0
неудобно потому как она предпологает целый алгоритм поиска
адресов нескольких датчиков в линии
Легче всего проверять работу с 1 датчиком командой 0х33

Я на меге8 не писал поэтому не совсем разобрался с примером кода
но насколько я помню у мегов порты настраиваются на вход и на выход
посему при подключении к 1 ноге контроллера ее надо постоянно
переключать при работе с линией не забыл ли про это zheka
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.