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;
}

 

posted @ 2023-11-13 23:59  要是天天吃鱼就好了  阅读(92)  评论(0)    收藏  举报