搜索
bottom↓
回复: 68

也许是屎上最简单的旋转编码器程序, 占用一个外中断

  [复制链接]

出0入0汤圆

发表于 2012-1-9 21:22:48 | 显示全部楼层 |阅读模式
#define ROTATE_A PIND.2
#define ROTATE_B PIND.3

uchar CW=0;
uchar CCW=0;

// External Interrupt 0 service routine
interrupt [EXT_INT0] void ext_int0_isr(void)
{
if(ROTATE_A!=ROTATE_B)
    {
        CW++;   
    }
        else CCW++;
}

void main(void)
{
        if ((CW|CCW)!=0)
            {
            DATA=DATA+CW-CCW;
            }
        CW=0;
        CCW=0;   
        delay_ms(50);
}


//////////////////////////////////////////

占用一个外中断,电平变化触发,CW是顺时针转过的脉冲,CCW是逆时针

每50ms处理一下数值,如果想要出错,起码脉冲时间要比50ms/256短才行,手指是没可能达到这速度

实际应用中感觉很爽

阿莫论坛20周年了!感谢大家的支持与爱护!!

如果想吃一顿饺子,就得从冰箱里取出肉,剁馅儿,倒面粉、揉面、醒面,擀成皮儿,下锅……
一整个繁琐流程,就是为了出锅时那一嘴滚烫流油的热饺子。

如果这个过程,禁不住饿,零食下肚了,饺子出锅时也就不香了……《非诚勿扰3》

出0入0汤圆

 楼主| 发表于 2012-1-9 21:24:23 | 显示全部楼层
硬件上两个信号引脚各并了两个10nf电容,带上拉

出0入0汤圆

发表于 2012-1-9 21:36:54 | 显示全部楼层
非常不错。

出0入0汤圆

发表于 2012-1-9 21:52:06 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-1-9 22:01:09 | 显示全部楼层
大哥,你的程序写的非常好啊,能不能把硬件原理贴出来看下,我没用过旋转拨码的,不懂···

出0入0汤圆

发表于 2012-1-9 23:21:02 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-1-9 23:23:56 | 显示全部楼层
恩。这个试试。

出0入0汤圆

发表于 2012-1-9 23:51:19 | 显示全部楼层
mark

出0入4汤圆

发表于 2012-1-10 00:07:49 | 显示全部楼层
编码器的各种程序
http://www.arduino.cc/playground/Main/RotaryEncoders

出0入0汤圆

发表于 2012-1-10 00:22:13 | 显示全部楼层
低频情况下可以接受,上了10k以上频率估计MCU受不了,现在带正交编码接口MCU也很多,而且也便宜了

出0入0汤圆

发表于 2012-1-10 05:52:20 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-1-10 08:25:15 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-1-10 08:35:30 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-1-10 08:35:34 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-1-10 08:36:14 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-1-10 08:56:25 | 显示全部楼层
回复【9楼】Onsunsl  金平合吾
-----------------------------------------------------------------------

这个还要用专用的接口啊,这么复杂

出0入0汤圆

发表于 2012-1-10 10:13:28 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-1-10 14:49:32 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-1-10 16:53:07 | 显示全部楼层
谢谢楼主!是够简单,只是硬件上略有限制。有机会试一下。

出0入0汤圆

发表于 2012-1-11 10:55:52 | 显示全部楼层
543
8

出0入0汤圆

发表于 2012-1-12 09:32:04 | 显示全部楼层
回复【楼主位】monlika 电子钟
-----------------------------------------------------------------------
请问外中断是由什么触发的?

出0入0汤圆

 楼主| 发表于 2012-1-12 12:45:37 | 显示全部楼层
换了另外一种带开关的编码器, 发现两种不一样

一种停顿时有高低电平两种状态的, 就要电平变化触发

另外一种只有低电平的, 就要上升或下降沿触发就行了

出0入4汤圆

发表于 2012-1-12 21:13:18 | 显示全部楼层
收下!学习一下!

出0入0汤圆

发表于 2012-1-13 12:25:19 | 显示全部楼层
mark shenku

出0入0汤圆

发表于 2012-4-8 04:14:18 | 显示全部楼层
够简单    有机会试一下。

出0入0汤圆

发表于 2012-4-8 06:05:20 | 显示全部楼层
本帖最后由 faw 于 2012-4-8 06:06 编辑

请问一下,有的编码器输出不是规整的方波,是编码器的问题吗?
我买一个欧姆龙的就不输出标准的方波,害得的的程序不好用,后来用示波器来知道!

出0入0汤圆

发表于 2012-4-8 07:42:12 | 显示全部楼层
mark 编码器程序

出5入190汤圆

发表于 2012-4-8 07:52:31 | 显示全部楼层
请问这个最高支持多少脉冲的旋转编码器?

出0入0汤圆

发表于 2012-4-8 08:25:55 | 显示全部楼层
这个思路很不错。

出0入0汤圆

发表于 2012-4-8 10:01:08 | 显示全部楼层
我刚好用到,我写的比

出0入0汤圆

发表于 2012-4-8 10:06:17 | 显示全部楼层
the best approach is to use two external ints or port changes.

otherwise, you can use a timer interrupt to read the pins and a state machine to detect rotation.

出0入0汤圆

发表于 2012-4-11 18:13:14 | 显示全部楼层
mark一记 最近在做

出0入0汤圆

发表于 2012-4-12 07:56:17 | 显示全部楼层
学习!!!

出0入0汤圆

发表于 2012-4-12 08:00:09 | 显示全部楼层

mark,

mark

出0入0汤圆

发表于 2012-6-8 23:00:40 | 显示全部楼层
mark!!!!!!!!!!!!

出0入0汤圆

发表于 2012-6-8 23:21:31 | 显示全部楼层
为什么要用两个变量?  写成这样如何?

  1. #define ROTATE_A PIND.2
  2. #define ROTATE_B PIND.3

  3. char  W = 0;
  4. // External Interrupt 0 service routine
  5. interrupt [EXT_INT0] void ext_int0_isr(void)
  6. {
  7.    if(ROTATE_A!=ROTATE_B)
  8.        ++W;
  9.    else
  10.        --W;  
  11. }

  12. void main(void)
  13. {
  14.         if (W) {
  15.            DATA += W;
  16.            W = 0;
  17.         }
  18.         delay_ms(50);
  19. }
复制代码

出0入0汤圆

发表于 2012-6-9 08:40:44 | 显示全部楼层
我也改进过,单片机正交脉冲四倍频,速率接近1M

出0入0汤圆

发表于 2012-8-29 00:04:17 | 显示全部楼层
留个记号,以备后用

出0入0汤圆

发表于 2012-10-12 16:55:51 | 显示全部楼层
厉害、试用一下

出0入0汤圆

发表于 2012-10-12 17:06:52 | 显示全部楼层
屎上最简单!

出0入0汤圆

发表于 2012-10-12 17:14:55 | 显示全部楼层
有什么用的啊

出0入0汤圆

发表于 2013-3-21 14:30:22 | 显示全部楼层
  看不懂啊

出0入0汤圆

发表于 2014-5-10 11:50:21 | 显示全部楼层
mark旋转编码器

出0入0汤圆

发表于 2014-5-14 20:44:15 | 显示全部楼层
挺好的              

出0入0汤圆

发表于 2014-5-20 16:58:18 来自手机 | 显示全部楼层
学习一下,谢谢

出0入0汤圆

发表于 2014-5-20 17:12:41 | 显示全部楼层
顶起      

出0入0汤圆

发表于 2014-7-31 22:48:04 | 显示全部楼层
简单应用,好使!!

出0入0汤圆

发表于 2014-8-8 21:28:49 来自手机 | 显示全部楼层
感谢lz的分享

出0入0汤圆

发表于 2014-8-13 11:18:21 | 显示全部楼层
没有任何消抖,用的是接触式的很容易误判的

出0入0汤圆

发表于 2014-8-13 11:56:34 | 显示全部楼层
我以前也有搞过,现在忘了我。。老了

出0入0汤圆

发表于 2014-8-13 12:17:05 | 显示全部楼层
没用过,不怎么懂

出0入0汤圆

发表于 2014-8-13 12:28:31 | 显示全部楼层
没用过中断,都是每个10ms扫描一下

出0入0汤圆

发表于 2014-10-15 16:55:23 | 显示全部楼层
谢谢lz的分享

出0入0汤圆

发表于 2014-10-21 16:57:49 | 显示全部楼层
怎么判断正反转???

出0入0汤圆

发表于 2014-10-21 17:10:30 | 显示全部楼层
好简洁的程序

出0入0汤圆

发表于 2014-10-21 17:12:17 | 显示全部楼层
mark            

出0入0汤圆

发表于 2014-11-5 21:13:57 | 显示全部楼层
mark                  

出0入0汤圆

发表于 2015-1-12 13:23:59 | 显示全部楼层
使用B相的上升沿触发中断么?

出0入0汤圆

发表于 2015-1-12 13:42:05 | 显示全部楼层
如果中断是双向的,还行,如果是单向,只有一个下降沿,那就不对了

出0入0汤圆

发表于 2015-1-18 15:32:20 | 显示全部楼层
留名学习

出0入0汤圆

发表于 2015-1-18 15:50:39 | 显示全部楼层
相信很多類似應用, 大家的第一個想法一定是使用編碼器,
最近不小心看過一個專利設計 , 一個幾毛錢的小型限位開關搞定,瞬間讓人崩潰,當時唯一想法就是佩服,

出0入0汤圆

发表于 2017-3-13 08:56:38 | 显示全部楼层
转快了,还是感觉不行呢

出0入0汤圆

发表于 2017-8-3 17:36:07 | 显示全部楼层
mark 最简单

出0入0汤圆

发表于 2017-12-5 11:41:59 | 显示全部楼层
学习了,试验一下!

出0入0汤圆

发表于 2017-12-5 13:16:11 | 显示全部楼层
代码少不等于就是好代码...

出0入0汤圆

发表于 2021-4-5 15:54:54 | 显示全部楼层
有没有不占用外部中断的方法?

出0入0汤圆

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

本版积分规则

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

GMT+8, 2024-3-28 17:44

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

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