Цифровой температурный cенсор ADT7301

Здравствуйте!
Предлагаю небольшой очерк о вышеупомянутой «песчинке» от Analog Device — камешком и не назовешь из-за размеров. Приобрел на Reichelt.de для одного микропотребляющего устройства, которое еще в разработке.
Я с такими размерами еще не работал (шестиногий SOT-23). Пока конечная плата в разработке, хотелось поиграться на макетке, «пощупать» детальку. Для этого отпилил кусочек платы от дисковода, где был ATA-разъем и резисторные сборки. Ничего лучшего наскоро не придумал, как припаять сенсор вместо резисторов и остаток соединить проводками.
Припаяться сходу не получилось, т.к. размер его выводов несколько больше, чем у резисторов – пришлось ножки малость подогнуть.
Вот так это теперь выглядит. Колхоз, конечно, но работает.
ADT7301
По заявлениям изготовителя и точность и разрешение довольно хорошие: максимум погрешности +/- 1° (типовая погрешность +/- 0,5°) ,13 значащих бит дают теоретическое разрешение в 0,03125° (пять двоичных разрядов после запятой). Потребляемая мощность очень низкая, довольно широкий диапазон напряжения питания (2,7 – 5,25 в), широкий диапазон измеряемой температуры, довольно простой интерфейс связи – SPI с самым простым протоколом – никаких тебе управляющих команд (вроде как у DS1820) слать не надо: читай и обрабатывай готовый результат. А главное – почти задаром (0,49 евро/штука).
Все подробности можно почитать в прилагаемой спецификации (Datasheet, далее -ДШ). Я же здесь хочу осветить свой скромный опыт экспериментов с этой деталькой.
Для экспериментов взял же и целевой МК Atmega8515L, ну чтоб уж сразу в паре обкатывать. Интерфейс завелся у меня сразу без всяких затруднений, хотя с аппаратным SPI в МК я еще не работал. На индикацию вывожу только до десятой части после «колхозного» же округления.
Меряю температуру
Значение после запятой изредка «скачит» в пределах двух десятых градуса. Что именно вызывает некоторые скачки этого значения, определить пока затрудняюсь. Может грязь по питанию (блокирующий конденсатор не припаян непосредственно у выводов), может мое «колхозное» округление, а может и сам датчик такой. А вот что уже успел заметить: точность измерения зависит от питающего напряжения. Нет у меня возможности поместить его в шкаф-термостат с эталонным термометром, чтоб однозначно понять на каком же напряжении питания врет. Однако при снижении напряжения питания до 3в наблюдал увеличение показаний на +0,4°. Конечно не много, но все же!

В кратце об интерфейсе. Сенсор имеет полный аналог SPI на аппаратном уровне:
/CS – выбор ведомого устройства ( /SS у SPI),
DIN – данные от ведущего (MOSI),
DOUT — данные к ведущему (MISO),
SCLK — тактовый сигнал (SCK).

DIN можно сразу посадить на общий провод. Единственная комадна, которую воспринимает сенсор – Shutdown – вряд ли будет использоваться. Поэтому можно сократить кол-во связей. Что же касается /CS, думаю его можно тоже «заземлить», хотя я еще не пробовал. Вернее я его специально применил, чтоб не было конфликтов во время программирования МК, у которого выводы ISP совпадают с аппаратным SPI.
Согласно ДШ сенсора для связи подходит SPI Mode 3, что и подтвердилось сразу же – других режимов мне не пришлось пробовать. В ДШ это явно не описано, но проанализировав временную диаграмму на стр.11 я пришел именно к этому выводу.
Процедуры из ДШ сенсора я не использовал – «щебетать» не умею: взял из атмеловского описания на асме, мне более понятном.

SPI_MasterInit:    ; Set MOSI, SS and SCK output
	sbi PORT_SPI, DD_SS	; SS=1
	outi SPI_DD,(1<<DD_MOSI)|(1<<DD_SS)|(1<<DD_SCK)	; Set MOSI, SS and SCK output
	outi SPCR,(1<<SPE)|(1<<MSTR)|(1<<CPOL)|(1<<CPHA)|(1<<SPR0)
		; Enable SPI, Master, SPI Mode 3, set clock rate fck/16
ret

SPI_MasterTransmit:
	out SPDR,Temp	; Start transmission of data 
                        ;данные в SPDR не играют роли, но писать туда надо для инициализации работы
Wait_Transmit:	; Wait for transmission complete
	sbis SPSR,SPIF
	rjmp Wait_Transmit
Ret

Сенсор выдает два байта информации, значащими являются только младшие 14 бит(старший из которых знаковый), поэтому первые два принимают значение 0. Передача ведется начиная со старшего бита. Для дальнейшего использования принятое число нужно нормализовать. В моем случае это сводится к конвертированию в абсолютное значение (в случае отрицательной температуры) и сдвигу всего слова влево на 3 разряда. Тогда в старшем байте имею целое число градусов, в младшем дробную часть.

ADT7301:	; считываем сенсор, нормализуем
	cbi PORT_SPI, DD_SS	; Slave Select = 0
	rcall SPI_MasterTransmit
	in TH_7301,SPDR		; High-Byte ADT7301
	rcall SPI_MasterTransmit
	in TL_7301,SPDR		; Low-Byte ADT7301
	sbi PORT_SPI, DD_SS	; Slave Select =1

        ldi Temp1,0b00100000	; проверяем знак полученного числа
        and Temp1, TH_7301
	breq T_Plus		; если 0, то положительно

; Здесь еще преобразуем в абсолютное число
	sbr Flag, 1<<T_minus    ; Флаг "отрицательная температура"
        ldi Temp, low(16384)	; конвертируем в абсолютное значение
        ldi Temp1,high(16384)	; почти как в ДШ стр.10
        sub Temp, TL_7301	; но уже правильно вычитая из 16384
        sbc Temp1, TH_7301
        movw TH_7301:TL_7301, Temp1:Temp

T_Plus:
	lsl TL_7301		; 3x влево
	rol TH_7301
	lsl TL_7301
	rol TH_7301
	lsl TL_7301		; TL_ = дробная часть
	rol TH_7301		; TH_ = целая часть без знака

	ldi Temp, 10		; а здесь колхозное округление дробной части
	mul TL_7301, Temp	; x10
	mov TL_7301, R1	; /256 == десятая часть (уже в BCD) округленная в меньшую сторону
RET

Для повышения стабильности показаний желательно применить усреднение или цифровой фильтр, которые хорошо описаны в Сообществе.

Резюмирую:
Я сделал хороший выбор, купив этот сенсор. За такую цену грех желать большего! По-моему, его единственным недостатком является мелкий корпус, если это вообще недостаток.
  • +4
  • 28 июля 2013, 23:54
  • Fahivec
  • 1
Файлы в топике: ADT7301.zip

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

RSS свернуть / развернуть
А главное – почти задаром (0,49 евро/штука).
А где такие цены бывают? Смотрел «обычные» магазины —
www.compel.ru/infosheet/AD/ADT7301ARTZ-500RL7/

www.digikey.com/product-search/en/integrated-circuits-ics/pmic-thermal-management/2556560?k=adt7301
в два-три раза дороже.
0
Извиняюсь. сразу не увидел — «limited Amount in stock»
0
Вот именно «ограниченное кол-во», иначе б я не взял эти пару штук.
0
0
Черненькая маковка рядом с кондерами 0805, стабилизатор из халявы NXP. Запаяно тем же паяльником. ИЧСХ, к таким размерам быстро привыкаешь…
0
Ну да, приходится привыкать :)
0
Цена по имраду(киев) — ~30грн(~4$). Что-то не радует…
0
Думаю показания скачут именно в связи с отсутствием блокирующего конденсатора. Я как-то игрался с аналогичным сенсором LM92 и тоже забыл впаять блокирующий конденсатор, так сенсор врал на 4 градуса в большую сторону.
0
Такие сенсоры нередко ставят на планки памяти или жесткие диски для контроля. Надо бы посмотреть на помойке, может даже дешевле найдутся.
0
На планках памяти оно вроде в SPD интегрировано. По крайней мере NXP в семплах раздавал такую SPD-шку.
А диски вроде все более и более интегрированные, неужели термосенсор на них дискретный? Тем более что там есть интегрированный термодатчик в головке.
0
Видел на платах ноутов, 3-4 летней давности.
0
Плату для тестирования подобной мелочи можно легко изготовить за 5 минут. Спирторастворимым тонким маркером делаются несколько штрихов по линейке, если кривовато или неправильные интервалы смываем спиртом и еще одна итерация. Затем тем же маркером нарисовать прямо по месту на глазок площадки под обвязку и пятачки с дырками под провода, соединить дорожками. Я травил в хлорном железе, для других растворов надо сначала проверить устойчивость маркерной краски.
0
Сомневаюсь что получится сделать маркером линию такой толщины. Я вообще маркер не люблю из-за подтравов, нестойкий он какой-то. Травлю в медном купоросе.
0
У меня получалось. Делал «плату» под sot23-5, тонкий маркер дает линию где-то 0.3 мм. Вот с линейкой с 4-5 подходов к снаряду получилось начирикать 5 черточек на равных расстояниях. Потом уже дорисовал остальное. Хлорное железо у меня сравнительно новое, так что травилось все минут 15 при комнатной температуре, подтравов не было. Если очень интересно — могу сделать фотку, но там плата получилась конечно страх и ужас, чисто проверить детальку.
0
Сомневаюсь я, что
за 5 минут
успеешь. :)
Одно травление раза в три дольше:
Хлорное железо у меня сравнительно новое, так что травилось все минут 15 при комнатной температуре
:)
0
В чем противоречие? Нарисовать 5 минут, а рядом с кюветой я не сижу. Подхожу, побалтываю и смотрю на промежуточный результат. По-моему все лучше, чем откуда-то выламывать куски платы, подгибать контакты и в итоге все равно лепить все по воздуху на соплях.
Альтернатива-то какая — лут, фоторезист? Даже в пеинтере больше времени уйдет просто начертить 5 падов с дорожками, чем вручную прямо на плате.
0
Плату для тестирования подобной мелочи можно легко изготовить за 5 минут.
Ладно, нарисовать-то можно и за пять минут. А резать текстолит все рвано придется, промывать после травления (само травление я уж опускаю), просверлить и прочая мелочь.
Вот ваше первое заявление меня и смутило :)
А «по воздуху» там только 3 соединения, выводы 4-6 на родных дорожках.

Но я ни в коем случае не утверждаю, что ваш вариант хуже! У меня не было готового раствора, поэтому отгрызть кусок старой платы и навешать соплей для теста мне представилось быстрее.
0
Кроме того на огрызке метализированные отверстия, в которые я паял штырьки с двух сторон (на фото не видно заднего ряда)ю
0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.