Ярослав Меньшиков

ООО "ЯРОСТАНМАШ"
 
Главная
 
Фрезерный станок с ЧПУ
  Общее описание станка
  Электрическая часть
  Шаговые двигатели
 
Электроника
Средства измерения:
  Лабораторный датчик тока 150А
  Анализатор элементов питания
  Электронный термометр
Приборы:
  Генератор трехфазных импульсов
  USB-программатор для Algorithm Builder
  USB-программатор Prottoss AVR910
  Лабораторный преобразователь частоты
  Зарядное устройство для автомобильных аккумуляторов из блока питания компьютера
Часы:
  Электронные часы для ВАЗ-2106
  Большие домашние электронные часы
Разное:
  Контроллер дворников SSANGYONG REXTON
  Контроллер управления кроватью медицинской "Волна"
 
Аудиотехника
  Активный сабвуфер
 
Техника
  Электровелосипед
  Токарный станок Корвет-403 с комплектом уникальной оснастки
 
Тестирование
  Тест пальчиковых батареек формата АА (R6, LR6)
  Тест мизинчиковых батареек формата AAA (R03, LR03)
  Тест батареек - малых бочонков - формата C (R14, LR14)
  Тест батареек - больших бочонков - формата D (R20, LR20)
 
Технологии
  Изготовление качественных печатных плат в домашних условиях
  Как ровно отрезать стеклянную банку?
 
Фотографии
  Лабораторный блок питания DAZHENG PS-305D
 
Продам
  Отечественные радиодетали из личных запасов
 
Разное
  Как устроена ТЭЦ?
  Парковочное зеркало на Фольксваген Транспортер
 
Полезные сайты
  Сварочный инвертор - это просто
  Микроконтроллеры PIC на русском языке
 

   Одноканальный электронный термометр.

 

Электронный термометр

 

   Здравствуйте друзья!

   На этой странице я расскажу Вам о самодельном электронном термометре. Данный прибор предназначен для измерения температуры за окном на улице, выполнен мною в нескольких экземплярах, каждый из которых работает без нареканий.

   Пределы измерения ограничены снизу типом применяемого датчика на уровне -40ºС, сверху - аппаратной схемой и программным обеспечением на уровне +80ºС. Таким образом, диапазон измерения электронного термометра составляет -40...80ºС. Точность измерения температуры не хуже ±1ºС.

   В качестве датчика температуры применен датчик LM335Z, выполненный в корпусе ТО-92:

 

Датчик температуры LM335Z

 

   Этот датчик имеет 3 ноги, из которых реально используется только две: "+" и "-":

 

Схема включения датчика температуры

 

   Датчик имеет характеристику почти идеального стабилитрона (стабилизатора напряжения), напряжение стабилизации которого линейно (точнее, почти линейно) зависит от температуры самого датчика. Задавая через датчик любой ток в диапазоне от 0.4 до 5мА (например, как показано на рисунке выше, с помощью резистора подходящего номинала) получаем напряжение на датчике, которое в десятках мВ представляет абсолютную температуру (в Кельвинах):

 

Вольт-Температурная характеристика датчика LM335Z

 

   Так, например, при температуре 0ºС = 273.15К, на датчике, в идеале, будет напряжение 2.7315В, при температуре -40ºС = 233.15К на датчике будет 2.3315В, при 100ºС = 373.15К на датчике будет 3.7315В.

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

   Основой электронного термометра является микроконтроллер фирмы Atmel ATtiny26. Данный микроконтроллер представляет из себя микросхему, функции которой можно изменять путем ее перепрограммирования. Микроконтроллер имеет несколько программируемых выводов, назначение и функции которых могут определяться самим разработчиком схемы прибора (т. е. мной самим) с помощью записанной в микроконтроллер микропрограммы. Кроме того, данный микроконтроллер содержит в себе ряд полезных устройств, в том числе Аналогово-Цифровой Преобразователь (АЦП) напряжения.

   АЦП - это устройство, предназначенное для преобразования входного аналогового сигнала (т. е. некоторого текущего значения напряжения на одной из ног микроконтроллера), в некоторое числовое значение, которое затем может быть использовано в микропрограмме как входной параметр. Разрешение данного АЦП составляет 10 бит. Это значит, что внутри микроконтроллера результат преобразования входного напряжения представляется числом в диапазоне от 0 до 1023 (0...1023, т. е. всего 1024 значения - это как раз число 2 в степени 10).

 

 

   Для получения результата АЦП, входное напряжение сравнивается с опорным напряжением, генерируемым встроенным в микроконтроллер Источником Опорного Напряжения (ИОН). Согласно описанию на данный микроконтроллер, его ИОН генерирует напряжение 2.56В, однако допустимый диапазон его отклонения от образца к образцу составляет 2.4 ... 2.9В. Типовое значение - 2.7В. Таким образом, если входное напряжение = 2.7В, т. е. равно опорному напряжению, то результат АЦП будет равен 1023, если входное напряжение составляет половину опорного, т. е. 1.35В, то результат АЦП будет равен половине от 1023, т. е. 511. В случае, если входное напряжение больше опорного, т. е. больше 2.7В, то результат АЦП все равно будет равен 1023:

 

Характеристика АЦП микроконтроллера ATtiny26

 

   Так как максимальная температура, на которую рассчитан электронный термометр, составляет 80ºС или 353.15К, и, следовательно, напряжение на датчике в идеале будет при этом равно 3.5315В, что больше чем опорное напряжение АЦП микроконтроллера (2.7В), нам потребуется делитель напряжения от датчика, в качестве которого используем два резистора:

 

Делитель напряжения от датчика LM335

 

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

 

Блок питания (китайское зарядное устройство для мобильника)

 

   Такие зарядные устройства имеют достаточно большой разброс выходных напряжений, которые (напряжения), к тому же, могут меняться под нагрузкой (просаживаться). Для термометров я подбирал зарядные устройства, напряжение на выходе которых на холостом ходу (т. е. без нагрузки) составляет порядка 5.2...5.8В. Больше нельзя, т. к. предельное максимальное напряжение питания микроконтроллера ATtiny26 составляет 6В. Допускаем также, что под нагрузкой выходное напряжение такого блока питания может просесть до 4.5В.

   Рассмотрим два предельных случая:

   1. Напряжение на датчике минимально (при температуре датчика -40ºС), напряжение питания - максимально (возьмем для удобства 6В):

 

Первый предельный случай

 

   2. Напряжение на датчике максимально (при температуре датчика 80ºС), напряжение питания - минимально (4.5В).

 

Второй предельный случай

 

   Видно, что при тех номиналах резисторов, которые указаны на рисунках выше, ток через датчик находится в пределах 0.87...3.67мА, что укладывается в допустимые пределы самого датчика (0.4...5мА). Номиналы резисторов делителя напряжения от датчика выбраны такими, чтобы ток через них не оказывал большого влияния на ток через датчик, и в то же время, чтобы их приведенное сопротивление (которое в данном случае получается порядка 7кОм) было значительно меньше входного сопротивления АЦП микроконтроллера (100МОм согласно описанию на микроконтроллер).

   Также видно, что во всем рабочем диапазоне электронного термометра, напряжение, подаваемое на вход АЦП, изменяется в пределах 1.74...2.64В, что соответствует результату АЦП в пределах 660...1001. Следовательно, если результат АЦП составит меньше 660, можно говорить о неисправности датчика или о его коротком замыкании. Если результат АЦП будет больше чем 1001, можно говорить о неисправности датчика или о его обрыве, т. к. в случае его обрыва делитель напряжения на резисторах 9.1кОм и 27кОм будет подключен почти к напряжению питания (через резистор 1кОм).

   Теперь рассмотрим цифровой индикатор. В качестве него применен четырехзначный семисегментный индикатор фирмы kingbright CA04-41SRWA или CC04-41SRWA ярко красного цвета свечения. CA04-41SRWA отличается от CC04-41SRWA направлением светодиодов: в СС04 они соединены по схеме с общим катодом (общим минусом):

 

Схема семисегментного индикатора с общим катодом

 

   в СА04 - по схеме с общим анодом (общим плюсом):

 

Схема семисегментного индикатора с общим анодом

 

   У семисегментного индикатора сегменты именуются латинскими буквами a, b, c, d, e, f, g, h следующим образом:

 

Обозначение сегментов семисегментного индикатора

 

   Каждый сегмент индикатора представляет собой отдельный светодиод, который может быть включен, т. е. светиться, или выключен, т. е. не светиться, в зависимости от полярности подаваемого на них напряжения:

 

Схема прямого включения отдельного сегмента (горит)   Схема обратного включения отдельного сегмента (не горит)

 

   Резистор необходим для ограничения тока через сегмент (светодиод) на необходимом уровне. Без него через светодиод будет идти недопустимо большой ток - светодиод выйдет из строя - сгорит.

 

   Давайте прикинем, сколько всего сегментов есть в четырех цифрах. Оказывается, их там 8 х 4 = 32 отдельных сегмента (светодиода). Если управлять каждым сегментом по отдельному проводу, то для управления четырехзначным индикатором нам потребовался бы микроконтроллер с 32 программируемыми ногами, не считая входа АЦП и выводов питания. Кроме того, потребовалось бы 32 резистора в цепи каждого сегмента (светодиода):

 

Схема включения каждого сегмента по-отдельности

 

   Есть ли способ сократить число управляемых выводов микроконтроллера? Оказывается есть! Уже в самом индикаторе CA04-41SRWA (CC04-41SRWA) сегменты (светодиоды) соединены по следующей схеме:

 

Внутренняя схема индикатора CA04-41SRWA

 

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

 

Схема использования индикатора в электронном термометре

 

   Сколько же теперь нам потребуется программируемых ног микроконтроллера, чтобы управлять таким индикатором? Оказывается всего-навсего 8 + 4 = 12. Правда теперь нам придется управлять не только сегментными, но и общими выводами цифр. Почему?

   Предположим, мы хотим зажечь только сегмент "а" на первой цифре, и только сегмент "b" на второй цифре. Остальные сегменты этих цифр и все сегменты других цифр должны быть выключены. Как нам быть?

 

Как зажечь желаемые сегменты?

 

   Чтобы зажечь сегмент "а" на первой цифре нам надо подать "+" на общий провод первой цифры и "-" на провод объединенных сегментов "а". Аналогично, чтобы зажечь сегмент "b" на второй цифре, нам надо подать "+" на общий провод второй цифры и "-" на провод объединенных сегментов "b".

   Но ведь тогда у нас будет гореть еще и сегмент "а" второй цифры, и сегмент "b" первой цифры, потому что и к ним будет поступать ток. Но ведь они нам не нужны! Что же делать?

 

Горят как нужные, так и "лишние" сегменты!

 

   А кто сказал, что они должны гореть одновременно?

   В самом деле, сначала подадим "+" только на общий электрод цифры 1, а на общие электроды остальных цифр подадим запрещающий их работу "-". Теперь, на объединенные сегментные выводы подадим комбинацию сигналов, необходимую для отображения нужного знака на цифре 1 (в данном случае "-" на провод объединенных сегментов "а" и "+" на остальные провода объединенных сегментов. Теперь у нас будет светиться только сегмент "а" первой цифры:

 

Включим только цифру 1

 

   По прошествии некоторого времени, подадим "+" теперь только на общий электрод цифры 2, а на общие выводы остальных цифр, в том числе и общий вывод цифры 1, подадим "-". Одновременно с этим сменим комбинацию сигналов на объединенных сегментных выводах на комбинацию, необходимую для отображения нужного знака на цифре 2 (в нашем случае "-" на провод объединенных сегментов "b" и "+" на остальные провода объединенных сегментов. Теперь у нас будет светиться только сегмент "b" второй цифры:

 

Включим только цифру 2

 

   Аналогично, по прошествии еще некоторого времени, поступим с третьей цифрой, только теперь ни на один из проводов объединенных сегментов не будем подавать "-", т. е. на все подадим "+":

 

Включим только цифру 3

 

   То же самое и для четвертой цифры:

 

Включим только цифру 4

 

   По прошествии еще некоторого времени снова включаем сегмент "а" первой цифры:

 

Снова включим только цифру 1

 

   И так далее.

   Если время переключения цифр будет достаточно малО, т. е. цифры будут переключаться достаточно быстро, у нас, у людей, создается иллюзия, что сегмент "а" первой цифры, и сегмент "b" второй цифры светятся одновременно, а не поочередно, а описанный выше метод включения цифр называется "динамическая индикация".

   А куда теперь подключать ограничивающие ток резисторы? К общим проводам, или к сегментным? Если хотите сэкономить на четырех резисторах, подключайте к общим, если хотите, чтобы цифры светлились равномерно - подключайте к сегментным.

   В самом деле, если резистор подключить к общему проводу какой-либо цифры, то этот резистор будет генерировать ток для ВСЕХ ВКЛЮЧЕННЫХ В ДАННЫЙ МОМЕНТ в этой цифре сегментов. Если это один сегмент - весь ток будет идти только через этот сегмент. Если сегментов два, то ток резистора будет делиться пополам между этими двумя сегментами, если должны гореть все восемь сегментов, то ток резистора будет разделен сразу между всеми восемью сегментами, т. е. каждому конкретному сегменту достанется лишь 1/8 тока резистора. Таким образом, в каждом конкретном сегменте ток будет зависеть от того, сколько сегментов включено в данной цифре. Ток напрямую связан с яркостью свечения: чем больше ток - тем больше яркость, чем меньше ток - тем меньше яркость. В итоге, яркость свечения каждой цифры будет зависеть от того, сколько сегментов в ней горит. Такая схема применялась в первых отечественных "домашних" телефонах с АОН марки "РУСЬ". Выглядело это совсем некрасиво.

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

   В своей практике я использую только второй вариант и подключаю резисторы только к сегментным выводам:

 

Подключение резисторов к сегментным выводам индикатора

 

   Как подобрать номинал этих резисторов?

   При нормальной работе сегментов (светодиодов) на них возникает падение напряжения порядка 2В. Еще некоторое падение напряжения образуется за счет выходного сопротивления выводов микроконтроллера. Это падение может быть порядка 1В при максимально допустимом токе через конкретный вывод микроконтроллера, который согласно инструкции на микроконтроллер ATtiny26 составляет 40мА. Остальное напряжение гасится на нашем резисторе.

 

 

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

   Примем этот ток через общие провода (в момент, когда горят все восемь сегментов данной цифры) на уровне максимально допустимого для данного микроконтроллера, т. е. 40мА. Тогда ток через любой сегмент должен быть в восемь раз меньше, т. е. 5мА. Учитывая, что максимальное напряжение питания электронного термометра может достигать 5.8В, получаем, что на резисторе может падать 5.8 - 2 - 1 = 2.8В. Итак нам необходим резистор, который обеспечит ток 5мА при падении напряжения на нем 2.8В: 2.8 / 0.005 = 560 Ом. На самом деле, мы еще не учли, что 5.8В - это максимальное напряжение ХОЛОСТОГО хода нашего блока питания, в то время как под нагрузкой оно может падать, так что ток через каждый сегмент индикатора будет еще меньше, чем 5мА. Следовательно, ток в общих проводах индикатора будет меньше, чем 40мА, посему, предельный ток микроконтроллера никогда не будет достигнут.

   Кстати, в электронном термометре нет необходимости в использовании сегмента точки в цифрах (сегмента "h"). Поэтому схема электронного термометра предусматривает только семь объединенных сегментных проводов, а не восемь, так как объединенный провод сегментов точки "h" в схеме электронного термометра не используется:

 

Схема подключения индикатора CA04-41SRWA к микроконтроллеру ATtiny26

 

   Это обстоятельство еще более снижает ток через общие провода цифр.

   Давайте теперь поговорим о микроконтроллере ATtiny26 более подробно.

   Микроконтроллер можно сравнить с настоящим настольным компьютером, только в сильно урезанном и уменьшенном виде.

   В микроконтроллере есть встроенный центральный процессор, который производит все арифметические и логические вычисления.

   В микроконтроллере есть память программ, в которую разработчик (т. е. я) записывает свою собственную, разработанную им микропрограмму, в соответствие с которой осуществляется вся дальнейшая работа микроконтроллера. Эту память программ можно сравнить с жестким диском настольного компьютера, на котором находится, например, программа Microsoft Word. Если мы хотим подготовить текстовый документ и для этого запускаем Microsoft Word, то в этот момент и начинает, собственно, исполняться его (т. е. Word-а) программа.

   В микроконтроллере есть оперативная память, в которой сохраняются текущие значения рабочих переменных программы, например результаты АЦП от датчика температуры, или наборы данных для вывода на семисегментный индикатор в разные моменты динамической индикации.

   В микроконтроллере есть энергонезависимая память EEPROM, предназначенная для хранения пользовательских настроек даже при отключении питания микроконтроллера. Предположим, у Вас есть дома телевизор. Однажды Вы настроили в нем телеканалы, и теперь их просматриваете, переключая между собой. Далее берем, выключаем телевизор и вынимаем вилку из розетки. Теперь схема телевизора полностью обесточена. Но тем не менее, при следующем включении этого телевизора в розетку, сделанные ранее настройки программ в нем почему-то сохранились! И мы снова можем смотреть наши настроенные телеканалы. Где же сохраняются эти настройки? Если бы телевизор был построен на микроконтроллере ATtiny26, эти настройки сохранялись бы в энергонезависимой памяти EEPROM. Энергонезависимой, потому что мы выключили телевизор из розетки, а настройки телеканалов все равно сохранились. Память EEPROM также можно сравнить с жестким диском настольного компьютера, но теперь мы на него будем записывать не саму программу Microsoft Word, а результаты ее работы - т. е. подготовленные нами текстовые файлы.

   В микроконтроллере есть тактовая частота работы, которая в данном микроконтроллере ATtiny26 может достигать 16МГц. При этом процессор микроконтроллера теоретически может производить до 16 миллионов арифметических или логических операций в одну секунду. Источником тактовой частоты могут быть разные устройства, например кварцевый резонатор или кварцевый генератор. В электронном термометре в качестве источника тактовой частоты используется встроенный в микроконтроллер RC-генератор на 8МГц.

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

   В микроконтроллере есть даже нога "Reset" - аналогичная по своей функции с кнопкой Reset на системном блоке настольного компьютера.

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

   Микропрограмма для микроконтроллера готовиться на настольном компьютере. Я для этого пользуюсь средой разработки программ для микроконтроллеров Algorithm Builder - это отечественный аналог Ассемблера, позволяющий, однако, не "писать" программы, а "рисовать" их в очень удобной графической форме:

 

Среда написания микропрограмм для микроконтроллеров Algorithm Builder

 

   С некоторых пор эта среда стала полностью бесплатна для любых объемов программы! Скачать ее можно со страницы разработчика здесь. Создал и поддерживает эту программу русский умелец Геннадий Громов.

 

   Чтобы микроконтроллер начал работать с использованием подготовленной микропрограммы, его необходимо запрограммировать. Программируется микроконтроллер находясь уже прямо в схеме электронного термометра (т. н. "внутрисхемное программирование"), посредством соединения микроконтроллера с настольным компьютером через специальный программатор. О том как сделать простейший программатор, работающий через СОМ-порт компьютера, описывается в инструкции к среде Algorithm Builder. Более "навороченная" версия программатора для данной среды представлена на странице USB-программатор AVR для Algorithm Builder.

 

   Для программирования микроконтроллера используется 5 проводов - 4 сигнальных и один общий. В число сигнальных проводов входит провод "Reset", т. к. микроконтроллер программируется, находясь в состоянии Reset-а (сброса). Другие 3 сигнальных провода - это обычные ноги ввода-вывода, которые кроме программирования могут использоваться по своему прямому назначению, т. е. как порты ввода-вывода. В частности, в схеме электронного термометра к ним подключены некоторые объединенные сегментные выводы семисегментного индикатора. Однако, необходимо, чтобы часть схемы, подключенная к этим выводам, не мешала процессу программирования, иначе программирование станет невозможным.

   Для того, чтобы предотвратить срабатывания сброса (Reset-а) микроконтроллера под влиянием внешних электромагнитных помех, к выводу "Reset" в непосредственной близости от микроконтроллера я подключаю конденсатор емкостью 5.6нФ:

 

Схема подключения программатора к микроконтроллеру ATtiny26

 

   Почему именно 5.6нФ? Вообще чем больше, тем лучше. Но опытным путем было установлено, что 5.6нФ - это максимальная емкость для этого конденсатора, при которой схема программирования микроконтроллера продолжает устойчиво работать. Ведь этот конденсатор шунтирует сигналы по входу "Reset", поступающие от программатора. Если емкость этого конденсатора увеличить, то процесс программирования становится неустойчивым, а если сильно увеличить - то вообще невозможным.

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

   Для удобства подключения программатора к микроконтроллеру в большинстве своих устройств на микроконтроллерах я предусматриваю пятиконтактный разъем следующего вида:

 

Разъем для подключения программатора к электронному термометру

 

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

   Наконец, чтобы микроконтроллер вообще работал, необходимо подать на него питание. Для этого используются выводы "VCC", "AVCC" и "GND". По системе питания микроконтроллер ATtiny26 разделен на две части: цифровую и аналоговую. Под аналоговой частью понимается АЦП и все, что с ним связано внутри микроконтроллера. Эта часть питается через свой собственный вывод (точнее ввод) питания с названием "AVCC". Другая (остальная), или "цифровая" часть микроконтроллера питается через вывод (ввод) "VCC". На оба этих провода следует подавать "+" от блока питания. "-" блока питания подключается к выводам "GND" (или "Земля", или "Общий") микроконтроллера. Выводов "GND" у микроконтроллера ATtiny26 два:

 

Подключение питания к микроконтроллеру ATtiny26

 

   Чтобы защитить микроконтроллер от влияния внешних и внутренних электромагнитных помех, правилами построения радиосхем настоятельно рекомендуется в непосредственной близости от микроконтроллера шунтировать выводы питания керамическими конденсаторами:

 

Конденсаторы на выводах питания микроконтроллера ATtiny26

 

   Кроме того, чтобы еще лучше защитить от помех аналоговую часть микроконтроллера, рекомендуется подавать питание на вывод "AVCC" через LC, или хотя бы RC-фильтр. В качестве "R" я использовал резистор на 30 Ом, в качестве "С" - конденсатор на 1мкФ:

 

RC-фильтр на питании аналоговой части микроконтроллера ATtiny26

 

   Наконец, чтобы снизить уровень помех на входе АЦП, к которому подключен датчик температуры через резистивный делитель напряжения, я также подключил к этому входу конденсатор на 1 мкФ, а питание самого датчика взял от входа питания микроконтроллера "AVCC":

 

Схема подачи питания на датчик температуры LM335

 

   Каким же образом микроконтроллер способен управлять светодиодным семисегментным индикатором, подавать на его выводы то "+", то "-"? Оказывается, каждый программируемый вход-выход, в случае если он используется в микропрограмме микроконтроллера именно как выход, соединяется внутри микроконтроллера по следующей схеме:

 

Внутренняя схема одного из программируемых выводов микроконтроллера

 

   Если мы хотим, чтобы на выходе оказался "+", в микропрограмме микроконтроллера на этот вывод мы выдаем логическую единицу (лог. "1"):

 

Схема вывода логической единицы на выход микроконтроллера

 

   Если мы хотим, чтобы на выходе оказался "-" (он же "0", "Общий" или "Земля"), то в микропрограмме микроконтроллера на этот вывод мы должны вывести логический ноль (лог. "0"):

 

Схема вывода логического нуля на выход микроконтроллера

 

   Семисегментный индикатор подключен у нас к одиннадцати программируемым выводам микроконтроллера, однако для простоты рассмотрим только два из них. Чтобы зажечь сегмент "а" первой цифры, нам необходимо подать "+" на общий провод первой цифры и "-" на сегментный вывод "а". Для этого нам надо в микропрограмме микроконтроллера подать лог. "1" на общий вывод первой цифры и лог. "0" на сегментный вывод "а". В этом случае сегмент "а" первой цифры будет гореть:

 

Схема включения сегмента "а" на первой цифре индикатора

 

   Если же мы хотим выключить этот сегмент, сделаем все наоборот: в микропрограмме микроконтроллера подадим лог. "1" на сегментный вывод "а" и лог. "0" на общий вывод первой цифры. Тогда наш сегмент "а" первой цифры светиться не будет - ведь при этом данный светодиод будет заперт:

 

Схема выключения сегмента "а" на первой цифре индикатора

 

   При использовании семисегментного индикатора CC04-41SRWA вместо CA04-41SRWA (помним, что они отличаются полярностью светодиодов), необходимо в микропрограмме поменять лог. "0" и лог. "1".

   Итак, настала пора рассмотреть полную схему электронного термометра:

 

Полная схема электронного термометра

 

   Собственно, на полной схеме нарисовано все то, о чем мы говорили выше. Цифры 0603 и 0805 рядом с обозначением резисторов и конденсаторов означают их типоразмер (в сотых долях дюйма). Такое обозначение используется для указания размера радиоэлементов для поверхностного монтажа.

   Конденсатор на ноге 17 микроконтроллера на самом деле подключен к ИОН АЦП для придания ему большей стабильности и защиты АЦП от помех.

   Ноги 19 и 20 микроконтроллера в данной схеме не используются, и чтобы они не "болтались в воздухе" я подключил их к общему проводу схемы. В микропрограмме для микроконтроллера эти выводы прописаны как выходы, на которые все время выводится логический ноль. Таким образом, внутренняя схема микроконтроллера через эти ноги дополнительно соединяется с общим проводом:

 

Схема использования неиспользуемых выводов микроконтроллера

 

   Микропрограмма микроконтроллера построена следующим образом. Вначале, после подачи питания, равно как и после сброса (Reset), производится очистка всей оперативной памяти микроконтроллера, включая все управляющие регистры всех встроенных в микроконтроллер полезных устройств. Сделано это для того, чтобы точно знать, что у нас не возникнет случайных данных в оперативной памяти или ложных включений тех или иных внутренних устройств в результате сбоев от, например, кратковременной пропажи питания.

   После очистки оперативной памяти происходит настройка некоторых внутренних устройств, как то:

   - Таймера №0 (а всего их 2 в данном микроконтроллере: Таймер №0 и Таймер №1), ибо по этому таймеру будет работать часть микропрограммы, отвечающая за динамическую индикацию;

   - Сторожевого таймера, который вызовет перезагрузку (Сброс, Reset) микроконтроллера в случае его "зависания" (при бездействии микропрограммы более 0.5сек);

   - Портов ввода-вывода. Именно в этот момент определяется, какая из программируемых ног будет выходом на светодиодный семисегментный индикатор, вход АЦП становится именно входом, а заземленные выводы 19 и 20 становятся "дополнительными выводами GND";

   - Аналогово-Цифрового Преобразователя (АЦП), в этот момент выбирается именно тот вход, к которому подключен датчик температуры, выбирается встроенный Источник Опорного Напряжения (ИОН) (2.7В который) и запускается первый процесс АЦП.

   После этого микропрограмма зацикливается и начинает ходить по кругу, выполняя оператор безусловного перехода сам на себя. Когда Таймер №0 отсчитает заданное время (примерно 1/500сек), он вызывает прерывание, микропрограмма прекращает ходить по "замкнутому кругу" и обрабатывает часть алгоритма, прописанную в обработке прерывания от Таймера №0. Сам Таймер №0 начинает отсчет следующей 1/500 секунды. По окончании обработки прерывания от Таймера №0, микропрограмма возвращается к своему "замкнутому кругу". Таким образом, 500 раз в секунду происходит исполнение алгоритма, описанного в обработке прерывания по Таймеру №0. Что же это за алгоритм?

   Алгоритм обработки прерывания по Таймеру №0 содержит две части: алгоритм подготовки значений, выводимых на индикаторы, и алгоритм обработки динамической индикации.

   Алгоритм подготовки значений, выводимых на индикаторы работает следующим образом. Алгоритм АЦП (см. ниже) поставляет абсолютное значение измеренной температуры (в Кельвинах). По этому значению определяются повреждения датчика (обрыв или короткое замыкание), а также определяется значение температуры в ºС и выбирается способ вывода этой температуры на индикаторы. Так,

   при повреждении датчика (если температура слишком мала (замыкание) или слишком велика (обрыв)) на индикатор выводятся прочерки "- - - -";

   При температуре 0...9ºС, например 5ºС, на индикатор выводится значение температуры в виде: "  5 º С" (первая цифра не светится);

   При температуре более 9ºС, например 27ºС, на индикатор выводится значение температуры в виде: "2 7 º С";

   При температуре в диапазоне -1...0ºС на индикатор выводится значение температуры в виде: "- 0 º С";

   При температуре в диапазоне -9...-1ºС, например при температуре -7ºС (т.е. при температуре в диапазоне -8...-7ºС), на индикатор выводится значение температуры в виде: "- 7 º С";

   При температуре менее -9ºС, например при температуре -18ºС (т. е. при температуре в диапазоне -19...-18ºС), на индикатор выводится значение температуры в виде: "- 1 8 º".

   Для того, чтобы отобразить на индикаторе значение температуры, его сначала необходимо "разложить на составляющие", т. е. на десятки и единицы ºС. После получения значения каждой цифры индикатора (символы "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", " ", "-", "º" и "С"), по этому значению выбирается тот или иной набор сегментов для данного знакоместа индикатора, отображающий требуемый символ. Четыре этих набора (по числу знакомест (цифр) на индикаторе) сохраняются в четырех ячейках (байтах) оперативной памяти.

   Алгоритм обработки динамической индикации устроен так. В оперативной памяти назначена ячейка, которая представляет собой номер цифры, выводимой в данный момент динамической индикации. Значение этой ячейки с каждым прерыванием от Таймера №0 увеличивается на единицу, а по достижении значения "4" обнуляется. Таким образом, значение этой ячейки "пробегает" ряд значений 0, 1, 2, 3, затем снова 0, 1... и т. д. Значение "0" соответствует первой цифре индикатора, "1" - второй, ... , "3" - четвертой. Именно по значению этой ячейки алгоритм динамической индикации выбирает цифру индикатора, которую необходимо включить в течение времени до следующего прерывания Таймера №0. На сегментные провода индикатора выводится комбинация сигналов именно для этой цифры индикатора (как раз одна из тех четырех, которые сохранены в оперативной памяти алгоритмом подготовки значений для индикатора). И на общий провод именно этой цифры подается разрешающий ее свечение "+" (лог. "1"). Таким образом, каждая цифра светится в течении периода времени между прерываниями от Таймера №0, т. е. в течение 1/500сек. Поскольку цифр всего четыре, индикатор обновляется с частотой 125Гц.

   АЦП, по завершению очередного преобразования, также как и Таймер №0, вызывает прерывание. Однако алгоритм обработки этого прерывания свой собственный. После завершения обработки этого прерывания, запускается очередное преобразование АЦП.

 

 

   Алгоритм обработки прерывания от АЦП производит следующие действия. В оперативной памяти микроконтроллера назначена ячейка (из 2-ух байт), работающая счетчиком выполненных преобразований АЦП (что тоже самое - счетчиком полученных результатов АЦП). С каждым прерыванием по завершению очередного преобразования АЦП, значение этой ячейки увеличивается на единицу. Кроме того, в оперативной памяти назначена еще одна ячейка (из 3-ех байт), используемая для суммирования результатов АЦП. С каждым прерыванием по завершению очередного преобразования АЦП, к имеющемуся значению этой ячейки добавляется новый полученный результат АЦП.

   По достижении счетчиком выполненных преобразований АЦП значения 16384, этот счетчик обнуляется и начинает считать заново, а сумма результатов АЦП делится на 16384, результат запоминается, а сама сумма затем также обнуляется для накопления суммы следующих 16384 результатов преобразований АЦП.

   Результат деления суммы на 16384 представляет собой усредненное значение результатов АЦП по 16384 результатам. Усреднение необходимо для увеличения стабильности показаний, устранения мелькания цифры младшего разряда. Усредненное значение используется для вычисления температуры в Кельвинах. Для пересчета результата преобразования АЦП в Кельвины необходимо результат АЦП умножить на некий коэффициент. Этот коэффициент определить очень просто.

   Для расчета некоего коэффициента микропрограмма микроконтроллера изменяется таким образом, что на индикатор выводится не температура, а непосредственно усредненное значение результатов АЦП. Датчик помещается в стакан с водой, в которой плавают кусочки льда и все это месиво интенсивно перемешивается для стабилизации температуры в стакане и уравнивания с ней температуры датчика (датчик при этом, естественно, должен быть уже защищен от влаги (см. ниже), иначе вода замкнет его выводы и сильно исказит результаты). Температура смеси воды со льдом, как всем известно, составляет 0ºС или 273.15К. Предположим, что при этом усредненный результат АЦП составил 761 единицу. Тогда наш искомый коэффициент равен 761 / 273.15 = 2.786. Собственно, после деления усредненного результата АЦП на этот коэффициент и получается температура в К. Это значение температуры в Кельвинах сохраняется в одной из ячеек оперативной памяти микроконтроллера, чтобы затем быть использованным алгоритмом подготовки значений, выводимых на индикаторы (см. выше).

   Получение усредненного результата АЦП происходит примерно 1 раз в 2 сек. Именно с такой частотой меняются показания электронного термометра при резком изменении температуры датчика.

   На последок хочу отметить, что на время, пока производится определение первого усредненного значения результатов АЦП (т. е. примерно на 2 сек.), на индикаторе включаются все используемые сегменты, т. е. "8 8 8 8". Сделано это для возможности быстро проконтролировать исправность всех используемых сегментов индикатора в случае необходимости.

 

   По просьбам посетителей сайта, предоставляю исходники и прошивку на микропрограмму микроконтроллера электронного термометра с подробными комментариями:

 

   T1.PROG.rar (20кБ)

 

   Напоминаю, что все материалы с этой страницы могут быть использованы только для личного применения (не для коммерческих целей).

 

   Перед работой со средой Algorithm Builder рекомендую ознакомится с инструкцией на эту среду. Инструкция в формате .pdf, вызывается клавишей F1 (из самой среды). В инструкции, в том числе, рассказано, как собрать простейший программатор, работающий через COM-порт компьютера, который подойдет для программирования схемы электронного термометра. Программирование схемы термометра осуществляется прямо из самого Algorithm Builder-а.

 

   Страница USB-программатор микроконтроллеров AVR для Algorithm Builder рассказывает о том, как собрать более продвинутый программатор для программирования микроконтроллеров из этой среды.

 

  Кроме того, будет необходимо запрограммировать его так называемые "Fuse bits". Эти биты определяют ряд важнейших параметров микроконтроллера, например, такие, как источник тактовой частоты и метод программирования. Установить нужные значения Fuse bits можно в меню "Опции" - "Опции проекта..." - вкладка "Fuse bits", либо из окна программирования по ссылке Fuse bits... В любом случае, эти биты устанавливаются в окне установки Fuse bits, и должны быть установлены В ТОЧНОСТИ как на картинке ниже:

 

Окно установки Fuse bits для микроконтроллера электронного термометра

 

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

 

Печатные платы электронного термометра Печатные платы электронного термометра с компонентами Печатные платы электронного термометра с компонентами

 

   Для тех, кто собрался повторить данную конструкцию, выкладываю файлы трассировки этих плат:

 

   T1.PCB.rar (37.6кБ) - файл трассировки печатных плат электронного термометра в программе P-CAD 2006:

 

Файл трассировки печатных плат для электронного термометра в формате P-CAD 2006

 

   После монтажа компонентов и отмывки от флюса, эти две платы с помощью штыревых гребенок типа PLS спаиваются между собой в единый блок:

 

Элктронный блок термометра

 

Элктронный блок термометра

 

   Платы смонтированы в корпус G1015, выпускаемые фирмой Gainta Industries. Этот корпус необходимо немного доработать, вырезать окошко для индикатора и пару отверстий для крепления блока печатных плат.

 

Размещение электронного блока в корпусе

 

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

 

Электронный термометр

 

   За "ушки" корпуса электронный термометр можно прикрутить к стене или еще к чему-либо.

   Датчик электронного термометра в первом варианте помещен в отрезок трубки от телескопической антенны и залит эпоксидным клеем:

 

Конструктивное оформление датчика температуры Конструктивное оформление датчика температуры

 

  В последующих вариантах я обматывал датчик несколькими витками толстой хлопчатобумажной нитки (арматура) и пропитывал затекающим герметиком для автомобильных стекол. Такой вариант, на мой взгляд, еще более влагостоек, чем первый, хотя и менее прочен с механической точки зрения:

 

Конструктивное оформление датчика температуры

 

   На данной странице представлена для свободного доступа вся необходимая информация и проектная документация для самостоятельного повторения данной конструкции.

 

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

 

   Яндекс-кошелек: 41001208237816

 

 

   Спасибо за то, что посетили эту страницу!

 

© 1995-2017 Ярослав Меньшиков

 Материал на страницах этого сайта выложен только для ознакомительных целей.

Любая перепечатка и распространение, использование в коммерческих целях материалов данного сайта возможно только с разрешения и по согласованию с автором.