Прошу помощи или подскажите в какую сторону копать
Есть енкодер, подключенный к микроконтроллеру(atmega8) к ножкам PINB.2, PINB.1. схема подключения - стандартная
с1,с2 = 0,1 мкф, r1,r2 = 10 ком
Но вот проблема в том, что иногда при бистром повороте в одном направление, "программа" может подсчитать 10 положительных импульсов и 3 отрицательных, хотя должно быть 13 положительных. И наоборот.
Хотя бы задержки. Алгоритм прост. Словили нажатие, подождали, проверили ещё раз, если осталось - значит окей. Сколько обычно длится дребезг контактов механических энкодеров подскажет ещё кто-то.. Ну или сами поищите, я не помню. Не сильно долго, 5мс это жирно, имхо.
Качественное и безопасное устройство, работающее от аккумулятора, должно учитывать его физические и химические свойства, профили заряда и разряда, их изменение во времени и под влиянием различных условий, таких как температура и ток нагрузки. Мы расскажем о литий-ионных аккумуляторных батареях EVE и нескольких решениях от различных китайских компаний, рекомендуемых для разработок приложений с использованием этих АКБ. Представленные в статье китайские аналоги помогут заменить продукцию западных брендов с оптимизацией цены без потери качества.
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
Насколько могу судить, при смене состояний AB -> B -> AB -> B ... диск фактически стоит на месте, а программа неуклонно шагает вверх. Поправьте меня, пожалуйста, если я ошибаюсь.
_________________ Любой дурак может писать код. Настоящий профессионал - это тот, кто способен постоянно создавать продукт высокого качества, укладываясь при этом в бюджет. J. Ganssle
Спасибо, посмотрел. Этот вариант понравился гораздо больше - аккуратная автоматная реализация, явно не боящаяся дребезга и дрожания диска.
(Разве что я бы еще добавил флаг ошибки при запрещенных переходах, например, из state_0 в state_3: полезно знать о том, что лезут помехи или контроллер не угоняется за скоростью диска; но это уже детали).
Вопрос не в том, что в принципе невозможно корректно работать с энкодером (чай не бином Ньютона), а в корректности конкретной реализации, которая предложена как рабочая.
_________________ Любой дурак может писать код. Настоящий профессионал - это тот, кто способен постоянно создавать продукт высокого качества, укладываясь при этом в бюджет. J. Ganssle
Насколько могу судить, при смене состояний AB -> B -> AB -> B ... диск фактически стоит на месте, а программа неуклонно шагает вверх. Поправьте меня, пожалуйста, если я ошибаюсь.
Ничего подобного происходить не будет. Для этой ситуации есть проверка EncCur != EncPrevPrev. Наоборот, в этой реализации имеется механический гистерезис. Чтобы произошел инкремент или декремент, должны последовательно пройти 3 состояния энкодера. При дрожании ручки энкодера между двумя соседними состояниями никакого изменения редактируемой величины происходить не будет. Чем, кстати, страдают многие варианты функций обработки энкодера. К тому же, это позволяет отказаться от обычного подавления дребезга, основанного на повторном считывании состояния с задержкой. Такое подавление вызывает пропуски шагов при большой скорости вращения. Данную реализацию обработки сигналов энкодера тестировал на предмет соответствия тактильных ощущений и реакции на поворот энкодера. Ведь для момента переключения можно выбрать разные условия. Остановился именно на таком варианте. Теперь использую его во всех проектах, никаких нареканий нет. Вот полный текст модуля:
Код:
//----------
//Модуль поддержки энкодера
//Энкодер подключается к портам ENC_F1 (фаза 1) и ENC_F2 (фаза 2). //Для подавления дребезга используется анализ двух последовательных //состояний. Это позволяет обойтись без временных задержек. //Функция Encoder_Init() должна вызываться один раз в начале программы. //Функция Encoder_Exe() должна вызываться в основном цикле. //При повороте энкодера на шаг вправо или влево вызываются функции //To_Do_Step_Up() и To_Do_Step_Dn() соответственно.
Ничего подобного происходить не будет. Для этой ситуации есть проверка EncCur != EncPrevPrev.
Точно, прошу прощения. Слишком быстро просматривал текст.
_________________ Любой дурак может писать код. Настоящий профессионал - это тот, кто способен постоянно создавать продукт высокого качества, укладываясь при этом в бюджет. J. Ganssle
В STM32 есть аппаратная поддержка энкодера, по этому программно не пройдет защита от дребезга. Проанализировав промсхемы сделал так: В схеме топикстартера последовательно с выходами энкодера поставил резисторы номиналом 15-25% от подтягивающего. Дребез полностью пропал.
Ну и как-же, всё-таки, бороться с преславутым дребезгом? Делать задержки, ставить тригерные защёлки.... А каков на самом деле самый изящный метод, применимый и к микроконтроллерам?
_________________ Порой мне кажется, что я делаю какое-то дерьмо, но когда я вижу, что делают другие, то я чувствую себя гением...
Тот же самый, что и при приеме бита по уарту. Три раза прочитали вход, за значение принимаем тот уровень, который встречается два или три раза. Я делаю так:
Код:
// каждые 20..30 мсек old_key= key; key= PINX.Y; if(old_key && !key) push= 1; // момент нажатия if(!old_key && key) pop= 1; // момент отпускания if(old_key && key) NotPressed= 1; // не нажата if(!old_key && !key) Pressed= 1; // удерживается нажатой
Задержки в самой программе - наиболее распространенный и универсальный вариант. Три раза ловить нажатие не нужно, достаточно одного. Суть в том, чтобы после первого сигнала о нажатии заблокировать кнопку на короткое время, чтобы пропустить дребезг. Может быть есть какие-нибудь библиотеки для организации задержки на разных кнопках, для тех же AVR. Думаю, правильная организация защиты от дребезга в программе и будет наиболее изящным решением. Но я таких правильных универсальных решений не знаю, всегда приходится делать по разному под конкретную программу.
А кто будет ресетить флаги состояния? else не хватает...
blackx писал(а):
Суть в том, чтобы после первого сигнала о нажатии заблокировать кнопку на короткое время
Это если кнопку. А если произвольный механический контакт, энкодер, например? Там ловля срабатывания по любому фронту чревата "странной" логикой работы... Лучше все таки фильтровать фронт срабатывания буфером на 2...3 бита.
Единого рецепта нет, есть разные способы, как программные, так и аппаратные.
К слову сказать, есть свежий цикл статей в журнале "Everyday Practical Electronics", называются "Mastering Rotary Encoders", 2013 год, номера 10-12. К сожалению, именно про удаление дребезга энкодера там нет ничего полезного, но просто по удалению дребезга интересно почитать, особенно про раритетные аппаратные способы. Язык - английский.
Последний раз редактировалось SmarTrunk Ср янв 15, 2014 08:50:43, всего редактировалось 2 раз(а).
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 12
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения