Не удалось получить показания для "Двигателя с энкодером"
Я написал на форуме DFRobot, кто производит двигатели FIT0186, но, похоже, там никто не отвечает. Так что извините за вставку копии. Вероятно, это проблема с двигателем/кодером, но, возможно, это связано с arduino. Я использую Nano и драйвер двигателя на базе TB6612 от DFRobot.
Я пытаюсь заставить встроенный кодировщик работать для FIT0186.
Пример вики-кода не работает, и я изменил его, насколько мог, используя разумные изменения. Я подключаю оба выхода датчика Холла A и B к прерываниям.
В настоящее время, когда я подключаю 12 В, он вызывает прерывание, но, кроме этого начального импульса, никаких прерываний не происходит.
Двигатель движется, как и ожидалось. Прикрепляю свой код. У кого-нибудь работает кодировщик?
const byte encoder0pinA = 2;
const byte encoder0pinB = 3;
volatile int posA;
volatile int posB;
int DIR1 = 8;
int PWM1 = 9;
void setup()
{
Serial.begin(115200);
pinMode(DIR1, OUTPUT);
pinMode(PWM1, OUTPUT);
pinMode(encoder0pinA,INPUT);
pinMode(encoder0pinB,INPUT);
attachInterrupt(digitalPinToInterrupt(encoder0pinA), encoderA, RISING);
attachInterrupt(digitalPinToInterrupt(encoder0pinB), encoderB, RISING);
}
void loop()
{
Serial.print("Pulse:");
Serial.println(posA);
Serial.println(posB);
noInterrupts();
posA = 0;
posB = 0;
interrupts();
delay(100);
int value;
digitalWrite(DIR1, HIGH);
for(value = 0 ; value <= 255; value += 5)
{
analogWrite(PWM1, value); //PWM Speed Control
delay(20);
}
Serial.print("Pulse:");
Serial.println(posA);
Serial.println(posB);
delay(100);
for(value = 255 ; value >= 0; value -= 5)
{
analogWrite(PWM1, value); //PWM Speed Control
delay(20);
}
Serial.print("Pulse:");
Serial.println(posA);
Serial.println(posB);
delay(100);
digitalWrite(DIR1, LOW);
for(value = 0 ; value <= 255; value += 5)
{
analogWrite(PWM1, value); //PWM Speed Control
delay(20);
}
Serial.print("Pulse:");
Serial.println(posA);
Serial.println(posB);
delay(100);
for(value = 255 ; value >= 0; value -= 5)
{
analogWrite(PWM1, value); //PWM Speed Control
delay(20);
}
}
void encoderA()
{
posA++;
}
void encoderB()
{
posB++;
}
@djb, 👍0
Обсуждение1 ответ
Лучший ответ:
Из того, что вы указали (правильно подключены), высока вероятность того, что у вас плохое соединение. Это может быть одна из многих вещей, таких как незакрепленный провод, обрыв провода, проблема с модулем и т.д... Поменяйтесь местами A и B и посмотрите, что произойдет.
Спасибо, у меня был датчик Холла gnd и vcc задом наперед., @djb
- Чтение квадратурного энкодера в реальном времени с полным разрешением только с одним прерыванием на ATmega328
- Работа двигателя в течение 3 секунд непрерывно с прерыванием и без него
- Использование прерывания внутреннего таймера для чтения аналогового датчика
- Мгновенная остановка двигателя при неисправности датчика Холла
- Использование поворотных энкодеров с прерываниями смены контактов
- Выводы прерываний Arduino Mega 2560 и отображение портов с помощью поворотного энкодера
- Две батареи делят землю?
- Как остановить двигатель через заданное время?
это, вероятно, квадратурный кодер ... он имеет два канала, A и B ... контролируйте состояние A ... на одном из краев сигнала проверьте состояние B ... это подскажет вам направление вращения ... например, проверяйте состояние B каждый раз, когда A переходит от высокого к низкому, @jsotola
Хм, так это было интересно. При проверке сейчас B увеличивается. Но затем, когда я касаюсь D4, он переходит в 0. О боже, волшебный час., @djb