板子是STM32F407,使用TIM5的正交编码器模式无法正确读取。

2019-07-20 03:43发布

同样的一段代码,把TIM5换成TIM3,并且使用PA6,PA7,就可以正确读取编码器脉冲个数,而改成TIM5读出来的数就很混乱没有规律。我知道TIM5是32位的,我把void ENCODER1_Init(u16 arr,u16 psc)改成void ENCODER1_Init(u32 arr,u16 psc),并且在初始化的时候将ARR赋值0xffffffff,结果还是一样。所以请大家帮我看看,是不是我配置TIM5编码器模式的时候漏了什么呀?谢谢帮忙,纠结了好久了。

void ENCODER1_Init(u16 arr,u16 psc)
{
        TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
        NVIC_InitTypeDef NVIC_InitStructure;
        GPIO_InitTypeDef  GPIO_InitStructure;
        TIM_ICInitTypeDef TIM_ICInitStruct;
       
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5,ENABLE);  ///使能TIM3时钟
        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);//使能GPIOA时钟
       
        //GPIOA0初始化设置
       GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1;
       GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//复用模式
       GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
       GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
       GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN;//上拉
       GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化
       
        GPIO_PinAFConfig(GPIOA,GPIO_PinSource0,GPIO_AF_TIM5);//将GPIOA0引脚复用映射到TIM3
        GPIO_PinAFConfig(GPIOA,GPIO_PinSource1,GPIO_AF_TIM5);//将GPIOA1引脚复用映射到TIM3
       
        TIM_TimeBaseInitStructure.TIM_Prescaler=psc;  //定时器分频
        TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up; //向上计数模式
        TIM_TimeBaseInitStructure.TIM_Period=arr;   //自动重装载值
        TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1;//设置分频系数
        TIM_TimeBaseInit(TIM5,&TIM_TimeBaseInitStructure);//初始化时钟
         
         //Set TIM3 and TIM4 to the ecoder mode
        TIM_EncoderInterfaceConfig(TIM5, TIM_EncoderMode_TI12, TIM_ICPolarity_Rising, TIM_ICPolarity_Rising);
        //配置编码器模式为定时器在TI1和TI2边沿同时计数,且CH1和CH2都为下降沿计数模式
       
        //初始化TIM3输入捕获参数
        TIM_ICInitStruct.TIM_Channel=TIM_Channel_1; //选择通道1     
        //TIM_ICInitStruct.TIM_ICPolarity=TIM_ICPolarity_Falling; //下降沿捕获
        TIM_ICInitStruct.TIM_ICSelection=TIM_ICSelection_DirectTI; //IC1映射到TI1上
        //TIM_ICInitStruct.TIM_ICPrescaler=TIM_ICPSC_DIV1;  //配置输入分频,不分频
        //TIM_ICInitStruct.TIM_ICFilter=0X00;//配置输入滤波器 不滤波
        TIM_ICInit(TIM5,&TIM_ICInitStruct);
       
        TIM_ICInitStruct.TIM_Channel=TIM_Channel_2; //选择通道1     
        //TIM_ICInitStruct.TIM_ICPolarity=TIM_ICPolarity_Falling; //下降沿捕获
       TIM_ICInitStruct.TIM_ICSelection=TIM_ICSelection_DirectTI; //IC2映射到TI2上
       TIM_ICInit(TIM5,&TIM_ICInitStruct);       

        //配置TIM5的中断优先级
        NVIC_InitStructure.NVIC_IRQChannel=TIM5_IRQn;//选择TIM5中断
        NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;//开启TIM5中断允许
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;//抢占优先级为1
        NVIC_InitStructure.NVIC_IRQChannelSubPriority=2;//相应优先级为2
        NVIC_Init(&NVIC_InitStructure);//初始化TIM3中断
       
        TIM_ClearFlag(TIM5, TIM_FLAG_Update);
        TIM_ITConfig(TIM5,TIM_IT_Update,ENABLE);//允许TIM3更新中断
       
        TIM_SetCounter(TIM5,0x8000);
       
        TIM_Cmd(TIM5,ENABLE);//使能定时器3
       
}

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。