Данный пост для начинающих и посвящен работе с дискретными и аналоговыми пинами контроллеров при подключении к ним кнопок.
У любого микроконтроллера большая часть входов (пинов) служат для приема информации. В большинстве своем, контроллеры имеют как дискретные так аналоговые входы.
Дискретный (цифровой) пин.
Такой пин может принимать информацию в виде логического ноля и логической единицы. Контроллеры широкого применения работают с напряжением от 0 до 5 или 3,3 Вольт. Соответственно логической единицей для них будет напряжение близкое к максимальному 5 или 3,3 вольта. Логическим нолем для контроллера будет напряжение близкое к 0 Вольтам.
Если сказать точнее, к примеру, Atmega328 (Arduino MINI, NANO, UNO) будет считать логической единицей напряжение от 3 до 5 В, а нулем – от 0 до 1,5 В. Напряжение от 1,5 до 3 В считается неопределенным. Свыше 5 В на пин подавать нельзя, это выведет МК из строя.
Кроме того, крайне нежелательно оставлять пин неподключенным (неподтянутым) никуда. Это приводит к негативному воздействию помех.
Существует несколько способов подключения к пину кнопки. С подтяжкой к земле или к питанию.
подтяжка осуществляется физически через сопротивление 4,7-10 кОм или программно.
.
.
В Arduino программно пин можно подтянуть только к питанию. При этом задействуется внутреннее высокоомное сопротивление контроллера.
В FLProg внутреннюю подтяжку можно сделать, установив соответствующий чек-бокс.
При подтяжке пина к питанию, при выключенной кнопке, на пине будет логическая единица.
Этот факт необходимо учитывать и при необходимости инвертировать выход пина в проекте.
.
.
В Arduino NANO цифровыми пинами могут быть D0-D13 и A0-A5
И только A6 и A7 могут быть исключительно аналоговыми.
Аналоговый пин.
В той же Arduino NANO аналоговыми могут быть пины A0-A7.
Как же работает аналоговый пин.
Принцип его работы основан на АЦП (Аналого Цифровом Преобразователе).
Попросту говоря, контроллер измеряет напряжение на аналоговом входе и преобразует его в цифровое значение. Но значение это не в вольтах, а в условных единицах соответствующих разрядности встроенного в контроллер АЦП. В Arduino NANO встроен 10-битный АЦП. Соответственно значение которое выдаст нам контроллер будет в пределах от 0 до 1023.
Зная что контроллер работает с напряжением от 0 до 5 В, не сложно догадаться, что 5 В будет соответствовать значение 1023, а 0 В – значение 0. Получается что разрешение такого АЦП примерно 0,005 В или 5мВ.
Стоит отметить, что разрешение можно повысить, снизив измеряемый диапазон к примеру от 0 до 3 В, Однако для этого потребуется источник опорного напряжения. Этой темы мы пока касаться не будем.
Что же дает нам АЦП при работе с кнопками.
С помощью использования аналогового пина, на один вход можно подключить несколько кнопок. Для этого надо всего лишь собрать многоступенчатый делитель напряжения.
.
.
Именно на таком принципе работают резистивные клавиатуры, к примеру в таком шилде:
.
.
При замыкании разных кнопок на такой клавиатуре, на аналоговый пин поступает различное напряжение. А зная какой кнопке соответствует определенное значение АЦП, легко настроить блок «Кнопка» (Button), на нужное значение.
Как узнать какое значение АЦП соответствует той или иной кнопке.
Все достаточно просто. Для этого надо подключить резистивную клавиатуру к нужному пину, загрузить в контроллер элементарный тестовый проект, в котором значение аналогового пина будет передаваться в монитор порта или на дисплей и записать соответствующие значения для каждой из кнопок.
Тестовый проект для монитора порта.
.
- Тест кнопок.jpg (10.17 КБ) 2931 просмотр
.
Дребезг контактов.
Практически все механические кнопки подвержены такому неприятному в электронике фактору как дребезг контактов. Суть проблемы в том, что в момент нажатия на кнопку с механическими контактами возникает микроискра и в этот момент, который измеряется миллисекундами, контроллер может определять несколько замыканий и размыканий. Для борьбы с этим явлением применяют фильтры как на уровне «железа», так и на программном уровне. И те, и другие имеют свои достоинства и недостатки. В данном случае расскажу о программном фильтре.
Антидребезг (так называют программный фильтр) работает следующим образом.
Всякий раз когда контроллер определяет замыкание контакта (логический переход от «0» к «1»), запускается таймер и только в том случае когда значение этого таймера превышает установленное значение, фиксируется нажатие. Благодаря этому, все короткие логические переходы не учитываются. Как правило значение таймера антидребезга составляет 30-80 мс.
В FLProg для того что бы задействовать фильтр антидребезга для цифрового (дискретного) входа, необходимо установить соответствующий чек-бокс.
.
- Антидребезг контактов.jpg (31.04 КБ) 2921 просмотр
.
То же самое справедливо и для аналогового антидребезга, с той лишь разницей что отслеживается не логический переход, а время нахождения значения АЦП в ограниченном диапазоне. В блоке «Кнопка» (Button) за ограничение такого диапазона отвечает параметр «Допуск отклонения значения аналогового входа». К примеру, если аналоговой кнопке назначено значение 560, а допуск отклонения 20, то диапазон соответствия будет от 540 до 580. И только если значение АЦП не будет выходить из данного диапазона в течении времени таймера антидребезга, будет зачтено нажатие. Штатного антидребезга для аналогового входа в FLProg не предусмотрено.
.