Проблема с индексом оптического поворотного энкодера

У меня следующий код работает правильно, за исключением части индекса. Я не уверен, что синтаксис правильный для оборудования. Конечный результат, который я ищу, — сбрасывать энкодер на 0 градусов каждый раз, когда индекс приближается к нулю (360 градусов). Я также жду комментариев по коду, так как хочу, чтобы выходные данные кодировщика были максимально точными и эффективными.

Вот код:

// Проводные соединения для моего кодера:
// Коричневый: VCC = 5 В
// Синий + Экран: 0 В = GND
// Черный: ENCODER0PINA, контакт 20
// Белый: ENCODER0PINB, контакт 17
// Оранжевый: ENCODER0PINI, контакт 19

#define ENCODER0PINA         20      // этот вывод должен поддерживать прерывания
#define ENCODER0PINB         17      // прерывание не требуется
#define ENCODER0PINI         19      // этот вывод должен поддерживать прерывания
#define CLOCKWISE            1       // константа направления
#define COUNTER_CLOCKWISE    2       // константа направления

// переменные, измененные обработчиком прерывания, должны быть объявлены как изменчивые
volatile long encoder0Position = 0;
volatile long interruptsReceived = 0;
volatile byte INTFLAG1 = 0;

// отслеживаем последнюю позицию, чтобы знать, стоит ли печатать новый вывод
long previousPosition = 0;

void setup()
{

  // входы
  pinMode(ENCODER0PINA, INPUT_PULLUP);
  pinMode(ENCODER0PINB, INPUT_PULLUP);
  pinMode(ENCODER0PINI, INPUT_PULLUP);

  // прерывания
  attachInterrupt(3, onInterrupt, RISING);
  attachInterrupt(4, onReset, CHANGE);

  // включаем диагностический вывод
  Serial.begin (9600);
  Serial.println("Ready.");
}

void loop()
{
  // отображаем информацию о позиции только в том случае, если она изменилась
  if (encoder0Position != previousPosition )
  {
    Serial.println(encoder0Position, DEC);

    previousPosition = encoder0Position;
  }
}

// функция прерывания должна делать как можно меньше
void onInterrupt()
{
  // читаем оба направленных ввода
  int a = digitalRead(ENCODER0PINA);
  int b = digitalRead(ENCODER0PINB);

  if (a == b )
  {
    // b опережает a (против часовой стрелки)
    encoder0Position--;
    if (encoder0Position < 0)
    {
      encoder0Position = (encoder0Position + 360);
    }
  }
  else
  {
    // a опережает b (по часовой стрелке)
    encoder0Position++;
    if (encoder0Position >= 360)
    {
      encoder0Position = (encoder0Position - 360);
    }
  }

void onReset()
{
  // читаем ввод индекса
  int i = digitalRead(ENCODER0PINI);

  if (i = 1)
  {
  encoder0Position = 0;
  }
}

, 👍0

Обсуждение

за исключением индексной части не является хорошим описанием наблюдаемого поведения.... пожалуйста, уточните, что это значит, @jsotola


1 ответ


2

В вашей функции onReset() вместо сравнения используется присваивание:

if (i = 1) // Это всегда верно
{
encoder0Position = 0;
}

i = 1 должно быть i == 1

,

Крейг, это правильный синтаксис для оптического кодировщика, если (i == 1)? Я не уверен, является ли это выходом прерывания?, @Bkukuk62

if (i == 1) верен., @sa_leinad