搜索
bottom↓
回复: 11

旋转编码器程序

[复制链接]

出0入0汤圆

发表于 2010-10-12 13:20:40 | 显示全部楼层 |阅读模式
unsigned int keysacn()        //扫描法,需改进,不太好用
{
//    AB
//正转 00->01->11->10->00->01->
//反转 00->10->11->01->00->10->

        unsigned char i,x,value;
        value=P0&0x3;         
        if(!(key_A == i & key_B == x) )
        {
                if(value==0x00)
                {
                        DelayMs(10);  
                        value=P0&0x3;                         //需再次读取io口,否则无法判断
                           if(value==0x01){VOL++;}
                          if(value==0x03){VOL--;}                                                                          
                }
                if(value==0x01)
                {
                        DelayMs(10);
                          value=P0&0x3;
                            if(value==0x03){VOL++;}
                          if(value==0x00){VOL--;}                                                                          
                  }
                if(value==0x03)
                  {
                        DelayMs(10);
                           value=P0&0x3;
                            if(value==0x02){VOL++;}
                          if(value==0x01){VOL--;}                                                                          
                  }
                if(value==0x02)
                {
                        DelayMs(10);
                          value=P0&0x3;
                            if(value==0x00){VOL++;}
                          if(value==0x03){VOL--;}                                                                          
                  }

                 
        }
        i = key_A;         
        x = key_B;

        return VOL ;
}

小弟用的程序,但结果不太好用,转得太快的时候会出错,有时不正确。
于是我用了中断法,但结果更惨,加的数有时太多,转得太快或太慢都觉得不好用,比不上音响上面的转动的好用,

void INT0_ISR( void ) interrupt 0        //外部中断法,需改进,不好用
{       
        unsigned int x;                                       
        for(x=0;x<10;x++);                                //延时去抖动                  
        if(key_B==0){VOL++;}       
        if(key_B==1){VOL--;}
               
}

-----------------------------------------------------------------------------------------------------------------------------------
网上的程序太多,太复杂了看不懂,请高手帮看下,那里要改进,并得到合适好用的转动数据

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

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

 楼主| 发表于 2010-10-12 13:21:15 | 显示全部楼层
沙发

出0入0汤圆

发表于 2010-10-12 16:01:27 | 显示全部楼层
我这发过一个汇编的:http://218.16.124.207/bbs/bbs_content.jsp?bbs_sn=3998438&bbs_page_no=1&search_mode=4&search_text=xiaomage_2000&bbs_id=9999
用中断的话其实还是比较简单的:比如A相用做外部中断,然后在中断程序里判断B的状态,比如B为0就加1,为1就减1。就这么简单。
另外最好别用软件来防抖,一般外部加个103左右的小电容就够了,软件的话就容易判断错误~

出0入0汤圆

发表于 2010-10-12 16:09:07 | 显示全部楼层
忘说了,我那个是先用个单片机鉴相(其实完全没必要用单片机,用门电路搭个就可以)鉴相后的数据就成了正转时单片机(或鉴相电路)的1口输出连续脉冲另一个端口持续为1.反转时端口2输出连续脉冲端口1持续为1.然后直接送到计数器里计数了,我在那个电路吧两个定时器全用了,比较奢侈呵呵。

另外里面也有我之前在网上搜索到的关于编码器的相关文件,你可以下下来看看~

出0入0汤圆

发表于 2010-10-12 16:22:28 | 显示全部楼层
记号

出0入0汤圆

发表于 2010-10-12 16:34:49 | 显示全部楼层
你现在用的方法不好,可以先画出相位图,根据状态转换,写代码就可以了。

出0入0汤圆

 楼主| 发表于 2010-10-13 10:54:44 | 显示全部楼层
回复【2楼】xiaomage_2000
我这发过一个汇编的:http://218.16.124.207/bbs/bbs_content.jsp?bbs_sn=3998438&amp;bbs_page_no=1&amp;search_mode=4&amp;search_text=xiaomage_2000&amp;bbs_id=9999
用中断的话其实还是比较简单的:比如a相用做外部中断,然后在中断程序里判断b的状态,比如b为0就加1,为1就减1。就这么简单。
另外最好别用软件来防抖,一般外部加个103左右的小电容就够了,软件的话就容易判断错误~
-----------------------------------------------------------------------

void INT0_ISR( void ) interrupt 0 //外部中断法,需改进,不好用
{
unsigned int x;
  for(x=0;x<10;x++); //延时去抖动   
if(key_B==0){VOL++;}
if(key_B==1){VOL--;}

}
--------------------------------------------------

这段够简单的,定义个VOL为合局变量,就是按你所说的方法,去看另一个脚是高电平或低电平,

但用起来的时候,觉得转一格,里面加了很多数,也有时转一点VOL,的数值变化太快,所以我加了一点延时测试的,

我用的MCU为C8051F330,说明书中说进入了中断后中断不会被重复触发的,所以进后不用关中断,也试了关中断,但都一样。

手头没有103或104这类的电容,所以没法测试是否增加两个电容会有所改善。


兄弟的另贴汇编,小弟看得如看天书,没找到我要的资料

出0入0汤圆

发表于 2010-10-13 14:55:42 | 显示全部楼层
我之所以没有用中断因为我检测的是2500线的,每转返回2500个脉冲,如果用外部中断的方式估计哪家的51也丢数据。所以采用的计数器。

出0入0汤圆

发表于 2012-8-3 14:21:21 | 显示全部楼层
学习了

出0入0汤圆

发表于 2012-8-5 14:03:31 来自手机 | 显示全部楼层
参观学习,我手头有一块别人开发的旋转器控制器就用这个方式也用330
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-8-26 20:14

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

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