У меня есть веб-страница о поворотных энкодерах и способах их использования , что может оказаться полезным.
К сожалению, без дополнительной информации я не могу решить вашу конкретную проблему.
Какие выводы микроконтроллера подключены к энкодеру и какой код вы сейчас используете для декодирования импульсов?
Хорошо, вы имеете дело с несколькими различными проблемами, первая проблема заключается в том, что это механический кодировщик, поэтому вам приходится иметь дело с шумом переключения (отскок, вибрация). В листе данных указано, что для прекращения подпрыгивания деталей и создания ложных выходных данных может потребоваться до 3 мсек.
Вам нужно создать процедуру отладки. Самым простым из которых является постоянная проверка, чтобы увидеть, идет ли А высоко. Если это так, запустите таймер и проверьте его снова через 3 мс. Если он все еще высокий, тогда вы можете проверить B - если он не высокий, тогда вы игнорируете паразитный импульс и продолжаете искать уровень A. Когда вы проверяете B, вы смотрите на него, запускаете таймер на 3 мс, а затем снова смотрите на B. Если оно было одинаковым оба раза, то вы можете использовать это значение - если оно изменится в течение 3 мс, вам придется сделать это снова (прочитайте B, подождите 3 мс, затем прочитайте его снова и посмотрите, соответствует ли оно).
Atmega достаточно быстр, чтобы вам не приходилось беспокоиться о медленной проверке, если только вы не используете низкую тактовую частоту.
Как только вы разберетесь с механическим шумом, вы захотите взглянуть на правильную подпрограмму серого кода - алгоритм, которому вы следуете, не будет работать, если вы также не уменьшите, если A высокий, а B низкий. Обычно люди сохраняют последнее значение двух входов, а затем сравнивают его с новым значением двух входов и используют небольшую функцию для увеличения или уменьшения на основе этого. (Проверьте заголовок «чтение с высоким разрешением» на веб-сайте, который я упомянул выше для таблицы). Я объединяю два чтения в четырехбитное число и использую простой массив, чтобы сообщить мне, увеличивать или уменьшать счетчик, но есть решения, которые являются даже более продвинутыми и оптимизируют размер кода, скорость или простоту обслуживания кода.