Vladimir Ljaschko (24.08.2010 08:52, просмотров: 19429)
Л.И., Ваш код обслуживания ротор-энкодера при обрыве одного сигнала продолжает генерировать инкремент/декремент при вращении в одну сторону, что не совсем верно. Подскажите плз, как проще подправить. 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;
}