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

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条回答
bucker
2019-08-18 16:37
本帖最后由 bucker 于 2017-7-15 14:35 编辑
风呼呼 发表于 2017-7-15 08:52
这个我都按照资料上以及网络上的配置好了,并且给两个通道输入正交脉冲时,计数器可以进行正常计数。
不 ...

不知你的正交信号是靠什么提供的,我曾经用GPIO仿真正交信号,也出现过乱计数的问题。我是(假设PA6和PA7模拟输出正交信号)GPIOA->ODR &= ~(0x03 << 6);
GPIOA->ODR |= 0x01 << 6;
静态来看没问题,但前一语句使得ODR的输出清了零,造成PA6先清零再置1的效果,虽然时间短暂,结果就造成了计数器的误动作,改为GPIOA->ODR = (GPIOA->ODR &  ~(0x03 << 6) | 0x01 <<6;或者GPIOA->BSRR = 1 << 23 | 1 <<6;就不会出现问题 。
不知你的情况是怎样的的。

一周热门 更多>