搜索
bottom↓
12
返回列表 发新帖
楼主: greatcai458

原创,可靠的旋转编码器解码程序,C语言编写,套用很方便(非中断,采用定时读IO方式,解码采用

  [复制链接]

出0入0汤圆

发表于 2015-6-12 19:21:36 | 显示全部楼层
谢谢,参考下

出0入0汤圆

发表于 2015-6-12 21:39:31 来自手机 | 显示全部楼层
mark......

出0入0汤圆

发表于 2015-6-15 11:10:52 | 显示全部楼层
坛子里好多关于编码器采集的 ,但是现在不知道哪一种效率最高

出0入0汤圆

发表于 2015-6-15 13:29:39 | 显示全部楼层
学习,谢谢!!!

出0入0汤圆

发表于 2015-6-15 13:53:35 | 显示全部楼层
高度集成的算法,

出0入0汤圆

发表于 2015-6-15 13:58:07 | 显示全部楼层
好巧,正要用,收藏了

出0入0汤圆

发表于 2015-7-11 17:01:55 | 显示全部楼层
正需要这方面的资料

出0入0汤圆

发表于 2015-7-11 17:19:22 | 显示全部楼层
Gorgon_Meducer 发表于 2013-1-19 18:35
假设函数IS_PIN_A_HIGH()和IS_PIN_B_HIGH()是读取A,B两个引脚的状态
假设有两个外中断INT0和INT1都已经配置 ...

你这个程序不能有干扰,硬件做得差就会误读。

出0入0汤圆

发表于 2015-7-11 17:34:31 | 显示全部楼层
Gorgon_Meducer 发表于 2013-4-23 23:24
我提供的算法里面,是不处理这个问题的——我觉得硬件可以处理,一般IO都有Filter。
如果不采用我说的4倍 ...


硬件做好是基础,硬件做不好,中断不退出去这样检测,很浪费CPU资源。

出0入0汤圆

发表于 2015-7-11 22:39:36 | 显示全部楼层
现在不是好多片子的定时器都有旋转编码器功能了吗?比如STM32

出0入296汤圆

发表于 2015-7-13 19:37:57 | 显示全部楼层
wind2100 发表于 2015-7-11 17:34
硬件做好是基础,硬件做不好,中断不退出去这样检测,很浪费CPU资源。
...

一般做差分解码器都需要有硬件滤波,用软件滤波效率更低。好在很多MCU都在IO口上加入硬件滤波了。NXP,Freescale,Atmel,ST的芯片都做得很不错。

出0入0汤圆

发表于 2015-8-4 22:54:47 | 显示全部楼层
这个不错,做DDS能用到

出0入0汤圆

发表于 2015-8-23 18:54:13 | 显示全部楼层
qjs412_avr 发表于 2012-4-18 18:16
上一个我写的,思路和楼主一样,定时中断采样A,B相,进入采样时,关闭中断,确保采样期间不受干扰

volatil ...

您好,请问一下,您的 GetABStatus())是啥样子的,可以把代码截图给我吗?另外一个问题就是,您的中断时间设置的是0.8ms

我还想设置长一点,请问一下,这个中断查询的时候,最长可以设置,多长时间查询一次?

出0入0汤圆

发表于 2015-8-23 19:40:20 | 显示全部楼层
shafei 发表于 2015-8-23 18:54
您好,请问一下,您的 GetABStatus())是啥样子的,可以把代码截图给我吗?另外一个问题就是,您的中断时 ...

这个时间有点久了,GetABStatus()就是去采样A,B对应IO的电平

中断时间的长短根据你的A,B相输出的最大频率设置,总之要确保能采样到A,B的变化状态

出0入0汤圆

发表于 2015-8-24 12:56:52 | 显示全部楼层
qjs412_avr 发表于 2015-8-23 19:40
这个时间有点久了,GetABStatus()就是去采样A,B对应IO的电平

中断时间的长短根据你的A,B相输出的最大频 ...

可以把这个getstatus的函数发给我吗?我也用的AVR的单片机,目前需要做一个计米器,
我想直接套用你给的函数

出0入0汤圆

发表于 2015-8-24 14:21:31 | 显示全部楼层
谢谢,学习!!!

出0入0汤圆

发表于 2015-8-24 15:55:01 | 显示全部楼层
Gorgon_Meducer 发表于 2013-1-19 18:35
假设函数IS_PIN_A_HIGH()和IS_PIN_B_HIGH()是读取A,B两个引脚的状态
假设有两个外中断INT0和INT1都已经配置 ...

你好,大侠,我想问一下,这个程序里面,A相引脚是INT0 ,还是B相作为INT0呀?

出0入296汤圆

发表于 2015-8-25 10:55:12 | 显示全部楼层
本帖最后由 Gorgon_Meducer 于 2015-8-25 10:56 编辑
shafei 发表于 2015-8-24 15:55
你好,大侠,我想问一下,这个程序里面,A相引脚是INT0 ,还是B相作为INT0呀? ...


其实无所谓,都可以的。甚至可以同时使用两个INT。但要注意,在同时使用两个中端的情况下,中断处理程序里面的算法极性是相反的。

出0入0汤圆

发表于 2015-8-28 13:40:19 | 显示全部楼层
最近有个项目要用 现在研究下

出0入0汤圆

发表于 2015-9-12 01:20:06 | 显示全部楼层
不错的资料

出20入62汤圆

发表于 2015-9-15 10:37:34 | 显示全部楼层
编码器解码~多谢~MARK

出0入0汤圆

发表于 2017-1-7 14:53:28 | 显示全部楼层
虽然看不太懂 但是已经拿来用在我的旋钮上面啦啦  谢谢楼主  

出0入0汤圆

发表于 2017-6-26 14:44:07 | 显示全部楼层
Gorgon_Meducer 发表于 2013-1-19 18:35
假设函数IS_PIN_A_HIGH()和IS_PIN_B_HIGH()是读取A,B两个引脚的状态
假设有两个外中断INT0和INT1都已经配置 ...

大神,按照你说的,比如A触发的中断,同加异减,但是判断条件里面是IS_PIN_A_HIGH() && IS_PIN_B_HIGH()。 我考虑了一下,是不是这个判断条件应该为IS_PIN_A_HIGH() == IS_PIN_B_HIGH()?  盼回复~~  

出0入296汤圆

发表于 2017-6-29 18:37:19 | 显示全部楼层
含笑半步颠 发表于 2017-6-26 14:44
大神,按照你说的,比如A触发的中断,同加异减,但是判断条件里面是IS_PIN_A_HIGH() && IS_PIN_B_HIGH() ...

不是的。应该是就是原来的表达式。因为 IS_PIN_A_HIGH() 是一个逻辑表达式,返回0和非0。用==就变成二者必须相等,
但是bool的true可能有多种表达方式,你用==就变成是 true == true,看似OK,但是true本身的数值是不同的,那么你这
个条件可能永远无法正确的触发。

考虑到 IS_PIN_A_HIGH() 很可能只是在GPIO的输入寄存器上做文章,比如:

#define IS_PIN_A_HIGH()    (PORTA.IN & PA1_MSK)  
#define IS_PIN_B_HIGH()    (PORTA.IN & PA2_MSK)

以这个为背景,你会发现,用 == 是不合理的。

出0入0汤圆

发表于 2017-8-3 17:27:49 | 显示全部楼层
mark!!!!!

出0入0汤圆

发表于 2017-8-3 20:14:06 | 显示全部楼层
好帖, 顶起来!!

出0入0汤圆

发表于 2020-10-18 15:39:29 | 显示全部楼层
好好看看
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-18 15:54

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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