А инверсия побитовая с добавлением единицы у меня почему то даёт не тот результат..
Всегда пользуюсь только таким алгоритмом и проблем не замечал. Как-то давно (когда под рукой был лабораторный термостат) проверял фирменные датчики на погрешность и влияние саморазогрева при минусовой температуре и на этом основании делал поправку в алгоритме при определённой температуре (в основном при минусе). Получалось довольно прилично увеличить точность показаний вплоть до минус 35. Вот данная таблица: показания с поправкой и напрямую с датчика. Период опроса датчика был 16 секунд (чтобы минимизировать саморазогрев).
Но с тех пор много воды утекло… оригинальные датчики теперь сильно дорого стоят, а клоны из Китая не отвечают заявленной погрешностью (в большинстве своём). Да и оценить их погрешность теперь уже давно нет возможности. Соответствующие приборы остались на производстве, которые теперь не доступны.
Просто при кодировании инверсия с прибавлением 1 удобнее, а так это тоже самое, что вычитание из 0.
К сожалению, у AVR инструкция NEG работает только с регистром, который только 8 бит. Но зато есть 16 битный INC/DEC. Так что алгоритм XOR+INC самое быстрое, что есть на AVR.
_________________ Репозиторий STM32: https://cloud.mail.ru/public/2i19/Y4w8kKEiZ Актуальность репозитория: 6 декабря 2025 года Если чего-то не хватает с сайта st.com - пишите, докачаю.
aaa (unsigned char dev) // функция считывания t с датчика номер(dev) и вывод значения // на лсд с отбросом незначащих нулей (до запятой) { tem=ds18b20_temperature(&ee_code[dev][0])*10; //считываем и умножаем на 10
if (tem<0) // если показание отрицательное { lcd_putsf("-"); //выводим "-" на лсд tem=-tem; //инвертируем показание
}
if (tem<1260) {
if (tem>=1000) goto la1; if (tem>=100) goto la2; // отброс незначащих нулей goto la3 ; // тоже отброс незначащих нулей la1: lcd_putchar(tem/1000+48); // сотни la2: lcd_putchar(tem%1000/100+48); // десятки la3: lcd_putchar((tem%100)/10+48); // единицы lcd_putchar(44); // запятая lcd_putchar(tem%10+48); // десятые градуса lcd_putchar(176); // градус ° lcd_putsf("C "); //C цельсия } else lcd_putsf("Err ");// если t<126 выводим на лсд // иначе выводим "Err" (ошибка)
} void main(void) {
// RS - PORTA Bit 2 // RD - PORTB Bit 7 // EN - PORTA Bit 3 // D4 - PORTA Bit 4 // D5 - PORTA Bit 5 // D6 - PORTA Bit 6 // D7 - PORTA Bit 7
lcd_init(16); w1_init(); w1_search(0xf0,ee_code); // считываем номера датчиков и помещаем в массив ee_code lcd_putsf("Chan.1="); lcd_gotoxy(0,1); lcd_putsf("Chan.2=");
while (1) { lcd_gotoxy(7,0); aaa(0); //выводим значение температуры 1-го датчика lcd_gotoxy(7,1); aaa(1); //выводим значение температуры 2-го датчика
} }
Добавлено after 3 minutes 16 seconds: 10 строк кода ... и всё работает
Добавлено after 24 minutes 46 seconds:
Добавлено after 5 minutes 55 seconds: Размеры чуть более спичечного коробка , автономность 4 суток без подсветки .
Добавлено after 5 minutes 7 seconds: Заряд , разряд контроль естественно
нет там флоатов, от слова совсем. там всё целочисленно. Хоть 0,1 (DS18xxx, кроме DS1821); хоть 0,01 (DS1821) разрешение - пофигу.
(круглый)
ЗЫЗЫ Кстати если кто-либо Вам скажет что там существует разогрев - не верьте, это всё не умение их приготавливать. Разогрев в пределах десятых градуса там (при самом частом опросе, порядка 800мс).
Последний раз редактировалось kolobok0 Вс дек 28, 2025 23:34:21, всего редактировалось 1 раз.
Если датчик находится в незамкнутой среде .. то как он может само разогреваться ?
Тепловое сопротивление кристалл—среда создает разницу температур. Чем больше сопротивление и чем больше тепловыделение, чем больше разница. Если бы это была изолированная среда, то температура росла бы бесконечно.
нет там флоатов, от слова совсем. там всё целочисленно. Хоть 0,1 (DS18xxx, кроме DS1821); хоть 0,01 (DS1821) разрешение - пофигу.
Помимо Float Point есть ещё и Fixed Point.
_________________ Репозиторий STM32: https://cloud.mail.ru/public/2i19/Y4w8kKEiZ Актуальность репозитория: 6 декабря 2025 года Если чего-то не хватает с сайта st.com - пишите, докачаю.
Разогрев в пределах десятых градуса там (при самом частом опросе, порядка 800мс).
Больше! Как то собрал термометр,опрос каждую секунду,вытянул датчик проводами на улицу,а там мороз градусов -25-и на яндексе и на гисметео -25,а мой термометр -20...-19 показывал,долго не мог понять почему,потом просто отключил питание термометра минут на 10,включил-показывает боле менее точно и постепенно пошла температура медленно вверх,снова -20 где то,когда сделал опрос раз в минуту стало нормально.
Все потребленное чипом электричество превращается в тепло! Я использовал LPS22HB (давление+температура) с опросом раз в секунду. При тестировании в комнатных условиях секунд за 10 температура в показаниях поднималась на 1-2 градуса. Отсюда важна разводка, чтобы тепловые потоки через ноги (а у них меньше тепловое сопротивление, чем у корпуса) сообщалось с полигонами (хотя бы для шин питания) и через них сообщалось со средой, а дорожки к датчику должны быть длинные, чтобы уменьшить подвод тепла от остальной электроники.
На картинке пример, как НЕ НАДО делать: все скучковано, LDO размещен вплотную.
А вот пример тестовой платы от ST: одинокий чип, все в земляных полигонах и тонкие длинные дорожки для коммуникации. Даже блокировочный конденсатор отнесен в сторону.
Чет уже 2 страницы. Сколько читал тему, так и не понял, в чем проблема. Читаем даташит и все предельно ясно. 4 последних бита - дробная часть, -1 при отрицательном значении. Сразу нарвался на саморазогрев. Периодичность считывания больше минуты и проблема решена. Как говорил мой первый учитель по программированию:- "Были бы данные, а сделать с ними можно все, что угодно!". А что с ними нужно сделать, подробно в даташите.
Заголовок сообщения: Re: DS18b20 мороз с разрешением 0,1 градуса
Добавлено: Пн дек 29, 2025 14:12:24
Мучитель микросхем
Карма: 2
Рейтинг сообщений: 21
Зарегистрирован: Пн сен 15, 2025 08:43:23 Сообщений: 474 Откуда: Маленький СССР посреди шариатской республики
Рейтинг сообщения:0
Для измерения температуры главного зеркала БТА я вот такие платки разработал (картинка). Естественно, там не убогие DS18, у которых точность ±лапоть, а TSYS01. Правда, когда эти датчики перемонтировали на "старое новое зеркало" в 2019 году, узнал, что существуют еще более точные, причем, немного дешевле (эти в 2014 году стоили около 710р за штуку, купили 100 датчиков).
Использование же DS18 осложняется еще огромным корпусом: если его использовать для примерного измерения температуры жидкости или чего-то еще с хорошей теплоемкостью и теплопроводностью, то ОК. А вот для газов не годится, т.к. придется его опрашивать очень-очень редко, иначе из-за саморазогрева фигню будет показывать, сколько ни старайся. Для воздуха же нужно что-то очень мелкое, надежней всего - самые примитивные платиновые TRD, а то и вообще медные NTC… У NTC, кстати, после калибровки тоже точность примерно ±0.5℃ получается, как и у DS18.
Всяким "крутым цифровым" тоже верить не стоит: они даже в одной и той же серии умудряются врать, выходя за пределы, гарантированные даташитом.
В общем, таки для измерения температуры воздуха с точностью 0.5÷1% я бы посоветовал взять самые обычные платиновые TRD, они совсем недорогие: рублей по 300 на алике. И корпус миниатюрный, своей теплопроводностью не будет сказываться. Да и включать источник тока можно только на момент измерения.
В общем, таки для измерения температуры воздуха с точностью 0.5÷1% я бы посоветовал взять самые обычные платиновые TRD, они совсем недорогие: рублей по 300 на алике. И корпус миниатюрный, своей теплопроводностью не будет сказываться.
На запрос TRD на Алике вываливает куча каких то запчастей на Тойоту. Если под платиновыми имеются в виду PT100, то на том же Алике они таки есть в ассортименте и не дорого, но размер в половину кацелярского карандаша миниатюрным как то язык не поворачивается...
Заголовок сообщения: Re: DS18b20 мороз с разрешением 0,1 градуса
Добавлено: Вт дек 30, 2025 07:42:20
Мучитель микросхем
Карма: 2
Рейтинг сообщений: 21
Зарегистрирован: Пн сен 15, 2025 08:43:23 Сообщений: 474 Откуда: Маленький СССР посреди шариатской республики
Рейтинг сообщения:0
Ничего сложного. Для точности в 0.5% достаточно встроенного АЦП. Только для использования в делителе нужно брать pt100, на pt100 слишком большой саморазогрев будет.
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения