搜索
bottom↓
回复: 62

C51旋转编码器问题

[复制链接]
头像被屏蔽

出0入0汤圆

发表于 2011-8-9 20:05:56 | 显示全部楼层 |阅读模式
提示: 作者被禁止或删除 内容自动屏蔽

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

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2011-8-9 20:50:26 | 显示全部楼层
"EA=0;
...
EA=1; "

only an idiot will do that.

出0入0汤圆

发表于 2011-8-9 21:01:29 | 显示全部楼层
编码器是机械接触的吧,LZ去抖动了没?

出0入4汤圆

发表于 2011-8-9 21:08:14 | 显示全部楼层
多快?

出0入0汤圆

发表于 2011-8-9 21:22:50 | 显示全部楼层
用状态机写比较好的!
头像被屏蔽

出0入0汤圆

 楼主| 发表于 2011-8-9 21:39:48 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
头像被屏蔽

出0入0汤圆

 楼主| 发表于 2011-8-10 09:07:32 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

出0入0汤圆

发表于 2011-8-10 16:02:36 | 显示全部楼层
我做过  不过不是中断的方式


(原文件名:1110.jpg)

是这种吗???????????
头像被屏蔽

出0入0汤圆

 楼主| 发表于 2011-8-10 17:17:35 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

出0入0汤圆

发表于 2011-8-10 19:25:08 | 显示全部楼层
把那个资料发上来,让我们大伙帮你想想看,或许帮你写个!

出0入8汤圆

发表于 2011-8-10 19:55:27 | 显示全部楼层
原来搞过,手车得再快都不掉码,不知 楼主程序中knob_count 是16bit还是8bit, 估计在中断中做加减比较耗时间, 贴个我的:
/* External Interrupt 0 Service Routine */
void INT0_ISR(void) interrupt 0
{
        DISABLE            // EA = 0;
        RES_C_B = 1;       // RES_C_B是口线
        _nop_();
        if(!RES_C_B)                 // C.W.
                RES_C = CW;       // RES_C是8 bit
        else                        // C.C.W.
                RES_C = CCW;
        bRES_C = 1;      // bRES_C是1 bit位型
        ENABLE           // EA = 1;
}// end of "INT0_ISR()"

在后台程序判断bRES_C和RES_C的值, 再做knob_count累加/减

出0入0汤圆

发表于 2011-8-10 19:59:59 | 显示全部楼层
回复【8楼】keli2046
不是,是增量式的
-----------------------------------------------------------------------

谁说7楼的不是增量型的?

说说你用的是多少线的,转到多快会不好使吧。根据你的速度和分辨率,计算一下频率是多少HZ?看看你的CPU能否胜任?

出0入8汤圆

发表于 2011-8-10 20:18:59 | 显示全部楼层
不知道你用的型号,上个我的相关电路图
点击此处下载 ourdev_666288IX21WL.pdf(文件大小:115K) (原文件名:LED.pdf)
可能有差别

出0入8汤圆

发表于 2011-8-10 20:21:06 | 显示全部楼层
请上增量式数据手册

出0入0汤圆

发表于 2011-8-10 20:29:01 | 显示全部楼层
靠中断来做的,基本不靠谱。
头像被屏蔽

出0入0汤圆

 楼主| 发表于 2011-8-10 21:12:14 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

出0入0汤圆

发表于 2011-8-10 21:32:27 | 显示全部楼层
回复【15楼】keli2046
回复【10楼】gutao007  
-----------------------------------------------------------------------
cw ccw是什么啊
-----------------------------------------------------------------------

转向,顺时针和逆时针

出0入0汤圆

发表于 2011-8-10 21:32:41 | 显示全部楼层
CW CCW是什么啊--顺时针与逆时针
贴个我的代码:
/*********************************************************************************************
函数名:unsigned char Mouse(void)
功能:    飞梭函数
调 用:  
参 数:  无
返回值:飞梭旋转方向,1为向左转,2为向右转,0为飞梭不动作
结 果:
备 注:
修改:
时间:2010-09-03
*********************************************************************************************/
/*
unsigned char Mouse(void)                                                        //采用状态机写法,测量飞梭旋转方向
{//机械式
        if (0 == mouse_stat)
        {
                if ((!KEY_ENCODER_A) && KEY_ENCODER_B)//向左转
                {
                        mouse_dir = 0;
                        mouse_stat = 1;
                }
                else if (KEY_ENCODER_A && (!KEY_ENCODER_B))//向右转
                {
                        mouse_dir = 1;
                        mouse_stat = 1;
                }
        }
        else if (1 == mouse_stat)
        {
                if (0 == mouse_dir)
                {
                        if ((!KEY_ENCODER_A) && (!KEY_ENCODER_B))
                        {
                                mouse_stat = 2;
                                return 2;//向右转
                        }
                        else if (KEY_ENCODER_A)
                        {
                                mouse_stat = 3;
                        }
                }
                else
                {
                        if ((!KEY_ENCODER_A) && (!KEY_ENCODER_B))
                        {
                                mouse_stat = 2;
                                return 1;//向左转
                        }
                        else if (KEY_ENCODER_B)
                        {
                                mouse_stat = 3;
                        }
                }
        }
        else if (2 == mouse_stat)
        {
                if (0 == mouse_dir)
                {
                        if (KEY_ENCODER_A && (!KEY_ENCODER_B))
                        {
                                mouse_stat = 3;
                        }
                        else if (KEY_ENCODER_B)
                        {
                                mouse_stat = 3;
                        }
                }
                else
                {
                        if ((!KEY_ENCODER_A) && KEY_ENCODER_B)
                        {
                                mouse_stat = 3;
                        }
                        else if (KEY_ENCODER_A)
                        {
                                mouse_stat = 3;
                        }
                }               
        }
        else if (mouse_stat >= 3)
        {
                if (KEY_ENCODER_A && KEY_ENCODER_B)
                {
                        mouse_stat = 0;
                }
        }
        return 0;
}

*/

出0入8汤圆

发表于 2011-8-10 21:33:11 | 显示全部楼层
顺时针, 逆时针
CW,CCW随便定义成不同的常数

出0入0汤圆

发表于 2011-8-10 21:53:00 | 显示全部楼层
不如我来上个照片吧,就用我那700元的松下相机吧。哈哈
唉,没办法,老是传不上来啊

(原文件名:P1000132.JPG)

出0入0汤圆

发表于 2011-8-10 22:01:58 | 显示全部楼层
请试试89c52的TIMER2可以设为加减计数器,硬件的,T2MOD的DCEN位设为1,P1.0,P1.1接A,B相脉冲输入

出0入0汤圆

发表于 2011-8-11 22:02:05 | 显示全部楼层
学习一下

出0入0汤圆

发表于 2011-8-12 10:34:45 | 显示全部楼层
多快 丢码呢
头像被屏蔽

出0入0汤圆

 楼主| 发表于 2011-8-12 11:41:44 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

出0入0汤圆

发表于 2011-8-13 18:01:20 | 显示全部楼层
回复【23楼】keli2046
顶多4k
-----------------------------------------------------------------------

4K是什么意思?4KHZ的频率?
是比较快了,换分辨率低点的吧,要不别用51了

出0入0汤圆

发表于 2011-8-20 10:10:19 | 显示全部楼层
TO【17楼】 zqy517 燎原星火
用你的程序测试了,反应很慢,要转4到5格,才动作一次,用STM32,频率72M

出0入0汤圆

发表于 2011-9-1 03:08:28 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-11-28 16:33:37 | 显示全部楼层
我用51做的旋转编码器检测,中断方式,也是旋转速度一块就容易丢,有时还会检测成反向的,看来要测下是多快的时候回丢,才能解决问题了.

出0入0汤圆

发表于 2011-12-15 11:02:25 | 显示全部楼层
回复【17楼】zqy517 燎原星火
-----------------------------------------------------------------------


17楼 if (1 == mouse_stat)有这样写的习惯想必是发现KEIL的编译存在一个问题,很多人还是这样写的 if (mouse_stat == 1)

出0入0汤圆

发表于 2011-12-15 17:43:08 | 显示全部楼层
mark!

出0入0汤圆

发表于 2011-12-17 19:11:40 | 显示全部楼层
c51速度不够啊!我也做过,没成功!!我是读脉冲(倍频再分频)!一项目可惜没好!

出0入0汤圆

发表于 2012-3-26 11:22:23 | 显示全部楼层
我先看看,然后好好学习!!

出0入0汤圆

发表于 2012-3-26 11:49:40 | 显示全部楼层
QEI功能的完全可以解决这个问题,但2051我都做出来都没问题哦,兄弟,是不是你程序有问题

出0入0汤圆

发表于 2012-3-26 12:37:08 | 显示全部楼层
需要对 AB相进逻辑行处理。不能直接把AB相接入到管脚。

出0入0汤圆

发表于 2012-3-27 19:53:36 | 显示全部楼层
值得学习!

出0入0汤圆

发表于 2012-3-27 20:10:15 | 显示全部楼层
mark      

出0入0汤圆

发表于 2012-3-28 09:33:43 | 显示全部楼层
lin_g 发表于 2011-12-15 11:02
回复【17楼】zqy517 燎原星火
-----------------------------------------------------------------------
...

请教了:到目前为止我还没搞清这是为什么,请大侠不惜赐教.

出0入0汤圆

发表于 2012-9-22 20:16:58 | 显示全部楼层
求增量式编码器的程序啊

出0入0汤圆

发表于 2012-11-19 13:30:43 | 显示全部楼层
zqy517 发表于 2011-8-10 21:32
CW CCW是什么啊--顺时针与逆时针
贴个我的代码:
/***************************************************** ...

很懒的盗用了哈哈~

出0入0汤圆

发表于 2013-3-21 14:40:03 | 显示全部楼层
晚上我也试试

出0入0汤圆

发表于 2013-7-13 22:43:03 | 显示全部楼层
有兄弟试了t2定时计数器来做的吗

出0入0汤圆

发表于 2013-7-29 09:51:10 | 显示全部楼层
求大侠讲解下...

出0入0汤圆

发表于 2013-7-29 14:10:18 | 显示全部楼层
yyinfo263 发表于 2013-7-13 22:43
有兄弟试了t2定时计数器来做的吗

T2定时器做的就基本全硬件的了,前面加触发器,如果要求高最好加比较器去随机干扰

出0入0汤圆

发表于 2013-7-29 15:13:53 | 显示全部楼层
zqy517 发表于 2011-8-10 21:32
CW CCW是什么啊--顺时针与逆时针
贴个我的代码:
/***************************************************** ...

旋转速度快了后会出现丢码.不知道到您是多少时间扫描一次的?

出0入0汤圆

发表于 2013-7-29 19:21:35 | 显示全部楼层
本帖最后由 fastweb 于 2013-7-29 19:28 编辑
YATAOME 发表于 2012-9-22 20:16
求增量式编码器的程序啊


首先AB相正交编码器如果直接进入管脚不用XOR门处理的话,MCU管脚必须支持上升沿和下降沿中断模式。光下降沿中断的MCU无法使用。
其次如果使用2倍频计数的话,只要有一个管脚支持上升下降沿中断就可以了。另外一相用状态读入的方式运行。

最后提醒:信号很重要,要快而准确,不能用OC门加上拉之类的输入方式,要推挽方式,远距离的话,要差分驱动,到板后差分转换。

下面是一个例子,使用C8051F3xx的PCA的CEX3输入通道(x相关注释已经修改掉)此程序经久耐用,在纺织机上一年四季不停电工作,不出错
(用来绝对值定位的,出错就打掉机器了。)

  1. //定义编码器输入脚:其中一根必须能分配到PCA的某个通道上
  2. sbit                BIT_IN09 = P2^0;        //这个脚引起中断
  3. sbit                BIT_IN10 = P2^1;        //这个脚位置任意

  4. I32        RealCnt;                        //光电编码器反馈实时的脉冲计数:计算实际绝对位置
  5. bit        Encoder_Dir;




  6. //初始化时,将编码器的一个输入脚配置为沿变化中断,并配到此管脚上。
  7.         PCA0CPM3 = 0x31;                //沿变化捕获,中断允许:分配A相输入到P2.0


  8. /******************************************************************************
  9. *功能:PG光电编码器A-B相线的触发沿中断处理
  10. *A相=BIT_IN09,A相=1/P20=0;B相=BIT_IN10
  11. ×内部分配:A=CEX3(P2.0),B=CEX4(P2.1)
  12. 2010-11-9:A相上升沿和下降沿触发中断,B相不中断,只在中断中用于判断方向
  13. 编码器计数器每个脉冲周期计两次(倍频)
  14. 每次中断耗时约2.5uS(@24.5Mhz),10%CPU强度时,A相频率=1000000/2.5*10%=40000Hz
  15. *****************************************************************************/
  16. void        PCA_ISR(void) interrupt 11
  17. {
  18.         if (CCF3){                                                        //A相电平变化中断
  19.                 CCF3 = 0;
  20.                 //检测到A变化后,A和B反相则:反向CCW;A和B同相则:正向CW
  21.                 Encoder_Dir = !(BIT_IN09^BIT_IN10);//Encoder_Dir=1为CCW,=0为CW
  22.                 if(Encoder_Dir)                                        //反向中
  23.                         RealCnt++;
  24.                 else                                                //正向中
  25.                         RealCnt--;                                //
  26.         }
  27. }


复制代码

出0入26汤圆

发表于 2013-8-1 12:28:09 | 显示全部楼层
正要用到这个,记号一下学习

出0入0汤圆

发表于 2013-8-1 13:02:35 | 显示全部楼层
学习学习。

出0入12汤圆

发表于 2013-12-10 14:03:48 | 显示全部楼层
18楼的用了,能行

出0入0汤圆

发表于 2013-12-22 11:03:22 | 显示全部楼层
Mark, 编码器的资料好像不多啊~
留着~

出0入54汤圆

发表于 2013-12-22 11:11:13 | 显示全部楼层
是电机转速用的编码器吗

出0入0汤圆

发表于 2013-12-22 19:23:00 来自手机 | 显示全部楼层
路过,看看               

出0入0汤圆

发表于 2013-12-23 21:46:11 | 显示全部楼层
这里真是精彩,今后要多来向各位前辈学习~谢谢!

出0入0汤圆

发表于 2014-1-9 15:40:53 | 显示全部楼层
mark学习啦!~

出0入0汤圆

发表于 2014-4-17 16:00:56 | 显示全部楼层
mark。。。

出0入0汤圆

发表于 2015-2-5 11:52:46 | 显示全部楼层
没看明白

出0入0汤圆

发表于 2015-2-15 08:28:41 | 显示全部楼层
我以为是模拟旋转编码器,原来是检测旋转编码器。

出0入0汤圆

发表于 2015-3-16 22:30:25 | 显示全部楼层
zqy517 发表于 2011-8-10 21:32
CW CCW是什么啊--顺时针与逆时针
贴个我的代码:
/***************************************************** ...

好用不?明天试试

出0入0汤圆

发表于 2015-4-22 11:41:53 | 显示全部楼层
mark

出0入0汤圆

发表于 2017-10-29 18:16:36 | 显示全部楼层
fastweb 发表于 2013-7-29 19:21
首先AB相正交编码器如果直接进入管脚不用XOR门处理的话,MCU管脚必须支持上升沿和下降沿中断模式。光下降 ...

你用的什么电路,好奇,公司在做检测,有时候方向会有问题,不知道是不是硬件的原因

出0入0汤圆

发表于 2017-10-29 18:17:11 | 显示全部楼层
fastweb 发表于 2013-7-29 19:21
首先AB相正交编码器如果直接进入管脚不用XOR门处理的话,MCU管脚必须支持上升沿和下降沿中断模式。光下降 ...

你这个测速度,应该没问题吧

出0入0汤圆

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

本版积分规则

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

GMT+8, 2024-3-29 08:55

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

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