Здравствуйте. Пытаюсь получить данные с китайского энкодера.
Заявлено 1000 линий на оборот и рассчитан на 5000 об/мин.
Подключил выходы А и В энкодера к пинам 20,21 Arduino Mega 2560, запитал от 12в.
Это я загрузил в Ардуино:
При небольшой скорости вращения всё работает отлично. На один оборот ровно 1000 тиков энкодера.
Но при увеличении скорости всё ломается. Как будто дуня не успевает обработать прерывания.
Тест показал, что обработка прерывания происходит за 28 тактов процессора.
Видео прилагается.
Кто знает в чём дело? Подскажите, что я не так делаю?
Этот энкодер должен считывать положение шпинделя на токарном станке. Максимальная скорость шпинделя 2000 об/мин.
Заявлено 1000 линий на оборот и рассчитан на 5000 об/мин.
Подключил выходы А и В энкодера к пинам 20,21 Arduino Mega 2560, запитал от 12в.
Это я загрузил в Ардуино:
Енкодер:
volatile int counter = 0; // счётчик
volatile byte reset = 0, last = 0;
volatile bool encFlag = 0; // флаг поворота
int old_counter;
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
pinMode(21, INPUT_PULLUP);
pinMode(20, INPUT_PULLUP);
attachInterrupt(3, test, CHANGE);
attachInterrupt(2, test, CHANGE);
}
void loop() {
if (counter != old_counter)
{
Serial.println(counter);
}
old_counter = counter;
}
void test(void)
{
byte state = (PIND & 0b11);
if (reset && state == 0b11) {
int prevCount = counter;
if (last == 0b10) counter++;
else if (last == 0b01) counter--;
if (prevCount != counter) encFlag = 1;
reset = 0;
}
if (!state) reset = 1;
last = state;
if(counter >= 1000 || counter <= -1000) counter=0; //Один оборот
}
Но при увеличении скорости всё ломается. Как будто дуня не успевает обработать прерывания.
Тест показал, что обработка прерывания происходит за 28 тактов процессора.
Видео прилагается.
Кто знает в чём дело? Подскажите, что я не так делаю?
Изменено: