Не удалось получить показания для "Двигателя с энкодером"

Я написал на форуме 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++;
}

, 👍0

Обсуждение

это, вероятно, квадратурный кодер ... он имеет два канала, A и B ... контролируйте состояние A ... на одном из краев сигнала проверьте состояние B ... это подскажет вам направление вращения ... например, проверяйте состояние B каждый раз, когда A переходит от высокого к низкому, @jsotola

Хм, так это было интересно. При проверке сейчас B увеличивается. Но затем, когда я касаюсь D4, он переходит в 0. О боже, волшебный час., @djb


1 ответ


Лучший ответ:

1

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

,

Спасибо, у меня был датчик Холла gnd и vcc задом наперед., @djb