Как получить положение энкодера во время движения роторного двигателя

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

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

Написанный мною комбинированный код находится здесь:

  #include <Stepper.h>

    const int stepsPerRevolution = 4000;  // 4000 шагов на один круг с шагом 10 мм.
    const int motorPitchPerCircle = 10;     // 10 мм на круг для линейной шарико-винтовой направляющей двигателя.

    int val;
    int encoder0PinA = 3; // Контакт 15 кабеля.
    int encoder0PinB = 4; // Контакт 13 кабеля.
    int encoder0Pos = 0;
    int encoder0PinALast = LOW;
    int n = LOW;

    // инициализируем библиотеку шаговых двигателей на контактах с 8 по 11:
    Stepper myStepper(stepsPerRevolution, 9, 8, A3, A5);

    void setup() {
      // устанавливаем скорость 60 об/мин:
      myStepper.setSpeed(100);
      // инициализируем последовательный порт:
      Serial.begin(9600);

      pinMode (encoder0PinA, INPUT);
      pinMode (encoder0PinB, INPUT);
      Serial.begin (9600); 
    }

    void loop() {
      // шаг на один оборот в одном направлении:
      myStepper.step(6*stepsPerRevolution);
      delay(2000); 

       n = digitalRead(encoder0PinA);
      if ((encoder0PinALast == LOW) && (n == HIGH)) {
        if (digitalRead(encoder0PinB) == LOW) {
          encoder0Pos--;
        } else {
          encoder0Pos++;
        }
        Serial.print (encoder0Pos);
        Serial.print ("/");
      }
      encoder0PinALast = n;

    }

, 👍0

Обсуждение

Вы можете использовать прерывания для поворотного энкодера, @chrisl

https://arduinoprosto.ru/q/40285/problem-with-tachometer-using-attachinterrupt-and-servo/56874, @Juraj


1 ответ


1

Пока функция delay() работает, вы не сможете читать какие-либо данные. Предлагается использовать прерывания, которые по сути гарантируют, что при изменении состояния вашего контакта (нижний фронт, верхний фронт или любое изменение, не стесняйтесь выбирать его), какое-то действие будет выполнено. Это действие может считывать позицию вашего кодировщика.

Прочитайте об этом здесь https://www.arduino.cc/reference/ en/language/functions/external-interrupts/attachinterrupt/

Я уверен, что он ответит на все ваши вопросы, он достаточно хорошо документирован

,