У меня возникли проблемы с правильной работой поворотного энкодера с микроконтроллерами AVR. Кодер является механическим ALPS encoder, и я использую Atmega168.Использование поворотного датчика с микроконтроллером AVR
Разъяснение
Я попытался с помощью внешнего прерывания, чтобы прослушать булавками, но кажется, что это слишком медленно. Когда Pin A высок, начинается процедура прерывания, а затем проверяется, является ли Pin B высоким. Идея состоит в том, что, если Pin B высок, момент, когда Pin A поднимается высоко, то он вращается против часовой стрелки. Если Pin B низкий, то он вращается по часовой стрелке. Но похоже, что AVR занимает слишком много времени, чтобы проверить Pin B, поэтому он всегда читается как высокий.
Я также попытался создать программу, которая просто блокируется до тех пор, пока не будут изменены контакты B или Pin A. Но может случиться так, что при вращении кодера слишком много шума, потому что это тоже не работает. Моя последняя попытка состояла в том, чтобы иметь таймер, который хранит последние 8 значений в буфере и проверяет, идет ли он от низкого к высокому. Это тоже не сработало.
Я попытался просмотреть кодировщик, и он, кажется, использует от 2 до 4 мс от первого изменения Pin до изменения другого Pin.
Это нормально, как «хобби». Однако дополнительное оборудование (резисторы/конденсаторы) не следует недооценивать. Именно поэтому программное debouncing является «лучшим» решением (IMHO). – 2009-02-02 22:45:23