Микроконтроллеры

Правильное подключение микроконтроллера

На первый взгляд вроде бы простая тема, но многие начинающие радиолюбители которые только начали изучать микроконтроллеры довольно часто задают одни и те же вопросы. К примеру, как подключить светодиод, как обработать события нажатия клавиш, для чего нужны выводы AGND и AREF, AVCC. И раз эти вопросы так часто задают, то тема еще не понятна или не полностью раскрыта и имеет смысл дать исчерпывающий ответ на вопрос "Как правильно подключить микроконтроллер?".

Питание микроконтроллера

Микроконтроллеры в зависимости от модели и серии питаются от напряжения величиной от 1.8 до 5 Вольт. Все микроконтроллеры AVR работают от напряжения в 5 Вольт. Поэтому можно считать что практически у всех микроконтроллеров напряжение питания 5 В, плюсовой вывод на микроконтроллере обозначается как Vcc. Нулевой вывод или еще его называют земля корпус, минусовой вывод обозначается как GND. Если взять блок питания от компьютера то черный провод это GND, а красный это +5 В это и есть Vcc. Если питаем от батареек то минус батарее это GND а плюс это Vcc. Главное чтобы напряжение питания с батареек было в диапазоне напряжения микроконтроллера, это интервал можно посмотреть в документации на МК. 

На пример:

 • Operating Voltages

  • –1.8 — 5.5V (ATtiny2313V)
  • –2.7 — 5.5V (ATtiny2313)

• Speed Grades

  • –ATtiny2313V: 0 — 4 MHz @ 1.8 — 5.5V, 0 — 10 MHz @ 2.7 — 5.5V
  • –ATtiny2313: 0 — 10 MHz @ 2.7 — 5.5V, 0 — 20 MHz @ 4.5 — 5.5V 

Operating Voltage это как раз и есть тот диапазон напряжения в котором возможно нормальная работа МК. Существуют низковольтные серии (ATtiny2313V) у которой минимальное напряжение заметно ниже. 

Speed Grades это максимально возможные частоты работы МК в зависимости от напряжения которое к нему подвели. Здесь видно, чем ниже напряжение тем меньше максимальная работа МК.

Для того чтобы нам МК начал работать то на него достаточно подать напряжение в 5 В. Как и говорилось ранее один провод кидаем на Vcc а другой на землю - к выводу GND. Некоторые микроконтроллеры имеют несколько выводов Vcc и также несколько GND. Это сделано не для того чтобы вам было делать печатные платы и удобства монтажа а для того чтобы подвести напряжение к камню равномерно, т.е. равномерно запитать весь кристалл. Это делается для того чтобы внутренний линии кристалла не перегружались. К примеру вы взяли МК с квадратным корпусов TQFP у него выводы Vcc и GNВ находятся со всех сторон. С одной стороны вы подвели питание, т.е. задействовали всего лишь 2 вывода питания а с другой  стороны вы подключили на порты кучу светодиодов и взяли и зажгли их разом. Получается что внутренние линии МК перегружены, в результате камень офигеф от такой нагрузки выходит из строя. Поэтому если у контроллера есть несколько выводов питания то запитать нужно все выводы Vcc и GND.

Помимо выводов предназначенных для питания МК есть еще выводы AGND и AVCC - это выводы питания АЦП (аналого-цифрового преобразователя). АЦП это довольно точный измеритель напряжения, по этой причине его можно запитать через фильтры. Для того чтобы помехи которые довольно часто бывают в цепях питания не влияли на результаты измерения. По этой причине в некоторых схемах производят разделение земли, а на вывод AVCC подается напряжение через фильтрующий дроссель. А если вы не планируете пользоваться АЦП и вам не нужны точные измерения, то на AVCC можно подать те же +5 В что и на Vcc, а вывод AGND подключить к земле. Подключать выводы AVCC и GND нужно обязательно!

Ahtung!

В микроконтроллере Atmega8 есть одна ошибка на уровне топологии чипа - выводы VCC и AVCC связаны друг с другом на уровне кристалла и между ними сопротивление 5 Ом. К примеру, в чипах Atmega16 и Atmega168 выводы VCC и AVCC связаны между собой и их сопротивление составляет порядка десяток МОм. В документации по этому поводу ничего не сказано. Поддержка Atmel на это ответила что в чипе есть недочет и выводы VCC и AVCC соединенны между собой внутри камня. По этой причине ставить фильтрующий дроссель на AVCC для ATmega8 нет смысла, но запитывать вывод AVCC нужно в любом случае.

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

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

Эта упрощенная схема подключения микроконтроллера так сказать необходимы минимум для запуска контроллера, по хорошему лучше добавить несколько внешних элементов. Провод показанный пунктиром от источника питания к БП необязателен. Если ты питаешь МК от внешнего источника то это провод лишний. Но лучше питать всю схему от одного источника - так больше вероятность того что все прошьется успешно. Для учебных целей схема подключения питания самый раз, светодиодиком там помигать или еще чего.

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

Вывод AREF это вход опорного напряжения АЦП, туда подается напряжение относительно которого будет считать АЦП. Можно использовать внутренний источник опорного напряжения величиной в 2.56 В либо использовать напряжение AVCC. На вывод AREF рекомендуется подключать конденсатор, это улучшает качество опорного напряжения АЦП и как в следствии правильность измерения АЦП. На входе в AVCC установлен дроссель и конденсатор между AVcc и GND. Также между выводами GND и VCC ставят керамический конденсатор номиналов в 100 нФ как можно ближе к выводам питания микросхемы - он сглаживает краткие импульсы помехи, которые получаются в результате работы самих микросхем. Также между выводами VCC и GND устанавливают конденсатор емкость в 47 мкФ для сглаживания более сильных бросков напряжения.

 Вывод сброса

В МК AVR есть внутренняя схема сброса и вывод reset внутри уже подтянут сопротивлением в 100 кОм к выводу Vcc. Но этой подтяжки не хватает, получается что микроконтроллер "выход" в сброс от незначительного потенциала на выводе. К примеру от прикосновения пальцем вывода RST, а иногда от случайного касания самой платы. Поэтому имеет смысл дополнительно подтянуть этот вывод резистором в 10 кОм. Меньшее значение резистора лучше не брать, потому что если вы используйте внутрисхемный программатор то он не сможет пересилить подтяжку и прошить микроконтроллер. Поэтому значение в 10 кОм в самый раз.

Схема сброса микроконтроллера

 Схема сброса микроконтроллера

После того как схема вклчючена, изначально конденсатор C12 разряжен и напряжение на RST почти равно нулю и в результате микроконтроллер не запускается. Получается что ему после запуска схемы постоянный сброс. С течением времени происходит заряд конденсатора через резистор, после того как он заряжится на выводе RST появится логическая единица МК запустится. Ну а скнопкой всю понятно она разряжает конденсатор и происходит перезапуск микроконтроллера.

 Задержку перед стартом МК легко посчитать по формуле как T=R*C при данных значения получается приблизительно одна секунда. Для чего эта задержка? - спросите вы. А для того чтобы МК не запускался раньше времени чем все устройства на плате запитаются в перейдут в установившийся режим работы. К примеру, в старых МК (AT89C51) если нет такой цепочки которая делает изначальный сброс, то МК мог вообще не запуститься.

В МК AVR такую задержку перед стартом можно сделать программно чтобы он подожда секунду и потом только запускался. Поэтому можно обойтись и без конденсатора. А кнопку можно оставить - на свое усмотрение. 

 Тактирование микроконтроллеров

Тактовый генератор это своего рода сердце микроконтроллера. По кажлому "тику" или импульсу тактового генераора происходи какая нибудь операция - передаются какие либо данные по шинам и регистрам, работают таймеры, переключаются порты ввода/вывода. Чем больше тактовая частота тем больше энергии нужно микрокнтроллеру.

Импульсы формируются тактовым генератором с определенной скоростью (частотой). Сам генерато может быть как может быть как внутренний так и внешний. Все это гибко настраивается. 

 podklyuchenie-mikrokontrollera11

Микроконтроллер можно тактировать от:

  • внутреннего генератора с внутренней задающей RC цепочкой. При таком тактировании никакой обвязки не нужно. К выводам XTAL1 и XTAL2 можно ничего не подключать, их можно использовать как обычные порты ввода/вывода. Внутренний RC генератор можно настроить на 4 значения частоты;
  • внутреннего генератора с внешней задающей RC цепочкой. Тактирование аналогично предидущему способоу, только вот задающая RC цепочка находится не внтури МК, а снаружи, такая схема позволяет изменять частоту прямо на ходу. Изменение задающей частоты происходит путем изменения значения сопротивления;
  • внутреннего с внешним задающим кварцем. В этом случае снаружи МК цепляют кварцевый резонатор с небольшой обвязкой кварца из двухконденсаторов. Если используется кварц(резонатор) с частотой менее 1 МГц то конденсаторы можно и не ставить.
  • внешнего генератора. Это когда импульсы поступают на вход МК от внешнего генератора. Такое тактирование применяют когда нужно чтобы несколько независимых микроконтроллера работали синхронно от одного генератора.

 У каждого способа тактирование есть свои достоинства. Если мы используем внутренюю или внешнюю RC цепочку то у нее есть один недостаток - " плавание частоты в зависимости от температуры. И мы не можем максимально развить максимальную частоту. Если использовать кварц то он занимает 2 ножки микроконтроллера. На кварце можно развить максимальную частоту. Частота тактирования микроконтроллера зависит от того какой кварц мы подключили.

Посмотреть способы тактирования МК можно в даташите System Clock and Clock Options. Если в кратце, то выбор способа тактирования осуществлятеся путем выставления определенных Fuse битов. Но если вы пока еще не ознакомились с ними, то лучше пока туда не лезть и использовать выбранный по умолчанию способ тактирование. По умолчанию в МК выбран внутренний генератор. Если не правильно выставить Fuse биты можно "залочить" МК и он превратиться в мертвеца и вернуть его к жизни будет совсем не просто, но все же возможно.

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

Микроконтроллер если к нему не подкючены какие либо внешние устройства не представляет собой ничего интересного, кусок кремния который тикает там что то себе под нос! Друго дело когда мы может что то понажимать, объяснить ему что "мол вот я нажал кнопку давай делай что нибудь!" а он нам в ответ может что включить, пропищать и как то с реагировать. 

Схемы подключения кнопок и светодиодов

Для того чтобы подключить нашу всеми любимую кнопку нам нужно сначала выбрать ножку на которую мы его будем цеплять. Один конец кнопки мы кидаем на землю а другой к ножке МК. Сам вывод к которому подключения кнопка нужно настроить на вход с включением внутренних подтягивающих резисторов (PORTx=1 DDRx=0). Получается что если кнопка не нажата то входе будет высокий уровень напряжения через подтягивающий резистор. Если мы считаем это значения через PINx то он будет возвращать 1. Если мы нажимаем кнопку то вывод подтягивается к земле и напряжение на нем становится равным нулю, PINx возвращает 0. По этому значению мы и определяем нажата ли кнопка или нет.

 В дополнении к внутреннему подтягивающему резистору можно подключить еще внешний резистор (на схеме показан пунктиром). Дело в том что внутренняя подтяжка слабовата порядка 100 кОм. Поэтому наведенное на этом выводе какое либо напряжение может привести к ложному срабатыванию. Довольно часто эти внутренние сопротивление сгорают от каких либо наводок. Микроконтроллер работает как и работал только вот без этой подтяжки. Поэтому рекомендуется ставить свою внешнюю подтяжку сопротивлением в 10 кОм. Таким образом можно подстраховатся даже, даже если внутреняя сгорела то у вас все будет работать должным образом.

 Для того чтобы подключить светодиод можно использовать две схемы подключения порт-земля и порт-питание. В первом случае для того чтобы зажечь светодиод нужно на вывод к которому подключили светодиод подать высокий уровень (логическую единицу). Для второго случае когда светодиод подключен к выводу Vcc нужно наоборот подать другой уровень низкий (логический ноль). Для микрокнтроллеров абсолютно неть разницы куда вы будете подключать светодиод к земле или к Vcc. Можно применять как одну так и другую схему подключения светодиода к микрокнтроллеру AVR в зависимости от разводки печатной платы. Программно разницы тоже особо нет.

Сначала нам нужно настроить порт на выход для этого в регистр DDRx запичываем 1. Далее записываем в порт PORTx нужный нам уровень высокий или низкий.

Светодиод к выводам МК нужно цеплять черех резистор. Максимальный ток вывода МК порядка 20-30 мА. А для нормального свечения светодиода нужно 3...15 мА. А когда мы подклчаем светодиод с низким прямым сопротивлением, то мы можем его в лучшем случае просто спалить, а в худшем спалить сам вывод микроконтроллера. Поэтому ток через светодиод нужно ограничивать подключаю последовательно светодиоду сопротивление.

Напряжение на ноге микроконтроллера около 5 В. Для нормального горения светодиода нужно что на нем падение напряжения было приблизительно 2.5 В. Получается что такое же напряжение должно быть и ограничивающем сопротивлении 5-2.5=2.5. Предположим что ток протекающий через диод 5 мА. Знаем ток в цепи и падение напряжения на резисторе находим по закону Ома требуемое сопротивление резистора R=U/I=2.5/5e-3=500 Ом. Ближайшее значение 510 Ом, но можно взять и другие хоть от 220 Ом до 1 кОм. Гореть светодиод будет хорошо.

 

con4

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

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

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

Но при такой программной реализации вывода порта нужно следовать определенным правилам:

Те назначения котоые вы планируете применять не должны друг другу мешать. Их нужно разделить таким образом чтобы одна функция (смежная) не изменяла результат работы другой функции (проверяемой).

Например, допустим у нас есть один вывод к которому мы подключили какой либо датчик либо кнопку. С датчика может придти сигнал 0 или 1, а в активном режиме Hi-Z в случае когда на датчик не послали сигнал Enable. А при нажатии на копку придет сигнал 0,

podklyuchenie-mikrokontrollera

Основную часть времени МК установлен на вход Hi-Z и мы получаем сигнал с датчика на него же подан сигнал enable. Если нам нужно узнать состояние кнопки, то мы убираем enable и его выходы становятся в режим Hi-Z и нам не мешают. Далее мы переводим вывод МК в редим Pull-Up и опрашиваем нет ли у нас на входе вывода нуля - это сигнла нажатой кнопки. После того как мы это проверили мы снова переводим МК в Hi-Z и отправляем сигнал enable на датчик. Эта последовательность действий повторяется несколько раз в секунду.

При таком способе подключения могут возникнуть противоречия

Логическое противоречие

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

Электрическое противоречие

Если с датчика поступает высокий уровень и мы нажимаем кнопку, то на одном выводе у нас сразу встретятся 0 и 1,Vcc и GND. В результате у нас датчик "заснет вечным сном" а кнопка как жили так и будет. Программым методом это противоречие не решить, а определить можно ли нажимать кнопку или нет в определенный момент времени на глаз просто не возможно, и в каком месте сейчас выполняется программа тоже не узнать. Электрическое противоречие можно решить только схемотехническим путем. Нам нужно в цепь где у нас кнопка добавить резистор. Значение резистора определяется через максимальтный ток самого низковольтного вывода (датчика или ножки).

К примеру если у нас на выводе васит датчик у которого вывод может дать не больше чем 10 мА. То нам нужно чтобы ток через датчик не был больше этой величины в случае нажатия кнопки. При напряжении в 5 В получаем сопротивление в 510 Ом. Таким образом даже если у нас с датчика идет высокий уровень, и в этот момент времени нажимается кнопка то ничего страшного не произойдет и датчик не сгорит и искажения уровня сигнала тоже не произойдет.

Примеры использования нескольких функций на одной ножке

Разъем ISP в некоторых схемах занимает 3 вывода микроконтроллера MOSI,MISO,SCK. У меня практически все платы имеют такой разъем и в него у меня вставлен программатор. Во время отладки платы я прошиваю МК по несколько раз. И это очень удобно, мне не приходится каждый раз когда мне нужно прошить МК его вытаскивать втавлять в колодку программатора и далее обратно.

На эти три разъема можно подключить, к примеру кнопки. И мониторить их состояние в прогамме. Самое главное не нажимать эти кнопочки во время заливки прошивки в микроконтроллер. Также с целью экономии выводов на эти выводы можно прицепить светодиоды. Правда если использовать программатор Громова то он может не корректно сработать. А если использовать программатор USBasp то проблем возникнуть не должно. В процесе прошивки светодиоды на выводах MOSI,MISO,SCK будут забавно моргать:)

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

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

Установленные резисторы по 10 кОм отделяют линию программатора от основной схемы. Резисторы ограничивают возможные другие уровни от дисплея на выводах ISP разъема, программатор их пересиливает и шьет микрокнтроллер. А на работу дисплея эти резисторы особоне не оказывают влияния.

Подключение двух светодиодов на один вывод

con7

В данной схеме два светодиода подкючены на одну ножку порта, такая схема позволяет упростить печатную плату, не придется тажить еще одну шину к каждому светодиоду. Для того чтобы зажечь верхний сетодиод нужно на вывод Pxy подать логический 0, а для того чтобы зажечь нижний то подать высокий уровень. Если мы хотим зажечь сразу оба светодиода та нам нужно перевести вывод МК в режим Hi-Z как будто его нет, в этом случае появится сквозной ток через оба светодиода и они оба загорят. Или можно бысто зажигать то один то другой, визуально они будут оба гореть. Минус схемы в том что погасить сразу два диода нельзя.

Подключение двух светодиодов по схема PORT-PORT

con8

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

con9

В данной схеме кнопки опрашиваются поочередно. Один вывод подтягивает внутренее сопротивление а другая дает 0. Нажатие кнопки дает 0 на подтянутом выводе а это фиксирует программа, таким образом,меняя роли выводов опрашивается каждая кнопка. Если у нас используется 6 выводов, то действуем по следующей схеме: одну ножку подтягиваем, другую делаем нулем а из третьей делаем состояние Hi-Z. Но тут тоже есть один минус. Допустим мы хотим опросить кнопку "В". Для этого верхнюю линию подтягиваем, среднюю делаем нулем, а нижнюю не задействуем в процессе или выставляем ее в стостоянии Hi-Z. Далее если мы нажмем на копку "B" то верхняя линия подтянится к нулю и программа поймет что нажата именно кнопка "B". В том случае если одновременно будут нажаты кнопки "E" и кнопка "Б" то верхняя линия такжн подтяница к 0 и программа поймет что была нажата кнопка "В", хотя мы ее не нажимали. 

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

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

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

Эта схема работает также в динамическом режиме.Для того чтобы отобразить состояние светодиода мы можем подать 0 - диод горит, либо перевести вывод в состояние Hi-Z - диод не горит. А для того чтобы опросить кнопку нам нужно временно на несколько микросекунд перевести вывод в режим входа с подтягом и опрашивать кнопку. В том случае когда горит светодид т.е. на выводе высокий уровень, то нажимать кнопку нельзя, в противном случае сгорит порт а это нам совершенно не нужно.

Оригинал статьи: www.easyelectronics.ru

Добавить комментарий


Защитный код
Обновить

Последние комментарии

Последнии темы форума

  • Нет сообщений для показа
-->