Обсуждаем контроллеры компании Atmel.
Ответить

Re: Программная обработка Энкодера на AVR

Ср ноя 16, 2016 13:09:58

Продолжаю. Вчера выкладывал код выдранный из своего генератора импульсов. В отличие от твоего он не помнит предыдущее состояние, а определяет, состояния, в которых может оказаться энкодер при следующем повороте. Сегодня ещё раз посмотрел, не понравилось. Убрал поиск и сразу вытаскиваю из FLASH новые состояния. Код стал ещё короче и уже внедрен в программу генератора.
Вложения
TEST_M8.asm
(1.18 KiB) Скачиваний: 842

Re: Программная обработка Энкодера на AVR

Ср ноя 16, 2016 13:55:20

Demiurg писал(а):Когда более-менее разобрался с си, у меня получилось писать программы так, чтобы компилятор выдавал более-менее приемлемый результат.
как говорилось в анекдоте (это не для прикола, а на полном серьезе), "я рад за вас, сэр!"
и мне приятно, что и ты меня тоже можешь понять.
akl, еще раз спасибо за активное участие и за новый вариант текста. да, текст получился короткий, в ближайшее время проанализирую его.

Re: Программная обработка Энкодера на AVR

Ср ноя 16, 2016 17:18:34

Не могу найти свою картинку, я ее по теме энкодеров выкладывал. В общем, вот картинка. Вместо счетчика D-триггер с подсоединенным D-входом на плюс питания, то есть на нем должна быть постоянно 1. Получается надежная схема выдающая импульсы при соответствующем направлении на соответствующих выходах.
Можно реализовать программно такой способ. Будет время займусь.
Вложения
encoder.jpg
(117.32 KiB) Скачиваний: 680

Re: Программная обработка Энкодера на AVR

Чт ноя 17, 2016 14:27:56

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

Re: Программная обработка Энкодера на AVR

Ср апр 11, 2018 10:50:13

добрый день
есть некоторые непонятки, касательно идеального триггера от автора Demiurg

viewtopic.php?p=2750074#p2750074
Изображение

... Счетный вход - считаем "S" входом. R - так и остается сбросом. Соединяем выход 1 со входом запрета. Выход 0 - инверсный выход триггера. 1 - прямой выход триггера...


ВОПРОСЫ:
- что такое вход запрета?
у D-тригера, если "имеется в виду" тригер CD4013 след. входы/выходы

R - reset
S - set to 1
D - input data
C - clock/synchro
Q0 & Q1 - triger output

- в описании от автора совсем "другой расклад" (S - счетный, R - сброс, Q1 - со входом запрета ... ?)
- возможно имелось в виду 2е разные схемы? (хотя сомневаюсь :)

спасибо

Re: Программная обработка Энкодера на AVR

Ср апр 11, 2018 11:02:44

"Идеальный триггер" можно собрать 3-мя вариантами. К561ИЕ8, у которой и есть вход запрета. Первый идеальный триггер у меня именно на ней и получился. Потом я проанализировал таблицы истинности других микросхем, получились следующие варианты: К561ТМ2, то есть D-триггер и К561ТВ1, JK-триггер. У КМОП микросхем положительная логика. То есть, активный уровень + питания. В отличие от ТТЛ, у которой отрицательная логика.

Re: Программная обработка Энкодера на AVR

Ср апр 11, 2018 13:24:12

ну... умеете вы запутать ... :dont_know:
ладно, подниму свои наработки давно минувших дней... геде там мои рабочие тетради и справочник "пыло" шилиться... фу-ты, "шило" пылиться? :)

Re: Программная обработка Энкодера на AVR

Чт апр 12, 2018 19:47:21

ну... умеете вы запутать ... :dont_know:
ладно, подниму свои наработки давно минувших дней... геде там мои рабочие тетради и справочник "пыло" шилиться... фу-ты, "шило" пылиться? :)

На схеме, которую я выложил К561ТМ2.
К561ИЕ8: 14-счетный вход, "S" вход. 15 "R" вход. 3 вывод - выход "0", инверсный выход триггера. 2 вывод - выход "1", соединен с 13 выводом запрета счета, прямой выход триггера.
Изображение

JK-триггер подключается следующим образом: R-вход, J-вход садится жестко на плюс питания. C-вход служит S-входом. Выходы триггера остаются как есть.

Логика работы "идеального триггера" проста. Пусть у нас в качестве донора К561ИЕ8. Исходное состояние микросхемы - активный уровень на выходе "0". Подаем активный уровень на счетный вход, микросхема переключилась на выход "1". А так как этот выход соединен со входом запрета, то теперь хоть задолбись на счетном входе, микросхема будет в этом состоянии пока ее не сбросят подачей активного уровня на R-вход.

Так же работают и D-триггер и JK-триггер. Входом "S" служат счетные входы. Исходное состояние триггеров - на инверсном выходе 1, на прямом 0. Так как входы D и J жестко посажены на плюс питания, при подаче активного уровня на счетный вход, переносится состояние информационных входов, то есть D или J. А так как на них всегда плюс питания, значит на прямом выходе будет активный уровень. Триггеры будут в этом состоянии, пока их не сбросят подачей активного уровня на R-вход.

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

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

Re: Программная обработка Энкодера на AVR

Пт апр 13, 2018 06:45:41

спасибо, но я уже свои наработки поднял

зю
по поводу вашей схемы, которую вы выложили ранее (и уточнения по поводу КМОП)
На схеме, которую я выложил К561ТМ2.

Изображение
Входы подтяните резисторами на минус питания

следовательно схема будет такой
Изображение
к стати, резисторы в "подтяжке" не только не нужны, но и вредны, все-таки будут на себе собирать наводки, хоть и маленькие, но КМОП их прекрасно может "гип-п-Потетически услышать" :))

далее, проанализировав таблицу истинности, я усомнился в правильности схемы:
Изображение Изображение

исходные данные: S & D - установлены в неактивное состояние

S - не активно, следовательно триггер устанавливается только D-данными на входе по CLK синхроимпульсу
D - на нуле, следовательно триггер синхроимпульсом может только сброшен
т.е. триггер будет находиться в нулевом состоянии, без возможности быть установленным (если он до этого как то не "устанавливается")

возможность повлиять на состояние триггера есть только у R, который получает так-же код грея, от "соседнего" контакта, при таком раскладе, судя по таблице истинности:

Код:
----------
S R | Q1 Q2
----------
0 0 | 1  0
0 1 | 1  1
----------


т.е. изменяется Q2(INV), повторяя форму сигнала на входе

уточнение
Код:
тригер сборошен   : Q1=0, Q2(INV)=1
тригер установлено: Q1=1, Q2(INV)=0


схему Demiurg-а проверял на железе, хоть "она" и не укладывалась в "мою философию"... схема не работает ... и ...

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

отработал схему и отложил, т.к. обработку энкодера возложил на "прерывания" и "доп.код с фильтром"...

вспомнил "эту тему", в связи с тем, что на отладочной плате энкодер неслабо раздолбался, что даже "программная фильтрация" уже не помогала :))

когда разрабатывал "свой триггер", то руководствовался след. мыслями (по памяти)

- триггер должен устанавливаться по синхро сигналу, следовательно
Код:
  на входе D   - единица
  на входе CLK - код грея


- второй триггер не должен "устанавливаться", в тот момент, когда первый триггер уже "активный", следовательно
Код:
  на вход R - активный сигнал от "соседнего" канала


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

- дополнительно: нужен хотя-бы элементарный подавитель "дребезга контактов"

собственно, как-то так я думал тогда давно ... :)) и схема набросалась само-собой, сканы из тетради и игловская схема

Изображение Изображение

с этой схемой раздолбанный энкодер вполне себе помолодел лет эдак на 5ть :))

небольшие выкусы из тетради:

по поводу вх. импульсов:
именно "отр. импульсы" - для срабатывания в конце, иначе сработает ТИК в самом начале, т.е. возможно сильное биение около нейтрального положения, а в нашем случае ТИК срабатывает где-то уже в конце

уточнение
- энкодер 4х тактный, со стандартным кодом грея (полный цикл), это к тому, что есть и "нестандартные энкодеры" :))
- на выходе получаем не "код грея" а уже готовый чистый сигнал INC & DEC, аналогично кнопкам, обработка такого сигнала - прямо благодать какая-то :))

p.s.
схема, вообщем-то, отличается двумя правильными пинами :))) и rc-фильтром (все гениальное, не только простО, но, видимо и имеет одну форму реализации :))) )
Вложения
шило_К561ТМ2_1.jpg
(208.72 KiB) Скачиваний: 775
CD4013_K561TM2_mod.png
(7.31 KiB) Скачиваний: 738
Scan-Notebook2.jpg
(249.95 KiB) Скачиваний: 762
шило_К561ТМ2_2.jpg
(252.06 KiB) Скачиваний: 705
CD4013_K561TM2_wrong_radiokot_shem.png
(3.52 KiB) Скачиваний: 732
Последний раз редактировалось sunjob Сб апр 14, 2018 05:59:21, всего редактировалось 26 раз(а).

Re: Программная обработка Энкодера на AVR

Пт апр 13, 2018 07:26:23

Изображение

Re: Программная обработка Энкодера на AVR

Чт апр 19, 2018 21:35:06

резисторы в "подтяжке" не только не нужны, но и вредны

эвона как меня торкнуло, валериянки переборщил... почему-то подумал про "установочные входы", а не про "счетные"...

а так ДА, счетные входы должны быть "подтянуты" куда либо, каюсь, переборщил с "вкусностями", ну т.е. в "общем"... а в конечной схеме - все нормально... :)) там энкодер подключен соотв. образом

Re: Программная обработка Энкодера на AVR

Вс апр 29, 2018 16:22:53

А в чем, вообще, проблема? Я всегда по любому изменению сигналов на любом из выходов энкодера сравнивал текущее состояние с предыдущим и по таблице принимал решение, что делать: добавить единичку к коду, вычесть, или оставить, как было. На 8-й Меге это очень удобно: разрешаешь прерывания INT0 и INT1 по любому изменению на этих входах. Они у нее у нее подключены к пинам PD2 и PD3, считываешь PIND, выделяешь эти биты по маске 0x0C, присоединяешь к ним старое их значение в битах 0-1 и готова ссылка в 16-байтовую таблицу, в которой закодированы действия по сочетанию старого и нового значений. И на здоровье, пусть себе дребезжит контакт, ну, переключится несколько раз младший бит, перед тем, как все устаканится, и что с того?

Кстати, вот такой энкодер на один щелчок вала делает четыре переключения.

Re: Программная обработка Энкодера на AVR

Пн апр 30, 2018 09:29:33

> А в чем, вообще, проблема?
какая проблема? ау...ууу? кто тут?! никаких проблем... :о)))

что мы тут "устаканивали и обсуждали"? это шум раздолбанного энкодера, дребезг контактов и входной триггер-подавитель дребезга (на старые раздолбанные энкодера весьма не помешает) а если у вас "но_проблем", то вы ломать энкодеры не умеете и вам "все это", что мы тут обсуждали - крайне не нужно ... муррр... :) а случаи бывают и такие, что энкодер/контроллер начинает сильно тупить, и только - триггер/подавитель/спец.микруха ...

Re: Программная обработка Энкодера на AVR

Вс июн 17, 2018 05:51:51

зы. в догонку (один из "подобных" энкодеров, снимок обоих каналов, захват неск.тиков и растяжка)

Изображение Изображение Изображение Изображение
Вложения
2канал_02.jpg
(36.64 KiB) Скачиваний: 451
2канал_01.jpg
(39.81 KiB) Скачиваний: 774
1канал_02.jpg
(38.19 KiB) Скачиваний: 768
1канал_01.jpg
(40.82 KiB) Скачиваний: 610

Re: Программная обработка Энкодера на AVR

Вт июн 19, 2018 19:46:52

О, какая красота. Тут, пожалуй, в самый раз применить интегратор с последующим триггером Шмитта. Я об этом недавно писал, вот здесь, правда там говорили о кнопках, но для такого энкодера это еще нужней.

А у Вас, случайно, не найдется к этому энкодеру тестовая платка с 8-й Мегой? Я тут, по-быстрому, накидал программулю, которая, как раз, и реализует эти интегратор с ТШ. Хотелось бы попробовать на таком энкодере. А то мой энкодер не настолько злобный...

Мега 8, скользяшие контакты энкодера подключены к PC0 и PC1, контакт на ручке - PC2, результаты выдаются на UART (использован только TxD, обратный канал UART не задействован, смотреть в терминалке).

enctst.zip
Проект GCC, Студия 4.19
(35.42 KiB) Скачиваний: 331

Re: Программная обработка Энкодера на AVR

Ср июн 20, 2018 05:37:16

Насколько мне помнится триггеры Шмитта есть в мк AVR.

Re: Программная обработка Энкодера на AVR

Ср июн 20, 2018 07:28:00

> afz
посмотрю, отпишусь

мур-р-р...

зы
упс, а машка та наша уже не наша... :oops:
есть другой энкодер, тоже "капризный", но не такой "злой"

Re: Программная обработка Энкодера на AVR

Пт июн 22, 2018 12:15:45

Demiurg писал(а):Насколько мне помнится триггеры Шмитта есть в мк AVR.
Да, только они "заточены" исправлять неидеальности нормальных цифровых сигналов - затянутые фронты, небольшой "звон" и т.п. Чтобы этот ТШ справидся с той дрянью, которую дает сухой контакт низкого качества (как на приведенных осциллограммах) его совершенно недостаточно.Для такого сигнала необходим, хотя бы, RC-фильтр, который "задавит" выбросы, которые доходят до полных +5В, не говоря уже об уровне "лог 1". То есть, как минимум, еще один резистор и конденсатор на каждый из контактов энкодера, которые надо рассчитать и припаять. Кроме того, не факт, что сигнал после этого фильтра будет иметь требуемый уровень, в смысле, пороги встроенного ТШ окажутся подходящими для этого сигнала. Почти наверняка это будет не так, придется принимать меры по подгонке уровня сигнала к порогам ТШ, а это еще резистор-другой на каждый из контактов. А еще, с расчетом там не так все просто, надо решать задачу аналитически и только потом считать.

Программная же реализация всего этого - два десятка строк кода, подстройка всех фильтраций, порогов и т.п. - несколько констант в программе, я даже не считал - так, прикинул что к чему, решил, что 1600 опросов в секунду хватит, ну и вперед! Оказалось, не хватает, если быстро крутануть ручку энкодера, начинаются сбои. Пришлось сделать 6400 опросов. Я там, кстати, настройку таймера изменил, а комментарий поправить забыл - старая строка с 1600 Гц осталась закомментированной, а в новой, сделанной из этой, код я поправил, а комментарий забыл...

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

Re: Программная обработка Энкодера на AVR

Пт июн 22, 2018 14:49:51

я твой код не проверил, он на 8ку заточен, а у меня только 328 контроллеры (в личку написал подробнее)

Re: Программная обработка Энкодера на AVR

Вт июл 03, 2018 18:25:17

проверка кода afz на злом "энкодере"

- правильно отрабатывает при "нормальном" вращении, но при "быстрых тиках" - затыкается
- проверялся только на "злом" энкодере, на "нормальном" должен отрабатывать правильно :))
- вполне пригоден для повторения/добработки
- подрихтов автором под ATmega328/Arduino-Nano, видимо, и обычная "мандарина" переварит :)
- энкодер примерно такой что и на снимках выше
- подключение : PC0,PC1 - энкодер, PC2 - кнопка
- код достаточно подробно откомментирован (две реализации, немного отличаются, но суть таже)
Вложения
enc328_2.zip
(45.41 KiB) Скачиваний: 369
enc328_1.zip
(44.87 KiB) Скачиваний: 367
Ответить