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