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

Энкодер+AtMega32a

Вс янв 12, 2020 11:55:39

Уважаемые форумчане, прошу помощи, ибо я уже задолбался биться самостоятельно с текущей проблемой.

Вводная информация. Энкодор ЕС11, от китайцев. МК Atmega32A. Среда разработки AtmelStudio7, язык С++.
Энкодер подключен к PD0,PD2

Изначально пробовал обрабатывать энкодер в общем коде программы. Код имел такой вид:



Вызывал эту функцию в общем коде программы. Работало при медленном вращении энкодера. ОООчень медленном.
Так как основной код получился довольно таки объемным, решил использовать внешние прерывания. Код видоизменился и стал иметь следующий вид:



В таком виде вообще не работат. куча ложнчх срабатываний даже от прикосновения пальцами к энкодеру. в общем что то невразумительное. Пробовал менять энкодер - эффекта нет.
Пробовал добавлять конденсаторы между энкодером и землей - эффекта нет.

Пробовал прикрутить этот код (нашел тут же на сайте), так же не смог заставить работать.


Очень прошу помощи, ибо я уже не знаю куда копать. Перерыл кучу сайтов, перечитал кучу форумов.
Последний раз редактировалось densir Пн янв 13, 2020 05:09:58, всего редактировалось 1 раз.

Re: Энкодер+AtMega32a

Вс янв 12, 2020 13:33:23

Вот Вам реальные осциллограммы с китайского энкодера. Обратите внимание на дребезг. Каждый фронт это прерывание, поэтому их надо запрещать при первом входе в прерывание, ну потом смотреть состояния через некоторое время. Алгоритм получается не простой. Еще хорошо учитывать предыдущее направление вращения.
На 4 и 5 файле дичь в которую превращается такой энкодер :shock: :)).
Вложения
1.png
(136.58 KiB) Скачиваний: 68
2.png
(101.06 KiB) Скачиваний: 83
3.png
(92.42 KiB) Скачиваний: 59
4.jpg
(122.29 KiB) Скачиваний: 65
5.jpg
(129.54 KiB) Скачиваний: 89

Re: Энкодер+AtMega32a

Вс янв 12, 2020 15:49:11

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

Re: Энкодер+AtMega32a

Вс янв 12, 2020 18:19:10

densir писал(а):вообщем
это где?

Re: Энкодер+AtMega32a

Вс янв 12, 2020 18:31:54

Есть ли какие-то жесткие ограничения на скорость и надежность? В смысле, если нужно контролировать скорость вращения двигателя это одно, а если "крутилочка" на приборе - совсем другое.
В простом случае, когда особых требований нет, скорости низкие, а пропуск срабатываний не критичен, можно поступить как с кнопками. Вы же не заводите прерывание для каждой? Так и тут - опрашиваете с каким-то интервалом, сравниваете текущее состояние с предыдущим. Должно получиться 2 бита текущего состояния и 2 предыдущего, итого 4 бита или 16 состояний, из которых 4 (0000, 0101, 1010, 1111) это отсутствие вращение, 4 - поворот по часовой стрелке, 4 - против и еще 4 - ошибка (0011, 0110, 1001, 1100). Комбинации для вращений можете прикинуть просто на бумажке, я их наизусть не помню.

Re: Энкодер+AtMega32a

Пн янв 13, 2020 05:17:08

COKPOWEHEU, нет, требований к скорости нет, просто крутилочка для установки параметров работы.
Как уже писал выше, изначально была функция опроса энкодера, в общем коде, но т.к. код получился объемным, занял практически всю мегу32, то работало только при медленном вращении энкодера. Свободных аппаратных таймеров нет, все задействованы под другие нужды, поэтому и решил попробовать на одном из внешних прерываний. В общем спасибо, мысли появились, попробую реализовать, если не получится-вернусь )

Re: Энкодер+AtMega32a

Пн янв 13, 2020 07:30:00

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

Re: Энкодер+AtMega32a

Пн янв 13, 2020 10:07:04

Свободных аппаратных таймеров нет,

Давненько использовал решения от Л.И. - работало хорошо
http://www.leoniv.diod.club/projects/po ... xs-90.html
см. dxs-90_source.zip (105 kB) - исходник (EWAVR 6.12) - там отдельно Encoder.c и Encoder.h
//Модуль поддержки энкодера

//Выходные сигналы энкодера подаются на порты ENC_F1 и ENC_F2.
//Кнопка энкодера подключена к порту ENC_SB.
//Используется программный опрос (поллинг). Функция Encoder_Exe()
//вызывается в основном цикле. При вращении энкодера или при изменении
//состояния кнопки в переменную Msg помещается код события.
//Этот код может быть считан с помощью функции Encoder_Msg().
//Подавление дребезга энкодера осуществляется на основе анализа стотояний.
//Переход между соседними состояниями не считается событием. Такая обработка
//возможна благодаря тому, что на один щелчок энкодера (на один период
//выходной последовательности) приходится 4 разных состояния.
//Подавление дребезга кнопки осуществляется путем проверки ее состояния
//в течение интервала SWDEBTM. Если состояние неизменно - дребезг закончился.
//При вращении производится счет шагов на интервале VMEASTM.
//Если измеренное количество шагов превышает пороговое значение MaxEncV,
//то формируются коды событий быстрого инкремента или декремента.

Re: Энкодер+AtMega32a

Пн янв 13, 2020 18:46:39

обработку энкодера можно вставить в любой аппаратный таймер

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

Re: Энкодер+AtMega32a

Пн янв 13, 2020 18:51:46

потому я и поставил энкодер в таймер, что у меня основной цикл много медленнее периода таймера

Re: Энкодер+AtMega32a

Вт янв 14, 2020 13:03:20

Коллеги, вы с этими энкодерами (EC11) имели дело? У них неподвижные контакты скользят по вращающемуся диску с "гребенкой" контактов. Диск обычный, стеклотекстолитовый, "гребенка" напечатана фольгой. Через тысячу-другую поворотов контакты становятся откровенно плохими и там возможны всяческие чудеса. В частности, они дребезжат не только при замыкании и размыкании, но и в течении всего времени замкнутого состояния. Мы с коллегой sunjob не так давно обсуждали это, сначала здесь (14-е сообщение на странице и дальше), затем в личке. У меня настолько убитого энкодера не было, поэтому я программировал, а sunjob проверял мои программы на своем энкодере, результаты он выложил в последнем сообщении той же страницы.

DimAlt писал(а):Вот Вам реальные осциллограммы с китайского энкодера.
Угу. Причем осциллограммы 1-3 - это новый хороший энкодер. А 4-5 - это то, во что он превращается после нескольких тысяч оборотов. То есть, если его использовать реально, а не для "поиграть", то надо рассчитывать программу именно на осциллограммы 4 и 5. Алгоритм, заложенный в мою программу с этим справляется...

Ну, или, как вариант, быть готовым регулярно менять этот энкодер.

Да, densir, не забудьте "подтянуть" все контакты энкодера к питанию МК, резисторами не более 10 к, лучше 4.7 к. А еще полезно заземлить (в смысле, соединить с линией 0 вольт МК) кузов энкодера.

Добавлено after 26 minutes:
Да, еще забыл сказать. densir, если задача скоро упрётся в возможности ATmega32A, пора подумать о смене платформы. И не на 64-ю Мегу, а на что-то посерьезнее, например, на STM32. Тот же STM32F103C8T6 сильно дешевле 32-й Меги и во много раз ее превосходит по возможностям и, особенно, по нафаршированности периферией. И пробная платка с ним (т.наз. BluePill) у китайцев стоит копейки.

Re: Энкодер+AtMega32a

Вт янв 14, 2020 15:03:43

oleg110592, я видел этот код, попытался с ходу прикрутить его через внешнее прерывание, очевидно не до конца разобрался и некорректно сделал.

COKPOWEHEU, изначально и сделал в майн, в виде функции. Работало только при медленном вращении энкодера. Код получился объемным, и данные по i2c гонять приходится, с дисплеем работать, динамически грузить в него кириллицу, вычисления с плавающей запятой, и т.п. в общем изначально думал меги 8 хватит. Не хватило. По этому и решил на прерывания перейти.

afz, понятно что энкодер не ахти, но использоваться он бкдет не часто. Задал параметры и пусть дальше работает. У меня такой в паяльной станции самодельной стоит. Уже несколько лет, правда он там практически не используется, так изредка подкорректировать. А вот про заземление, это хорошее замечание, так как энкодер сейчас подвешан на проводках (развел платку без учета работы с внешним прерыванием, пришлось подпаиватся проводками ,что бы подключится к нужному пину с прерыванием) и заметил, что простое касание корпуса иногда вызывают ложное срабатывание прерывания.
А что касается перехода на stm я не на столько крутой) пока мне хватает avr, а использовать в моих поделках stm все равно что стрелять из пушки по воробьям. к выходным, надеюсь, буду дома поэкспериментирую.

Re: Энкодер+AtMega32a

Вт янв 14, 2020 23:42:33

densir писал(а):заметил, что простое касание корпуса иногда вызывают ложное срабатывание прерывания.
А подтянуть входы резисторами не забыл? Внутренняя подтяжка, если не врет мой склероз, порядка 50 кОм, что может быть приемлемо только для батарейных устройств с микропотреблением и без связи с электросетью, а для устройств с сетевым питанием 10 кОм - и то многовато, надо бы 4.7 кОм.

densir писал(а):Пробовал добавлять конденсаторы между энкодером и землей - эффекта нет.
Одного конденсатора мало. Три резистора, диод и конденсатор. Общий провод энкодера на землю, каждый из контактов энкодера через 1 кОм на +5В, с него же через 1 кОм на параллельные диод и 10-100 кОм (подобрать), с них на вход. С этого же входа конденсатор (подобрать, навскидку -0.1 мкФ) на землю. Диод анодом на вход. Подтяжку входа не включать. Смысл такой цепочки - в положении "разомкнуто" конденсатор не торопясь зарядится через три последовательных резистора, скорости должно хватать для того, чтобы при нормальном вращении конденсатор успел зарядиться до следующего переключения (срабатывания второго контакта), но не успевал заметно заряжаться во время дребезга своего контакта (см. осциллограммы). При замыкании же конденсатор быстро разряжается через резистор 1 кОм (второй, который подбираем, зашунтирован диодом) и не успевает заметно зарядиться за время размыканий при дребезге. Скорее всего, такая схема будет прекрасно работать.

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

densir писал(а):код получился объемным, занял практически всю мегу32
densir писал(а):использовать в моих поделках stm все равно что стрелять из пушки по воробьям.
:) Эти два высказывания противоречат друг другу.

И вообще, 32-я Мега - последняя из АВР-ок, которую стоит использовать. Если задача близка к тому, чтобы "упереться" в ее ресурсы, однозначно следует задуматься о переходе на другую платформу.

densir писал(а):А что касается перехода на stm я не на столько крутой)
Да там особой крутизны и не надо - ставишь Кейл, до 32К готовой прошивки он работает без лицензии. Далее бегло просматриваешь соответствующий RM (для F103 это RM0008), потом внимательно изучаешь те его разделы, где описана периферия, которую собираешься использовать, и вперед. Ну, еще прочитать PM0056, там описаны общеАРМовские фенечки, такие, как SysTick и NVIC...

Re: Энкодер+AtMega32a

Ср янв 15, 2020 00:51:25

Да там особой крутизны и не надо - ставишь Кейл, до 32К готовой прошивки он работает без лицензии. Далее бегло просматриваешь соответствующий RM (для F103 это RM0008), потом внимательно изучаешь те его разделы, где описана периферия, которую собираешься использовать, и вперед. Ну, еще прочитать PM0056, там описаны общеАРМовские фенечки, такие, как SysTick и NVIC...

Вот тут не могу согласиться. Сам постепенно перехожу на STM и следы от граблей на лбу еще свежи.
Конечно, не так страшен ARM как его малюют, но отличия существенные.
Самое главное - количество настроек. Там, где у AVR пара 8-битных регистров, у STM десяток 32-битных, причем назначение отдельных полей и их взаимоотношения далеко не всегда понятны только из даташита (если точнее, reference manual'а, но не стоит цепляться к словам). А уж если неважно с английским... Самое интересное, что реально необходимых настроек не так уж много, но их ведь еще надо найти и скомпоновать. Самый простой путь - найти чужой код, который делает примерно то, что нужно, и по строчкам пересказать у себя, постоянно сверяясь с даташитом, для чего строчка нужна, что она делает. Простейший пример - настройка порта. В AVR это единственный бит единственного регистра DDR. Ну, может, еще через PORT с ним потом общаться. В STM же один только режим задается 4 битами. Что самое забавное, в разных контроллерах разными: в F103 это GPIOA->CRL, GPIOA->CRH, а в L151 уже GPIOA->MODER и GPIOA->OSPEEDR. Отдельный регистр для подтяжки, отдельный для выбора альтернативной функции (если порт совмещен с UART, АЦП и т.п.). Вывод бита возможен аж двумя способами (GPIOA->ODR, GPIOA->BSRR). Ну и так далее.
Вторые грабли, на которые наступают столь же часто, как на фьюзы в AVR - тактирование. У AVR-то ладно, там сразу со старта все тактируется от одного источника, настраивать ничего не надо. В STM же мало того, что сам источник выбирается из нескольких вариантов (как минимум, это внутренний RC-генератор и внешний кварцевый), потом идет целая вереница из умножителей и делителей, потом еще по делителю на каждую шину. Но и этого мало. Прежде, чем хоть как-то работать с модулем, на него персонально нужно подать тактовый сигнал. Отдельное веселье начинается, когда возникает желание работать на высокой частоте. Оказывается, встроенная флешка такого не позволяет, так что приходится шаманить с режимом доступа и напряжением ядра.
.
Так что входить в мир контроллеров с STM я однозначно не рекомендую. Вот переходить с более простого семейства - сколько угодно. Хотя бы не придется изучать концепции периферийных модулей и принципов их работы.

Re: Энкодер+AtMega32a

Ср янв 15, 2020 10:06:40

В STM же мало того, что сам источник выбирается из нескольких вариантов (как минимум, это внутренний RC-генератор и внешний кварцевый), потом идет целая вереница из умножителей и делителей, потом еще по делителю на каждую шину. Но и этого мало. Прежде, чем хоть как-то работать с модулем, на него персонально нужно подать тактовый сигнал. Отдельное веселье начинается, когда возникает желание работать на высокой частоте. Оказывается, встроенная флешка такого не позволяет, так что приходится шаманить с режимом доступа и напряжением ядра.

Шаманить не надо - у производителя есть экселевские утилиты для настройки тактирования разных семейств - генерят чистый си с комментариями, по ним и документации потом легко разобраться. Задержки флэшки от частоты автоматом.
В самых простых STM32F0 есть таймера которые работают в режиме энкодера аппаратно и даже аппаратно подавление дребезга.
An external incremental encoder can be connected directly to the MCU without external
interface logic. However, comparators are normally be used to convert the encoder’s
differential outputs to digital signals. This greatly increases noise immunity. The third
encoder output which indicate the mechanical zero position, may be connected to an
external interrupt input and trigger a counter reset.

В снипетсах (примерах) от производителя есть пример настройки таймера в режиме энкодера - всего три строки с комментариями. Примеров только для таймера там 20 штук.
Кейл для F0 для начинающих раздают бесплатно без ограничений.
В мир STM32, имхо, можно переходить без простого семейства - все тоже самое только чуть больше.

Re: Энкодер+AtMega32a

Ср янв 15, 2020 17:06:59

си с комментариями, по ним и документации потом легко разобраться.

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

Re: Энкодер+AtMega32a

Ср янв 15, 2020 18:11:54

нашел на Телесистемах 2008 г. реализацию энкодера ЛИ попроще - тоже работало
http://530.ru/wwwboards/mcontrol/2142/m ... 0350.shtml
когда впервые видишь в документации все развесистое дерево тактирования, это довольно сильно деморализирует

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

это имхо также справедливо и для человека впервые изучающего другие архитектуры микроконтроллеров - учитель лучше.
з.ы. на нашем форуме есть профессиональный учитель микроконтроллеров 8)
https://www.radiokot.ru/forum/viewtopic ... 8#p3505498

Re: Энкодер+AtMega32a

Ср янв 15, 2020 22:24:11

когда запускаешь экселевскую утилиту

Оно еще и на макросах, то есть работать скорее всего не будет.
это имхо также справедливо и для человека впервые изучающего другие архитектуры микроконтроллеров - учитель лучше.
Для самостоятельного изучения живой учитель обычно неудобный, учебник лучше. Вот только по ARM не видел учебника "с нуля". Почти все начинают с установки какой-нибудь IDE, хорошо если не Куба. Где уж тут мечтать о начале с низкого уровня. С AVR в этом смысле гораздо лучше.

Re: Энкодер+AtMega32a

Чт янв 16, 2020 09:26:00

на макросах, то есть работать скорее всего не будет

все работает в офисе 2003/2007. На всякий: офис 2003/2007 работает на самой последней виндовс10 и линукс, весит мало, можно установить только эксель, 2003 лучший офис (имхо) я пользуюсь и знакомые пользуются. Писал - сгенерить тактирование один раз и потом легче разобраться, сам генерил последний раз очень давно, сейчас с новым смсис требует небольшой правки, внешний генератор не умеет (надо добавить один бит по документации), можно существенно подсократить.
Вот только по ARM не видел учебника "с нуля"

Есть - см. в теме BOB51
https://www.radiokot.ru/forum/viewtopic ... 5#p3716625
"Практический курс микропроцессорной техники на базе процессорных ядер ARM-Cortex-M3/M4/M4F"
там есть:
- ОСНОВЫ ДВОИЧНОЙАРИФМЕТИКИ
- ВВЕДЕНИЕ В МИКРОПРОЦЕССОРНУЮ ТЕХНИКУ
-АРХИТЕКТУРА ПРОЦЕССОРНЫХ ЯДЕР ARM CORTEX-M3/4/4F
и т.д.
Что представляет собой эта книга?
Учебник для студентов
Книга написана на основе многолетнего опыта преподавания курсов «Компьютерная и микропроцессорная техника в электроприводе», «Микропроцессорные средства в электроприводе», «Системы управления электроприводов», «Электропривод с вентильными и шаговыми двигателями» в Национальном исследовательском университете «МЭИ» для студентов электротехнических специальностей, а также практического опыта создания серий цифровых систем управления электроприводов и силовых преобразователей для отечественной промышленности.

з.ы. подобных книг для AVR не встречал

Re: Энкодер+AtMega32a

Чт янв 16, 2020 13:47:43

все работает в офисе 2003/2007. На всякий: офис 2003/2007 работает на самой последней виндовс10 и линукс

Так а в обычном офисе-то работает? Например, у меня сейчас установлен 6.1.5
На2003 лучший офис (имхо)
счет табличного редактора спорить не буду, у меня к нему требований немного. Но вот текстовый процессор у майкрософта неудобный. Writer явно лучше.
сам генерил последний раз очень давно

Да не нужны эти автоконфигураторы на самом деле. Там пару битовых полей записать, причем почти всегда одинаковые. Один раз изучается по даташиту, потом копипастится из проекта в проект.
"Практический курс микропроцессорной техники на базе процессорных ядер ARM-Cortex-M3/M4/M4F"
Спасибо, ознакомлюсь. Правда, из того, что я видел, тоже неоправданно много текста уделено среде разработки.
з.ы. подобных книг для AVR не встречал

Например, Ю.Ревич "Занимательная электроника", я с нее начинал.
Еще курс ДиХалта хорош.
Ответить