本帖最后由 伟好好学习 于 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这个参数时就会改变倍频的输出。所以后面的极性参数对倍频并没有影响,仅仅只是规定检测方式而已?希望懂的大神留言指导,谢谢了。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
一周热门 更多>