roboforum.ru

Технический форум по робототехнике.

Работа с Энкодером

Программирование микроконтроллеров AVR, PIC, ARM.
Разработка и изготовление печатных плат для модулей.

Re: Работа с Энкодером

Сообщение dccharacter » 18 мар 2011, 12:29

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

О, так это ж капчур в чистом виде. Вешаем энкодер на капчур, ставим делитель 4-ку, в прерывании беснуемся... Если еще какие-нить буфферы сделать, можно будет снова три энкодера пихать в один 50-ти рублевый ПИК??? это ж не i2c...

Добавлено спустя 3 минуты 2 секунды:
т.е. 4 енкодера - в 1827 четыре капчур-канала. А таймера три... странно... ну или три.
Мой волшебник это я сам. Всю архитектуру программы придумал лично, а ребята помогли воплотить её. Я бы и сам мог написать, но лень учить язык и его конструкции.
Аватара пользователя
dccharacter
 
Сообщения: 4995
Зарегистрирован: 10 дек 2010, 13:16
Откуда: Красногорск МО
прог. языки: C, Python, wiring/processing
ФИО: Андрей

Re: Работа с Энкодером

Сообщение boez » 18 мар 2011, 13:20

А, сорри, я тоже невнимательно глянул, там обработчик на любой фронт повешен - значит и правда надо 170 кГц. Наверное придется отказаться от digitalRead, повесить энкодер на 2 соседние ноги (к примеру 2 и 3) и сделать что-то наподобие
Код: Выделить всёРазвернуть
const signed char Decode[4] = {0,1,-1,0};
...
void doEncoder() {
    encoder0Pos += Decode[PIND>>encoder0PinA];
}

Или не выделываться и назначить прерывание только по фронту, тогда и частота упадет, и обработчик упростится:
Код: Выделить всёРазвернуть
void doEncoder() {
    if (PIND&(1<<encoder0PinB))
        encoder0Pos++;
    else
        encoder0Pos--;
}
boez
 
Сообщения: 1981
Зарегистрирован: 27 авг 2008, 10:45
Откуда: Харьков
прог. языки: С/С++

Re: Работа с Энкодером

Сообщение Michael_K » 18 мар 2011, 13:26

В любом случае это достаточно напряженно, если что-то кроме энкодера еще нужно делать.
Софтово решать такие штуки можно, но это не очень-то красиво. Если речь идет о серьезных проектах (в данном случае это, вероятно, не так), то я бы не особо рассчитывал на программные решения, честно. Но это, конечно, имхо.
Аватара пользователя
Michael_K
 
Сообщения: 6028
Зарегистрирован: 07 окт 2009, 00:29
Откуда: СПб

Re: Работа с Энкодером

Сообщение dccharacter » 18 мар 2011, 13:39

Michael_K писал(а):В любом случае это достаточно напряженно, если что-то кроме энкодера еще нужно делать.
Софтово решать такие штуки можно, но это не очень-то красиво. Если речь идет о серьезных проектах (в данном случае это, вероятно, не так), то я бы не особо рассчитывал на программные решения, честно. Но это, конечно, имхо.

Я соглашусь - я год строил лазерные часы, уперся в драйвер двигателя (даже описывал свои приключения в теме "жарю блины") - спалил три драйвера из-за флюса, черт бы его побрал (http://we.easyelectronics.ru/warning_gu ... el-tt.html - не я писал, но ППКС - Анатолий, Михаил, ну предупреждать же надо про такую бадягу!!!! столько сил и денег потрачено...). В итоге купил 8-ми выводную микруху в соике за 100 рублей, на которую тупо подаю ШИМ и ВООБЩЕ никаких проблем. Но пониманию процесса это не содействует. А с BDLC движками я процентов на 70 разобрался, пока блины жарил. Так что либо время, либо опыт :-)
Мой волшебник это я сам. Всю архитектуру программы придумал лично, а ребята помогли воплотить её. Я бы и сам мог написать, но лень учить язык и его конструкции.
Аватара пользователя
dccharacter
 
Сообщения: 4995
Зарегистрирован: 10 дек 2010, 13:16
Откуда: Красногорск МО
прог. языки: C, Python, wiring/processing
ФИО: Андрей

Re: Работа с Энкодером

Сообщение Michael_K » 18 мар 2011, 13:53

boez писал(а):Или не выделываться и назначить прерывание только по фронту, тогда и частота упадет, и обработчик упростится:

Так делать нельзя. Представьте, что у вас вал гуляет около этого фронта - он же считать будет в одну сторону постоянно. Смысл квадратурного энкодера теряется.
Аватара пользователя
Michael_K
 
Сообщения: 6028
Зарегистрирован: 07 окт 2009, 00:29
Откуда: СПб

Re: Работа с Энкодером

Сообщение boez » 18 мар 2011, 16:35

А, ну да, в режиме "удержание позиции", типа как в серве, это будет основным рабочим режимом, так не пойдет :) Хотя при обычном вращении и нечастых реверсах - вполне нормально, а нагрузку на проц снижает раза в 2.5.
Ну и вообще - если в иксмеге есть декодер, надо брать ее - и АВР, и работает с энкодером.
boez
 
Сообщения: 1981
Зарегистрирован: 27 авг 2008, 10:45
Откуда: Харьков
прог. языки: С/С++

Re: Работа с Энкодером

Сообщение NorthStar » 18 мар 2011, 17:23

А кто знает - на оптическом квадратурном энкодере нужно ли что-нибудь делать для борьбы с дребезгом контактов?
NorthStar
 
Сообщения: 317
Зарегистрирован: 13 сен 2010, 12:47

Re: Работа с Энкодером

Сообщение =DeaD= » 18 мар 2011, 17:29

Вы не томите, предложенный мной код помог или как? :)
Проект [[Open Robotics]] - Универсальные модули для построения роботов
Аватара пользователя
=DeaD=
 
Сообщения: 24218
Зарегистрирован: 06 окт 2004, 18:01
Откуда: Ебург
прог. языки: C++ / PHP / 1C
ФИО: Антон Ботов

Re: Работа с Энкодером

Сообщение NorthStar » 18 мар 2011, 23:35

Сорри. Я когда ваш ответ увидел, то уже разобрал этот макет.
Я скоро вернусь к этому вопросу - обязательно проверю. Просто плата Arduino у меня одна, а идей много..)
NorthStar
 
Сообщения: 317
Зарегистрирован: 13 сен 2010, 12:47

Re: Работа с Энкодером

Сообщение Duhas » 19 мар 2011, 06:35

NorthStar писал(а):А кто знает - на оптическом квадратурном энкодере нужно ли что-нибудь делать для борьбы с дребезгом контактов?

если говорить о готовых покупных нормальных.. типа тех же ЛИР, то там все ок с этим.. просто нужен адекватно шустрый обработчик...
«Как сердцу выразить себя? … Мысль изреченная есть ложь!»
В этом мире меня подводит доброта и порядочность...
"двое смотрят в лужу, один видит лужу, другой отраженные в ней звезды"
Аватара пользователя
Duhas
 
Сообщения: 6338
Зарегистрирован: 15 сен 2007, 13:03
Откуда: Красноярск
прог. языки: ASM(МК), C(PC)
ФИО: Гагарский Андрей Александрович

Re: Работа с Энкодером

Сообщение =DeaD= » 19 мар 2011, 08:31

NorthStar писал(а):для борьбы с дребезгом контактов?

А с чего бы дребезг? Промежуточные состояния может? Тогда - триггер шмитта.
Проект [[Open Robotics]] - Универсальные модули для построения роботов
Аватара пользователя
=DeaD=
 
Сообщения: 24218
Зарегистрирован: 06 окт 2004, 18:01
Откуда: Ебург
прог. языки: C++ / PHP / 1C
ФИО: Антон Ботов

Re: Работа с Энкодером

Сообщение NorthStar » 20 мар 2011, 00:25

Кстати, а что такое ЛИР? Можно ссылку иль чертеж?
NorthStar
 
Сообщения: 317
Зарегистрирован: 13 сен 2010, 12:47

Re: Работа с Энкодером

Сообщение Michael_K » 20 мар 2011, 00:44

Аватара пользователя
Michael_K
 
Сообщения: 6028
Зарегистрирован: 07 окт 2009, 00:29
Откуда: СПб

Re: Работа с Энкодером

Сообщение Rm86 » 06 сен 2011, 13:31

Некоторое время назад делал драйвер. Обрабатывал 2 энкодера, управлял мостом MOSFET, и все это по командам UART
Делал на PIC16f1936.
Обработку энкодеров сделал следующим образом:
Инициализирую таймеры 0 и 1 для счета:
Код: Выделить всёРазвернуть
        OPTION_REG = 0b00101000; // Инкремент по фронту RA4 делитель 32
// Настройка таймера 1 - для счета инкремента ДО
   T1CON   = 0b10000100;
   T1GCON   = 0b00000000;
   TMR1ON = 1;

Постоянно, пока програма находится в режиме ожидания, в бесконечном цикле main определяю направление вращения для каждого энкодера:
Код: Выделить всёРазвернуть
      temp_a1 = RC0;         
      temp_a2 = RA4;
      while (!clock_reg.byte){ // Если нет текущих заданий
         if (temp_a1 !=RC0){  // Изменился счетный вход второго энкодера
            if (RC0){
               if (ENC_B2) //Вход "направление"
                  a1_inc_flag = 1;  //направление "вперед"
               else
                  a1_inc_flag = 0;  //направление "назад"
            }
         }
         if (temp_a2 !=RA4){  // Изменился счетный вход первого энкодера
            if (RA4){
               if (ENC_B1) //Вход "направление"
                  a2_inc_flag = 1;
               else
                  a2_inc_flag = 0;
            }
         }


Каждые 10мс по флагу прерывания считываю показания счетных таймеров и в зависимости от полученных битов направления, инкрементирую или декрементирую их:
Код: Выделить всёРазвернуть
         if (a2_inc_flag)
            Angle_E2 += TMR0;
         else
            Angle_E2 -= TMR0;
         TMR0 = 0;
         if (a1_inc_flag)
            Angle_E1 += TMR1;
         else
            Angle_E1 -= TMR1;
         TMR1 = 0;   


Сразу предостерегу: у такого метода счета есть небольшая погрешность в моменты изменения направления вращения. В моей задаче направление менялось редко и плавно, поэтому ошибкой я пренебрегал.
Rm86
 
Сообщения: 1
Зарегистрирован: 06 сен 2011, 13:01

Пред.

Вернуться в Микроконтроллеры

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2