打印

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

[复制链接]
楼主: lizengmao
手机看帖
扫描二维码
随时随地手机跟帖
41
lizengmao|  楼主 | 2007-12-13 20:53 | 只看该作者 回帖奖励 |倒序浏览

今天用示波器查看波形

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

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
SeaSun + 1
42
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;
}

使用特权

评论回复
43
今晚打老虎| | 2007-12-14 12:41 | 只看该作者

lizengmao,你NB,都旋到0.8Ms了

我们公司测试员的也才旋到1Ms左右。

使用特权

评论回复
44
wenhailang| | 2007-12-14 23:03 | 只看该作者

我写的,很简单,快了反而更准确51汇编的


你们先看下程序,我用的是AT89S52,我之前也是用了一个10K上拉后再接一个1K电阻到I/O口,后来不行,只接10K就可以了;因为接1K后硬件有延时,单片机读数就慢了.就有一个小问题,我用的是国产的编码开关才几块钱一个,所以在顺时钟转时有时会有反弹现像(编码开关本身机械问题).基本上是可以用的.有疑问的,可与我联系286044494,助人为快乐之本,技术人员更应该相互帮助.以下是菜单设置的一小节:

M_LOOP2:     JB     MENU_KEY,M_LOOP4  ;判断编码开关有无按下
             LCALL  DEL5MS
             JB     MENU_KEY,M_LOOP4 
             LCALL  KEY_MZ            ;调用按键音
             JNB    MENU_KEY,$        ;用软件实现正跳变触发   
             LJMP   NEXT0
M_LOOP4:     JB     A_KEY,M_LOOP2   ;判断编码开关是否旋转
             LCALL  DEL5MS
             JB     A_KEY,M_LOOP2
             JNB     A_KEY,$        ;用软件实现正跳变触发
             JNB     B_KEY,C_W      ;编码开关有动作,再判断为顺时针方向(0)还是逆时针方向(1)转动
             LCALL  KEY_MZ          ;调用按键音
             DEC    R0
             CJNE   R0,#00H,CC_W
             MOV    R0,#17
CC_W:        AJMP   M_LOOP3           ;跳转到显示处理
            
C_W:         LCALL  KEY_MZ            ;调用按键音
             INC    R0
             CJNE   R0,#18,M_LOOP3
             MOV    R0,#1
M_LOOP3:     LJMP   BEGIN           ;循环扫描

使用特权

评论回复
评论
lxa0 2018-1-15 14:02 回复TA
能把你的全部汇编代码发上来看看吗?谢谢! 
45
lizengmao|  楼主 | 2007-12-15 10:53 | 只看该作者

re 今晚打老虎

我用20M数字示波器抓波形,发现在旋转过程,输出是11时有时只有0.8ms。可惜没有相机照下来。慢转时开始的输出10,01可达280ms。使用15段的编码器测试。
现在我采用方法2,在主程序中调用,大约1.5ms调用一次,可以正确识别了。谢谢大家。

使用特权

评论回复
46
lizengmao|  楼主 | 2007-12-15 11:02 | 只看该作者

手机拍的照片,比较模糊

两个光标间时间是11ms

使用特权

评论回复
47
xwj| | 2007-12-15 11:40 | 只看该作者

其实,最简单的方法就是检测下降沿是另一个脚的电平即可

当然,不消抖的话可能会多次计数

使用特权

评论回复
48
awey| | 2007-12-15 12:02 | 只看该作者

△T最小是0.08T

看到前面的参数,△T最小是0.08T,只有6个多的mS,你5mS查询一次,还有加上抖动的延时,转动的时候稍微快一点(直接转动转轴,速度很可能会过快),就有出错的可能。

使用特权

评论回复
49
今晚打老虎| | 2007-12-15 16:05 | 只看该作者

呵呵

其实鼠标的滚轮也是这个道理的。通过检测0/1信号的变化规律来确定鼠标是向左还是向右移动的。

使用特权

评论回复
50
txh353012| | 2007-12-15 18:20 | 只看该作者

我特意做了一个

前几天我看到这个帖子.今天特意自己做了一个.
我用的是扫描.还要执行动态扫描的程序,也很好,很准.
但是动态扫描的时间不能太长,要不然也有漏的.
也没加去抖动.也没加别的电路.
关键是在检测到为00后,然后再检测是01就正转.为10 就反转.也不要11的判断.

使用特权

评论回复
51
sharks| | 2007-12-17 00:00 | 只看该作者

以上发言没有一个人思路上了正道

   旋转编码器远离决定了他和键盘一样必然有抖动。但是,决不能使用一般键盘的抗抖方法。因为键盘的抖动时间是基本固定的(弹簧跳动决定),但是编码器的抖动和角速度有关,也就是说,转的越快,毛刺时间越短。
   如果采用一般键盘延迟抗抖,如果抗抖时间太短,慢速旋转就失效,如果抗抖时间过长,快速旋转就会漏掉。这是一对矛盾事物,所以,以上发言中所有“延迟”、“电容”等方法都会遇到钉子。

   正确的方法是互锁逻辑。AB信号互差90度且都有毛刺,那么,在A信号下降沿之后的第一个B信号下降沿查看A信号的电平,得到一次旋转信息。然后等待下一个A信号下降沿。总之,必须有A才等B。
   一个简单的状态机即可实现。

使用特权

评论回复
52
hqgboy| | 2007-12-17 09:43 | 只看该作者

ding...

使用特权

评论回复
53
lizengmao|  楼主 | 2007-12-17 19:24 | 只看该作者

如“sharks"所述

    如“sharks"所述:“正确的方法是互锁逻辑。AB信号互差90度且都有毛刺,那么,在A信号下降沿之后的第一个B信号下降沿查看A信号的电平,得到一次旋转信息。然后等待下一个A信号下降沿。总之,必须有A才等B。
   一个简单的状态机即可实现。”
   虚心请教:采用扫描的方式,如何判定下降沿?
   硬件有红外解码(使用外中断0),6个按键(与1602LCM复用IO),1个LCM(1602),IIC协议的音量控制IC/24C02/RTC时钟IC,两个编码器等。
   是否需外加数字电路以实现锁存?

使用特权

评论回复
54
农民讲习所| | 2007-12-17 19:30 | 只看该作者

格雷码,不可能互锁

听俺的话:不要精确地把每个脉冲检出来,漏了也没关系。只要防止反转就可以了,这样不需要任何形式的去抖。

使用特权

评论回复
55
lizengmao|  楼主 | 2007-12-17 20:23 | 只看该作者

已经搞定,只是想多了解一些其他的方法

使用特权

评论回复
56
s99060| | 2007-12-17 21:40 | 只看该作者

吐血奉献:STM32代码

static u8 encoder;

encoder=encoder | (0x3 & GPIO_ReadInputData(GPIOD)>>3);

switch (encoder & 0xf){
  case 0x1:counter++; break;
  case 0x7:counter++; break;
  case 0xe:counter++; break;
  case 0x8:counter++; break;
  case 0x2:counter--; break;
  case 0xb:counter--; break;
  case 0xd:counter--; break;
  case 0x4:counter--; break;
}
encoder=encoder<<2;

包你一个脉冲不丢,不用去抖的,就这几句,没别的了,手拧的1ms一次够了,转速再高就再缩短周期,再高就CPLD了,也是同样的代码

写法可以改,以提高编译效率,用51asm的话就更简单了,它有散转指令(thumbII不熟)

这是4x译码(标准光电编码器用),2x就不管D0,那个手拧的(正名应该叫什么?网上不好搜)就不管D1D0,同时00时清一下这两位同步了就可以了.

抖动无所谓的,1相抖动时,另1相是稳定的,抖来抖去无非相当于来回转罢了

OK???

使用特权

评论回复
57
lhkjg| | 2007-12-18 10:09 | 只看该作者

编码器削抖其实只要加一个时间消除抖动就可以了。。很简

当然我说的是工业里面用的编码器。。对成本没有什么要求。。但是你这个东西还没有做过,,不敢下结论

使用特权

评论回复
58
lizengmao|  楼主 | 2007-12-18 22:38 | 只看该作者

to s99060

    s99060的方法是否可以理解为:
    连续读取编码器的输出,取最后两次不同的数据,如果是0001,0111,1110,1000则判断正转,如果是0010,1011,1101,0100则判断是反转?
    我之前也有使用过,但是由于扫描时间间隔太长,所以有漏检测。

使用特权

评论回复
59
ocon| | 2007-12-18 23:52 | 只看该作者

总结一下:

sharks的观点有缺陷:
  “AB信号互差90度且都有毛刺,那么,在A信号下降沿之后的第一个B信号下降沿查看A信号的电平,得到一次旋转信息。然后等待下一个A信号下降沿。总之,必须有A才等B。”
----此方法不出现反向误判的前提是AB相不同时出现抖动,如图F1。
  但是,如果在A信号毛刺消失之前,B出现毛刺,哪怕是一个毛刺都可能导致判断错误,如图F2。
  如果加入去抖动时间t,就可以得到图F3的干净波形。
  可这样还是有漏洞:当高速旋转的时候,毛刺持续时间和AB相周期会同时变小,这个去抖动时间t会把整个信号周期都给滤掉,怎么办呢?
  答案是:根据上一次检测出的信号周期T1来修改下一周期需要用的去抖动时间t,你们看呢?

使用特权

评论回复
60
zsmike| | 2008-8-18 18:09 | 只看该作者

求教

 wenhailang 发表于 2007-12-14 23:03 侃单片机 ←返回版面    

45楼: 我写的,很简单,快了反而更准确51汇编的 


你们先看下程序,我用的是AT89S52,我之前也是用了一个10K上拉后再接一个1K电阻到I/O口,后来不行,只接10K就可以了;因为接1K后硬件有延时,单片机读数就慢了.就有一个小问题,我用的是国产的编码开关才几块钱一个,所以在顺时钟转时有时会有反弹现像(编码开关本身机械问题).基本上是可以用的.有疑问的,可与我联系286044494,助人为快乐之本,技术人员更应该相互帮助.以下是菜单设置的一小节:

M_LOOP2:     JB     MENU_KEY,M_LOOP4  ;判断编码开关有无按下
             LCALL  DEL5MS
             JB     MENU_KEY,M_LOOP4 
             LCALL  KEY_MZ            ;调用按键音
             JNB    MENU_KEY,$        ;用软件实现正跳变触发   
             LJMP   NEXT0
M_LOOP4:     JB     A_KEY,M_LOOP2   ;判断编码开关是否旋转
             LCALL  DEL5MS
             JB     A_KEY,M_LOOP2
             JNB     A_KEY,$        ;用软件实现正跳变触发
             JNB     B_KEY,C_W      ;编码开关有动作,再判断为顺时针方向(0)还是逆时针方向(1)转动
             LCALL  KEY_MZ          ;调用按键音
             DEC    R0
             CJNE   R0,#00H,CC_W
             MOV    R0,#17
CC_W:        AJMP   M_LOOP3           ;跳转到显示处理
            
C_W:         LCALL  KEY_MZ            ;调用按键音
             INC    R0
             CJNE   R0,#18,M_LOOP3
             MOV    R0,#1
M_LOOP3:     LJMP   BEGIN           ;循环扫描



wenhailang前辈,能否用AT89S52写一段流水灯程序发上来让我等学习
也就是编码开关右转时,流水灯右移;编码开关左转时,流水灯左移.期待着

使用特权

评论回复
评论
lxa0 2018-1-15 14:12 回复TA
我计划用你的汇编代码做验证。 
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则