关于编码器模式计数的问题

2019-08-15 16:34发布

[mw_shl_code=c,true]void TIM2_Configuration(void) { GPIO_InitTypeDef GPIO_InitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_ICInitTypeDef TIM_ICInitStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2 , ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//使能GPIOB时钟 GPIO_StructInit(&GPIO_InitStructure);//将GPIO_InitStruct中的参数按缺省值输入 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//PA6 PA7浮空输入 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); // NVIC_Configuration(); TIM_DeInit(TIM2); TIM_TimeBaseStructure.TIM_Period=65535; //1s /* 自动重装载寄存器周期的值(计数值) */ /* 累计 TIM_Period个频率后产生一个更新或者中断 */ TIM_TimeBaseStructure.TIM_Prescaler= 0; /* 时钟预分频数 72M/72 */ TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1; /* 采样分频 */ // TIM_TimeBaseStructure.TIM_ClockDivision=0; TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; /* 向上计数模式 */ TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); TIM_EncoderInterfaceConfig(TIM2, TIM_EncoderMode_TI1, TIM_ICPolarity_Rising, TIM_ICPolarity_Rising); //编码器工作模式 // TIM_ETRClockMode2Config(TIM2, TIM_ExtTRGPSC_OFF, TIM_ExtTRGPolarity_NonInverted, 0); // TIM_ETRConfig(TIM2,TIM_ExtTRGPSC_OFF, TIM_ExtTRGPolarity_NonInverted, 0); TIM_ICStructInit(&TIM_ICInitStructure);//将结构体中的内容缺省输入 TIM_ICInitStructure.TIM_ICFilter = 6; //选择输入比较滤波器 TIM_ICInit(TIM2, &TIM_ICInitStructure);//将TIM_ICInitStructure中的指定参数初始化TIM2 TIM_ClearFlag(TIM2, TIM_FLAG_Update); TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE); TIM_SetCounter(TIM2, 0); TIM_Cmd(TIM2, ENABLE); /* 开启时钟 */ TIM_ClearFlag(TIM2, TIM_FLAG_Update); TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE); }[/mw_shl_code] 上面是我调试成功的代码,但是我有两个问题没搞明白,求助
1、 [mw_shl_code=c,true]TIM_EncoderInterfaceConfig(TIM2, TIM_EncoderMode_TI1, TIM_ICPolarity_Rising, TIM_ICPolarity_Rising); //编码器工作模式[/mw_shl_code] 这个程序中如果我只设置TI1,最后一个参数应该是什么?
2、 [mw_shl_code=c,true]#define TIM_ICPolarity_Rising ((uint16_t)0x0000) #define TIM_ICPolarity_Falling ((uint16_t)0x0002) #define TIM_ICPolarity_BothEdge ((uint16_t)0x000A) #define IS_TIM_IC_POLARITY(POLARITY) (((POLARITY) == TIM_ICPolarity_Rising) || ((POLARITY) == TIM_ICPolarity_Falling)) #define IS_TIM_IC_POLARITY_LITE(POLARITY) (((POLARITY) == TIM_ICPolarity_Rising) || ((POLARITY) == TIM_ICPolarity_Falling)|| ((POLARITY) == TIM_ICPolarity_BothEdge)) [/mw_shl_code] [mw_shl_code=c,true]TIM_ICPolarity_Rising 和 TIM_ICPolarity_BothEdge 的区别具体体现在什么地方? [/mw_shl_code]
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
27条回答
风呼呼
1楼-- · 2019-08-17 18:41
卡尔曼滤波 发表于 2015-8-27 09:27
回复【2楼】正点原子:
---------------------------------
原子哥,求解啊,编码器模式如果用模式1,硬件上 ...

楼主,问题现在解决了吗?新人求教啊
bucker
2楼-- · 2019-08-17 23:06
风呼呼 发表于 2017-7-14 22:18
楼主,问题现在解决了吗?新人求教啊

编码器方式很简单的,只要按照手册要求设好寄存器就可以了,如果使用库函数就更简单,以TIM3为例 TIM_EncoderInterfaceConfig(TIM3, TIM_EncoderMode_TI12,TIM_ICPolarity_Falling,TIM_ICPolarity_Falling);//设置TIMx编码界面。当然,GPIO引脚要设置正确,定时器的预分频器等也要设置好,还要开启定时器TIM_Cmd(TIM3, ENABLE);//使能或者失能TIMx外设。
风呼呼
3楼-- · 2019-08-18 04:59
bucker 发表于 2017-7-14 23:51
编码器方式很简单的,只要按照手册要求设好寄存器就可以了,如果使用库函数就更简单,以TIM3为例 TIM_Enc ...

这个我都按照资料上以及网络上的配置好了,并且给两个通道输入正交脉冲时,计数器可以进行正常计数。
不过我现在只给一个通道输入脉冲,且上升沿触发,另一个通道保持低电平,按理说应该是向上计数的,可是有时候却向下计数,楼主这样子测试过吗
风呼呼
4楼-- · 2019-08-18 10:50
bucker 发表于 2017-7-14 23:51
编码器方式很简单的,只要按照手册要求设好寄存器就可以了,如果使用库函数就更简单,以TIM3为例 TIM_Enc ...

定时器的预分频器设置会影响计数值吗
luwei2058
5楼-- · 2019-08-18 10:50
 精彩回答 2  元偷偷看……
bucker
6楼-- · 2019-08-18 12:55
风呼呼 发表于 2017-7-15 08:54
定时器的预分频器设置会影响计数值吗

有影响,和普通的计数器没区别。

一周热门 更多>