Датчик заявлен как высокоточный, +/- 0.1 градуса для 0…+85 град. С, в корпусе DFN-2L. Для всего диапазона температур -40 … +150 градусов точность несколько хуже, до +/- 0.5 градуса. У датчика 15-ти битное АЦП, восемь разрядов на градусы и семь на дробную часть, что дает разрешающую способность 1/128 или 0.0078125 градуса. Время преобразования и считывания данных порядка 32-х миллисекунд. Подключается он по шине 1-Wire и имеет два варианта конструктивного исполнения: DFN-2L (1.6 x 0.8 мм) и TO-92S-2L (4.0 x 3.0 mm).
Типовая схема подключения показана на Рис.1 и требует 2 ножки микроконтроллера. GPIO1 используется для управления обменом, GPIO2 для считывания данных. Параметры микросхемы приведены для +25°C, напряжении питания от +1.7V до +5.5V и резисторе подтяжки 4.7 кОм.
Рис. 1 Схема подключения NST1002
Обмен с микроконтроллером показан на Рис. 2. Его начало инициируется сбросом питания (GPIO1) в ноль на время 200 микросекунд. Этот импульс запускает в датчике процесс преобразования температуры. Он длится около 30 миллисекунд и по его окончании датчик выдает 17-ти микросекундный импульс (показан на рисунке пунктиром), который микроконтроллер считывает по линии GPIO2.
Рис. 2 Обмен данными с микроконтроллером
Это означает, что процесс завершен корректно и датчик готов передавать данные. Передача данных происходит побитно, сбросом линии питания (GPIO1) в ноль на время порядка 1-2 микросекунды. При этом датчик удерживает нулевой потенциал примерно либо 7…10 микросекунд (что означает «1»), либо 18…21 микросекунду (что означает «0»). Интервал между импульсами сброса должен быть не менее 60-ти микросекунд, таким образом 24 бита данных передадутся минимально за 1440 микросекунд. Данные считываются соответственно по линии GPIO2, их формат показан на Рис. 3.
Рис. 3 Формат принимаемых данных
Первые 16 бит это данные, из которых старший бит – это знак; следующие 8 бит – CRC код в формате Maxim/Dallas. Отрицательные значения температуры передаются в дополнительном коде. Пример вычисления CRC показан на Рис.4 ниже. Не обязательно также считывать все 24 бита. Для получения температуры в целых градусах достаточно считать первые 9 бит.
Следует отметить, что процесс считывания данных должен начаться не позднее 5-ти миллисекунд после импульса готовности. Иначе датчик перейдет в дежурный режим (idle state), и будет выдавать все время одни и те же данные -> 0x18 0x6E 0xE0.
Рис. 4 Пример вычисления CRC
Импульс готовности, чтение 16 бит данных и затем стартовый импульс, снятые логическим анализатором, показаны на Рис. 5 ниже.
Рис. 5 Данные с датчика NST1002-CDNR
Чтение данных было организовано с помощью микроконтроллера STM32F103C8T6 c тактовой частотой 72 МГц. С помощью прерывания от таймера была получена временная сетка с шагом 5 микросекунд. Формирование сигналов и чтение данных организовано в обработчике прерывания. Для того чтобы минимизировать в нем количество проверок, был создан массив задержек от начала последовательности для фронтов arr[25] (PB1 -> “0”; PB1 -> ”1”) и массив задержек для чтения данных brr[24]. С их помощью сначала формируется импульс 300 мкс для сброса датчика NST1002; затем примерно через 31 миллисекунду, когда датчик гарантировано выдает импульс окончания преобразования, формируются импульсы побитного считывания данных.
Тем не менее, погрешность времени преобразования датчика не указана в документации, поэтому возможно более правильно дождаться импульса готовности, и сразу после него начинать считывать данные.
Код формирования массивов приведен ниже. Они объявлены как const и располагаются во Flash памяти, возможно размещение их в ОЗУ позволит несколько убыстрить работу обработчика.
uint32_t index_arr = 0, index_brr = 0, index_data = 0;
uint32_t arr_data[90] = {0};
const uint32_t arr[25*2] = {
100/5, 400/5,
(31500+(60* 0))/5, (31505+(60* 0))/5,
(31500+(60* 1))/5, (31505+(60* 1))/5,
(31500+(60* 2))/5, (31505+(60* 2))/5,
(31500+(60* 3))/5, (31505+(60* 3))/5,
(31500+(60* 4))/5, (31505+(60* 4))/5,
(31500+(60* 5))/5, (31505+(60* 5))/5,
(31500+(60* 6))/5, (31505+(60* 6))/5,
(31500+(60* 7))/5, (31505+(60* 7))/5,
(31500+(60* 8))/5, (31505+(60* 8))/5,
(31500+(60* 9))/5, (31505+(60* 9))/5,
(31500+(60*10))/5, (31505+(60*10))/5,
(31500+(60*11))/5, (31505+(60*11))/5,
(31500+(60*12))/5, (31505+(60*12))/5,
(31500+(60*13))/5, (31505+(60*13))/5,
(31500+(60*14))/5, (31505+(60*14))/5,
(31500+(60*15))/5, (31505+(60*15))/5,
(31500+(60*16))/5, (31505+(60*16))/5,
(31500+(60*17))/5, (31505+(60*17))/5,
(31500+(60*18))/5, (31505+(60*18))/5,
(31500+(60*19))/5, (31505+(60*19))/5,
(31500+(60*20))/5, (31505+(60*20))/5,
(31500+(60*21))/5, (31505+(60*21))/5,
(31500+(60*22))/5, (31505+(60*22))/5,
(31500+(60*23))/5, (31505+(60*23))/5
};
const uint32_t brr[24] = {
(31515+(60* 0))/5,
(31515+(60* 1))/5,
(31515+(60* 2))/5,
(31515+(60* 3))/5,
(31515+(60* 4))/5,
(31515+(60* 5))/5,
(31515+(60* 6))/5,
(31515+(60* 7))/5,
(31515+(60* 8))/5,
(31515+(60* 9))/5,
(31515+(60*10))/5,
(31515+(60*11))/5,
(31515+(60*12))/5,
(31515+(60*13))/5,
(31515+(60*14))/5,
(31515+(60*15))/5,
(31515+(60*16))/5,
(31515+(60*17))/5,
(31515+(60*18))/5,
(31515+(60*19))/5,
(31515+(60*20))/5,
(31515+(60*21))/5,
(31515+(60*22))/5,
(31515+(60*23))/5
};
Для этого каждые 60 мкс линия питания датчика опускается в “0” на 5 микросекунд, затем поднимается в “1” и так 24 раза подряд. Датчик NST1002 удерживает линию в “0” либо на время около 10 микросекунд (бит = "1"), либо на 20 микросекунд (бит = "0").
Для чтения бита мы считываем PB2 в момент, отстоящий на 15us от падающего питания PB1 -> “0”. Считанный бит плюсуется к переменной, затем ее биты сдвигаются влево, и так 23 раза (кроме последнего). Код обработчика прерывания приведен ниже.
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef* htim){
if(ccc == 1){
//HAL_GPIO_WritePin(GPIOB, GPIO_PIN_3, 0);
aaa++;
if(aaa == arr[index_arr]){
if((index_arr & 0x01) == 0) HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, 0);
else HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, 1);
index_arr ++;
}
if(aaa == brr[index_brr]){
if (HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_2)) dataBRR ++;
if(index_brr != 23) dataBRR = dataBRR << (1);
index_brr ++;
}
if(index_brr == 24){
if(index_data < 90){
arr_data[index_data] = dataBRR;
}else{
ccc = 0;
}
index_data ++;
dataBRR = 0;
aaa = 0;
index_arr = 0;
index_brr = 0;
}
//HAL_GPIO_WritePin(GPIOB, GPIO_PIN_3, 1);
}
}
С точки зрения использования аппаратных ресурсов микроконтроллера данное решение не является оптимальным, но вполне работоспособным. Время нахождения в обработчике примерно 1,2 микросекунды из 5-ти, что позволяет микроконтроллеру выполнять и другие задачи.
Экспериментальные данные температуры, полученные от NST1002-CDNR со скоростью чтения примерно 30 раз в секунду, представлены ниже на Рис. 6. Сам датчик находился при комнатной температуре в неподвижном воздухе и для достижения стабильных показаний был обернут фольгой.
Рис 6 Данные температуры с датчика NST1002
Заявленный Novosense температурный дрейф –> 0.4 градуса после 1000 часов наработки при +125 градусах С. Таким образом, NST1002 представляет вполне достойную альтернативу температурным датчикам американских и европейских производителей.
Выражаю отдельную благодарность компании MTsystem за предоставленные образцы NST1002-CDNR.
Комментарии (32)
Vcoderlab
24.06.2024 15:09Всё это очень интересно, но сколько он стоит и как его купить? Ни в чип-дипе, ни в промэлектронике поиск не дал результата.
Hhappyy Автор
24.06.2024 15:09Обращайтесь в MT-Systems :)
Vcoderlab
24.06.2024 15:09+2В 2024 году совет обращаться в зарегистрированную в США компанию звучит не иначе как издёвка.
Hhappyy Автор
24.06.2024 15:09Видимо, мы о разных компаниях говорим? https://mt-system.ru/
Цена в районе 0.2-0.4 USD
Vcoderlab
24.06.2024 15:09Видимо да, о разных. Вы написали по-английски "MT-Systems", ровно это я и спросил у поисковика:
Компания же, на которую Вы дали ссылку, называется "МТ-Системс" по-русски, но "MT-System" (без "s") по-английски:
К слову, если спросить поисковик по-русски, тогда он выдаст ссылку на российскую компанию:
Вот так неуместное использование латиницы и одна лишняя буква привели к непониманию.
SanSeich_78
24.06.2024 15:09Задал вопрос о поставке в пять контор, с которыми сотрудничаем. Никто не знает про оный. Не, привезти могут, конечно, но никто не знает про эту диковинку. И смысл её закладывать проект (а мне как раз может потребоваться для БИО и МЕД) просто нет.
Hhappyy Автор
24.06.2024 15:09NST118 посмотрите. С ним попроще. А какое у вас годовое количество?
SanSeich_78
24.06.2024 15:09на данный момент ничего еще не согласовано и нужем будет просто функциональный образец. Но партии малые: компании - для собственных нужд.
sami777
24.06.2024 15:09Не хочу вдаваться в изучение даташитов. В двух словах, отличие NST118 от NST1002? Сам, сежду прочим, пользую от стм - stlm75. Датчик неплохой, но i2Cцэшный. Сейчас, вроде, проблем с закупкой продукции от СТМ нет. Цены, конечно, не радуют, да и неизвестно, что дальше будет.
sterr
24.06.2024 15:09А бывают какие-нибудь нормальные датчики с большой скоростью, для которых не надо останавливать программу? 1.2 мс из 5 - это слишком тормозно. В каких то рилтайм процессах это слишком долго. А если их там 20? Программа только и будет читать температуру вместо работы. Или делать отдельный измеритель на МК, который тупо и будет заниматься датчиками, отдавая главному по SPI?
Yuri0128
24.06.2024 15:09Ну так если расстояние небольшое - i2c датчики, там по прерыванию при наличии аппаратного i2c-master.
mlnw
24.06.2024 15:091-wire и всякие циклы ожидания вполне себе аппаратно реализуемы на прерываниях, нужны лишь таймеры и DMA. И там вроде полный цикл конверсии и считывания - 30 с небольшим миллисекунд.
Yuri0128
24.06.2024 15:09Я на rp2040 делал на PIO машинах интерфейс "аппаратный" с ДМА на пачку устройств почти без затрат основных процов. Чисто на обычном таймере с прерываниями - ну.... наверное можно, но накладных расходов будет много (на само прерывание, которое просто считывает полбита).
Dr_Faksov
24.06.2024 15:09Комрады, кто может подсказать путь изготовления (или приобретения) дифференциального термостата? Это который сравнивает две температуры и включает нагрузку при достижении между ними заданной разницы.
mikelavr
24.06.2024 15:09https://aliexpress.ru/item/1005001458589774.html
Находится за 30 секундSanSeich_78
24.06.2024 15:09+1и тут могут возникнуть (а могут и не возникнуть) гистерезис, точность, повторяемость и софтовые особенности китайского девайса )))
solderman
24.06.2024 15:09Купить это чуть выше Вам написали.
Изготовить- смотря какая температура. Если попадает в допустимый диапазон для DS18B20, то ардуино нано и простенькая программа на С. Если хочется бантиков с вэб мордой и рокенролом, то ESP32 программка на С и море радости.
Ну и конечно исполнительное устройство, например модуль с реле на адекватный ток, коих предлагается достаточно и недорого.
Если температуры иные, то то же самое плюс подходящие термодатчики и модули преобразования к ним, но это уже совсем другая история.
Traveller0968
24.06.2024 15:09+2Меня всегда интересовало, а что является чувствительным элементом таких вот цифровых датчиков, не я понимаю что всю цифровую составляющую можно запихнуть хоть в "кончик иглы", и вывести любое кол-во знаков после запятой, но что именно в нем отвечает за температуру!? если это банальный PN-переход, это одно, если это платиновый терморезистор это другое...
SanSeich_78
24.06.2024 15:09я когда-то общался со старым Хорошим схемотехником. И между делом разговор перешел на измерение температуры и датчик DS18b20. Могу ошибаться, но вроде речь шла именно про этот тип.
Если не подводит память, он говорил про два терморезистора, с положительной и отрицательной зависимостью. А дальше обработка встроенным вычислителем.Traveller0968
24.06.2024 15:09В даташите про это я инфы не видел, да и точность его целых 0,5 градуса, что довольно много, да и назначение у него:
Контроль окружающей среды HVAC, мониторинг температуры
системы внутри зданий, оборудования или машин, а также
системы мониторинга и управления технологическими процессами.Так что не думаю что в нем применена какая то мудреная балансно-мостовая схема, там все гораздо проще...
Там где нужна точность, используют PT100 - PT1000 в связке с другими АЦП, а этот для обозначения того что температура находится в заданных границах, не более того... Я так думаю... :)
Yuri0128
24.06.2024 15:09Исходя из широкого диапазона напряжений питания, думаю что таки мост.
Traveller0968
24.06.2024 15:09Широкий диапазон питаний это не аргумент, мосты используют когда надо ловить минимальные изменения на уровне долей градуса или любой другой величины, а здесь диапазон 200 градусов, там не один мост будет нужен, а с десяток... :)
REPISOT
24.06.2024 15:09+3GPIO1 используется для управления обменом, GPIO2 для считывания данных.
Нет. Если только не считать подачу питания за "управление обменом"
There are 2 GPIO needed in this application in order to achieve the no power consumption in standby mode.
The GPIO1 will set to high, and provide the power though the pull up resistor Rpu as VDD.
Рекомендуемое значение резистора 4.7 кОм @ 3.3 В.
Где вы это взяли?
Note: the NST1002 max Conversion current is 30μA (typical), and the min Operation voltage will be effected by pull up resistor Rpu. For example, the min Operation voltage is 1.7V while the Rpu =5KΩ.
Его начало инициируется сбросом питания (GPIO1) в ноль на время 200 микросекунд.
Нет. Весь обмен, в том числе инициализация, осуществляется пином DQ (GPIO2). Потому что GPIO1 вообще может не быть. Он нужен для режима экономии питания. И если он у вас есть, то его не надо сбрасывать, потому что он все время сброшен, пока не идет опрос, чтобы собственно, экономить питание.
Для датчика, конечно, нет разницы, каким образом вы ему выдаете 0.
Hhappyy Автор
24.06.2024 15:094.1.Electrical Characteristics
at TA = +25°C and Vpu = +1.7V to +5.5V, Pull up resistor 4.7kohm, unless otherwise noted.В остальном вы правы, спасибо.
mlnw
Прежде, чем углубляться в технические дебри, подобные обзоры должны отвечать на вопрос "Зачем?". Окей, датчик заявлен, как более точный, чем DS18B20, мотаем обзор, ничего не видим про измерение точности на лабораторном оборудовании. Итого вопрос "зачем?" (применительно как к датчику, так и к данному обзору) остаётся открытым.
Hhappyy Автор
А как вы интересно, оцениваете объем работ, чтобы он ответил на ваш вопрос зачем?
SanSeich_78
согласен с Вами!
Про "точность" DS18b20:
По роду работы был связан с этими датчиками. На столе лежало около 100 датчиков в гильзах. Разница в показаниях была до 2,2 градусов (вычитывал все биты).
Найти 5 штук с одними показаниями не смог, даже опустив датчики в воду, которую перемешивали.
Hhappyy Автор
Про этот датчик не скажу, но NST118 (I2C) от Novosense испытывали 32 штуки сразу. Сутки в термо-камере на 63-х градусах. Вполне все прилично. Разброс по партии от 62.75 до 63.25 градусов. Датчики были смонтированы на одной плате 50 х 50 мм.
Hhappyy Автор
Dallas же это у нас нынче ADI? А ADI это амеры?
mlnw
На продукции Maxim свет клином не сошелся, есть 100500 китайских и клонов и оригинальных разработок, включая "типа отечественные". Но без спеков и ТТХ (причем не паспортных, а проверенных собственноручно), на одном лишь лозунге "зато наше, импортозамещённое" далеко не уедешь (если речь, конечно, не о кейсе как с Миландром и тем монитором).