同样的一段代码,把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
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
一周热门 更多>