Re: STM32F100 + Two Timer + Encoder
Вставлю свои 5коп. Работа с энкодером с TIM1 по прерыванию таймера TIM7 10 раз в сек. Определяем скорость вращения, направление и угол поворота вала.
void TIM7_IRQHandler(void)
{
if (TIM_GetITStatus(TIM7, TIM_IT_Update) != RESET)
{
TIM_ClearITPendingBit(TIM7, TIM_IT_Update);
_current_pos=TIM1-›CNT;
if(_current_pos!=_last_pos)
{
if (_current_pos›_last_pos)
{
if (TIM_GetFlagStatus(TIM1,TIM_FLAG_Update))
{
TIM_ClearFlag(TIM1,TIM_FLAG_Update);
_delta_fi=((0xFFFF-_current_pos)+_last_pos);
_speed=(_delta_fi*300)/4000;
_tacho=0;
} else
{
_delta_fi=(_current_pos-_last_pos);
_speed=(_delta_fi*300)/4000;
_tacho=1;
}
} else {
if (TIM_GetFlagStatus(TIM1,TIM_FLAG_Update))
{
TIM_ClearFlag(TIM1,TIM_FLAG_Update);
_delta_fi=((0xFFFF-_last_pos)+_current_pos);
_speed=(_delta_fi*300)/4000;
_tacho=1;
} else
{
_delta_fi=(_last_pos-_current_pos);
_speed=(_delta_fi*300)/4000;
_tacho=0;
}
}
_last_pos=_current_pos;
if (_tacho)
{
_fi=_fi+_delta_fi; if (_fi›=4000) _fi=0;
} else {
_fi=_fi-_delta_fi; if (_fi›4000) _fi=3999;
}
} else _speed=0;
}
}
|