Easyelectronics.ru

Электроника для всех
Текущее время: 20 окт 2018, 03:18

Часовой пояс: UTC + 5 часов



    • JLCPCB - Прототипы 10 PCBs всего за 2$ (100*100mm, 2-layer)
    • Как мы делаем платы, смотрите на YouTube
    • Крупнейшая китайская фабрика прототипов. 300000+ заказчиков и 10000+ заказов в день!
    • LCSC - Крупнейший китайский онлайн магазин комплектующих.

Начать новую тему Ответить на тему  [ Сообщений: 16 ] 
Автор Сообщение
 Заголовок сообщения: Опрос клавиатуры и энкодеров по SPI
СообщениеДобавлено: 10 янв 2018, 01:46 
Заглядывает иногда
Аватара пользователя

Зарегистрирован: 19 июн 2013, 22:36
Сообщения: 39
Как обещал, опишу свое изобретение.
Возможно, не там где надо, тему создал. Все-таки, это больше к теории схемотехники относится. Извиняйте и поправьте, если, что.

При разработке самодельных устройств на микроконтроллере, часто возникает проблема подключения к нему большого количества элементов управления, таких как кнопки и инкрементальные энкодеры, и ограниченного количества свободных выводов контроллера. Существует много способов решения этой задачи, таких как: использование микроконтроллера с большим количеством выводов; матрицирование элементов управления; использование мультиплексоров; и т.д. Но у всех этих способов есть свои недостатки. В этой статье, я хочу предложить еще один способ решения задачи, лишенный, по моему мнению, многих из этих недостатков. Суть этого метода, заключается в использовании распространенного, последовательного интерфейса SPI микроконтроллера c применением микросхем десятичных счетчиков.
Ниже, приводится схема, успешно использованная в одной из моих поделок. Схему немного доработал и упростил, но должна работать:
Вложение:
Kbd.GIF
Kbd.GIF [ 74.92 Кб | Просмотров: 1335 ]

Основными элементами этой схемы являются недорогие микросхемы — десятичные счетчики: HEF4017B и такой-же, недорогой и доступный буферный элемент с тремя состояниями на выходе: SN74LVC1G125DBVR.
Линии SCK, KBD_CS, EXT_INT, MISO подключаются к выводам микроконтроллера. SCK и MISO – стандартные сигналы интерфейса SPI и должны быть подключены к соответствующим выводам МК. Линия EXT_INT должна быть подключена к выводу контроллера, способному генерировать внешнее прерывание на переход с логической 1 на 0. С помощью этого сигнала, контроллер узнает, что произошло нажатие какой либо кнопки или поворот ручки энкодера и запускает процедуру опроса элементов управления. Линия управления схемой KBD_CS, по назначению, аналогична стандартному сигналу CS (Chip Select), используемому во всех схемах подключаемых по SPI и подключается к любому управляемому выводу микроконтроллера.
При логической единице на линии управления KBD_CS, схема находится в режиме ожидания. Выход схемы MISO находится в высокоимпедансном состоянии и интерфейс SPI свободен для общения контроллера с другими функциональными блоками. В этом режиме все выходы десятичных счетчиков находятся в состоянии логического нуля, а выход EXT_INT, наоборот, притянут к логической единице на линии KBD_CS, через резистор R2. Таким образом, при нажатии любой кнопки или замыкании контактов любого энкодера, выход EXT_INT притянется к логическому нулю на соответствующем выводе счетчика, а в контроллере сработает прерывание на переход с логической 1 на 0.
При срабатывании внешнего прерывания вызванного изменением состояния одного из элементов управления, в обработчике вектора этого прерывания, контроллер выдает на линию KBD_CS логический ноль, тем самым переводя схему в рабочий режим и запускает процедуру опроса состояний элементов управления. По завершении опроса, контроллер должен вновь выдать логическую единицу на линию KBD_CS, тем самым переводя схему в режим ожидания.
В рабочем режиме схемы, когда на линии KBD_CS логический ноль, этот сигнал поступает на вход OE выходного буферного элемента, и он переводится в режим передачи состояния со входа A на выход Y подключенного к линии MISO. В этом режиме, логический ноль с линии KBD_CS поступает на управляющий вывод MR счетчика IC3 и он так-же переводится в рабочий режим. В этот момент, выход O0 счетчика IC3 переходит в состояние логической единицы, а на всех остальных выходах этого счетчика, как и на всех выходах счетчика IC2, остается логический ноль. Таким образом, счетчики приводятся в исходное состояние, и схема готова к опросу.
При обмене по SPI, контроллер посылает счетные импульсы по линии SCK и побитно передает данные из своего выходного регистра по линии MOSI и принимает данные во входной регистр по линии MISO. В нашем случае никакие данные из контроллера в схему не передаются, поэтому линия MOSI не используется. Передачу по SPI в контроллере необходимо настроить таким образом, чтобы прием и передача битов информации происходила по переднему нисходящему фронту счетного импульса, а сдвиг данных в регистрах — по заднему восходящему фронту.
Наши десятичные счетчики устроены таким образом, что при прохождении восходящего фронта счетного импульса по входу CP0, очередной по порядку выход On переводится в состояние логической 1, а предыдущий выход On-1 возвращается в состояние логического 0. Таким образом, при прохождении счетных ипульсов SCK интерфейса SPI, во время опроса состояния схемы контроллером, логическая единица, последовательно перепрыгивает с одного выхода счетчика на следующий. И если этот выход счетчика замкнут кнопкой или контактами энкодера со входом A выходного буфера, то логическая единица передается на выход Y буфера и на выход MISO схемы, где и забирается контроллером в момент прохождения нисходящего фронта следующего счетного импульса. Если-же контакты управляющего элемента связанного с очередным выходом счетчика разомкнуты, то на входе A выходного буфера остается логический ноль, т.к. он, через диод VD4 и резистор R3 притянут к нулю на KBD_CS, и этот ноль контроллер заберет на линии MISO на следующем шаге.
Теперь разберемся с остальными элементами схемы:
Конденсатор C1 служит для гашения паразитных импульсов вызванных дребезгом контактов управляющих элементов во время нажатия кнопок или поворота ручки энкодера.
Диод VD1 припятствует прохождению положительных импульсов напряжения на кондесатор C1 во время опроса, препятствуя его заряду и отдаче положительного уровня обратно в схему при разряде.
Резисторы R5 – R15 служат для гашения тока короткого замыкания на выводах счетчиков, во время опроса схемы, в случае замыкания контактов сразу нескольких управляющих элементов.
Практическое применение инкрементальных энкодеров показало, что в ряде случаев их контакты могут оставаться замкнутыми после поворота ручки и ее отпускания. Это приводит к тому, что при замыкании контактов другого управляющего элемента прерывание не срабатывает. Это происхдит потому, что линия прерывания остается прижатой к нулю и ее невозможно подтянуть к единице для следующего срабатывания. Для обхода этой неприятности служат цепи R16, C2 и R17, C3. Эти цепи прозрачны для импульсов тока протекающего через конденсаторы в момент замыкания контактов и при смене логического состояния выхода счетчика, но затрудняют протекание постоянного тока при долговременном эамыкании цепи что позволяет подтянуть линию EXT_INT к логической единице для срабатывания прерывания.
На элементах R4, VD2, VD3 собрана логическая схема монтажного И, служащая для передачи управления со счетчика IC3 на счетчик IC2 по завершении восьмого по счету импульса SCK. Таким образом реализуется возможность получения нескольких последовательных байтов данных с элементов управления связанных с разными счетчиками. Т.е. количество опрашиваемых элементов управления можно практически, неограниченно увеличивать, путем такого последовательного подключения десятичных счетчиков. Более подробное описание последовательного подключения см. в даташите на HEF4017B.
Теперь самый сложный в понимании момент. Для понимания направления вращения ручки энкодера, нам необходимо знание состояниия замкнутости обеих цепей между его выводами 3-2 и 1-2. Но совсем не обязательно, и даже вредно, каждый раз вызывать прерывание, как при замыкании цепи выводов 3-2 так и при замыкании цепи выводов 1-2. Для того, чтобы знать, что ручку энкодера повернули в ту или иную сторону, достаточно срабатывания прерывания в момент замыкания одной из этих цепей. В нашем случае, прерывание вызывается только при замыкании цепи выводов 3-2. А цепи выводов 1-2 обоих энкодеров, когда схема находится в режиме ожидания, разорваны закрытым транзистором VT1. Но в рабочем режиме схемы, в исходном ее состоянии, когда вывод O0 счетчика IC3 находится в состоянии логической единицы, транзистор открыт за счет протекания тока через переход эмиттер-база и резистор R1. (Диод VD5 блокирует обратный ток через транзистор и R1 на KBD_CS). Таким образом, при опросе, контроллер сможет узнать, замкнута или разомкнута цепь выводов 1-2 одного из энкодеров. Т.к. цепи выводов 1-2 обоих энкодеров подключены к выходу O0 первого по порядку опроса счетчика, соответствующего нулевому биту входного регистра интерфейса SPI. То значение 1 в нем будет означать, что цепь выводов 1-2 одного из энкодеров замкнута, а значение 0, будет означать, что эта цепь разомкнута. Следовательно, по состоянию нулевого бита первого принимаемого по SPI байта, мы можем узнать в какую сторону повернут один из энкодеров. Но какой-же энкодер был повернут? Это уже проще. Т.к. цепи выводов 3-2 наших энкодеров не объединены в одну, как цепи выводов 1-2, и каждая из них подключена к собственному выходу счетчика, то по состоянию битов принятого байта, сопоставленным этим выходам, мы однозначно сможем определить, какой из энкодеров был повернут.

Для наглядности, рассмотрим рисунок ниже. На нем изображены временные диаграмы состояний цепей выводов 1-2 и 3-2 энкодера ENC1 при повороте его ручки в ту и другую стороны:
Вложение:
Graph.GIF
Graph.GIF [ 37.93 Кб | Просмотров: 1335 ]

Цепь выводов 3-2 энкодера ENC1 подключена к выходу O1 первого по порядку опроса счетчика. Следовательно, если первый бит первого принятого по SPI байта равен 1, то это значит, что была повернута ручка именно энкодера ENC1. А по состоянию нулевого бита можно узнать в какую сторону была повернута эта ручка. Если нулевой бит равен 1, то ручка была повернута по часовой стрелке. А если он равен 0, то ручку повернули против часовой стрелки.
Таким же образом можно узнать и состояние энкодера ENC2, приняв, что его линии выводов 3-2 подключены к выходу O2 счетчика и отображаются на второй бит первого принятого байта. Значение байта 0x05 (b00000101) говорит, что ручка ENC2 повернута по часовой стрелке. А значение — 0x04 (b00000100) говорит, что ручка ENC2 повернута против часовой стрелки.

Ниже приведу поясняющие куски исходного кода программы:
Show

Еще несколько замечаний:
Если опрашивать только кнопки, то все просто и логично как 3 копейки. Но если используются энкодеры, то это самые быстро меняющиеся управляющие элементы. И поэтому их надо опрашивать как можно быстрее, и подключать в самое начало опроса. Емкость конденсатора C1 напрямую зависит от качества управляющих элементов. При использовании энкодеров ее надо подбирать особенно тщательно, чтобы дребезг, как можно более эффективно гасился, и в то-же время не задерживался опрос энкодеров. Оптимальное значение емкости C1 лежит в диапазоне 100 — 1000 pf. Если используются только кнопки, время опроса особо экономить не требуется. В этом случае можно выбрать значение C1 = 0.1uf и не париться. Так-же, необходимо правильно выбрать скорость работы SPI (частоту SCK), чтобы она не превышала максимальную частоту срабатывания счетчиков и в то-же время не тормозила опрос энкодеров.
Теперь, как-бы, надо подвести итоги:
Считаю, что получилось вполне жизнеспособное, достаточно элегантное, универсальное и, тем не менее, очень недорогое решение проблемы кнопок и энкодеров. Не лишенное некоторых недостатков, но и обладающее неоспоримыми преимуществами, перед методами программного ногодрыга и неоправданного расточительства пинов. Главное достоинство этого решения — экстремально малое число необходимых пинов контроллера для опроса, теоретически, неограниченного количества управляющих элементов. Учитывая то, что итерфейс SPI довольно широко используется, и с ним обычно работает сразу несколько различных функциональных блоков устройства, и можно считать, что линии SCK и MISO, часто, достаются на халяву. То опрос кучи кнопок и энкодеров по двум оставшимся проводам (причем один из них — линия прерывания и в опросе не учавствует) — это совсем неплохо. Метод очень универсален в применении микроконтроллеров. Даже если угораздит нарваться на контроллер лишенный SPI, его легко реализовать программно. И очень легко расширяем.
Конечно, есть недостатки. Нельзя, например, одновременно, двумя руками крутить энкодеры, и нажимать одновременно несколько кнопок. Но это не такой-уж большой недостаток, не приводящий к каким нибудь фатальным последствиям и легко отсекающийся программно. Неправильная комбинация просто не примется и ничего не произойдет. Пока не придумал как можно сделать матрицу элементов с использованием счетчиков (типа, один счетчик на столбцы, другой на строки) без применения большого количества дополнительных деталей. Наверное не получится зацепить большое количество энкодеров. Наверное есть еще...

Наверно скажете "фу - какое-то любительство". Но зато, теперь я точно знаю, как буду зацеплять кнопки в своих будущих поделках.

На этом все. Простите, что так много букв и начинайте ругать! :)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Опрос клавиатуры и энкодеров по SPI
СообщениеДобавлено: 10 янв 2018, 02:00 
Старожил
Аватара пользователя

Зарегистрирован: 09 июн 2016, 13:49
Сообщения: 290
Откуда: Севастополь
А чо сразу ругать ? По-моему, для любительской конструкции - отлично.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Опрос клавиатуры и энкодеров по SPI
СообщениеДобавлено: 10 янв 2018, 02:03 
Старожил

Зарегистрирован: 10 окт 2014, 00:48
Сообщения: 5006
Прошу извинения у ТС за свой откровенно свинский пост. Однако, предложу альтернативный вариант - STM32 в корпусе TQFP48 (32 для тех, у кого трудности с ЛУТ).


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Опрос клавиатуры и энкодеров по SPI
СообщениеДобавлено: 10 янв 2018, 07:39 
Старожил
Аватара пользователя

Зарегистрирован: 28 дек 2011, 11:24
Сообщения: 3762
Откуда: г. Липецк
Изобретение так себе, вместо счетчиков обычно используют 74НС595, MOSI и SCK по своему прямому назначению. Так гибче, можно опросить то что требуется в данный момент.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Опрос клавиатуры и энкодеров по SPI
СообщениеДобавлено: 10 янв 2018, 10:27 
Старожил

Зарегистрирован: 26 ноя 2012, 10:28
Сообщения: 2860
Откуда: КЧР, поселок Нижний Архыз
u37 писал(а):
Прошу извинения у ТС за свой откровенно свинский пост. Однако, предложу альтернативный вариант - STM32 в корпусе TQFP48 (32 для тех, у кого трудности с ЛУТ).

Можно вообще 20-рублевый STM8S003 в 20-ногом корпусе взять. И общаться по CAN-шине…
Но здесь предложена реализация, не требующая программирования дополнительных МК, да и CAN-трансиверы недешево стóят (20 рублей за TJA1050T).


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Опрос клавиатуры и энкодеров по SPI
СообщениеДобавлено: 10 янв 2018, 11:23 
Старожил

Зарегистрирован: 26 ноя 2012, 10:28
Сообщения: 2860
Откуда: КЧР, поселок Нижний Архыз
В тему: на али наткнулся на TM1637 — управление по I2C, работа с шестью 8-сегментными индикаторами и 16 кнопками. Знатную, однако, штуку китайцы придумали: за 15 рублей получаем освобождение огромного количества ног. Надо будет поиграться с этой мелкосхемой (как минимум — написать код под STM8 и STM32 для работы с ней).


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Опрос клавиатуры и энкодеров по SPI
СообщениеДобавлено: 10 янв 2018, 11:46 
Старожил

Зарегистрирован: 23 мар 2017, 14:45
Сообщения: 3736
Чисто имхо:
решение элегантное, но в устаревшем стиле, приблизительно так наверное конца 90-х прошлого века.
Использованы дополнительно 3 корпуса микросхем. (Не считая диодов, прочей мелочухи.)
Почему бы вместо тех трех не поставить одну: дополнительный МК?
Я так делал, когда мне не хватало ног. Насколько дороже? - ну на 50 руб наверное (зависит, какой МК). Но зато:
- никаких диодов, и подобной лабуды;
- произвольность в определении ног;
- дополнительный объем памяти;
- распараллеливание обработки ввода.

Первые два пункта облегчают и упрощают разводку платы,
последние два - облегчают программирование устройства как целого, так как в дополнительный МК можно вынести нехилый кусок кода, связанный со вводом: обработку быстрых энкодеров независимо от основной программы, контроль корректности введенных данных и вообще всё оформление пользовательского интерфейса.
И все эти плюшки за +50 руб или около того? - мой выбор был предрешен)))))))


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Опрос клавиатуры и энкодеров по SPI
СообщениеДобавлено: 10 янв 2018, 12:00 
Старожил
Аватара пользователя

Зарегистрирован: 14 апр 2014, 11:06
Сообщения: 1330
Откуда: Курск
Про дребезг (энкодер)
Если почитать теорию то окажется, что дребезг есть когда контакты замыкаются и его нет когда размыкаются
Потом можно сесть, нарисовать сигналы A и B с дребезгом применительно к Вашему энкодеру. Потом немного подумать
И может оказаться, что аппаратно бороться с дребезгом тонкой настройкой RC нет смысла
Это только мои домыслы


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Опрос клавиатуры и энкодеров по SPI
СообщениеДобавлено: 10 янв 2018, 13:10 
Заглядывает иногда
Аватара пользователя

Зарегистрирован: 19 июн 2013, 22:36
Сообщения: 39
Кот495 писал(а):
Почему бы вместо тех трех не поставить одну: дополнительный МК?
Я так делал, когда мне не хватало ног. Насколько дороже? - ну на 50 руб наверное (зависит, какой МК). Но зато:...
Я предложил свое решение как альтернативу многоногим МК, мультиплексорам и сдвиговым регистрам. Вы предложили свой вариант, как альтернативу моему варианту. Так и должно быть. И да, Ваше решение, наверное лучше. Я подумаю. Но решать за и против, все равно, придется в каждом конкретном случае.
В продолжение Вашей мысли, можно придумать универсальное решение для дополнительного контроллера клавиатуры и/или энкодеров, напрошивать их сразу несколько в прок и ставить когда и куда потребуется. Может, кто предложит решение лучше Вашего? Неужели в природе не существует готовых (заводских), недорогих и доступных контроллеров клавиатуры? Может я не так искал?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Опрос клавиатуры и энкодеров по SPI
СообщениеДобавлено: 10 янв 2018, 13:17 
Заглядывает иногда
Аватара пользователя

Зарегистрирован: 19 июн 2013, 22:36
Сообщения: 39
Eddy_Em писал(а):
В тему: на али наткнулся на TM1637 — управление по I2C, работа с шестью 8-сегментными индикаторами и 16 кнопками. Знатную, однако, штуку китайцы придумали: за 15 рублей получаем освобождение огромного количества ног. Надо будет поиграться с этой мелкосхемой (как минимум — написать код под STM8 и STM32 для работы с ней).

Посмотрел. Да на первый взгляд - отличный вариант, надо поковырять....


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Опрос клавиатуры и энкодеров по SPI
СообщениеДобавлено: 10 янв 2018, 13:37 
Старожил

Зарегистрирован: 26 ноя 2012, 10:28
Сообщения: 2860
Откуда: КЧР, поселок Нижний Архыз
За 65 центов продают на али платку как раз для игр с этим чипом: чип + индикатор на 4 позиции. можно чуть дороже взять - там еще кнопочки напаяны (но их и так можно самому подпаять).


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Опрос клавиатуры и энкодеров по SPI
СообщениеДобавлено: 10 янв 2018, 16:28 
Старожил
Аватара пользователя

Зарегистрирован: 17 апр 2010, 08:38
Сообщения: 4851
Откуда: Усинск, республика Коми
Эди, а ссылку?

_________________
хаос это непознанный порядок


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Опрос клавиатуры и энкодеров по SPI
СообщениеДобавлено: 10 янв 2018, 16:44 
Старожил

Зарегистрирован: 26 ноя 2012, 10:28
Сообщения: 2860
Откуда: КЧР, поселок Нижний Архыз
Вот. А что, в поиске забанили?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Опрос клавиатуры и энкодеров по SPI
СообщениеДобавлено: 11 янв 2018, 00:06 
Старожил

Зарегистрирован: 23 мар 2017, 14:45
Сообщения: 3736
Cthulhu писал(а):
Про дребезг (энкодер)
Если почитать теорию то окажется, что дребезг есть когда контакты замыкаются и его нет когда размыкаются
Потом можно сесть, нарисовать сигналы A и B с дребезгом применительно к Вашему энкодеру. Потом немного подумать
И может оказаться, что аппаратно бороться с дребезгом тонкой настройкой RC нет смысла
Это только мои домыслы
А мои не домыслы, потому что с механич. энкодером я игрался. Так вот, его процедура в результате получилась изрядно навороченной. Я даже не ожидал. И при этом RC-цепь оказалась тоже нелишней и улучшила стабильность результата.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Опрос клавиатуры и энкодеров по SPI
СообщениеДобавлено: 11 янв 2018, 00:19 
Старожил

Зарегистрирован: 11 сен 2012, 11:19
Сообщения: 5101
Kot, аппаратный на стм работает прекрасно.
В чем трабл?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Опрос клавиатуры и энкодеров по SPI
СообщениеДобавлено: 11 янв 2018, 00:35 
Старожил

Зарегистрирован: 23 мар 2017, 14:45
Сообщения: 3736
В том, что во время небыстрого проворота, в состоянии когда оба контакта замкнуты - дребезг продолжается, и может быть воспринят как быстрая пачка шагов в произвольную сторону.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 16 ] 

Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB