我上次发的那个“C4定时炸*”里有用C写的例子,可以参考

[复制链接]
楼主: lizengmao
手机看帖
扫描二维码
随时随地手机跟帖
txh353012| | 2007-12-9 00:42 | 显示全部楼层

有意思,

我以前以为很简单的而没有动手去做.,现在看了楼上的发言,我还是动手去做做!
过两天给个答复,我看看谁的方法好啊!

使用特权

评论回复
edanzg| | 2007-12-9 01:27 | 显示全部楼层

呵呵,高手终于来了,

使用特权

评论回复
今晚打老虎| | 2007-12-9 01:35 | 显示全部楼层

老乡,还没睡呐

高手谈不上,感觉还是在门外打转转啊

使用特权

评论回复
lastnew| | 2007-12-9 01:54 | 显示全部楼层

今晚打到华南虎没

又是汇编还一个劲儿goto,好迷糊 哦

使用特权

评论回复
hotpower| | 2007-12-9 02:00 | 显示全部楼层

华南虎下山了~~~

使用特权

评论回复
edanzg| | 2007-12-9 02:07 | 显示全部楼层

呵呵,听说要去打老虎,我哪敢睡那么早啊。

使用特权

评论回复
lastnew| | 2007-12-9 02:10 | 显示全部楼层

热市电

能夜到多久?

使用特权

评论回复
ocon| | 2007-12-9 02:34 | 显示全部楼层

我上次发的那个“C4定时炸*”里有用C写的例子,可以参考

单片机是PIC的,用旋转编码器设定参数,已经过验证,不会发生突然反向的问题。

使用特权

评论回复
hotpower| | 2007-12-9 03:25 | 显示全部楼层

哈哈~~~

使用特权

评论回复
hellomcu| | 2007-12-9 09:55 | 显示全部楼层

呵呵,楼上的大叔们不仅是牛人,也是铁人呀!

To lizengmao :
   你没有完全理解我说的意思。抖动在此是可以消除的。跟最后停止关系不大。

    <当N或M比对方大,同时也大于一个设定的周期数,即可以准确判断是正转或反转呀>。 在此把P高为正向,Pcount设为正向计数,N高为反向,Ncount设为反向计数。     
    这里设定的周期数是要你自己去试一下的。当存在抖动(也即可能反向转动时),其相对应的计数值减1,反向的计数值加1,一消一长。到最后累积(大于设定的周期数),仍然是在一个方向上转,如果两边的计数都不大于设定的周期,那就是一直在抖动。
    同时,如所长所言,此检测是要加时间限制的(如果要写得很好的话几乎每一步都要加时间限制)。当一个方向等到k长的时间仍然没有一个信号进来(这个跟通信是一个样的,不能无限等待),那就是已经停止了。此时,就要把所有的变量初始化。至于是否反向,都由计数设定。
    还有一点要注意的是,Pcount,Ncount计数是不能无限大的。如果需要应用方向转动的距离,那就重新定义变量吧。


相关链接:http://shop35088126.taobao.com

使用特权

评论回复
hotpower| | 2007-12-9 10:19 | 显示全部楼层

晕~~~收工回村...

使用特权

评论回复
lizengmao|  楼主 | 2007-12-9 20:29 | 显示全部楼层

今天重写程序进行测试,初步通过

   今晚重写测试程序初步测试通过,明天整理一份看能否用。
   还是采用方法2,每5ms检测一次编码器AB端,如果检测到的数据与上次的不一样则保存编码器的数据,连续4次如果符合正转/反转规则则判定正转/反转有效。只是快速旋转依然不正常。把读出的数据依次排列在RAM中察看,竟然发现快速旋转时会偶尔有转了6格只收到4个正确的信号的现象,有丢失某个数据,例如00,11的数据有时会检测不到(丢失)。把扫描时间提高到2ms,依然没有太大的改善(总不能让我的程序只做编码器扫描吧)。明天装上塑胶旋钮进行测试看是否是手抖动的问题。如果还是没有改善,程序再改善另做快速旋转时的处理了。
   感谢各位的热心指点。感谢hellomcu~~~

使用特权

评论回复
凌晨依旧| | 2007-12-10 13:47 | 显示全部楼层

TO楼主

我经常用到编码器  
 看下我程序:单片机是用的三星的(1MS扫描一次)I/O是cd1port1.1,cd1port2.7自己定义的
 cd1scan:
     sb1
     ld    r0,encflag
     BTJRF cd1canfirst,r0.0
     ldb   r1,cd1port1.1
     BTJRF cd1scanout,r1.0
     and   encflag,#11111110b
     BTJRF cd1add,r0.1
     ldb   R1,cd1port2.7
     BTJRT cd1scanout,r1.0
     or    encflag,#04h
     and   encflag,#11110111b
     ;dec   tempo
     jr    cd1scanout
cd1add:
     ldb   R1,cd1port2.7
     BTJRF cd1scanout,r1.0      
     or    encflag,#04h
     or    encflag,#08h
     ;inc   tempo
     jr    cd1scanout
cd1canfirst:
     ldb   r1,cd1port1.1
     BTJRT cd1scanout,r1.0
     or    encflag,#00000011b
     ldb   r1,cd1port2.7
     BTJRT cd1scanout,r1.0
     and   encflag,#11111101b
      
cd1scanout:
     ret

使用特权

评论回复
s99060| | 2007-12-10 23:11 | 显示全部楼层

编码器不要管他抖动不抖动,否则反而会出错

也不要管他是否一个循环,就是说得到的是4x编码,用个1ms定时器,将上次和这次采样数据组合成4bit散转决定+/-即可,稍复杂可以得到速度值
程序很小,包括散转表10几byte吧大概

使用特权

评论回复
kent_gwk| | 2007-12-12 09:03 | 显示全部楼层

时间间隔太长了

这个东西我用多了,其实不用像有些人说的那么复杂,也不用做什么去抖,首先定时器必须<=1.5MS,每次中断查一次状态,判断的方法也很简单的,发现11做个标志位,然后如果之后发现10或01就可以判断向左或右旋转了一格,然后清11标志位,还有,发现00也要清11标志位,就那么简单,

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
SeaSun + 1
农民讲习所| | 2007-12-12 09:38 | 显示全部楼层

不要去抖,只要方向限制防反转

而且还要限制移动的步数速率,超过步数速率程序容易BUG,比如界面不断重画。

使用特权

评论回复
txh353012| | 2007-12-13 00:00 | 显示全部楼层

有意思

kent_gwk  有可能说的对.
lizengmao 的问题可能不是抖动的问题,可能是编码漏检了.

使用特权

评论回复
fsaok| | 2007-12-13 09:10 | 显示全部楼层

kent_gwk 的方法可能是简化版本

看上去应该行,

使用特权

评论回复
lizengmao|  楼主 | 2007-12-13 20:53 | 显示全部楼层

今天用示波器查看波形

今天用示波器查看编码器的波形,与我想象的差很远。快速旋转的脉冲宽度最小才0.8ms。可能真的是我漏检测了。明天改进程序试看是否OK。

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
SeaSun + 1
e21| | 2007-12-13 21:13 | 显示全部楼层

我用了将近十年没改的方法。

在音响中使用,要求不高。在主循环空闲时调用,检测两个状态。

{
unsigned  char sw1;
static uchar sw2;
static bit direction;
sw1 = (PORT_encoder & (encoder_A | encoder_B));
if(sw1==0) 
    {
    if(sw2==encoder_A)
        direction=1;
    else if(sw2==encoder_B )
        direction=0;
    }
else if (sw2==0)
    {
    if(sw1==encoder_B && direction)
        {
        key_code=KEY_down;
        }
    else if (sw1==encoder_A && !direction)
        {
        key_code=KEY_up;
        }
    }
sw2=sw1;
}

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则