STM32 F1 编码器模式的相关疑惑

2019-07-20 23:12发布

本帖最后由 伟好好学习 于 2019-7-5 16:36 编辑

void Time3_Init_Config(u16 arr,u16 psc)
{
        TIM_TimeBaseInitTypeDef         TIM_TimeBaseStructure;
        NVIC_InitTypeDef                         NVIC_InitStructure;
        GPIO_InitTypeDef                         GPIO_InitStructure;
        TIM_ICInitTypeDef                        TIM_ICInitStructure;
        
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);                //使能Timer3时钟
        
#ifdef TIME3_GPIO
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
         
        GPIO_InitStructure.GPIO_Pin        = GPIO_Pin_6 | GPIO_Pin_7;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //选择输入浮空输入模式
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOA, &GPIO_InitStructure);
        //TIM3_CH3----PB0;TIM3_CH4------PB1
//        GPIO_InitStructure.GPIO_Pin        = GPIO_Pin_0 | GPIO_Pin_1;
//        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //选择输入浮空输入模式
//        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
//        GPIO_Init(GPIOB, &GPIO_InitStructure);
#endif
        
        TIM_TimeBaseStructure.TIM_Period = arr;                                        //设置在下一个更新事件装入活动的自动重装载寄存器周期的值(计数到5000为500ms)
        TIM_TimeBaseStructure.TIM_Prescaler = psc;                                        //设置用来作为TIMx时钟频率除数的预分频值(10KHz的计数频率)
        TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;                //设置时钟分割:TDTS = TIM_CKD_DIV1
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;        //TIM向上计数模式
        TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);                                //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位

#ifdef TIME3_Encoder
        TIM_DeInit(TIM3);
        TIM_EncoderInterfaceConfig(TIM3,TIM_EncoderMode_TI1,TIM_ICPolarity_Rising, TIM_ICPolarity_Rising);                //TIM_ICPolarity_Falling
        TIM_ICStructInit(&TIM_ICInitStructure);
    TIM_ICInitStructure.TIM_ICFilter = 6;//ICx_FILTER;
    TIM_ICInit(TIM3, &TIM_ICInitStructure);
        
        TIM3->CNT = Encoder_Init;
#endif

        /*中断优先级NVIC设置*/
        NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;                                //TIM3中断
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;        //先占优先级1级
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;                        //从优先级1级
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                                //使能IRQ通道
        NVIC_Init(&NVIC_InitStructure);                                                         //初始化NVIC寄存器
        
        TIM_ClearFlag(TIM3, TIM_FLAG_Update);                                                // Clear all pending interrupts
        TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE );                                 //使能TIM3指定的中断
        
        TIM_Cmd(TIM3, ENABLE);                                                                          //使能TIMx外设
}

这个是我自己按照网上的信息自己写的编码器的配置函数,我在测试有关编码器模式下的2倍频和4倍频的时候出现了一些不解。
当我把TIM_EncoderInterfaceConfig(TIM3,TIM_EncoderMode_TI1,TIM_ICPolarity_Rising, TIM_ICPolarity_Rising);函数的配置参数TIM_EncoderMode_TI1变成TIM_EncoderMode_TI12时,编码器可以以4倍频的方式输出计数,而此时不论后面的参数TIM_ICPolarity_Rising,是上升沿还是下降沿,还是两个沿都检测时,并不影响是否为4倍频输出。(例如200线的编码器此时转一圈变换800个计数)
而将配置参数变为TIM_EncoderMode_TI1时,此时不论后面的参数TIM_ICPolarity_Rising,是上升沿还是下降沿,还是两个沿都检测时,并不影响是否为2倍频输出。(例如200线的编码器此时转一圈变换400个计数).所以我的理解与我刚开始看网上资料有所偏差,刚开始以为是同时满足TIM_EncoderMode_TI12和TIM_ICPolarity_BothEdge这两个参数的情况下才会输出4倍频的计数,然后经过实际检测计算,却只是改变TIM_EncoderMode_TI12->TIM_EncoderMode_TI1/TIM_EncoderMode_T2这个参数时就会改变倍频的输出。所以后面的极性参数对倍频并没有影响,仅仅只是规定检测方式而已?希望懂的大神留言指导,谢谢了。


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