РадиоКот :: Пять DS18B20 из одного STM8.
Например TDA7294

РадиоКот >Схемы >Цифровые устройства >Измерительная техника >

Теги статьи: ТермометрДобавить тег

Пять DS18B20 из одного STM8.

Автор: Евгений Геннадьевич Чепкасов (Z_h_e)
Опубликовано 23.12.2017
Создано при помощи КотоРед.

1. Назначение.

Измеряет пять аналоговых сигналов от термисторов MF58 или других с аналоговым выходом.  Преобразует измеренное в формат DS18B20 и передает по одной шине 1-wire как от пяти датчиков DS18B20.

 

2. Схема электрическая принципиальная.

      В данной схеме используются термисторы MF58, с сопротивлением 10кОм при 250С и b= 3950. Сопротивление термистора Т1 преобразуется  в напряжение с помощью моста R7-R8 и дифференциального усилителя на  OP1.1 (LM358). Коэффициент усиления дифф. усилителя задается сопротивлениями R3-R6. Данный преобразователь R в U преобразует сопротивление ( 10...0.2 )кОм  в напряжение (0.02 ... 3.3) В, что позволяет измерять температуру от 25 до 150 градусов (приблизительно). Конечно можно подобрать сопротивления под другой нужный диапазон. Для каждого канала может быть свой диапазон.

        Десятибитное АЦП STM8S103F3 измеряет напряжение пропорциональное сопротивлению и вычисляет температуру согласно коэффициентам сохраненным в EEPROM.

        Стабилитрон VD1 защищает порт PC6 от перенапряжения.

        Питание устройства от трехпроводной линии 1-wire 5В.

 

3. Как это работает.

Данное устройствое является подчиненным устройством и может вести какой-то обмен только по требованию мастера.

Поддерживает следующие команды:

  • RESET -отвечает импульсом пристутствия present
  • SEARCH_ROM
  • MATCH_ROM
  • SKIP_ROM - будет эффект как от MATCH_ROM для первого канала
  • READ_ROM - тоже для первого канала температуры.
  • READ_SCRATH - чтение данных.

Так как все пять каналов ведут обмен через одну шину, само собой каждый канал имеет свой ROM и для мастера все эти пять каналов выглядят как пять различных устройств.

Для каждого канала  формируется восьмибайтный  ROM следующим образом.

  • Байт 0 - 0x28, что соответствует семейству DS18B20.
  • Байт 1..6 - считываются из памяти контроллера по адресу 0x486A последовательно , адрес этот не случаен, в этом месте лежит уникальный номер контроллера. В младший нибл байта №6 вносится корректировка. Для каналов Т1-Т5 он соответствует 0x0-0x4, чтобы ROMы были разные.
  • Байт 7 - CRC для ROM.

4. Настройка каналов.

Все коэффициенты лежат в EEPROM контроллера. Так как датчик нелинеен, то градуировка разбита  на 4 линейных участка.

Карта памяти EEPROM.

 

Адрес

Тип данных

Пример

Назначение

Канал температуры №1

0x4000

int16_t

0x019F  (+25,9)

Точка темпер. №0

0x4002

uint16_t

0x0013

Код АЦП №0

0x4004

int16_t

0x0280  (+40,0)

Точка темпер. №1

0x4006

uint16_t

0x011C

Код АЦП №1

0x4008

int16_t

0x0344  (+52,2)

Точка темпер. №2

0x400A

uint16_t

0x01F5

Код АЦП №2

0x400C

int16_t

0x051D  (+81,8)

Точка темпер. №3

0x400E

uint16_t

0x032C

Код АЦП №3

0x4010

int16_t

0x063E  (+99,9)

Точка темпер. №4

0x4012

uint16_t

0x038D

Код АЦП №4

0x4014

int8_t

0xF8 (-0,5)

Смещение температуры для всего диапазона.

0x4015

int8_t

 

Резерв

                                           Канал температуры №2

0x4016

int16_t

0x019F  (+25,9)

Точка темпер. №0

…..

 

Так как характеристика разбита на 4 линейных участка, то есть 5 настроечных точек для каждого канала температуры. Т.е. температура и соответствующий ему код 10битного АЦП. Температура хранится в формате DS18B20, но старшим байтом вперед.

 

5. Как настроить.

Есть у меня устройство которое может работать с 8 датчиками по одной шине 1-wire. Я подключил сеё устройство и на эту же шину подключил DS18B20 (как эталон).

Вместо MF58 подключил магазин сопротивления.

Сделал вот такую табличку в excel. Будет во вложении.

 

  • Измерил напряжение питание МК, так как оно является ИОН для АЦП.
  • Весь диапазон разбил на 4 поддиапазона выбрав почти наугад некоторые значения кода АЦП из диапазона 0-1023. Автоматически рассчиталось какое надо задать напряжение на входе для данного кода АЦП.
  • С помощью магазина сопротивления (напоминаю подключен вместо MF58) и мультиметра последовательно задавал расчетные напряжения. Сопротивления заносил в таблицу (вместо магазина можно использовать потенциометр). Сопротивление автоматически пересчитывались в температуру согласно характеристикам MF58
  • В последние две колонки автоматически рассчитались коды, которые надо занести в EEPROM.

 

6. Прошивка контроллера.

Прошить контроллер можно с помощь программы ST Visual Programmer и программатора ST-Link V2.

В STM8 есть такая область памяти называемая Option Byte, это некий аналог фьюзов AVR. Тут нужно переключить альтернативную функцию AF0 как на картинке, остальное по умолчанию.

 После заливки программы, переключения AF0 и установки коэффициентов в EEPROM устройство готово.

 

7. Проверка

  В крутой кипяток был помещен MF58 и DS18B20. DS18B20 конечно "тот еще" эталон, но у меня была еще задача проверить как работает мое устройство в комплекте со штатным DS18B20.

  Кружка с водой не спеша остывала и я смотрел разницу показаний на разных температурах. Где-то до двух градусов получилось. В реперных точках (т.е. когда stm8 показывал температуры из таблицы EEPROM) разница была запомнена и на это значение были скорретированы реперные температуры.

   Эксперимент повторил заново. Теперь уже в целом разница  между DS18b20 и STM8   составила  до 0,5 градусов и меньше.  В двух точках доходила до 0,9 градусов. Возможно благодаря тому что DS18b20 тоже не идеален, а может действительно так характеристика подзагнулась. Самое главное показания температуры получились стабильными, не скачут, я опасался что будет хуже, а еще можно будет усреднение добавить. После кратковременного выключения-включения  устройства, показания не изменялись.

 

8. Заключение.

Устройство работает, но проверка выполнена не полностью.

   Я реально пока спаял ОУ только для первого канала, но не вижу причин не работать другим каналам. Плату явно можно сделать меньше, ну ЛУТом лучше чем получилось, я не умею.

Проводил тест, где мастером 1-wire является мое же некое устройство. Оно само находит датчики с помощью функции поиска ROM.   Проблем при параллельной работе настоящего DS18B20 и STM8 на одной линии не наблюдал. Реально подключал две DS и STM. Т.е. на линии было 7 девайсов и все работало.

Команды SKIP_ROM и READ_ROM  тестировал с помощью обычной терминальной программы и "1-wire терминал" т.к. мой мастер-устройство их не использует. За программу "1-wire терминал" отдельное спасибо товарищу ARV. Хорошая вещь.

 Зачем вообще это надо было:

  1. Подобное устройство мне хотелось сделать давно, просто хотелось.
  2. Такие датчики получатся дешевле (правда тут поработать чуток надо). МК я покупал  где-то за 25 рублей, ОУ и МF58 не более 5 рублей за штуку. Если бы мне раньше пришел STM32F030, то наверное я бы на нем стал делать. Может еще сделаю, если появится необходимость. Там 9 каналов АЦП и 12битное АЦП, а цена не на много дороже.
  3. Можно откалибровать под нужные диапазоны и под более широкий чем у DS.
  4. Можно еще будет сделать  такое же,  только вместо DS18B21, которые вроде как сняты с производства.

 

Всех с наступающим 2018 годом!!!

 

 

 

 


Файлы:
Схема, прошивка


Все вопросы в Форум.




Как вам эта статья?

Заработало ли это устройство у вас?

14 14 3

Эти статьи вам тоже могут пригодиться: