Итак сегодня мы поговорим про такое замечательное устройство как инкрементальный энкодер. Что же это за зверь такой?
Энкодер - это датчик угла поворота, то есть он преобразует угол поворота вала в электрические сигналы. Энкодеры можно разделить на два больших класса - абсолютные и инкрементальные. Абсолютный энкодер для каждого положения вала выдает свой уникальный код, таким образом, мы сразу же можем определить положение вала, без всяких дополнительных действий. Это, конечно, очень хорошо, но сегодня нас больше интересует другой тип, а именно, инкрементальный энкодер.
На выходе такого энкодера мы имеем два сигнала, а точнее две импульсные последовательности, смещенные друг относительно друга по фазе. На основе этих сигналов мы можем сделать вывод о частоте вращения вала и о направлении вращения. Как видите, здесь все не так просто, как в абсолютном энкодере.
Итак, давайте подробнее рассмотрим сигналы, которые мы имеем на выходе. При вращении в одном направлении мы получим следующее:
А если мы будем крутить ручку вала в противоположном направлении, то картина изменится:
Как видите, ничего сложного тут нет ) Давайте разберемся, как из этих сигналов получить полезную информацию.
Начнем с определения направления вращения. Условно будем считать, что на первой картинке показано вращение "вперед", а на второй, соответственно, вращение "назад". Подключаем канал А энкодера к любому выводу микроконтроллера, для которого можно использовать внешнее прерывание. Настраиваем прерывание таким образом, чтобы оно срабатывало во время прихода переднего фронта сигнала с канала А. А теперь обратите внимание, что при вращении "вперед" переднему фронту сигнала А всегда соответствует низкий уровень сигнала на выходе канала В. При вращении "назад" все, естественно, наоборот.
То есть мы можем повесить канал В на любой вывод микроконтроллера и просто опрашивать его состояние в прерывании.
Идем дальше. Из документации на каждый конкретный инкрементальный энкодер мы можем узнать какое количество импульсов приходится на один полный оборот, то есть на 360 градусов. И посчитав импульсы, легко рассчитываем текущее положение вала.
Давайте напишем пример, обрабатывающий данные с энкодера, для микроконтроллера AVR. Повесим канал А на вход INT3, а канал В на обычную ножку РС3. Заведем специальную переменную encoderState для хранения результата вращения энкодера. Заходя в прерывание, будем анализировать вывод РС3 и в случае низкого уровня (вращение "вперед") будем инкрементировать значение переменной encoderState, а в случае высокого, наоборот, декрементировать. Вот полный код нашей программы:
/***************************************************************************************/ #include <avr/io.h> #include <avr/interrupt.h> /***************************************************************************************/ unsigned char encoderState; /***************************************************************************************/ void main(void) { // Глобальное разрешение прерываний sei(); // Включаем и настраиваем прерывание по переднему фронту сигнала на выводе INT3 EICRA |= ((1 << ISC31) | (1 << ISC30)); EIMSK |= (1 << INT3); while(1) { } } /***************************************************************************************/ ISR(INT3_vect) { if (PINC & 0x08) { encoderState--; } else { encoderState++; } } /***************************************************************************************/
Итак, на этом на сегодня заканчиваем, возможно, в дальнейшем, в каком-нибудь устройстве энкодер нам еще пригодится...
А дребезг?
Решил для начала такой примерчик сделать, чтобы внешнее прерывание заодно охватить. Потом напишу как сделать с периодическим опросом каналов, наверное
С этим датчиком можно сделать интересный проект ... скорей бы каникулы кончились ... (кладем его в портфель проектов). Надеемся на информацию и по другим датчикам !
А какие еще интересуют?)
Вот слышал еще о
датчиках электрического поля серии EPIC. " Видят сквозь стену ".
Такой мне еще не попадался пока)