Page 1 of 27

Термометр на ATtiny2313 и DS18B20

Posted: 01 Feb 2009 00:12
by hardlock
В Интернете есть куча схем термометров на AVR, но как всегда хочется чего-то своего.. Да и мозги размять тоже следует. Этот термометр был одним из первых моих проектов.

Чего хотелось:
  • минимальные размеры (в разумных пределах)
  • минимальная стоимость
  • простота конструкции
  • высокая повторяемость
  • ну и наконец универсальность (об этом чуть позже).
Что получилось:

Посмотрев подобные конструкции и покурив описалово на тиньку, которая оказалась под рукой (ATtiny2313), пришёл к выводу, что можно несколько упростить существующие конструкции и немного улучшить их характеристики.

Итак схема: (12.11.2009 привёл названия сегментов в соответствии с даташитом на индикатор.)
Схема
Схема
На схеме показан второй вариант включения термодатчика, если он не захотеть работать по однопроводной шине (что встречается очень редко). Обратите внимание, что подтягивающий резистор на 11 выводе должен быть 4,7кОм. Уменьшение или увеличение может привести к нестабильной работе датчика в случае включения по однопроводной схеме. Хотя в последнее время попадаются экземпляры датчиков, которые не хотят работать с таким подтягивающим резистором, приходится подбирать в диапазоне 1,8кОм - 6,2кОм (обычно около 4,0кОм).

Как видим эта схема отличается от подобных отсутствием транзисторов на управление сегментов. Таким образом схема упростилась на 4 транзистора и 4 резистора, по сравнению с аналогичными схемами. Тут некоторые скажут: "так нельзя - большая нагрузка на порты!!!". Читаем datasheet на сей контроллер "DC Current per I/O Pin - 40.0 mA". У нас 8 сегментов в каждом символе, по 5 мА каждый - получается 40мА!!!.

Теперь посмотрим графики из того же описания:
fig.105.gif
fig.105.gif (13.78 KiB) Viewed 89132 times
fig.108.gif
fig.108.gif (13.91 KiB) Viewed 89132 times
Из графиков видно, что ток может достигать и 60 мА и даже 80 мА на пин. Ну не будем увлекаться - нам 5 мА на сегмент (40мА на символ) хватит с головой! Ограничительные резисторы подобраны для получения тока около 5 мА на сегмент. В моей схеме стоят 470 Ом. Я ркость сегментов при этом отличная!!! Так, чё-то я увлёкся теорией.

Практика!!!

Печатную плату рисовал исходя их соображений "как можно меньше, но как можно проще". Поэтому она получилась с несколькими перемычками...
Печатная плата
Печатная плата
pcb.gif (9.41 KiB) Viewed 89132 times
На рисунке есть место под кварц - это для небольшой универсальности - у меня было несколько штук AT90S2313, у которых нет внутреннего генератора. КРЕНка применена в корпусе SOT-89. Защитные стабилитроны BZX79-C5V1 в корпусе DO-35. Конденсаторы в фильтре питания - 10mkF * 16V танталовые (других не нашлось), размера 3528 (SMD-B). Я их обычно не ставлю, а вместо них - 1mkF * 50V размера 1206.Глюков связанных с питанием не замечено.

Ну и далее фотки платы:
пустая плата, изготовленная "лазерным утюгом"
пустая плата, изготовленная "лазерным утюгом"
собранная плата: вид со стороны проводников (не хватает стабилизатора)
собранная плата: вид со стороны проводников (не хватает стабилизатора)
вид со стороны элементов (не запаян индикатор)
вид со стороны элементов (не запаян индикатор)
Далее запаиваем индикатор и программируем:
programming.jpg
Прошивка для случая индикатора с ОА (+) и ОК (-) - в HEX формате, ну и проект под CodeVisionAVR, который можно скомпилировать и под ОА, и под ОК. Проект собран по кускам, что-то из готовых проектов из Интернета, что-то дописано мной... Оригинальной идеей стала динамическая индикация. Проблема заключалась в том, что во время общения с датчиком температуры DS18B20 возникали моменты, когда "сканирование" индикации останавливалось. Поэтому обновление индикатора сделано не по прерываниям, а в главном цикле программы, и ещё вставлено кой-где в процедуре общения с датчиком... Плюсом данного способа стала высокая частота обновления, что исключило проблему мерцания.

Чуть не забыл - фьюзы для нормальной работы термометра:
fuses.gif
fuses.gif (13.27 KiB) Viewed 89132 times
Покалькулировать эти самые фьюзы можно тут. А почитать про них - в описании на контроллер...

Заработало!!!

Итак, прошили, включили... Хм... работает!!! (а вот про эту красную штуку справа - читаем тут)
working1.jpg
Ну ещё вот в таком виде:
working2.jpg
Ответ на вопрос "что делают кнопочки ПЛЮС и МИНУС - читаем в статье ТЕРМОСТАТ". Это то, о чём говорилось в 5-м пункте "Чего хотелось".

Итак как видим получилось довольно простое (куда уж проще???) устройство, которое по размерам не превышает размер индикатора. Кроме всего ещё и точность высокая: по описанию датчика - "±0.5°C accuracy from –10°C to +85°C". Как показала практика точность гораздо выше - около ±0,1°C. Сверял 10 экземпляров с лабораторным термометром, прошедшим метрологический контроль...

Термометр

Posted: 05 Feb 2009 09:42
by GOR
Уважаемый Hardlock, можно ли в термометр, добавить след. функцию- нажал на кнопочку термометр поработал секунд 5-10 и выключился (примерную схему я прицепил). И от батареек питать в таком случае можно.

С ув. GOR.

Re: Термометр

Posted: 05 Feb 2009 10:00
by hardlock
Тему переместил в соответствующий форум.

Я думаю можно. Если Вы немного понимаете в программировании, то скачайте проект и добавте управление на вывод PA0 или PA1 (это только для ATtiny2313).

Если нет, я постараюсь подумать в этом направлении, но быстро не обещаю.

Re: Термометр на ATtiny2313 и DS18B20

Posted: 05 Feb 2009 14:42
by GOR
ничего в программировании не понимаю, потому и спросил ).
К сожалению, я пока что только схемоповторитель.
А сайт очень хороший, просто супер!

С ув. GOR

Re: Термометр на ATtiny2313 и DS18B20

Posted: 05 Feb 2009 14:44
by hardlock
GOR wrote:А сайт очень хороший, просто супер!
Спасибо за отзыв.

Как появится время, то постараюсь доработать прошивку.

Re: Термометр на ATtiny2313 и DS18B20

Posted: 08 Feb 2009 22:20
by dovjik1
Ввобщем сам удивляюсь,но все получилось.Поставил в термометр AT90s2313,скомпилировал прошивку и все заработало.Кстати если вместо кварца 8Мгц поставить 4Мгц,тоже работает только считывает температуру в два раза медленее.Спасибо Hardlockу и всем участникам форума.

Re: Термометр на ATtiny2313 и DS18B20

Posted: 08 Feb 2009 22:22
by hardlock
dovjik1, при 4-х Мегагерцах не сильно мельтишит индикатор? Частота обновления в 2 раз ниже...

А прошивку компилировали в CodeVisionAVR, или просто прошили существующую?

Re: Термометр на ATtiny2313 и DS18B20

Posted: 08 Feb 2009 22:41
by dovjik1
Вот это да.Откуда такая оперативнось?А я подумал сообщение не отправилось.Да прошивку компилировал CodeVisionAVR,первый раз,и товарища небыло в помощь.Существующую заливал экран был темным,хотя кварц резонировал.Потом скомпилировал Ваш проект,залил,все сегменты загорелись но при нагревании датчика видно было что-то меняется.Потом в проекте поменял ОА на ОК и ура заработало.При 4 Мгц мельтишит если смотреть косым взглядом.Рядом сегодня стояли на attiny2313 и at90s2313 разница 0,3 градуса.Не может микросхема не правильно считать?

Re: Термометр на ATtiny2313 и DS18B20

Posted: 08 Feb 2009 22:45
by hardlock
dovjik1, не - микросхема не может считать неправильно (почти). Могут врать немного термодатчики.
Скажу по секрету - в прошивке термометра отрицательные температуры показывает на 0,1 градуса больше (паример вместо -11,4 покажет -11,3). Там надо один бит добавлять. Но это не существенно.
В "термостате 0,1" - это устранил.

Скажите, а в проекте что-нибудь меняли, или просто скомпилировали и всё?

Re: Термометр на ATtiny2313 и DS18B20

Posted: 08 Feb 2009 23:02
by dovjik1
0,1 градус не существенно это когда термометры находятся в разных углах комнаты.А когда DS18b20 на расстоянии 0,5 мм єто уже существенно.Не принимайте єто всерьез.На атини 2313 я совал датчик в тающий снег показывал 0,0 или -0,0.Обломался я менять местами датчики и не уговаривайте-не буду.А в проекте я менял(как бы это поумнее обьяснить),Ну там где строка //anode #catode я черточки с дефисом поменял местами.Перед этим не поменял-все сегменты горели,наверное исходник для с ОА ,а у меня индикатор с ОК.Исправьте если что-то не так обьяснил,и правильно ли сделал?

Re: Термометр на ATtiny2313 и DS18B20

Posted: 09 Feb 2009 09:33
by hardlock
dovjik1 wrote:правильно ли сделал
Всё правильно сделали! Если больше ничего не меняли, то можно было прошивать прямо скомпилированные HEX файлы с сайта - там же есть и для ОА и для ОК.

Re: Термометр на ATtiny2313 и DS18B20

Posted: 11 Feb 2009 20:58
by dovjik1
Добрый вечер.Нет,прошивку с сайта я пробывал-не работает с AT90S2313.Только генерация кварца есть.В CodeVisionAVR менял название микросхемы и частоту кварца.Сегодня опять пробывал-тоже самое.Спасибо за внимание.

Re: Термометр на ATtiny2313 и DS18B20

Posted: 11 Feb 2009 21:03
by hardlock
dovjik1 wrote:менял название микросхемы и частоту кварца
ВОТ! Самое главное - поменяли название микросхемы. Если не сложно - выложите сюда рабочие версии.

Re: Термометр на ATtiny2313 и DS18B20

Posted: 11 Feb 2009 21:16
by dovjik1
Не проблема,только завтра могу.Все железо на работе а интернет дома.Не знаю,я вообще не спец в програмировании.Можно ли доверять этим прошивкам.Хотя у меня же работает.

Re: Термометр на ATtiny2313 и DS18B20

Posted: 11 Feb 2009 21:18
by hardlock
dovjik1 wrote:Хотя у меня же работает.
А вы думаете у меня прошивки проходят проверку на 1000 устройств в разных условиях? Вот на Вас, уважаемые повторятели, и проверяю :secret: ...

Re: Термометр на ATtiny2313 и DS18B20

Posted: 11 Feb 2009 21:36
by dovjik1
Хорошо.Только завтра.

Re: Термометр на ATtiny2313 и DS18B20

Posted: 12 Feb 2009 21:53
by dovjik1
Прошивка для термометра на AT90s2313.Индикатор с общим катодом,кварц 8 Мгц.Хотя я поставил 4 Мгц-работает.Только немного притормаживает.

Re: Термометр на ATtiny2313 и DS18B20

Posted: 12 Feb 2009 23:55
by Valentin_N
Автору большое спасибо за интересные и позновательные темы :good:
У меня вопрос по Термометру
На страничке есть печатная плата, но очень бы хотелось что бы выложили печатку в формате *.lay
если не сложно :scratch:

Re: Термометр на ATtiny2313 и DS18B20

Posted: 13 Feb 2009 12:15
by hardlock
Valentin_N wrote: хотелось что бы выложили печатку в формате *.lay
берите печатку от термостата. она подходит 100% и даже лучше!

Re: Термометр на ATtiny2313 и DS18B20

Posted: 20 Mar 2009 21:22
by dovjik1
Добрый вечер.Вопрос такого плана.Просит знакомый сделать термометр в машину,только чтобы поместился под заглушку на панели.Заглушка маленькая.Выход нашел-трехразрядный индикатор на проводах.Сегодня суну для проверки в холодильник-минуса не показывает!Не знаю как выкрутиться.Минус наверное остался в четвертом разряде.Не удобно наверное будет пользоваться когда температура около нуля.Будеш думать +1или-1 градусов.А если (как по схеме ) коротнуть общие аноды первого и второго разряда?Будет плохо?

Re: Термометр на ATtiny2313 и DS18B20

Posted: 20 Mar 2009 21:27
by hardlock
hardlock wrote:Будет плохо?
будет. выведите один светодиод из первого разряда (средний) и будет вам счастье.

Re: Термометр на ATtiny2313 и DS18B20

Posted: 20 Mar 2009 21:37
by dovjik1
Да извините корочу не только общие аноды а и выходы микросхемы.Придется клеить плоский светодиод в начало индикатора.Спасибо за ответ.

Re: Термометр на ATtiny2313 и DS18B20

Posted: 13 Apr 2009 22:32
by Telek
Привет, в плане продолжения изучения микропроцессоров теперь решил повторить твой термометр. Благо есть исходники и можно экспериментировать. Собрал на макетке и начал извращаться с кодом. Вот некоторые интересные моменты(может кому интересно будет):

Преобразование температуры в числа для дисплея.

Так было:

Code: Select all

  for(i=0; i<3; i++)
      {
         bDisplay[2-i] = T1 % 10;
         T1 /= 10;
      }
Понимая что деление очень "тяжелая" операция - придумал пару других вариантов:

Code: Select all

  for (i=0;i<3;i++)
  {
     bDisplay[i]=0;  
     if (i==0) n=100;
     if (i==1) n=10;
     if (i==2) n=1;

     while(T1>=n)
    {
      T1-=n;   
      bDisplay[i]++;
    }    
  }
и "индусский способ" (раскладываем цикл для увеличения количества строк, а соответственно увеличения зарплаты :) )

Code: Select all

  bDisplay[0]=0;
  while(T1>=100)
  {
  T1-=100;   
  bDisplay[0]++;
  }    

  bDisplay[1]=0;
  while(T1>=10)
  {
  T1-=10;   
  bDisplay[1]++;
  }    

  bDisplay[2]=0;
  while(T1>=1)
  {
  T1--;   
  bDisplay[2]++;
  }
И начал сравнивать.

По размеру:
Оказывается 1 вариант весит 166 байт, второй 66, третий 88

По скорости:
Преобразование числа 99: 1 вариант примерно 23030 тактов, второй 7827, третий 5588
Преобразование числа 9: 1 вариант примерно 23166 тактов, второй 5389, третий 1403
Т.е. получается, что если деление в проекте нужно только для преобразования выводимых чисел, то второй вариант экономит код, а третий время. Причем для сравнения - 23000 тактов - это примерно время обмена с одним датчиком DS18s20(т.е. примерно 3мс при 8МГц)

Re: Термометр на ATtiny2313 и DS18B20

Posted: 14 Apr 2009 08:16
by hardlock
Telek, прикольно! Я это писал на заре своего знакомства с контроллерами и о оптимизации совсем не задумывался. Если Вам не сложно - выложите тут исходники, пожалуйста. Может кому-то пригодяться... :oops:

Re: Термометр на ATtiny2313 и DS18B20

Posted: 14 Apr 2009 14:58
by Telek
Вчера к сожалению в мои расчеты вкралась ошибка. Ошибка состояла в том, что я включил прерывание INT0, для включения термометра по кнопке(поработал - заснул, чтобы не сажать батарейки. По нажатию на кнопку проснулся, показал температуру и опять заснул.). В эмуляторе AVR Studio если прерывание по INT включено, то по умолчанию флаг прерывания выставляется постоянно, т.е. получается, что после выполнения каждой команды кода срабатывает прерывание... поэтому в количество тактов добавляются такты прерывания INT(по сути добавка равнялась количество команд кода помноженное на количество команд в прерывании)
Поэтому даю новые результаты по скорости:
Преобразование числа 99: 1 вариант примерно 1638 тактов, второй 611, третий 564
Преобразование числа 9: 1 вариант примерно 1646 тактов, второй 341, третий 123.
Результат уже не столь критичен по времени, хотя все равно быстрее чем деление.

Вот исходники и модель для Протеуса. http://odmax.ru/upload/Termometr.rar
Специфика: делалось с учетом 3х разрядного индикатора и термометра ds18s20(т.е. только целые значения температуры). Это практически твой код, за исключением экспериментального кода и несколько переделанного вывода во время обмена с термометром(У тебя после каждой посылки/приема байта к/от термометра и в основном цикле вызывалось "пересчет температуры"+"вывод", но так как пересчет достаточно "тяжел" и необходим только после получения нового значения температуры, то функция "пересчет температуры"+"вывод" разделена и пересчет выполняется только один раз(после получения данных), а все остальное время - только вывод ) + приделана кнопка "пробуждения" термометра для экономии батареек.