Оптический энкодер
- Войдите на сайт для отправки комментариев
Сб, 28/09/2019 - 11:57
Тяжко мне работать с энкодерами, не даются они мне.
Имеется такая конструкция:
Шестерня" может крутиться в обе стороны. Красная и синяя полосы это оптические датчики, если зуб шестерни не заслонил датчик, на выходе 1, если заслонил - 0. (конструкция готовая, переделать её нет возможности).
В каком положении остановится шестерня неизвестно.
Мне нужно чтобы при вращении по часовой стрелке переменная увеличивалась, против - уменьшалась.
Помогите реализовать логику работы.
Обработчик прерываний по одному из датчиков должен проверять в каком состоянии другой датчик и если он активен, то прибавляем, если нет - убавляем.
Надо сразу определится с режимом 1 зуб 1 шаг переменой или же 1 зуб 2 шага с переменой. Отличие в том что у зуба шестерни 2 стороны. А значит один датчик при движении в одну сторону фиксирует 1 фронт и 1 спад. Сложность энкодеров в том что бы не пропустить это измение уровня из-за нагрузки на мощность вычислительной системы. А в случае механического энкодера еще и подавить дребезг. Что на больших скоростях вращения проблематично так как время прохода зуба может оказаться больше времени защиты от дребезга. Из-за чего переходят на оптику.
Всего в шестерне 90 зубьев.
Соответственно переменная должна быть от 0 до 90
Главное понимать в какую сторону он крутится, а сколько там зубьев не важно-может его несколько оборотов решили крутить в одну сторону ...
С этим у меня и сложность, узнать в какую сторону крутится.
В #1 я описал принцип.
С этим у меня и сложность, узнать в какую сторону крутится.
Печатаю и ламинирую шестерню, скоро отпишусь
PS...
Я чего подзатупила то...смотрю на свой рисунок из первого сообщения, и думаю. ведь зуб шестеренки закрывает оба датчика...а по факту то он закрывает только один, зубчик узкий, как раз между датчиками помещается и закрывает их по очереди...
Значит надо раздвинуть датчики на разные зубья.
Ширина зуба должна уметь закрыть и открыть оба датчика одновременно . Иначе энкодер не выйдет
Ширина зуба должна уметь закрыть и открыть оба датчика одновременно . Иначе энкодер не выйдет
Сейчас узнаю точно, закрывает или нет.
Зуб закрывает оба датчика, всё правильно.
A_Read и B_Read это чтение пинов ардуино (соответственно первый и второй оптический датчик)
Правильное решение?
Запустите пример из библиотеки.
Тот что на прерываниях.
Только кондерчики поставьте 10-100 нан.
И вам сразу станет ясно работает ли ваше размещение датчиков.
Датчики работают, это я проверила, зуб закрывает оба датчика, промежуток между зубами - открывает оба датчика
A - B // 0-0;0-1;1-1;1-0 ну и так далее 90 раз за весь оборот шестерни в одном направлении
Так, вроде, попроще будет?
Датчики работают, это я проверила, зуб закрывает оба датчика, промежуток между зубами - открывает оба датчика
Я же вам советую не проверить то что они работают,
а то что они работают по правилам работы инкрементального энкодера.
Сделала шестерню из картона, 20 зубьев.
A - B // 0-0;0-1;1-1;1-0 ну и так далее 90 раз за весь оборот шестерни в одном направлении
Результат за 1 оборот шестерни - 12 или 13
Мой скетч показывает 19-20
Датчики работают, это я проверила, зуб закрывает оба датчика, промежуток между зубами - открывает оба датчика
Не поняла какой библиотеки
Я про энкодер.
https://github.com/PaulStoffregen/Encoder
А вы о чем?
Работает.
80 прерываний на оборот (20 зубьев)
Библиотека не использует паузы? Остальные функции будут работать стабильно?
Один из примеров работает по прерываниям.
Я как-то этой библиотекой проверял энкодер 1024 импульса на оборот после ремонта.
Заменял заклинившие подшипники.
Разборка и сборка только в патроне токарного станка.
Потом пришлось постепенно пододвигать фотодиск к датчику пока не добился четкой работы.
Там зазор 0.3мм примерно
Крутил несколько сот оборотов в одну сторону и потом обратно.
.
Закреплённая стрелка-указатель чётко возвращалась на прежнее место.
Я не поняла, как мне сбросить переменную position
Как сбросить myEnc.read()
К примеру,
if (position>=20){
Тяжко мне работать с энкодерами, не даются они мне.
Имеется такая конструкция:
Шестерня" может крутиться в обе стороны. Красная и синяя полосы это оптические датчики, если зуб шестерни не заслонил датчик, на выходе 1, если заслонил - 0. (конструкция готовая, переделать её нет возможности).
В каком положении остановится шестерня неизвестно.
Мне нужно чтобы при вращении по часовой стрелке переменная увеличивалась, против - уменьшалась.
Помогите реализовать логику работы.
Ты не у тех спрашиваешь! Тут в основном тусуются кодеры теоретики, а не состоявшиеся программисты, которые способны что-то реальное сотворить!
Логика работы тут простая -
1 - Если энкодер вращается по часовой стрелке, то первым ВСЕГДА будет изменять свое состояние синий датчик, а потом красный.
2 - Если против часовой, то наоборот - первым ВСЕГДА будет изменять свое состояние красный датчик, а потом синий.
3 - Если один из датчиков (ЛЮБОЙ), ДВА раза ПОДРЯД, изменит свое состояние, а другой датчик останется в неизменном состоянии, то произошло изменение направления вращения энкодера.
Программно сначала фиксируешь состояние обоих датчиков, а потом смотришь какой датчик изменился. По этому изменению определяешь направление вращение энкодера, ну а дальше либо инкрементируешь рабочий счетчик, либо декрементируешь его. В подпрограмме обработки прерываний ловишь все фронты импульсов обоих датчиков, и как только обнаруживаешь сбой очередности срабатывания датчиков, меняешь направление счета рабочего счетчика.
Если нужен "строгий" подсчет срабатываний датчков, то при каждом изменении направления подсчета, необходимо принудительно прибавлять(или вычитать) единицу в рабочий счетчик. Если этого не сделать, то при частых сменах направления вращения энкодера будет накапливаться системная ошибка!
alex_ivanoff_31 спасибо за разъяснения.
До сегодняшнего дня я не интересовалась аппаратной стороной работы энкодера.
Разобралась, всем спасибо.
Один (сдвоенный оптический датчик считает зубья), второй датчик,тот что на фото, обнуляет круг (такая конструкция, не я придумала).
https://youtu.be/eZbc9EriKHw
Иринка, а вот интересно. Только одному мне сдаётся что вы мужик? Давайте уж начистоту.
Что-то новое, конечно, интересное)
маленький довесок к
Логика работы тут простая -
ТУТа есть картинка и график и написано немного больше... за код в статье ничего не скажу, а за принцип работы "для чайникоф" 5+
тут холловский датчик описан (один из вариантов)... про оптические энкодеры будет тоже самое и информаии тоже масс, я имею ввиду принципы работы.
как бы там ни было : оптический, механический и холловский энкодеры работают про одному принципу, а вот сигналы с них можно получить разные....
Вообще-то на моей памяти три энкодера:
Инкрементальный, инкрементальный с Z каналом и абсолютный
маловато будет... всю статью не читал и в ней не хватает механических... ниже источник и выдержка из текста