1、TIM1编码器模式
void Tim1_Init(void) //编码器模式初始化
{
TIM1_DeInit();
TIM1_TimeBaseInit(0,TIM1_COUNTERMODE_UP,65536-1,0);//16分频,向上计数,
TIM1_ICInit((TIM1_Channel_TypeDef)(TIM1_CHANNEL_1 | TIM1_CHANNEL_2),TIM1_ICPOLARITY_RISING,TIM1_ICSELECTION_DIRECTTI,TIM1_ICPSC_DIV1,0);
TIM1_EncoderInterfaceConfig(TIM1_ENCODERMODE_TI12,TIM1_ICPOLARITY_RISING,TIM1_ICPOLARITY_RISING);
TIM1_ClearFlag(TIM1_FLAG_UPDATE);
TIM1_SetCounter(0);
TIM1_Cmd(ENABLE);//开定时器
}
2、中断计数编码器的值
- 初始化引脚
/**************************************************
//中断读取编码器
encodeA-PC5
encodeB-PD5
**************************************************/
void EXIT_Init(void)
{
GPIO_Init(GPIOD,GPIO_PIN_5,GPIO_MODE_IN_FL_IT);
GPIO_Init(GPIOC,GPIO_PIN_5,GPIO_MODE_IN_FL_IT);
EXTI_SetExtIntSensitivity(EXTI_PORT_GPIOD, EXTI_SENSITIVITY_FALL_ONLY);//外部中断触发方式
EXTI_SetExtIntSensitivity(EXTI_PORT_GPIOC, EXTI_SENSITIVITY_FALL_ONLY);//外部中断触发方式
}
注意,要用两个外部中断(EXTI_PORT_GPIOD,EXTI_PORT_GPIOC)
- 中断程序
__interrupt void EXTI_PORTC_IRQHandler(void)
{
if(!Flag_IntA)
{
if(!(GPIO_ReadInputPin(GPIOD,GPIO_PIN_5)==1))
{
Pulse_count = Pulse_count - 4;
}
else
{
Pulse_count = Pulse_count + 4;
}
}
Flag_IntA = 1;
Flag_IntB = 0;
}
__interrupt void EXTI_PORTD_IRQHandler(void)
{
if(!Flag_IntB)
{
Flag_IntA = 0;
Flag_IntB = 1;
}
}