Используя MCP23017 с 5 роторными кодировщиками, БЕЗ пропускания одного шага от любого из них?

Я недавно следовал инструкциям в ответе на этот вопрос: Чтение нескольких роторных энкодеров , опубликованных Максимилианом-Герхардтом

Я подключил все, и я использую пример прерываний, который можно найти здесь: https://github.com/maxgerhardt/rotary-encoder-over-mcp23017/tree/master/examples/Interrupt

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

Я предполагаю, что это потому, что в то время как одно прерывание обрабатывается, все другие прерывания отключены?

Есть ли способ, которым я могу гарантировать, что каждое движение (шаг CW или CCW) зарегистрировано на всех 5 кодерах?

- Спасибо! Брайан

, 👍1

Обсуждение

Прерывания не являются гарантом отсутствия шагов. Шаги должны происходить только так быстро, как прерывания должны выполняться. Чтение MCP над I2C самостоятельно заняло бы 100us min (предполагая 1 байт данных. С 2 байтами у вас будет 150us min). А затем время выполнения логики: как быстро ваши шаги приближаются?, @chrisl


2 ответа


0

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

И соединение этого с расширителем IO, который неизбежно замедлит все, означает, что вы действительно не можете сделать то, что вы пытаетесь сделать.

Если вы хотите мгновенно реагировать на каждый отдельный импульс каждого отдельного кодера, то каждый кодер должен быть присоединен к чему-то, что само может реагировать на эти импульсы.

Я был бы склонен иметь небольшой микроконтроллер, прикрепленный к каждому отдельному кодеру (или, возможно, два кодера, если у вас достаточно контактов прерывания), и иметь дело с каждым отдельно - таким образом, один кодер не может вмешиваться в любой другой. Маленький MCU может затем отслеживать положение или количество (в зависимости от того, что вы пытаетесь сделать), и вы сообщаете это "главному" контроллеру (Arduino, например) по какой-то другой шине, асинхронно импульсам кодера.

Если вы хотите более быстрого реагирования на движения кодировщика, то можно было бы реализовать свой собственный сигнал прерывания от небольшого MCU к Arduino, чтобы сказать "Мой кодировщик был перемещен", после чего Arduino может собирать данные. Не имеет значения, сколько времени это займет, так как маленький микроконтроллер будет отслеживать любые другие изменения. ATtiny85 используя прерывания изменения контакта смогло быть хорошим недорогим выбором для этого.

,

1

Я бы использовал другой подход. Рассмотрите возможность установки флага при возникновении прерывания, другого флага для каждого прерывания, а затем обработки его в основном цикле, а не в ISR (подпрограмме обслуживания прерываний). Подключение к SPI в режиме 1,7 МГц позволит вам проверить прерывание, установить флаг и оставить ISR. Это будет немного сложно написать, но я думаю, что это сработает очень хорошо. При быстром просмотре спецификации MCP23917 должен быть подходящей деталью для выполнения этой задачи. Также выполните разборку извне, это сэкономит много кода и ускорит процесс.

,