Доброго времени суток. Хочу преобрести вот такой мотор-редуктор с энкодером на базе датчика холла(http://electroprivod.ru/ig-22gm.htm) меня смутило, то что он двух-канальный. Я так понял, что когда колесо движеться в одном направлении, то канал А первый первый выдает сигнал о положении колеса, а канал B в обратном направлении первым выдает сигнал о положении. И вот тут-то я и затупил. Информации о подключении двухканальных энкодеров к ардуино я так и не нашол. В принцыпе ,когда приобрету смогу поэксперементировать, но хотел-бы заранее знать, с чем мне придется столкнуться! Поэтому прошу помощи! Кто знает где достать информацию по считыванию двнных положения с этих датчиков. Мне нужна в принцыпе только одна функция: Что-бы этот мотор двигался туда-сюда и выдавал, колличество пройденных шагов на ардуино! Заранее спасибо!
ссылка говорит not found, но в принципе ясно - если это электропривод, то скорее всего энкодер более -менее стандартный, т.е. имеет три вывода общий-A-В. Для вас проще сделать так- делаете прерывание по А (0->1), и если В==0 то к счетчику +1, если В==1 то к счетчику -1. Если делать прерывание по любому изменению сигнала А, можно сделать вдвое большее разрешение по углу. Но вы начните с предложенного.
счетчик будет показывать к-во импульсов , т.е. пройденных шагов, если уж совсем точно - алгебраическую сумму , с учетом знака. Чтобы понять принцип, нарисуйте график замыкания / размыкания контактов и проверьте на графике предложенный выше алгоритм. У меня работает.
пы сы посмотрите код из с (сode vision), в принципе нетрудно разобраться и перенести его в ардуину энкодер подключен на порты с.5 и d.3, соттв. надо их объявить входами с подтяжкой int CountB; // counter of steps в инициализации прерывание по порду d.3 GICR|=0x80; // разрешаем прерывание по порту d.3 MCUCR=0x08; //Down тут down, я выше написал Up, но это неважно, это лишь сместит фазу GIFR=0x80; // cбрасываем флаг прерывания по порту d3, чтобы при старте в прерывание не лез и собственно сама функция прерывания interrupt [EXT_INT1] void ext_int1_isr(void) { if(PINC.5) CountB--; else CountB++; }
Не хочу вас утруждать и нудить. Но не могли бы вы дать информацию по коду, который вы написали. Я в нем не разобрался.
попробуйте тогда, заюзав хелпы ардуинского ide 1 разрешаем прерывание (есть такая фунция в ide) по порту portD.3 2 прерывание разрешаем по изменению вход порта из 0 в 1 3 в самой функции прерывания пишем { if(PINC.5) CountB--; else CountB++; } ну соотвественно надо посмотреть - pinc.5 это какой вход , или замените pinC.5 например на pinD.4, это будет digital input 4 в ардуине.