Проблема с индексом оптического поворотного энкодера
У меня следующий код работает правильно, за исключением части индекса. Я не уверен, что синтаксис правильный для оборудования. Конечный результат, который я ищу, — сбрасывать энкодер на 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;
}
}
@Bkukuk62, 👍0
Обсуждение1 ответ
▲ 2
В вашей функции onReset() вместо сравнения используется присваивание:
if (i = 1) // Это всегда верно
{
encoder0Position = 0;
}
i = 1
должно быть i == 1
,
@Craig
Крейг, это правильный синтаксис для оптического кодировщика, если (i == 1)? Я не уверен, является ли это выходом прерывания?, @Bkukuk62
if (i == 1)
верен., @sa_leinad
Смотрите также:
- Считывание нескольких поворотных энкодеров
- Выводы прерываний Arduino Mega 2560 и отображение портов с помощью поворотного энкодера
- Взаимодействие с датчиком SSI?
- Как выбрать входной контакт 600 кГц, разделить его на 4 и сгенерировать низкочастотный сигнал на выходном контакте Arduino
- Мотор-редуктор BLDC с энкодером - Как подключить энкодер? (6 проводов)
- Ошибка расчета с оптическим энкодером
- Сохранение значения одним кликом
- От Uno до Mega, и где ошибка необъявленного прерывания?
за исключением индексной части
не является хорошим описанием наблюдаемого поведения.... пожалуйста, уточните, что это значит, @jsotola