ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Пятница
29 марта
207386
Vladimir Ljaschko (24.08.2010 08:52, просмотров: 18779)
Л.И., Ваш код обслуживания ротор-энкодера при обрыве одного сигнала продолжает генерировать инкремент/декремент при вращении в одну сторону, что не совсем верно. Подскажите плз, как проще подправить.  void HallService(void) { hall.cur = 0; if (!GET_HALL1()) hall.cur = StateA; //опрос фазы 1 энкодера if (!GET_HALL2()) hall.cur |= StateB; //опрос фазы 2 энкодера if (hall.cur != hall.prev) //если состояние изменилось, { if (hall.prev == StateAB && //если предыдущее состояние StateAB hall.cur != hall.prev_prev ) //и текущее и пред-предыдущее не равны, { if (hall.cur == StateB) //если текущее состояние StateB, { #ifdef BACKWARD hall.cposition++; #else hall.cposition--; //шаг вниз #endif hall.event=1; } else //иначе { #ifdef BACKWARD hall.cposition--; //шаг вверх #else hall.cposition++; //шаг вверх #endif hall.event=1; } } hall.period=hall.timer; hall.timer=0; hall.prev_prev = hall.prev; //сохранение пред-предыдущего состояния hall.prev = hall.cur; //сохранение предыдущего состояния } if (hall.timer<50000) hall.timer++; if (hall.timer>hall.period) hall.period=hall.timer; }