Как получить положение энкодера во время движения роторного двигателя
У меня вопрос по энкодеру и роторному двигателю. Когда двигатель движется, я не могу получить доступ к положению двигателя. Я запустил код отдельно, все в порядке. Но когда я объединяю эти два кода, двигатель может двигаться, но данных о положении не было.
Любые предложения о том, как заставить двигатель двигаться и одновременно получить положение энкодера.
Написанный мною комбинированный код находится здесь:
#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;
}
@ljsg, 👍0
Обсуждение1 ответ
Пока функция delay()
работает, вы не сможете читать какие-либо данные. Предлагается использовать прерывания, которые по сути гарантируют, что при изменении состояния вашего контакта (нижний фронт, верхний фронт или любое изменение, не стесняйтесь выбирать его), какое-то действие будет выполнено. Это действие может считывать позицию вашего кодировщика.
Прочитайте об этом здесь https://www.arduino.cc/reference/ en/language/functions/external-interrupts/attachinterrupt/
Я уверен, что он ответит на все ваши вопросы, он достаточно хорошо документирован
- Считывание нескольких поворотных энкодеров
- Использование поворотных энкодеров с прерываниями смены контактов
- Выводы прерываний Arduino Mega 2560 и отображение портов с помощью поворотного энкодера
- Взаимодействие с датчиком SSI?
- Будет ли простой RC-фильтр работать с механическим поворотным энкодером или понадобится триггер Шмитта?
- Проблема с преобразованием выходного сигнала поворотного энкодера в угол.
- Чтение двух квадратурных кодировщиков с помощью одного ардуино
- Поворотный энкодер KY-040 пропускает шаги
Вы можете использовать прерывания для поворотного энкодера, @chrisl
https://arduinoprosto.ru/q/40285/problem-with-tachometer-using-attachinterrupt-and-servo/56874, @Juraj