как получить флаг конвертации ds18b20
- Войдите на сайт для отправки комментариев
Всем привет.
В даташите на ds18b20 сказано, что после отправления запроса на измерение температуры, он начинает преобразование и в это время выдает в линию 0. Это если питание от внешнего источника.
У меня не получается отловить этот ноль. Датчик всегда выдает единицу. В чем может быть причина?
На самом деле при нескольких первых попытках датчик отвечал нулем, а потом менял его на единицу, но время конвертации было странным: от 650 до 800 мс при 12-битном преобразовании, а при 9-битном 150 мс. После перестал выдавать нули.
Датчик из Китая в герметичном корпусе с метровым проводом. Между Vdd и DQ резистор 4,7 КОм, Vdd берет +5 В. Провода определил так: черный GND, красный Vdd, желтый DQ.
#include <OneWire.h> #include <DallasTemperature.h> OneWire ds18b20(2); DallasTemperature sensors(&ds18b20); byte i; byte addr[8]; byte data[8]; int16_t Temp; int a = 1; int reading = 0; unsigned int startTime; unsigned int stopTime; void setup(void) { Serial.begin(9600); sensors.begin(); sensors.setResolution(12); if (!ds18b20.search(addr)) { ds18b20.reset_search(); delay(250); } } void loop() { if (reading == 0) { startTime = millis(); ds18b20.reset(); ds18b20.select(addr); ds18b20.write(0x44, 0); reading = 1; } Serial.println(ds18b20.read_bit()); delay(500); // для измерения времени конвертации часть кода менял на это if (ds18b20.read_bit()) { ds18b20.reset(); ds18b20.select(addr); ds18b20.write(0xBE); for ( i = 0; i < 9; i++) { data[i] = ds18b20.read(); } Temp = (data[1] << 8) | data[0]; stopTime = millis(); reading = 0; Serial.print(a); Serial.print(" "); Serial.println(stopTime - startTime); a++; delay(500); } }
Библиотеку Dallas Temperature использовал для задания разрядности по привычке. У нее есть встроенная функция проверки готовности конвертации, но она работает нам тоже read_bit и результат такой же.
Делэй появился по ошибке, когда правил код при вставке сюда. его не было при тестировании.
Я чот нипонял, чо нужно. Всю жись делал так: дал им всем команду конвертации, поделал чёнить в течении 1 секунды, опросил всех адресно и дал им команду опять. Проблем пока небыло (года 4) тфу...блеее...
нужно определить реальное время конвертации.
мне нужно измерять время как можно быстрее, поэтому я ставлю разрядность 9 бит. в принципе я могу отправить запрос и прочитать результат через 100 мс - этого хватит, - но стало интересно, почему не работает функция, описанная в даташите. к тому же мне всегда казалось странным считывать температуру через костыль с фиксированным промежутком времени.
как можно быстрее, поэтому я ставлю разрядность 9 бит.
75 мс на 9 битах 100% работает!!!
а как вы можете доказать?
ПИД регулятор 2-х зонный со скважностью в 75 мс уж лет ПЯТЬ как работает и не "жужЖжит" )))
без флага время измерения я проверял так. в setup считывал температуру, сохранял как preTemp, потом в loop один раз отправлял запрос и по кругу читал результаты, пока не появится температура Temp != preTemp. измерял время. отправлял новый запрос и тд. для надежности совал датчик под лампу, чтоб за время конвертации температура успела измениться. для 12 бит время получалось около 650 мс.
для 9 бит этот способ не годится, т.к. заявленное время конвертации меньше 100 мс, а чувствительность всего 0,5 градуса. это надо успевать каждые 100 мс нагревать датчик на полградуса. пять градусов в секунду. вряд ли такое возможно
ПИД регулятор 2-х зонный со скважностью в 75 мс уж лет ПЯТЬ как работает и не "жужЖжит" )))
у вас не жужжит, а у меня не отлавливается ноль. есть у вас соображения по этому поводу?
есть у вас соображения по этому поводу?
Конечно. Написать самому обработчик датчика по даташиту и не парить мозг.
мне нужно измерять время как можно быстрее
а зачем ты температурным даччиком время мериишь?
температуру конечно. ошибся
Нельзя так его использовать.
Во время запроса и преобразования, возрастает энергопотребление датчика.
Ну и соответственно, оно рассеивается на корпусе.
Если слишком часто опрашивать датчик, то он начинает грется и безбожно врать.
Если время опроса критично возьмите термистор.
хорошо, тогда используй аналоговый даччик (LM35) и не завись от времени конвертации далласа. с какой скоростью сможешь его читать, с такой и читай.
Часто опрашивать нельзя? Насколько я понял, можно, но он тогда греется. В любом случае мне не нужно часто опрашивать, и вопрос не в этом. Мне нужно измерить время замера температуры.
Кстати, можете посоветовать термистор в герметичном корпусе?
Кстати, можете посоветовать термистор в герметичном корпусе?
любой датчик температуры можно запихнуть в гильзу, гильзы можно найти на Али отдельно.
Что касается готовых - например NTC по-моему, на Али только герметичные и попадаются, других не видел
Почитал - повеселило, особенно про замену координат времени координатой температуры. Есть тут что-то от дзен буддизма.
А теперь серьезно - неужто у Вас настолько быстрые процессы, что их надо мерить с максимальной частотой? Огромная энергия или очень малый объем? Если это так, то забудьте про китайские (и иже с ними датчики) - это серьезная задача, которая требует дорогих решений. А если Вас устроит замер раз в 1/3 секунды, так и не заморачивайтесь, DS обеспечит.
ну вот. почему люди пишут, что если мне надо быстро, то надо другой датчик, или что надо через заданное время самому прочесть датчик или еще что. спасибо за советы, конечно, но это все и так понятно же. я не это спрашивал.
неужели никто не пробовал читать готовность датчика к конвертации? это же один из самых распространенных у ардуинщиков
А теперь серьезно - неужто у Вас настолько быстрые процессы, что их надо мерить с максимальной частотой?
если серьезно, то мне хватит и 100 мс на измерение или даже больше
если серьезно, то мне хватит и 100 мс на измерение или даже больше
А зачем Вы вообще создали эту тему? Честно - я не понял. Вам не нравится библиотека, так почитайте даташит и напишите свою программу под ДС (я так и делаю - мне не нравится).
после отправления запроса на измерение температуры, датчик начинает преобразование и в это время выдает в линию 0. когда преобразование закончено, датчик выдаст в линию 1. это из даташита.
мой датчик всегда выдает в линию 1. вернее, сначала он слал нули во время преобразования, но время получалось сильно различным от замера к замеру, а потом перестал делать и это.
библиотека 1-wire нормальная, насколько я понимаю.
ваша библиотека может же отправить запрос на измерение температуры, а затем слушать линию? попробуйте
неужели никто не пробовал читать готовность датчика к конвертации? это же один из самых распространенных у ардуинщиков
встречный вопрос - А зачем????
хотите посмеяться (по теме)? прочитайте 100++ постов этой темы - настроение обеспечено будет
1) если датчик до окончания конвертации будет держать "0" он не сможет работать от питания даташины. Не помню команду перевода датчика в трехпроводный режим - проверьте.
2) если датчик будет держать лог 0 на даташине он будет подогреваться протекающим током ключа (выше уже писали), не смогут работать несколько датчиков на одной линии, (ИМХО) это нарушает идею самой шины OneWire - никто не может монополизировать шину ИМХО
3) используйте термосопротивление и внешний АЦП, ИОН (или образцовый источник тока так правильнее).... короче говоря соберите устройство под задачу сами и перечитайте тему по ссылке выше в этом посте :))))))))))
спасибо за конструктивный комментарий.
о невозможности монополизации шины я думал уже. но все же в даташите это указано, и я несколько раз видел, как датчик отвечал нулями в течение какого-то времени после запроса на конвертацию
Странно. Я не экспериментировал, но, если в ДШ расписана эта ситуация, то должно выполняться... И крайне редко встречается обратное.
Действительно... если трехпроводное питание есть такая функция, осталось разобраться как датчик определяет тип подключения 3х или 2х проводное...
нашел такое в описании:
осталось разобраться как датчик определяет тип подключения 3х или 2х проводное...
[B4h] Команда позволяет определить режим питания любого датчика. После передачи команды, ведущее устройство выполняет тайм-слот чтения. Термодатчик с ”паразитным питанием” установит выход в низкое состояние, в то время как, датчик с внешним питанием будет держать шину в высоком состоянии.
[44h] Команда инициализирует одно преобразование температуры. После нее значение температуры оказывается в 2-байтном регистре температуры оперативной памяти и датчик переходит в неактивное, низкопотребляющее состояние. Для режима ”паразитного питания” необходимо выполнить требования по подключению шины к источнику питания на время преобразования из раздела ПИТАНИЕ DS18B20. В режиме внешнего питания ведущее устройство может определить состояние операции преобразования с помощью слота чтения. При не законченной операции состояние шины будет низкого уровня, по завершению преобразования на шине будет высокий уровень. При ”паразитном питании” такой способ отслеживания процесса преобразования не возможен.
Не нужно никаких delay'ев. Просто в цикле выставляем слот чтения и когда конвертация закончится датчики отдадут в него "1":
Как оказалось время конвертации 9-bit значения ~66..67ms, против документированных 93.75ms ну и дальше кратно.
Как оказалось время конвертации 9-bit значения ~66..67ms, против документированных 93.75ms ну и дальше кратно.
в каком диапазоне температур? 93.75ms - гарантированный интервал во всем диапазоне, для любой партии т.к. осцилляторы не кварцы и точность значительно ниже.