Комментарии 9
перевод статьи как закрутить лампочку... с помощью домкрата...
вместо кучи условий можно сделать таблицу размером 16 и состояниями +1, -1, 0 и fault - на вход подаются 4 бита: предыдущее состояние и новое, ну и логичнее считать переменную внутри, а не слать в уарт
fault тоже желательно обрабатывать, потому как ошибка счетчика - выдача неверного положения с кучей проблем типа поломка контуров foc, ПИД регуляторов и исполнительных устройств в принципе
Есть же магнитные еще энкодеры. Линейные стоят тоже несколько долларов. С кольцевыми сложнее. Но кольцевые оптические можно найти надорогие, или просто сделать из пары датчиков концевых и кружка с дырками, что стоит меньше доллара в сумме.
Кстати, есть аппаратные декодеры, например LS7366R и аналоги из того же семейства. Обрабатывать программно можно только, наверное, ручной энкодер, который используется пользователем для ввода информации с какого-нибудь пульта и который вращается относительно медленно.
Если необходимо обрабатывать квадратурные сигналы с какого-нибудь датчика вращения или станочного энкодера с разрешением 2500 имп/оборот, скорости микроконтроллера может и не хватить и он начнет пропускать импульсы или же будет заниматься только этим.
Аппаратный декодер можно собрать также на нескольких микросхемах ттлш логики.
Сделать диодное ИЛИ, и пустить выход на прерывание - будет любой фронт. На обычный входной порт пустить выход любого из каналов до диода. Итого - пришло прерывание - значит обнаружен любой фронт. Смотрим потенциал - если там 1, значит фронт был с CW (или CCW - в зависимости от того, как подключили) вывода. Этой информации достаточно, чтобы раскодировать направление вращения.
Не получится, переходы с 10 или 01 на 11 не будут детектироваться.
Да-да, я внимательно посмотрел и понял, что если вход прерывания только один - то нужны и диоды, и потенциальный сигнал с обеих выходов. Теперь сижу думаю, нельзя ли соорудить какую-нибудь диодно-конденсаторную обвязку, чтобы по полярности импульса сразу судить о направлении вращения..
PS - если бы мог - сам бы себе поставил за предыдущий коммент минус
Второй метод использует код Грея. В этом случае нам не нужны никакие прерывания вообще.
чтобы запускать эту процедуру в прерывании каждый раз, когда счётчик переполняется
Метод без прерываний требует прерываний ?
То есть либо тратим такты на бесполезную обработку в основном цикле, либо такты в бесполезной обработке таймера, даже если энкодер не двигается.
Уж лучше в прерывании от ноги все это делать
Очень смело использовать внутренние подтягивающие резисторы.
Инкрементальный энкодер: подключение и обработка его с помощью AVR (ATmega8/16/32/168/328)