Реле Tianbo - ресурс 10 млн переключений

Использование АЦП микроконтроллера в качестве интерфейса клавиатуры

Atmel ATMega168

Журнал РАДИОЛОЦМАН, июль 2015

Les Hughson

EDN

Выбираем схему BMS для заряда литий-железофосфатных (LiFePO4) аккумуляторов

ATMega168 – это прекрасный универсальный 8-битный AVR микроконтроллер фирмы Atmel. Он имеет 23 вывода общего назначения (GPIO), но иногда, по мере роста вашего проекта, контактов ввода/вывода начинает не хватать. Такое недавно случилось и со мной, когда из 23 доступных GPIO два я занял внешним керамическим резонатором, один вывод под линию сброса, 3 для последовательного порта, 14 для ЖК индикатора и 3 для управления RGB светодиодом. Таким образом, все 23 вывода были использованы, и для управления четырьмя кнопками ничего не оставалось. Что же делать? Решение предлагается в этой статье.

Внимательно посмотрев в техническую документацию на ATMega168, можно заметить, что количество доступных выводов для вариантов в 28-выводном корпусе DIP и 32-выводном корпусе TQFP не одно и то же. Версия в корпусе TQFP, помимо рекламируемых 23 GPIO, имеет пару дополнительных выводов VCC и GND, а также два входа АЦП. Таким образом, если я смогу с помощью двух дополнительных входов АЦП считывать данные четырех кнопок, все будет OK, и моя конструкция будет спасена.

Кроме того, интерфейс пользователя был довольно сильно перегружен функциями, поэтому для вызова на ЖКИ различных пунктов меню приходилось использовать комбинации кнопок. К тому же, разработка софта еще не была закончена, и не было уверенности, что не понадобятся новые комбинации кнопок. Мне хотелось иметь возможность определения нажатия, как каждой отдельной кнопки, так и любых их сочетаний, поэтому всего я должен был распознавать 24 или 16 возможных состояний кнопок.

Ну что же, сначала мне показалось, что это будет несложно. Я просто должен был включить цепочку резисторов между моими четырьмя кнопками и одним из входов АЦП, чтобы каждая кнопка подтягивалась к земле различным количеством резисторов, равномерно распределенных между VCC и GND (Рисунок 1). Однако, когда я попытался это сделать, оказалось, что все не так просто, как представлялось вначале.

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

Я рассматривал вариант использования лестничной цепочки резисторов R-2R, но для этого потребовались бы переключатели на два направления, чтобы выходы соединялись с VCC или GND и не оставались висящими в воздухе. Поразмышляв об этом некоторое время, я понял, что пошел по слишком трудному пути, и решение должно быть более простым. Есть два доступных входа АЦП, поэтому, если к каждому из них я подключу только по две кнопки, мне потребуется декодировать лишь 22, или 4 возможных состояния кнопок вместо 16 (Рисунок 2). Если состояния не распределятся равномерно между VCC и GND, особого значения это иметь не будет.

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

Это привело к созданию схемы, изображенной на Рисунке 3, которая подтвердила правильность выбранного решения довольно долгой работой в серийной продукции одного из моих клиентов. Поскольку сопротивления всех резисторов одинаковы, заменив их одной матрицей из четырех резисторов, например, чем-нибудь типа Bourns 1206, можно уменьшить размеры схемы.

Использование АЦП микроконтроллера в качестве интерфейса клавиатуры
Рисунок 3. Часть схемы с двумя парами кнопок.

В конце статьи можно загрузить проектные файлы, помогающие понять работу схемы, среди которых есть электронные таблицы в формате OpenOffice. Желтым цветом в них выделены ячейки, в которые вы вводите значения сопротивлений используемых резисторов, напряжение питания и разрешение АЦП. В зеленых ячейках находятся расчетные значения, показывающие работу схемы. Первые три колонки содержат таблицу истинности входов кнопок, а колонка R Buttons показывает результирующее подтягивающее сопротивление, образующееся при различных комбинациях нажатых кнопок. В колонках Vout и Counts представлены входное напряжение АЦП и его выходной код. Колонка Count Mid Points содержит коды АЦП, средние относительно ожидаемых значений; именно они используются для дифференциации различных входов и декодирования нажатых кнопок. Это дает гарантию, что все возможные комбинации входных значений будут декодированы, а запас, учитывающий разброс номинальных значений сопротивлений, шумы и прочее, будет максимальным.

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

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

Использование АЦП микроконтроллера в качестве интерфейса клавиатуры
Рисунок 4. Зависимость входного напряжения АЦП от номера комбинации
нажатых кнопок для схемы на Рисунке 3.

Это приемлемая плата за простоту, которая, однако, заставила меня задаться вопросом, можно ли придумать более хорошее решение задачи, и побудила пересмотреть первоначальные представления о схеме на Рисунке 1. Кажется логичным увеличить количество кнопок с двух до четырех, продлив прогрессию сопротивлений резисторов от 10K, 20K до 10K, 20K, 40K, 80K. Однако это не решает проблем нелинейности или потери части рабочего диапазона АЦП.

Более хорошим решением была бы замена подтягивающего резистора (R1 на Рисунке 3) источником постоянного тока. Цепочка подключенных к кнопкам резисторов преобразовывала бы постоянный ток в хорошие, равномерно распределенные значения выходных напряжений. Вероятно, подобное можно сделать с помощью источника опорного напряжения (например, TL431) и транзистора. Но это увеличит число активных компонентов и потребует тщательной проработки конструкции, уводя меня от первоначального видения простой резистивной цепочки.

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

Использование АЦП микроконтроллера в качестве интерфейса клавиатуры
Рисунок 5. Схема с четырьмя кнопками.

В этой схеме для четырех кнопок используется всего один вход АЦП, оставляя другой для наращивания количества кнопок, или для иных целей. Четыре кнопки и включенные последовательно с ними резисторы образуют одно плечо моста, а R9 и R10 – другое. Втрое плечо используется в качестве источника опорного напряжения АЦП, равного максимальному входному напряжению. Сопротивления резисторов выбраны так, чтобы R10 = R15, а R9 равнялось эквивалентному сопротивлению включенных параллельно резисторов R11 … R14, что обеспечивает полное использование входного диапазона АЦП. Небольшие величины сопротивлений R15 и R10 улучшают линейность за счет снижения фактического размаха напряжения.

Надо заметить, что на практике найти такие значения сопротивлений непросто, однако их можно сделать с использованием резисторов из стандартного ряда номиналов. Нужные сопротивления R13 и R14 можно набрать путем последовательного соединения резисторов 20 кОм, а R9 может состоять из пары параллельно соединенных резисторов 10 кОм, к которым последовательно подключены три параллельных резистора 1 кОм. При использовании этих трех номиналов для всей схемы будет достаточно четырех резисторных матриц и одного отдельного резистора.

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

Использование АЦП микроконтроллера в качестве интерфейса клавиатуры
Рисунок 6. Зависимость входного напряжения АЦП от номера комбинации
нажатых кнопок для схемы на Рисунке 5.

Опыт, приобретенный в процессе создания и исследования схемы, выявил незначительную проблему, связанную с выводом AREF микроконтроллера, потребляющим небольшой ток и вносящим ошибку в опорное напряжение. Ток вывода AREF приводится в справочных данных на микроконтроллер, и может быть учтен. Для компенсации вносимой этим выводом ошибки последовательно с R10 необходимо включить резистор 33 Ом. После такой коррекции экспериментальные результаты, полученные при использовании 8-битного АЦП, отличались от расчетных значений из электронной таблицы не более чем на один отсчет. Разработка программного кода для этой версии схемы оставлена в качестве упражнения для читателей.

Использование АЦП микроконтроллера в качестве интерфейса клавиатуры
Рисунок 7. Макет схемы с четырьмя кнопками.

Есть возможность обойтись вообще без R9 и R10, воспользовавшись напряжением 1.1 В внутреннего источника опорного микроконтроллера. В этом случае сопротивление R15 потребуется изменить с 1 кОм на 1.5 кОм. Однако тогда на результаты измерений будет влиять точность напряжения VCC.

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

Загрузки

Проектные файлы в формате OpenOffice

Перевод: AlexAAN по заказу РадиоЛоцман

На английском языке: Read multiple switches using ADC

66 предложений от 35 поставщиков
Плата на базе микроконтроллера ATmega168, создана на основе открытой архитектуры серии Arduino.Платформа содержит 14 цифровых входов/выходов (6 из которых могут использоваться...
ЗУМ-СМД
Россия
ATMEGA168PA-AU
Microchip
15 ₽
Akcel
Весь мир
ATMEGA168-15MZ
Microchip
от 47 ₽
ATMEGA168PA-AU
Microchip
от 167 ₽
Vess Electronics
Весь мир
ATMEGA168PB-MU
Microchip
по запросу
Электронные компоненты. Бесплатная доставка по России
Для комментирования материалов с сайта и получения полного доступа к нашему форуму Вам необходимо зарегистрироваться.
Имя