Подключение фотоэлектрических инкрементальных энкодеров

Тема в разделе "Arduino & Shields", создана пользователем Saimong, 13 апр 2018.

  1. Saimong

    Saimong Нуб

    Добрый день, форумчане.
    Ардуину купил позавчера, так что не судите строго, а лучше помогите с проблемой. Есть необходимость снятия показаний одновременно или почти одновременно с четырех советских фотоэлектрических энкодеров BE178A5. Как один подключить я разобрался, а как подключить дв а и более пока сообразить не могу. Может кто нибудь знает как это реализовать? Или мне придется на каждый энкодер ставить по своей ардуине и потом связывать их? Ниже приведен рабочий скетч с одним таким энкодером.
    /*Encoder ВЕ178А5*/
    #define Signal_A 2
    #define Signal_B 3
    unsigned int A = 0;
    unsigned int B = 0;
    /**/
    void setup() {
    pinMode(Signal_A, INPUT);
    pinMode(Signal_B, INPUT);
    Serial.begin(9600);
    attachInterrupt(digitalPinToInterrupt( Signal_A), interrupt, RISING);
    }
    void interrupt()
    { char i;char j;
    i = digitalRead( Signal_B);
    if (i == 0)//Счёт нулей
    A += 1;
    else
    B += 1;
    }
    void loop() {
    int grA=A-B;
    Serial.print("a=");
    Serial.println(grA*0.36);//Вывод значений угла поворота в градусах
    delay(200);
    }
     
  2. DetSimen

    DetSimen Guest

    я думаю, до правильно запрограммированных фотоэнкодеров ты дайдёшь только на второй год обучения, а не на третий день. Что мешает начать со светодиодика и кнопочки?
     
    parovoZZ нравится это.
  3. parovoZZ

    parovoZZ Гуру

    Saimong


    Энкодер запросто может остановиться в запрещённом положении. И твой код рухнет =)
     
  4. Saimong

    Saimong Нуб

    Я спрашивал про два энкодера, то есть про возможность работы двух счетчиков импульсов одновременно, а не про кнопки с лампочками, если не знаете ответа и не имеете дельного совета то можно было и не писать сюда.
     
  5. Saimong

    Saimong Нуб

    Нет, не может энкодер остановиться в запрещенном положении, таких положений не существует, он может крутится сколько угодно и в одну и в другую сторону, считывая при этом количество полученных нулей прога выдаст угол, проблему я описал в вопросе, если знаете как сделать так напишите совет, а не злорадствуйте.
     
  6. a1000

    a1000 Гуру

    Не скажу, что я асс в программировании, но мне кажется, что на одной плате это не получится. Отсчёт импульсов производится в прерывании. А пока МК висит в прерывании, он больше ни на что не реагирует. Поэтому, пока крутится один из энкодеров, на остальные никакой реакции не будет.
     
    Saimong нравится это.
  7. Saimong

    Saimong Нуб

    Спасибо за мысли, я тоже вообщем к такому выводу пришёл, придется значит на каждый датчик повешать по наноардуинке, а потом свести все эти данные в один файл, ну и видимо тогда придется завести синхронизирующую временную метку, чтобы собрать все это.
     
  8. parovoZZ

    parovoZZ Гуру

    Если в энкодере есть электроника, отслеживающая это - то да.
    На абдурино языке можно обработать только два энкодера. Если писать на Си - больше.
    В архитектуре AVR прерывания становятся в очередь по мере их поступления.
     
  9. a1000

    a1000 Гуру

    Ну почему, на меге 6 прерываний.
    Может я и преувеличиваю, но будут-ли успевать обрабатываться импульсы от четырёх энкодеров? Не будет пропусков?
     
    Saimong нравится это.
  10. parovoZZ

    parovoZZ Гуру

    Давай сразу на СТМ32 - в нем таймеры аппаратно энкодеры поддерживают.
    Ещё пообедать успеет. Для МК энкодер как для нас черепаха.
     
    Saimong нравится это.
  11. mcureenab

    mcureenab Гуру

    Можно сделать опросом состояний пинов. Тогда нужны только цифровые входы. И в целом этот подход простой и надёжный. Позволяет работать с кучей энкодеров. Ну только что энергии для питания МК нужно больше.

    На прерываниях нужно обрабатывать CHANGE от выводов A и B. Прерывание от A даёт возможность читать стабильное состояние B и наоборот. А так же определить направление движения в предыдущем прерывании.

    Если прерывание от A и состояние B не изменилось - это дребезг или колебания вблизи перехода выхода A. Ничего не делаем. Если состояние B изменилось, то направление изменения B( HIGH->LOW или LOW->HIGH) и прежнее состояние A укажет направление движения.
    Аналогично для прерывания от B, только смотреть надо на A.

    Если не накручивать сложные функции максимальная скорость вращения видимо будет ограничена только датчиком.
     
    Последнее редактирование: 13 апр 2018
    Saimong нравится это.
  12. parovoZZ

    parovoZZ Гуру

    У АВР все входы PCINT обладают прерываниями. Для 328 это все ноги. Так-то.
     
    Saimong нравится это.
  13. Saimong

    Saimong Нуб

    Есть хоть какой то пример кода с "кучей энкодеров"?, энергия не проблема)
     
  14. Saimong

    Saimong Нуб

    Так получилось запустить два энкодера одновременно, прочитал))), что у Ардуинки 2,3 пины с прерыванием, как запустить прерывание еще на двух? и можно ли это сделать)
    /*Encoder ВЕ178А5*///Управление двумя энкодерами
    #define Signal_A 2
    #define Signal_B 4
    #define Signal_C 3
    #define Signal_D 5
    unsigned int A = 0;
    unsigned int B = 0;
    unsigned int C = 0;
    unsigned int D = 0;
    /**/
    void setup() {
    pinMode(Signal_A, INPUT);
    pinMode(Signal_B, INPUT);
    pinMode(Signal_C, INPUT);
    pinMode(Signal_D, INPUT);
    Serial.begin(9600);
    attachInterrupt(digitalPinToInterrupt( Signal_A), inter, RISING);
    attachInterrupt(digitalPinToInterrupt( Signal_C), interrupt, RISING);
    }
    void inter()
    { char i;
    i = digitalRead( Signal_B);
    if (i == 0)
    A += 1;
    else
    B += 1;
    }
    void interrupt()
    { char j;
    j = digitalRead( Signal_D);
    if (j == 0)
    C += 1;
    else
    D += 1;
    }
    void loop() {
    int grA=A-B;
    int grC=C-D;
    Serial.print("a=");
    Serial.println(grA*0.36);//Вывод значений угла поворота в градусах
    Serial.print("c=");
    Serial.println(grC*0.36);//Вывод значений угла поворота в градусах
    delay(1000);
    }
     
  15. parovoZZ

    parovoZZ Гуру

    Вешаешь энкодеры так, чтобы каждый из них был но одном порту. Затем считываешь целиком порт и сравниваешь по маске. Таким образом за раз можешь обработать сразу 4 энкодера.
     
  16. a1000

    a1000 Гуру

    Да, но это можно реализовать на Си. А человеку надо а Arduino IDE.
     
  17. mcureenab

    mcureenab Гуру

    Так в Arduino IDE порты тоже доступны.
     
  18. mcureenab

    mcureenab Гуру

    Этот код в некоторых ситуациях будет работать неправильно и непредсказуемо.
    Он и сам по себе ненадёжный. И с энкодером могут быть проблемы. Он только в одну сторону вращается?

    И пользуйся кнопочкой для форматирования кода.
     
  19. mcureenab

    mcureenab Гуру

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

    http://easyelectronics.ru/avr-uchebnyj-kurs-inkrementalnyj-enkoder.html

    Функцию нужно на массивы переделать и опрашивай столько энкодеров, сколько влезет.
    Правда, на счёт этой статьи у меня тоде есть сомнения.
     
  20. parovoZZ

    parovoZZ Гуру

    Лично я себе никаких рамок не ставлю.
    В Abduino IDE разве не Си?