Сможет ли Arduino Uno считывать 3-кратные инкрементальные энкодеры?

Энкодеры представляют собой квадратурные энкодеры 600ppr со счетом X2. Следовательно, 1200 импульсов на оборот для каждого энкодера. Существует ли предел скорости ребра? В настоящее время у меня есть один кодировщик, подключенный с использованием кода с прерываниями.

, 👍0

Обсуждение

Ответ на вопрос заголовка, скорее всего, да. Но я думаю, что ваш реальный вопрос заключается в том, насколько быстро (и вам нужно назвать конкретную платформу) Arduino Uno 16 МГц может прочитать контакт GPIO., @st2000

Как быстро вращаются энкодеры?, @the busybee


2 ответа


0

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

Учтите, что существует несколько платформ Arduino. Каждый, возможно, использует другой тип процессоров. Вероятно, эти процессоры работают на разных скоростях. Чтобы дать конкретный ответ, нам нужно предположить конкретную платформу, процессор и скорость. текущая (3-го поколения) Arduino Uno работает на частоте 16 МГц. А Arduino Due работает на частоте 84 МГц. Поскольку большинство людей используют Arduino Uno, давайте возьмем ее для примера.

В этой ветке форума arduino.cc отмечается, что Arduino Uno, работающая на частоте 16 МГц, может выполнять вызов функции «Digital Pin Read» занимает примерно 4,78 мкс. Если округлить до 5 мкс, получится 1/5E-6 или 200 000 выборок в секунду. Вероятно, это можно улучшить, если написать код для прямого управления регистром процессора для получения желаемого результата. Обычно это считается умеренно сложной задачей встроенного программирования. И далеко за пределами обычных знаний Arduino. Кроме того, такой код, скорее всего, больше не будет переносимым между разными платформами Arduino.

,

в вопросе есть теги arduino-uno и arduino-due, а Uno в заголовке. так зачем интро?, @Juraj

Хорошая точка зрения. Я обычно использую теги для поиска. Мне не приходило в голову, что теги использовались для формулировки вопроса. Я перефразирую ответ., @st2000

и это в микросекундах, а не в миллисекундах для digitalRead. «Цифровое чтение() составляет около 3,6 мкс»., @Juraj

Ты прав. Просматривая эту ветку форума, я вижу только ссылку на 4.78us. Я снова отредактировал ответ и удалил ошибку., @st2000

так что «Сможет ли Arduino Uno считывать 3-кратные инкрементальные энкодеры?» (параллельно), @Juraj

Вероятно. Или, другими словами, маловероятно, что энкодер создаст более 100 000 циклов в секунду., @st2000


1

Вот пример кода, который я использовал для считывания двух энкодеров с помощью прерываний по смене контакта. Это возможно сделать с одним ISR, поскольку все они используют общий порт. Главное, чтобы он был коротким. Пока вы можете оставить все 6 контактов вашего энкодера на одном и том же порту, это должно быть легко расширено до 3 энкодеров. Это может даже работать для четырех на одном порту. Или вы можете использовать второй порт и получить еще 3 или 4 в зависимости от того, какой у вас чип.

volatile uint8_t lastPortRead = 0;

volatile int32_t leftCounter = 0;
volatile int32_t rightCounter = 0;


ISR(PCINT2_vect){

    uint8_t portRead = PINC;

    uint8_t whoFired = portRead ^ lastPortRead;
    uint8_t pinsDiff = portRead ^ (portRead << 1); // Будут установлены биты 5 или 7, если контакты на правом или левом двигателе не совпадают. Очищено, если то же самое.

    if (whoFired & LEFT_INT_MASK) {
        if (pinsDiff & LEFT_INT_MASK) {
            leftCounter++;
        } else {
            leftCounter--;
        }
    }
    if (whoFired & RIGHT_INT_MASK) {
        if (pinsDiff & RIGHT_INT_MASK) {
            rightCounter++;
        } else {
            rightCounter--;
        }
    }

    lastPortRead = portRead;
}
,