32-TIM编码器接口

编码器接口的两个引脚借用了输入捕获单元的前两个通道,所以编码器的输入引脚就是定时器的CH1和CH2这两个引脚。



GPIO模式什么时候上拉什么时候使用下拉模式呢?看外部模块,若外部模块默认输出高电平,则选择上拉输入模式,反之,选择下拉模式。如果不确定外部模块的默认状态,尽量选择浮空输入模式,但是这种模式输入会受到噪声干扰。
void Encoder_Init() { RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE); //用到定时器3的CH1和CH2通道,对这两个通道进行输入捕获,对应PA6和PA7 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); 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); TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct; TIM_TimeBaseInitStruct.TIM_ClockDivision=TIM_CKD_DIV1; TIM_TimeBaseInitStruct.TIM_CounterMode=TIM_CounterMode_Up; TIM_TimeBaseInitStruct.TIM_Period=65536 -1; //ARR 自动重装载 TIM_TimeBaseInitStruct.TIM_Prescaler=1 -1; //PSC 预分频器 TIM_TimeBaseInitStruct.TIM_RepetitionCounter=0; TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStruct);//配置时基单元 TIM_ICInitTypeDef TIM_ICInitStruct; TIM_ICStructInit(&TIM_ICInitStruct); //给结构体赋初值,因为下面结构体成员没赋值完整 TIM_ICInitStruct.TIM_Channel = TIM_Channel_1; // TIM_ICInitStruct.TIM_ICFilter=0xF; //滤波 TIM_ICInitStruct.TIM_ICPolarity=TIM_ICPolarity_Rising; //上升沿触发 TIM_ICInit(TIM3,&TIM_ICInitStruct); //配置输入捕获单元,这一句之后,配置就已经写入寄存器了,下面就可以再次对结构体变量进行配置而不需要重新定义结构体 TIM_ICInitStruct.TIM_Channel = TIM_Channel_2; // TIM_ICInitStruct.TIM_ICFilter=0xF; //滤波 TIM_ICInitStruct.TIM_ICPolarity=TIM_ICPolarity_Rising; //上升沿触发 TIM_ICInit(TIM3,&TIM_ICInitStruct); //配置输入捕获单元 TIM_EncoderInterfaceConfig(TIM3,TIM_EncoderMode_TI12,TIM_ICPolarity_Rising,TIM_ICPolarity_Rising); TIM_Cmd(TIM3,ENABLE); } int16_t Encoder_Get() { //要测速的话,可以隔一段时间读一下CNT,然后清零 uint16_t Temp; Temp = TIM_GetCounter(TIM3); TIM_SetCounter(TIM3,0); return Temp; }

浙公网安备 33010602011771号