Как определить направление вращения с помощью датчика времени энкодера (фотоэлектрический датчик скорости)?

Я делаю игровой руль своими руками и застрял. Для измерения вращения колеса я использую диск с датчиком энкодера, который обычно используется в принтерах. - https://robu.in/product/photoelectric-speed-sensor-encoder -coded-disk-code-wheel.

Эта функция используется во многих учебных пособиях на YouTube. Но я никак не могу понять, как пользоваться этим датчиком.

Пожалуйста, помогите мне разобраться: с помощью этого датчика, как -

  1. Измерить, насколько повернулось колесо?

  2. Узнайте, в каком направлении вращается колесо (по часовой стрелке, против часовой стрелки).

PS: я пытался использовать энкодер, но он не может определить вращение при вращении двигателя на 1000 об/мин. Хотелось бы понять почему.

Спасибо!

, 👍0

Обсуждение

Из описания товара непонятно, 1 или 2 фототранзистора у датчика. Если он имеет только 1, вы не можете почувствовать направление. Если их два, это простое кодирование A/B, как и любой поворотный энкодер. Можете ли вы предоставить более конкретную и подробную таблицу данных?, @chrisl


1 ответ


1

Это похоже на кодирование A/B: если A становится выше B, это в одну сторону (например, подсчет), а если B становится выше A, это наоборот (десчет). Итак, подключаем питание и землю. Затем подключите два провода к входным контактам:

    int P_A=2; int P_B=3; //Входы
    long int position = 0; //Положение колеса
    long int lastPosition = 0; //последняя позиция колеса: для вычисления скорости

Обратите внимание, что один контакт должен быть контактом аппаратного прерывания (Uno 2 и 3 являются контактами прерывания. Затем подключите прерывание в stup:

    attachInterrupt(2, wheel, RISING);  //колесо произвольное

Затем создайте код прерывания:

    void wheel(){
        int sB = digitalRead(P_B);
        if (sA == sB)   { //По часовой стрелке
        position++;
        }
        else   { // против часовой стрелки
        position--;
        }

Затем в своем цикле вы можете распечатать позицию, когда она изменится, чтобы прочитать текущую позицию:

    if(lastPosition != position){
        Serial.println(position);
    }

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

,

У меня проблемы с пониманием этого. Не могли бы вы предоставить фрагмент кода?, @Ashish Gogna