OpenEdv-开源电子网

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

STM32、外部中断、旋转编码器

[复制链接]

1

主题

12

帖子

0

精华

新手上路

积分
42
金钱
42
注册时间
2018-12-24
在线时间
9 小时
发表于 2018-12-24 19:36:52 | 显示全部楼层 |阅读模式
2金钱
现在小弟需要用STM32的外部中断处理旋转编码器返回来的信号,判断方向并进行计数。由于经常不能复位(Ac=0,Bc=0),所以加了Tim进行复位操作。
现在还是出现快速转动时会出现于往预期的反方向计数。
查了好久了。
麻烦各位帮忙看看问题出在哪,或者是有什么更好的处理方法(PS:只能使用外部中断)










2.png
1.png
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

685

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3447
金钱
3447
注册时间
2017-7-4
在线时间
869 小时
发表于 2018-12-24 23:47:06 | 显示全部楼层
外部中断不好处理,会丢脉冲。另外在中断函数延时,大忌啊,还延时这么长。。。。
用定时器的正交编码功能啊,多简单的事。
回复

使用道具 举报

8

主题

293

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1001
金钱
1001
注册时间
2018-8-16
在线时间
327 小时
发表于 2018-12-25 07:58:41 | 显示全部楼层
Acuity 发表于 2018-12-24 23:47
外部中断不好处理,会丢脉冲。另外在中断函数延时,大忌啊,还延时这么长。。。。
用定时器的正交编码功能 ...

刚好最近在实验定时器的编码器输入功能,使用的是几块钱的机械式旋转编码器。
我发现快速旋转时一样会出现CNT值往相反方向计数的情况。
估计是由于机械触点抖动造成的。
请问这种情况在定时器设置里有没有途径避免或改善?或只能在电路上消抖来改善?
如果用光电编码器或磁性编码器,还会有这种情况吗?(只用过几块钱的机械编码器)
回复

使用道具 举报

16

主题

112

帖子

0

精华

高级会员

Rank: 4

积分
818
金钱
818
注册时间
2014-10-22
在线时间
589 小时
发表于 2018-12-25 09:26:38 | 显示全部楼层
看着好麻烦啊,看不懂了,当然我水平不高了,不过编码器到经常用,我讲讲我用的方法
1:定时器编码器模式
2:定时器查询,就一个可以了,也不用消斗,查询A和B的电平,总共就4种状态,定义一个变量,让这4种状态分别使变量赋值为1,2,3,       4 然后这个变量跟上一次的值比较,就可以计数了。
回复

使用道具 举报

1

主题

12

帖子

0

精华

新手上路

积分
42
金钱
42
注册时间
2018-12-24
在线时间
9 小时
 楼主| 发表于 2018-12-25 09:54:27 | 显示全部楼层
试过用Stm32CubeMX配置了定时器的编码器模式。因为现在用的编码器是定位为20,分辨能力是10P的。
转一次只会有上升沿或只会有下降沿。
所以用定时器的编码器模式的话,有转动两次才计数+-1。
3.png
回复

使用道具 举报

1

主题

12

帖子

0

精华

新手上路

积分
42
金钱
42
注册时间
2018-12-24
在线时间
9 小时
 楼主| 发表于 2018-12-25 09:56:20 | 显示全部楼层
Acuity 发表于 2018-12-24 23:47
外部中断不好处理,会丢脉冲。另外在中断函数延时,大忌啊,还延时这么长。。。。
用定时器的正交编码功能 ...

试过用Stm32CubeMX配置了定时器的编码器模式。
因为现在用的编码器是定位为20,分辨能力是10P的。
转一次只会有上升沿或只会有下降沿。
回复

使用道具 举报

1

主题

12

帖子

0

精华

新手上路

积分
42
金钱
42
注册时间
2018-12-24
在线时间
9 小时
 楼主| 发表于 2018-12-25 09:57:09 | 显示全部楼层
brucewoo 发表于 2018-12-25 07:58
刚好最近在实验定时器的编码器输入功能,使用的是几块钱的机械式旋转编码器。
我发现快速旋转时一样会出 ...

我现在使用的也是机械式的
EC09
回复

使用道具 举报

1

主题

12

帖子

0

精华

新手上路

积分
42
金钱
42
注册时间
2018-12-24
在线时间
9 小时
 楼主| 发表于 2018-12-25 10:01:41 | 显示全部楼层
dfbb123 发表于 2018-12-25 09:26
看着好麻烦啊,看不懂了,当然我水平不高了,不过编码器到经常用,我讲讲我用的方法
1:定时器编码器模式
...

试过用Stm32CubeMX配置了定时器的编码器模式。因为现在用的编码器是定位为20,分辨能力是10P的。
转一次只会有上升沿或只会有下降沿。
所以用定时器的编码器模式的话,有转动两次才计数+-1。
回复

使用道具 举报

16

主题

112

帖子

0

精华

高级会员

Rank: 4

积分
818
金钱
818
注册时间
2014-10-22
在线时间
589 小时
发表于 2018-12-25 10:38:05 | 显示全部楼层
我真的好难懂,什么叫定位为20?是一圈输出20个脉冲吗?还有 转一次只会有上升沿或只会有下降沿,让人费解?编码器不是输出90度相交的方波吗?你的难道不是这样的?
回复

使用道具 举报

8

主题

293

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1001
金钱
1001
注册时间
2018-8-16
在线时间
327 小时
发表于 2018-12-25 12:08:53 | 显示全部楼层
kaixi 发表于 2018-12-25 09:57
我现在使用的也是机械式的
EC09

我实验的是差不多的东西,就是满淘宝都是的那种编码器模块。
你用这东西没有出现快速旋转时计数方向错的问题?
回复

使用道具 举报

1

主题

12

帖子

0

精华

新手上路

积分
42
金钱
42
注册时间
2018-12-24
在线时间
9 小时
 楼主| 发表于 2018-12-25 12:28:16 | 显示全部楼层
brucewoo 发表于 2018-12-25 12:08
我实验的是差不多的东西,就是满淘宝都是的那种编码器模块。
你用这东西没有出现快速旋转时计数方向错的 ...

有呀,我用的是外部中断,你是用什么处理的
回复

使用道具 举报

1

主题

12

帖子

0

精华

新手上路

积分
42
金钱
42
注册时间
2018-12-24
在线时间
9 小时
 楼主| 发表于 2018-12-25 12:31:06 | 显示全部楼层
dfbb123 发表于 2018-12-25 10:38
我真的好难懂,什么叫定位为20?是一圈输出20个脉冲吗?还有 转一次只会有上升沿或只会有下降沿, ...


我用的是旋钮那样的,不知道和你的是不是一样的,想用来调音量
一圈有20的卡位
回复

使用道具 举报

1

主题

12

帖子

0

精华

新手上路

积分
42
金钱
42
注册时间
2018-12-24
在线时间
9 小时
 楼主| 发表于 2018-12-26 19:46:55 | 显示全部楼层
如果使用定时器的编码器模式的话,怎么实现0到N的调档(顺时加到N,再顺时就一直保持在N,逆时减到0,再逆时就一直保持在0),大伙知道吗,求帮助
回复

使用道具 举报

5

主题

53

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
271
金钱
271
注册时间
2014-8-7
在线时间
59 小时
发表于 2018-12-26 21:51:57 | 显示全部楼层
kaixi 发表于 2018-12-26 19:46
如果使用定时器的编码器模式的话,怎么实现0到N的调档(顺时加到N,再顺时就一直保持在N,逆时减到0,再逆 ...

这是软件的思路了,先能保证判断顺转还是逆转
if(顺)

    if(count < N)
   {
      count = count + 1;
   }

else
{
   if(count > 0)
   {
      count = count - 1;
   }
}
回复

使用道具 举报

8

主题

293

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1001
金钱
1001
注册时间
2018-8-16
在线时间
327 小时
发表于 2018-12-27 03:46:21 | 显示全部楼层
kaixi 发表于 2018-12-25 12:28
有呀,我用的是外部中断,你是用什么处理的

就是使用了一个定时器的编码器模式,把编码器的输出引脚接到通道1和通道2,然后轮询定时器的CNT值,没有使用中断。
回复

使用道具 举报

64

主题

446

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1032
金钱
1032
注册时间
2017-7-26
在线时间
275 小时
发表于 2018-12-27 09:45:31 | 显示全部楼层
你需要转很快?
我只用了一个外部中断处理,识别左右,转动没啥问题。
快转1秒3次以上不行,不过对于我产品来说够用。

另外这东西,如果你买到质量不好的抖动很大,处理起来很麻烦
可以尝试换家店买。
回复

使用道具 举报

1

主题

12

帖子

0

精华

新手上路

积分
42
金钱
42
注册时间
2018-12-24
在线时间
9 小时
 楼主| 发表于 2018-12-27 17:11:03 | 显示全部楼层
一开选用的就是定时器的编码器模式,不过当时把预分频值配错了,调不出来才想用外部中断模式,现在用定时器的编码器模式实现了,谢谢大家的回帖
回复

使用道具 举报

1

主题

12

帖子

0

精华

新手上路

积分
42
金钱
42
注册时间
2018-12-24
在线时间
9 小时
 楼主| 发表于 2018-12-27 17:14:21 | 显示全部楼层
ndthome 发表于 2018-12-26 21:51
这是软件的思路了,先能保证判断顺转还是逆转
if(顺)

嗯嗯,采用外部中断时是用这个思路加减的,现在用定时器了,用了别的方法,思路差不多,谢谢
回复

使用道具 举报

1

主题

12

帖子

0

精华

新手上路

积分
42
金钱
42
注册时间
2018-12-24
在线时间
9 小时
 楼主| 发表于 2018-12-27 17:16:52 | 显示全部楼层
a3748622 发表于 2018-12-27 09:45
你需要转很快?
我只用了一个外部中断处理,识别左右,转动没啥问题。
快转1秒3次以上不行,不过对于我产 ...

哈哈哈,以防回很快的情况出现,我用外部中中断时在里面延时了,觉得还是不稳妥,就改用回定时器了,配置就能用
回复

使用道具 举报

64

主题

446

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1032
金钱
1032
注册时间
2017-7-26
在线时间
275 小时
发表于 2018-12-28 09:30:47 | 显示全部楼层
kaixi 发表于 2018-12-27 17:16
哈哈哈,以防回很快的情况出现,我用外部中中断时在里面延时了,觉得还是不稳妥,就改用回定时器了,配置 ...

我的是残留的老问题,刚开始开发的时候没注意到用定时器。

后面将外部中断抢占优先级调最低,用着也没事~
回复

使用道具 举报

14

主题

65

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
205
金钱
205
注册时间
2019-3-31
在线时间
31 小时
发表于 2019-4-13 16:22:42 | 显示全部楼层
请问怎么设置定时器为编码器模式啊,有些函数不知道,TIM的参数设置是会的,然后应该怎么办啊,大佬可以解答一下吗,我是小白
回复

使用道具 举报

3

主题

72

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1305
金钱
1305
注册时间
2015-12-3
在线时间
160 小时
发表于 2019-5-12 16:54:31 | 显示全部楼层
Acuity 发表于 2018-12-24 23:47
外部中断不好处理,会丢脉冲。另外在中断函数延时,大忌啊,还延时这么长。。。。
用定时器的正交编码功能 ...

MARK                              
。。。。
回复

使用道具 举报

1

主题

6

帖子

0

精华

初级会员

Rank: 2

积分
135
金钱
135
注册时间
2019-4-29
在线时间
51 小时
发表于 2023-8-30 17:28:49 | 显示全部楼层
dfbb123 发表于 2018-12-25 09:26
看着好麻烦啊,看不懂了,当然我水平不高了,不过编码器到经常用,我讲讲我用的方法
1:定时器编码器模式
...

你好,你这个程序发下不了
回复

使用道具 举报

1

主题

6

帖子

0

精华

初级会员

Rank: 2

积分
135
金钱
135
注册时间
2019-4-29
在线时间
51 小时
发表于 2023-8-30 17:29:20 | 显示全部楼层
z1160425650 发表于 2023-8-30 17:28
你好,你这个程序发下不了

1160425650@qq.com,感谢。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-24 18:00

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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