编码器接口(EncoderInterface)
编码器接口可接收增量(正交) 编码器的信号根据编码器旋转产生的正交信号脉冲,自动控制CNT自增或自减,从而指示编码器的位置、旋转方向和旋转速度;
每个高级定时器和通用定时器都只拥有1个编码器接口;基本定时器没有编码器接口;
两个输入引脚借用了输入捕获的通道1和通道2;
实现步骤:
1、开启时钟
2、使能GPIO
3、开启时基单元
4、开启滤波器、边沿检测极性选择
5、打开编码器接口
6、时钟使能
代码步骤:
//1
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
//2
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6|GPIO_Pin_7;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);
//3
TIM_TimeBaseInitTypeDef TIM_BaseInitInstructure;
TIM_BaseInitInstructure.TIM_ClockDivision= TIM_CKD_DIV1;
TIM_BaseInitInstructure.TIM_CounterMode=TIM_CounterMode_Up;
TIM_BaseInitInstructure.TIM_Period=65536-1;//ARR
TIM_BaseInitInstructure.TIM_Prescaler=1-1;//PSC
TIM_BaseInitInstructure.TIM_RepetitionCounter=0;
TIM_TimeBaseInit(TIM3,&TIM_BaseInitInstructure);
//4
TIM_ICInitTypeDef TIM_ICInitStructure;
//因为结构体配置不完整,加这个防止报错
TIM_ICStructInit(&TIM_ICInitStructure);
TIM_ICInitStructure.TIM_Channel=TIM_Channel_1;
TIM_ICInitStructure.TIM_ICFilter=0xF;
//因为后面配置编码器接口的时候会重新覆盖该代码,所以可以注释
// TIM_ICInitStructure.TIM_ICPolarity=TIM_ICPolarity_Rising;
TIM_ICInit(TIM3,&TIM_ICInitStructure);
TIM_ICInitStructure.TIM_Channel=TIM_Channel_2;
TIM_ICInitStructure.TIM_ICFilter=0xF;
// TIM_ICInitStructure.TIM_ICPolarity=TIM_ICPolarity_Rising;
TIM_ICInit(TIM3,&TIM_ICInitStructure);
//5配置编码器接口
TIM_EncoderInterfaceConfig(TIM3,TIM_EncoderMode_TI12,TIM_ICPolarity_Rising,TIM_ICPolarity_Rising);
//6
TIM_Cmd(TIM3,ENABLE);
//1
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
//2
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6|GPIO_Pin_7;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);
//3
TIM_TimeBaseInitTypeDef TIM_BaseInitInstructure;
TIM_BaseInitInstructure.TIM_ClockDivision= TIM_CKD_DIV1;
TIM_BaseInitInstructure.TIM_CounterMode=TIM_CounterMode_Up;
TIM_BaseInitInstructure.TIM_Period=65536-1;//ARR
TIM_BaseInitInstructure.TIM_Prescaler=1-1;//PSC
TIM_BaseInitInstructure.TIM_RepetitionCounter=0;
TIM_TimeBaseInit(TIM3,&TIM_BaseInitInstructure);
//4
TIM_ICInitTypeDef TIM_ICInitStructure;
//因为结构体配置不完整,加这个防止报错
TIM_ICStructInit(&TIM_ICInitStructure);
TIM_ICInitStructure.TIM_Channel=TIM_Channel_1;
TIM_ICInitStructure.TIM_ICFilter=0xF;
//因为后面配置编码器接口的时候会重新覆盖该代码,所以可以注释
// TIM_ICInitStructure.TIM_ICPolarity=TIM_ICPolarity_Rising;
TIM_ICInit(TIM3,&TIM_ICInitStructure);
TIM_ICInitStructure.TIM_Channel=TIM_Channel_2;
TIM_ICInitStructure.TIM_ICFilter=0xF;
// TIM_ICInitStructure.TIM_ICPolarity=TIM_ICPolarity_Rising;
TIM_ICInit(TIM3,&TIM_ICInitStructure);
//5配置编码器接口
TIM_EncoderInterfaceConfig(TIM3,TIM_EncoderMode_TI12,TIM_ICPolarity_Rising,TIM_ICPolarity_Rising);
//6
TIM_Cmd(TIM3,ENABLE);
//传参
int16_t Encoder_Get(void)
{
int16_t temp;
temp= TIM_GetCounter(TIM3);
TIM_SetCounter(TIM3,0);
return temp;
}