Чтение оптического инкрементного энкодера с использованием Arduino UNO

У меня есть оптический инкрементный энкодер HP (256 CPR), в котором

  • Контакт 1 = A,
  • Контакт 2 = VCC,
  • Контакт 3 = GND,
  • Контакт 8 = B.

Я уже читал и смотрю руководства для ротационного кодировщика, такие как: https: //playground .arduino.cc /Главная /RotaryEncoders

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

Я смог заставить его работать. Я не подключал свой штырь должным образом к моему Arduino.

    #include <LiquidCrystal.h>

LiquidCrystal lcd(8, 9, 4, 5, 6, 7);


#define encoderPinA 2
#define encoderPinB 3
#define CPR 256
volatile int counter =0;
volatile boolean flag;

volatile int var_degrees =0;

void setup() {

  pinMode(encoderPinA, INPUT);
  pinMode(encoderPinB, INPUT);
  Serial.begin (9600);
  attachInterrupt(digitalPinToInterrupt(encoderPinA), isr, RISING);
  lcd.clear();

}

void loop() {

   if(flag == true){     
        var_degrees = ((360/256.0)*counter);
        Serial.println(var_degrees);
        lcd.setCursor(0, 1);
        lcd.print("Degrees: ");
        lcd.setCursor(9, 1);
        lcd.print(var_degrees);
        flag = false;
  }

}
//Interrupts 

void isr_2(){
flag = true;
  if(digitalRead(encoderPinA) == HIGH){
    if(digitalRead(encoderPinB) == LOW){
      counter = counter -1; //COUNTER CLOCK WISE
    }
    else{
      counter = counter +1; //CW
    }
  }
  else{
    if(digitalRead(encoderPinB) == LOW){
      counter = counter + 1; //CW
    }
    else{
      counter = counter - 1 ; //CCW
    }
  }
}
1 голос | спросил crucl 27 MarpmTue, 27 Mar 2018 19:58:41 +03002018-03-27T19:58:41+03:0007 2018, 19:58:41

1 ответ


1

Вы неправильно подключили свое прерывание. Вы не должны передавать номер контакта, а номер прерывания. Существует также удобная функция, которая преобразует вывод в правый номер прерывания:

attachInterrupt(digitalPinToInterrupt(pin), ISR, mode);

Итак, ваш код должен быть:

attachInterrupt(digitalPinToInterrupt(encoderPinA), isr,CHANGE);

Кроме того, вы должны объявить переменную counter volatile, так как он изменен в ISR, и, следовательно, компилятор не должен предполагать, что он не изменяется, даже если loop() никогда не меняет его:

volatile int counter = 0;
ответил jose can u c 27 MarpmTue, 27 Mar 2018 21:07:21 +03002018-03-27T21:07:21+03:0009 2018, 21:07:21

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132