Конечный автомат поворотного энкодера - может считывать только ОДНО из двух состояний вывода на прерывание

Фон:

Я пишу драйвер для поворотного энкодера с кодом Грея с использованием конечного автомата после чтения этот пример Arduino. Мое устройство написано на C # с использованием микросхемы .net. Поскольку это не совсем встроенная операционная система реального времени, я могу зафиксировать только состояние ОДНОГО из двух выводов кодировщика во время прерывания. После прерывания событие ставится в очередь для запуска в потоке с высоким приоритетом. Состояние вывода, сгенерировавшего прерывание, передается в качестве аргумента в "ISR", также известную как _ 1_ делегат. Чтение состояния второго пина во время работы обработчика неточно, потому что прошло несколько миллисекунд после того, как фактическое событие было поставлено в очередь (я пробовал это).

В моем случае базовое состояние - оба контакта A и B вытянуты высоко (значение = 1)

Итак, у меня есть только 4 измеримых состояния, но фактические состояния основаны на предыдущем состоянии.

  1. Pin A High 1
  2. Контакт B высокий 1
  3. Pin A Low 0
  4. Контакт B низкий 0

У меня проблемы с созданием таблицы переходов между состояниями, в которой таблица не перепутается. Я пытаюсь придумать какую-то быструю логику или, возможно, некоторые побитовые операции для завершения этого.

Вот таблица состояний (не таблица переходов), которую я придумал:

Pin State   Assigned Value  State Name
PinB-High   4               CW Rot
PinA-High   3               CW3
PinB-Low    2               CW2
PinA-Low    1               CW1
Start       0               Start
PinB-Low    5               CCW1
PinA-Low    6               CCW2
PinB-High   7               CCW3
PinA-High   8               CCW Rot

Как мне получить правильные переходы только в 4 состояния?


person GisMofx    schedule 10.01.2018    source источник


Ответы (2)


В коде Грея за раз изменяется только один бит, я предлагаю вместо того, чтобы рассматривать его как 4 состояния, попытаться подумать об этом в побитовом представлении. Допустим, PinA - это бит 0, а PinB - это бит 1.

Поскольку вы сказали, что оба контакта в базовом состоянии находятся на высоком уровне, переходы могут быть:

CW: b11 -> b01 -> b00 -> b10

CCW: b11 -> b10 -> b00 -> b01

Логика может меняться в зависимости от того, как работает ваш кодировщик.

Тогда вы сможете легко справиться с этим с помощью корпуса переключателя.

person Marius    schedule 10.01.2018

Даже если вы подумаете о битовых парах для каждого из состояний кодировщика, отскок контактов настолько зашумлен, что при декодировании этих возбуждений с помощью конечного автомата результаты могут быть неточными. Может помочь сочетание состояний плюс некоторый вид дребезга конденсатора и некоторая задержка, соответствующая спецификации времени дребезга контактов, введенной в функции прерывания. Отскок может сильно измениться от одной марки и модели кодировщика к другой. Программные задержки в операционных системах могут еще больше усугубить ситуацию. Это требует времени и некоторых тестов.

person Roberto Berner    schedule 29.05.2019