ВходНаше всё Теги codebook PARTS Поиск Закон
Среда
1 апреля

Микроконтроллеры

/207402
Топик полностью
Леонид Иванович (24.08.2010 10:52 - 10:56, просмотров: 9) в ответ на Л.И., Ваш код обслуживания ротор-энкодера при обрыве одного сигнала продолжает генерировать инкремент/декремент при вращении в одну сторону, что не совсем верно. Подскажите плз, как проще подправить. - автор: Vladimir Ljaschko
В моём коде такого нет. При обрыве или закоротке одной из фаз при вращении энкодера ничего не происходит.  /---------------------------------------------------------------------------- //Модуль поддержки энкодера //Энкодер подключается к портам ENC_F1 (фаза 1) и ENC_F2 (фаза 2). //Функция Encoder_Scan() вызывается в основном цикле. //Результат обработки энкодера возвращается функцией Encoder_Get(). //---------------------------------------------------------------------------- #include "Main.h" #include "Encoder.h" //----------------------------- Константы: ----------------------------------- enum { State0, StateA, StateB, StateAB }; //состояния энкодера //----------------------------- Переменные: ---------------------------------- static char EncPrev; //предыдущее состояние энкодера static char EncPrevPrev; //пред-предыдущее состояние энкодера static char Msg; //сообщение энкодера //----------------------- Инициализация энкодера: ---------------------------- void Encoder_Init(void) { EncPrev = State0; //инициализация предыдущего состояния EncPrevPrev = State0; //инициализация пред-предыдущего состояния } //------------------------- Обработка энкодера: ------------------------------ void Encoder_Exe(void) { char EncCur = 0; if(!Pin_ENC_F1) EncCur = StateA; //опрос фазы 1 энкодера if(!Pin_ENC_F2) EncCur |= StateB; //опрос фазы 2 энкодера if(EncCur != EncPrev) //если состояние изменилось, { if(EncPrev == StateAB && //если предыдущее состояние StateAB EncCur != EncPrevPrev ) //и текущее и пред-предыдущее не равны, { if(EncCur == StateB) //если текущее состояние StateB, Msg = ENC_UP; //шаг вверх else //иначе Msg = ENC_DN; //шаг вниз } EncPrevPrev = EncPrev; //сохранение пред-предыдущего состояния EncPrev = EncCur; //сохранение предыдущего состояния } } //-------------------------- Чтение энкодера: -------------------------------- char Encoder_Get(void) { char m = Msg; //сохранение сообщения энкодера Msg = ENC_NO; //очистка сообщения энкодера return(m); } //----------------------------------------------------------------------------
Ответить
Ответы