Датчик заявлен как высокоточный, +/- 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.

High-precision Single-BUS Digital Temperature Sensor

Комментарии (32)


  1. mlnw
    24.06.2024 15:09
    +4

    Прежде, чем углубляться в технические дебри, подобные обзоры должны отвечать на вопрос "Зачем?". Окей, датчик заявлен, как более точный, чем DS18B20, мотаем обзор, ничего не видим про измерение точности на лабораторном оборудовании. Итого вопрос "зачем?" (применительно как к датчику, так и к данному обзору) остаётся открытым.


    1. Hhappyy Автор
      24.06.2024 15:09

      А как вы интересно, оцениваете объем работ, чтобы он ответил на ваш вопрос зачем?


    1. SanSeich_78
      24.06.2024 15:09
      +2

      согласен с Вами!
      Про "точность" DS18b20:
      По роду работы был связан с этими датчиками. На столе лежало около 100 датчиков в гильзах. Разница в показаниях была до 2,2 градусов (вычитывал все биты).
      Найти 5 штук с одними показаниями не смог, даже опустив датчики в воду, которую перемешивали.


      1. Hhappyy Автор
        24.06.2024 15:09
        +1

        Про этот датчик не скажу, но NST118 (I2C) от Novosense испытывали 32 штуки сразу. Сутки в термо-камере на 63-х градусах. Вполне все прилично. Разброс по партии от 62.75 до 63.25 градусов. Датчики были смонтированы на одной плате 50 х 50 мм.


    1. Hhappyy Автор
      24.06.2024 15:09

      Dallas же это у нас нынче ADI? А ADI это амеры?


      1. mlnw
        24.06.2024 15:09

        На продукции Maxim свет клином не сошелся, есть 100500 китайских и клонов и оригинальных разработок, включая "типа отечественные". Но без спеков и ТТХ (причем не паспортных, а проверенных собственноручно), на одном лишь лозунге "зато наше, импортозамещённое" далеко не уедешь (если речь, конечно, не о кейсе как с Миландром и тем монитором).


  1. Vcoderlab
    24.06.2024 15:09

    Всё это очень интересно, но сколько он стоит и как его купить? Ни в чип-дипе, ни в промэлектронике поиск не дал результата.


    1. Hhappyy Автор
      24.06.2024 15:09

      Обращайтесь в MT-Systems :)


      1. Vcoderlab
        24.06.2024 15:09
        +2

        В 2024 году совет обращаться в зарегистрированную в США компанию звучит не иначе как издёвка.


        1. Hhappyy Автор
          24.06.2024 15:09

          Видимо, мы о разных компаниях говорим? https://mt-system.ru/

          Цена в районе 0.2-0.4 USD


          1. Vcoderlab
            24.06.2024 15:09

            Видимо да, о разных. Вы написали по-английски "MT-Systems", ровно это я и спросил у поисковика:

            Запрос в поисковик и первый результат. Результат полностью соответствует запросу.
            Запрос в поисковик и первый результат. Результат полностью соответствует запросу.
            Раздел "Contact us" на сайте, который выдал поисковик
            Раздел "Contact us" на сайте, который выдал поисковик

            Компания же, на которую Вы дали ссылку, называется "МТ-Системс" по-русски, но "MT-System" (без "s") по-английски:

            Логотип и веб-адрес российской компании
            Логотип и веб-адрес российской компании

            К слову, если спросить поисковик по-русски, тогда он выдаст ссылку на российскую компанию:

            Результат запроса на русском языке
            Результат запроса на русском языке

            Вот так неуместное использование латиницы и одна лишняя буква привели к непониманию.


    1. SanSeich_78
      24.06.2024 15:09

      Задал вопрос о поставке в пять контор, с которыми сотрудничаем. Никто не знает про оный. Не, привезти могут, конечно, но никто не знает про эту диковинку. И смысл её закладывать проект (а мне как раз может потребоваться для БИО и МЕД) просто нет.


      1. Hhappyy Автор
        24.06.2024 15:09

        NST118 посмотрите. С ним попроще. А какое у вас годовое количество?


        1. SanSeich_78
          24.06.2024 15:09

          на данный момент ничего еще не согласовано и нужем будет просто функциональный образец. Но партии малые: компании - для собственных нужд.


        1. sami777
          24.06.2024 15:09

          Не хочу вдаваться в изучение даташитов. В двух словах, отличие NST118 от NST1002? Сам, сежду прочим, пользую от стм - stlm75. Датчик неплохой, но i2Cцэшный. Сейчас, вроде, проблем с закупкой продукции от СТМ нет. Цены, конечно, не радуют, да и неизвестно, что дальше будет.


          1. sterr
            24.06.2024 15:09

            А бывают какие-нибудь нормальные датчики с большой скоростью, для которых не надо останавливать программу? 1.2 мс из 5 - это слишком тормозно. В каких то рилтайм процессах это слишком долго. А если их там 20? Программа только и будет читать температуру вместо работы. Или делать отдельный измеритель на МК, который тупо и будет заниматься датчиками, отдавая главному по SPI?


            1. Yuri0128
              24.06.2024 15:09

              Ну так если расстояние небольшое - i2c датчики, там по прерыванию при наличии аппаратного i2c-master.


            1. mlnw
              24.06.2024 15:09

              1-wire и всякие циклы ожидания вполне себе аппаратно реализуемы на прерываниях, нужны лишь таймеры и DMA. И там вроде полный цикл конверсии и считывания - 30 с небольшим миллисекунд.


              1. Yuri0128
                24.06.2024 15:09

                Я на rp2040 делал на PIO машинах интерфейс "аппаратный" с ДМА на пачку устройств почти без затрат основных процов. Чисто на обычном таймере с прерываниями - ну.... наверное можно, но накладных расходов будет много (на само прерывание, которое просто считывает полбита).


  1. Dr_Faksov
    24.06.2024 15:09

    Комрады, кто может подсказать путь изготовления (или приобретения) дифференциального термостата? Это который сравнивает две температуры и включает нагрузку при достижении между ними заданной разницы.


    1. mikelavr
      24.06.2024 15:09

      https://aliexpress.ru/item/1005001458589774.html

      Находится за 30 секунд


      1. SanSeich_78
        24.06.2024 15:09
        +1

        и тут могут возникнуть (а могут и не возникнуть) гистерезис, точность, повторяемость и софтовые особенности китайского девайса )))


    1. solderman
      24.06.2024 15:09

      Купить это чуть выше Вам написали.

      Изготовить- смотря какая температура. Если попадает в допустимый диапазон для DS18B20, то ардуино нано и простенькая программа на С. Если хочется бантиков с вэб мордой и рокенролом, то ESP32 программка на С и море радости.

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

      Если температуры иные, то то же самое плюс подходящие термодатчики и модули преобразования к ним, но это уже совсем другая история.


  1. Traveller0968
    24.06.2024 15:09
    +2

    Меня всегда интересовало, а что является чувствительным элементом таких вот цифровых датчиков, не я понимаю что всю цифровую составляющую можно запихнуть хоть в "кончик иглы", и вывести любое кол-во знаков после запятой, но что именно в нем отвечает за температуру!? если это банальный PN-переход, это одно, если это платиновый терморезистор это другое...


    1. SanSeich_78
      24.06.2024 15:09

      я когда-то общался со старым Хорошим схемотехником. И между делом разговор перешел на измерение температуры и датчик DS18b20. Могу ошибаться, но вроде речь шла именно про этот тип.
      Если не подводит память, он говорил про два терморезистора, с положительной и отрицательной зависимостью. А дальше обработка встроенным вычислителем.


      1. Traveller0968
        24.06.2024 15:09

        В даташите про это я инфы не видел, да и точность его целых 0,5 градуса, что довольно много, да и назначение у него:
        Контроль окружающей среды HVAC, мониторинг температуры
        системы внутри зданий, оборудования или машин, а также
        системы мониторинга и управления технологическими процессами.

        Так что не думаю что в нем применена какая то мудреная балансно-мостовая схема, там все гораздо проще...

        Там где нужна точность, используют PT100 - PT1000 в связке с другими АЦП, а этот для обозначения того что температура находится в заданных границах, не более того... Я так думаю... :)


        1. Yuri0128
          24.06.2024 15:09

          Исходя из широкого диапазона напряжений питания, думаю что таки мост.


          1. Traveller0968
            24.06.2024 15:09

            Широкий диапазон питаний это не аргумент, мосты используют когда надо ловить минимальные изменения на уровне долей градуса или любой другой величины, а здесь диапазон 200 градусов, там не один мост будет нужен, а с десяток... :)


  1. REPISOT
    24.06.2024 15:09
    +3

    GPIO1 используется для управления обменом, 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.


    1. Hhappyy Автор
      24.06.2024 15:09

      4.1.Electrical Characteristics
      at TA = +25°C and Vpu = +1.7V to +5.5V, Pull up resistor 4.7kohm, unless otherwise noted.

      В остальном вы правы, спасибо.


      1. REPISOT
        24.06.2024 15:09

        Это не "Рекомендуемое значение". Это условия, при которых приводятся данные в таблице.


        1. Hhappyy Автор
          24.06.2024 15:09

          ОК, поправил.