打印

增量式光电编码盘误差讨论

[复制链接]
楼主: yewuyi
手机看帖
扫描二维码
随时随地手机跟帖
21

软件判也很容易的。

直接输入给MCU,判A相电平是否变化,变化则判A相、B相电平:不同则加,相同则减。

这样绝对不会出错的。

硬件也一样的。

使用特权

评论回复
22
HWM| | 2009-2-21 13:29 | 只看该作者

to LZ:423+04(NPN管也行)+R+C 构成鉴别电路

提示:充分利用423的资源,注意RC匹配(有三组RC,两组为423用;一组为信号延迟,阻塞用)。

电路特点:输出两个独立的正反向脉冲,无微动误差,反映速度快。

适用范围:具有两个外部中断的MCU系统,且需高速记数。

若一定要用软件,无所谓拉,没问题就好。

使用特权

评论回复
23
yewuyi|  楼主 | 2009-2-21 14:12 | 只看该作者

~~

HWM老师的方法对现在这个东西来说,因为PCB和硬件已经确定了,而且MCU也只有一个INT中断,所以不太好改了,当然如果以后再做类似东西的话,呵呵,HWM老师的方法我肯定会优先考虑的啊,呵呵,用硬件做可以省略掉很多软件的麻烦。


冬发君的方法是目前对我最合适的方法,但问题也是存在的,就是A相的上升沿和下降沿都要判断,而我现在MCU只能工作在上升沿或下降沿中的一个状态下,所以,此时只能用软件判断了,还好我的信号变化比较慢,大约在100HZ内,这个方法似乎也是有缺点的把,呵呵,必须有在上升沿或者下降沿发生后很快的时间内检测A、B相电平,否则过去90度相位后就又错了把!?


洗丸剂的方法我再想想。。。

使用特权

评论回复
24
HWM| | 2009-2-21 14:20 | 只看该作者

LZ:速度慢且软件负担不大的话自然可以用软件啦。

但必须判别上下沿,这在软件上还好办一点。用硬件中断的话一般只能判单向沿。若只判单向沿,就会出现微动误差,即在一个微小的范围内来回摆动形成单向记数。

使用特权

评论回复
25
yewuyi|  楼主 | 2009-2-21 14:42 | 只看该作者

分析了一下,洗丸剂的方法和冬发君的说法应该是一样的

请洗丸剂先生帮忙确认一下是否确是如此?!

使用特权

评论回复
26
yewuyi|  楼主 | 2009-2-21 15:59 | 只看该作者

TO HWM老师

正在修改程序,原来A相信号采取的是上升沿触发,还好当时考虑到可能的更改,硬件上可以把该信号连接到IO的电平变化中断引脚上,现在考虑用IO的电平变化中断采集A相信号,这样不管是上升沿或者下降沿,只要发生电平变化了就都能识别出来,发生电平变化中断响应后,再读取B相的信号并判断A、B相信号是相同还是相反,按照不同则加、相同则减的方法进行脉冲计数。


请HWM老师分析一下俺上面的拙招是否管用?!

使用特权

评论回复
27
HWM| | 2009-2-21 19:36 | 只看该作者

TO LZ:就是这么回事,检测A的上下沿,再配合B判断方向。

但一定要区分是上沿还是下沿,这可以在“上下沿触发”中断后判别A的高低来确定。总之就是利用A的上下沿(注意能上下沿触发)中断,在中断中判别A和B的高低。A高为上沿触发,A底为下沿触发,然后根据B的高低确定方向。这样的话就实现了软件无误差鉴别功能,其关键是能实现“上下沿都能触发”的中断接口。

使用特权

评论回复
28
yewuyi|  楼主 | 2009-2-21 21:15 | 只看该作者

呵呵,弄明白原理,程序真是很简单。。。

uchar PORTBbuf;
if(RBIF){//下降沿触发
        PORTBbuf=PORTB;
        switch(PORTBbuf&0b00010100){
                                   case 0b00000000:
                                   case 0b00010100:lengthcnt--;
                                                   break;
                                   case 0b00000100:
                                   case 0b00010000:lengthcnt++;
                                                   break;
                                   default:  break;
                             }
        PORTBbuf=PORTB;
        RBIF=false;
        if(lengthcnt&0x8000){lengthcnt=0;}
        else{
            if(lengthcnt>20000){lengthcnt=20000;}
            }
        }
----------------------------------------------
实际测试了一下,目前确实没看到有什么误差。
做法:把A相信号连接到了MCU的电平变化中断上,不过是上升沿和下降沿都肯定有电平变化中断的发生,当MCU发生电平变化中断后,将执行上面的这段代码,A相连接到PORTB.4上,B相连接到PORTB.0上,PORTBbuf=PORTB;--》读取PORTB端口状态,下面的switch(PORTBbuf&0b00010100)则根据冬发君的不同正转,相同则反转的方法计算编码盘的脉冲数。

再次感谢HWM老师、冬发君、洗丸剂先生的帮助,
目前来说,这个问题似乎已经解决了,呵呵,继续测试测试,看看是否还会有其他问题!!!

使用特权

评论回复
29
程疗匠人| | 2009-2-22 19:36 | 只看该作者

mask

使用特权

评论回复
30
onebyte| | 2009-2-24 08:44 | 只看该作者

先留个记号,继续观察

软件上感觉应该可以做的到补偿。应该可以根据前后的逻辑关系,做适当的补偿。但要想精确计数,是应该将分辨率提高,这样才能保证最终测量的准确性。

使用特权

评论回复
31
xhtxzxw| | 2009-2-25 21:57 | 只看该作者

嘿嘿

还是用硬件做转向判别为好吧???

使用特权

评论回复
32
bald| | 2009-2-27 23:20 | 只看该作者

与计算无关

做这样一个产品,需要机械结构的几何对称、照度对称、电路对称。
如果要求严格,在信号的输出端应该是一对正交的中心对称的正弦波形。
几何结构不清楚,但起码感觉这图的照度和电路对称性查太多了。
拿示波器查一下,估计输出端的信号很可能不是方波而是占空比相差许多的脉冲波形,不是方波谈什么正交。

就这个电路而言,应该有两个调节点:
1、调整R12使两路信号的相位差为90度越接近越好,这是考虑到两个光电开关增益可能有误差。(建议使用下降沿,因为猜测你的电路增益偏高)
2、分别调节R14、R15使占空比至50%左右(如果运行频率比较高,观察到的信号上升段和下降段相差比较多的话可能还需要调节电容值)



使用特权

评论回复
33
懒人| | 2009-2-28 12:05 | 只看该作者

学习

使用特权

评论回复
34
xhtxzxw| | 2009-2-28 19:59 | 只看该作者

嘿嘿

34L没有用过旋转编码器.

使用特权

评论回复
35
原野之狼| | 2009-3-1 12:19 | 只看该作者

标记

我怎么感觉X公子和冬发兄说的不是不是同一回事啊~~

使用特权

评论回复
36
yewuyi|  楼主 | 2009-3-1 18:12 | 只看该作者

呵呵,34L讲的和我这个估计不是一回事情

呵呵,我这个东西就是简易的编码器,波形确实不是很好,呵呵,但也能用。


误差主要是往复运动造成的,如果是单向的运动是没有累计误差的

使用特权

评论回复
37
甄蔡组合| | 2009-3-3 13:20 | 只看该作者

学习一下!

使用特权

评论回复
38
cocoliwen8| | 2011-1-24 11:51 | 只看该作者
楼主,研究了一下你整个讨论过程,我现在用2个光槽加+增量式编码盘 做了一个正反转计数器也遇到这个问题,就是在正,反转次数很多时,回到起始位置时计数有累计误差。我的电路在附件里面 麻烦大家给我分析下,谢谢~~~

计数光槽.jpg (233.16 KB )

计数光槽.jpg

使用特权

评论回复
39
yewuyi|  楼主 | 2011-1-24 11:59 | 只看该作者
解决办法就是倍频啊,不已经说过了吗!?

使用特权

评论回复
40
hificwc| | 2011-12-4 14:19 | 只看该作者
留个记号看看

使用特权

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

本版积分规则