OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 7566|回复: 27

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

[复制链接]

3

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
106
金钱
106
注册时间
2014-9-10
在线时间
10 小时
发表于 2015-8-26 16:51:53 | 显示全部楼层 |阅读模式
5金钱
[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]

学习,要看心情
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165462
金钱
165462
注册时间
2010-12-1
在线时间
2114 小时
发表于 2015-8-26 19:48:06 | 显示全部楼层
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

3

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
106
金钱
106
注册时间
2014-9-10
在线时间
10 小时
 楼主| 发表于 2015-8-27 08:40:47 | 显示全部楼层
自己顶,大神们求解啊
学习,要看心情
回复

使用道具 举报

17

主题

237

帖子

0

精华

高级会员

Rank: 4

积分
925
金钱
925
注册时间
2012-2-27
在线时间
393 小时
发表于 2015-8-27 08:51:38 | 显示全部楼层
楼主,发下代码好吗,正好需要,谢谢好人
回复

使用道具 举报

3

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
106
金钱
106
注册时间
2014-9-10
在线时间
10 小时
 楼主| 发表于 2015-8-27 08:59:40 | 显示全部楼层
回复【4楼】k-ad:
---------------------------------
我上边发的就是编码器配置,不过没有用中断
学习,要看心情
回复

使用道具 举报

17

主题

237

帖子

0

精华

高级会员

Rank: 4

积分
925
金钱
925
注册时间
2012-2-27
在线时间
393 小时
发表于 2015-8-27 09:00:41 | 显示全部楼层
回复【5楼】卡尔曼滤波:
---------------------------------
不需要用到中断啊,只是计数就可以了
回复

使用道具 举报

3

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
106
金钱
106
注册时间
2014-9-10
在线时间
10 小时
 楼主| 发表于 2015-8-27 09:11:16 | 显示全部楼层
回复【6楼】k-ad:
---------------------------------
我一楼发的就是那个代码啊,
学习,要看心情
回复

使用道具 举报

17

主题

237

帖子

0

精华

高级会员

Rank: 4

积分
925
金钱
925
注册时间
2012-2-27
在线时间
393 小时
发表于 2015-8-27 09:13:11 | 显示全部楼层
没有完整的吗?我刚才开始搞,不知道怎么才是成功的
回复

使用道具 举报

3

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
106
金钱
106
注册时间
2014-9-10
在线时间
10 小时
 楼主| 发表于 2015-8-27 09:24:27 | 显示全部楼层
这是我修改后的代码,

编码器.rar

1.86 MB, 下载次数: 1272

学习,要看心情
回复

使用道具 举报

17

主题

237

帖子

0

精华

高级会员

Rank: 4

积分
925
金钱
925
注册时间
2012-2-27
在线时间
393 小时
发表于 2015-8-27 09:26:30 | 显示全部楼层
回复【9楼】卡尔曼滤波:
---------------------------------
谢谢,我看一下
回复

使用道具 举报

17

主题

237

帖子

0

精华

高级会员

Rank: 4

积分
925
金钱
925
注册时间
2012-2-27
在线时间
393 小时
发表于 2015-8-27 09:27:34 | 显示全部楼层
楼主是做那一方面的啊?
回复

使用道具 举报

3

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
106
金钱
106
注册时间
2014-9-10
在线时间
10 小时
 楼主| 发表于 2015-8-27 09:27:41 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
原子哥,求解啊,编码器模式如果用模式1,硬件上是不是要A B相两根线都必须接,
学习,要看心情
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165462
金钱
165462
注册时间
2010-12-1
在线时间
2114 小时
发表于 2015-8-27 23:03:58 | 显示全部楼层
回复【12楼】卡尔曼滤波:
---------------------------------
没用过编码器模式
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

3

主题

60

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
249
金钱
249
注册时间
2016-10-8
在线时间
50 小时
发表于 2017-7-14 22:18:55 | 显示全部楼层
卡尔曼滤波 发表于 2015-8-27 09:27
回复【2楼】正点原子:
---------------------------------
原子哥,求解啊,编码器模式如果用模式1,硬件上 ...

楼主,问题现在解决了吗?新人求教啊
回复

使用道具 举报

21

主题

151

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
423
金钱
423
注册时间
2017-4-1
在线时间
73 小时
发表于 2017-7-14 23:51:04 | 显示全部楼层
风呼呼 发表于 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

主题

60

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
249
金钱
249
注册时间
2016-10-8
在线时间
50 小时
发表于 2017-7-15 08:52:48 | 显示全部楼层
bucker 发表于 2017-7-14 23:51
编码器方式很简单的,只要按照手册要求设好寄存器就可以了,如果使用库函数就更简单,以TIM3为例 TIM_Enc ...

这个我都按照资料上以及网络上的配置好了,并且给两个通道输入正交脉冲时,计数器可以进行正常计数。
不过我现在只给一个通道输入脉冲,且上升沿触发,另一个通道保持低电平,按理说应该是向上计数的,可是有时候却向下计数,楼主这样子测试过吗
回复

使用道具 举报

3

主题

60

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
249
金钱
249
注册时间
2016-10-8
在线时间
50 小时
发表于 2017-7-15 08:54:06 | 显示全部楼层
bucker 发表于 2017-7-14 23:51
编码器方式很简单的,只要按照手册要求设好寄存器就可以了,如果使用库函数就更简单,以TIM3为例 TIM_Enc ...

定时器的预分频器设置会影响计数值吗
回复

使用道具 举报

5

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
62
金钱
62
注册时间
2017-7-13
在线时间
14 小时
发表于 2017-7-15 11:02:30 | 显示全部楼层
我用F4 不能计数啊
回复

使用道具 举报

21

主题

151

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
423
金钱
423
注册时间
2017-4-1
在线时间
73 小时
发表于 2017-7-15 14:23:27 | 显示全部楼层
风呼呼 发表于 2017-7-15 08:54
定时器的预分频器设置会影响计数值吗

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

使用道具 举报

21

主题

151

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
423
金钱
423
注册时间
2017-4-1
在线时间
73 小时
发表于 2017-7-15 14:25:46 | 显示全部楼层
本帖最后由 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;就不会出现问题 。
不知你的情况是怎样的的。
回复

使用道具 举报

3

主题

60

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
249
金钱
249
注册时间
2016-10-8
在线时间
50 小时
发表于 2017-7-15 15:19:07 | 显示全部楼层
bucker 发表于 2017-7-15 14:25
不知你的正交信号是靠什么提供的,我曾经用GPIO仿真正交信号,也出现过乱计数的问题。我是(假设PA6和PA7 ...

我也是通过你这种方式提供的两路正交信号,不过一开始我就是使用的“GPIOA->BSRR ”这种方式给端口置1置0,所以计数方向正常。
现在我只给一个通道输入脉冲,且上升沿触发,另一个通道一直保持低电平,这样计数方向就出现问题了,有时一直向上计数,有时一直向下计数......
回复

使用道具 举报

3

主题

60

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
249
金钱
249
注册时间
2016-10-8
在线时间
50 小时
发表于 2017-7-15 15:19:33 | 显示全部楼层
luwei2058 发表于 2017-7-15 11:02
我用F4 不能计数啊

发来配置看看
回复

使用道具 举报

21

主题

151

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
423
金钱
423
注册时间
2017-4-1
在线时间
73 小时
发表于 2017-7-15 15:35:40 | 显示全部楼层
风呼呼 发表于 2017-7-15 15:19
我也是通过你这种方式提供的两路正交信号,不过一开始我就是使用的“GPIOA->BSRR ”这种方式给端口置1置0 ...

你说的这种状态按分析编码器计数应该是-1、0、1之间跳动才对,但我没有模拟这种状态,很难下结论。。
回复

使用道具 举报

3

主题

60

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
249
金钱
249
注册时间
2016-10-8
在线时间
50 小时
发表于 2017-7-15 15:47:39 | 显示全部楼层
bucker 发表于 2017-7-15 15:35
你说的这种状态按分析编码器计数应该是-1、0、1之间跳动才对,但我没有模拟这种状态,很难下结论。。

对,刚开始出现过这种现象(只在0、1两数之间变化)。但是我将预分频系数修改为了2分频,就可以计数了,不过就是计数的方向有问题,有时一直向上计数,有时一直向下计数,我都不知道是什么原因导致这种现象发生的
回复

使用道具 举报

5

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
62
金钱
62
注册时间
2017-7-13
在线时间
14 小时
发表于 2017-7-15 16:12:25 | 显示全部楼层

你看看 试了很多方法就是不能计数
QQ截图20170715161057.png
QQ截图20170715161036.png
回复

使用道具 举报

3

主题

60

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
249
金钱
249
注册时间
2016-10-8
在线时间
50 小时
发表于 2017-7-15 16:34:11 | 显示全部楼层
luwei2058 发表于 2017-7-15 16:12
你看看 试了很多方法就是不能计数

主函数里面怎么没有看到你调用TIM3初始化的配置?
回复

使用道具 举报

5

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
62
金钱
62
注册时间
2017-7-13
在线时间
14 小时
发表于 2017-7-26 14:15:02 | 显示全部楼层
计数值一直在01间跳变怎么回事
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
2
金钱
2
注册时间
2017-7-30
在线时间
0 小时
发表于 2017-7-30 19:42:32 | 显示全部楼层
楼主你好,我不能理解为什么编码器模式和定时器的分频系数有关。通过时钟表来看,是TI1信号经过滤波和边沿检测器形成TI1FP1,一方面作为时钟,一方面作为触发捕获,也就是说来一个TI1FP1的信号,计数器CNT计数一次,并存在捕获比较寄存器里,没有TI1FP1的信号,CNT是不计数的。这样的话,PSC预分频器应该不分频,或者越小越好吗,这样计数器可以满足的计数频率就越高,TI1FP1为任何频率都可以满足,这样不是更好吗
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-4-19 22:31

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表