打印

求解单片机判编码器旋转方向时的一个奇怪现象

[复制链接]
2313|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
catiya|  楼主 | 2011-8-17 16:45 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
实验目的:采用单片机判定编码器旋转方向。

实验方法:外部中断法,对编码器输出的A、B两相进行判定,并由RS232串口控制查询

和输出结果。

硬件连接:编码器B相输入到外部中断0(INT0),A相输入到P3.3口。

实验原理:编码器输出的A、B两相相位相差90度,正转时A相领先B相90度,反转时B

相领先A相90度。B相下降沿触发外部中断,在外部中断服务程序中采样A相的电平,若

为高电平,则判定编码器是反向转动,若为低电平,则是正向转动。

实验现象:程序已经最简化,但是每次进入外部中断后,采样到的A相电平总是不定的,

所以判定出的编码器旋转方向总是不确定的。

程序关键部分:
......

acall uart_rx //接收串口字符

cjne a,#0cdh,error //查询串口,若收到“cd”则是判定方向指令,否则报错

acall CheckDIR
......

CheckDIR: //判定方向子程序,只做了一件事,就是打开外部中断0
   
    setb EX0 //开外部中断0

    ret
.......

EX_INT0: //外部中断服务程序

    clr EX0 //只响应一次外部中断,下次外部中断等待串口输入"cd”再次开启

    jb p3.3,setAntiCW //若p3.3为低,则改变LED1状态表示是正转

    cpl LED1
   
    reti

setAntiCW:

    cpl LED2 //若p3.3为高,则改变LED2状态表示是反转

    reti

实验手段:一开始用手转动编码器,发现判出的编码器旋转方向不定,表现为LED1和

LED2随机交替闪亮。怀疑是手转动编码器有抖动误差。后来用写了个测试程序,用另外

一块单片机口线模拟了A、B相的脉冲,用示波器观测波形正常,可模拟出要么A相超前B

相要么B相超前A相90度的稳定脉冲,但判出的旋转方向依然是不定态,无论怎样改变

A、B两相的周期,小到几us级,大到几ms级,现象相同。

判方向的单片机采用的是STC的11F01E的1T单片机,晶振22.1184M。

以上问题左思右想不得其解,望高人指点,谢谢!

相关帖子

沙发
cbstudy| | 2011-8-18 07:35 | 只看该作者
进外中断要几个时钟周期?是不是你的串口中断优先级比较高,打断了外中断。

使用特权

评论回复
板凳
liulingo| | 2011-8-18 07:51 | 只看该作者
靠软件判断出方向,没那么简单。

因为产生中断的波形 不是理想中的 方波。

使用特权

评论回复
地板
dqyubsh| | 2011-8-18 08:58 | 只看该作者
一般都是用硬件处理成脉冲和方向两个信号之后再进单片机。

使用特权

评论回复
5
catiya|  楼主 | 2011-8-18 09:35 | 只看该作者
进外中断要几个时钟周期?是不是你的串口中断优先级比较高,打断了外中断。
cbstudy 发表于 2011-8-18 07:35


串口是查询方式,不存在此问题

使用特权

评论回复
6
catiya|  楼主 | 2011-8-18 09:37 | 只看该作者
靠软件判断出方向,没那么简单。

因为产生中断的波形 不是理想中的 方波。
liulingo 发表于 2011-8-18 07:51


速度很慢的情况下,比如A、B两项周期都是ms级,每次都能稳定进入中断,而且进入

中断后在采样点上,A相也是稳定的电平。

使用特权

评论回复
7
catiya|  楼主 | 2011-8-18 09:37 | 只看该作者
一般都是用硬件处理成脉冲和方向两个信号之后再进单片机。
dqyubsh 发表于 2011-8-18 08:58


没太明白呢?

使用特权

评论回复
8
kfzy6| | 2011-8-18 10:20 | 只看该作者
没看太明白

使用特权

评论回复
9
dqyubsh| | 2011-8-18 10:42 | 只看该作者
A/B两个信号是输入,用芯片或者CPLD处理成一路单独的脉冲信号和一路正负变化的方向信号,这样单片机用计数器数脉冲个数就可以了(或者用8253),在数个数的同时,根据方向信号确定计数是加还是减。

使用特权

评论回复
10
dqyubsh| | 2011-8-18 10:43 | 只看该作者
更简单的方法是,有专门的计数器芯片可以用来处理编码器信号,处理结果就是脉冲总数。

使用特权

评论回复
11
catiya|  楼主 | 2011-8-18 13:25 | 只看该作者
dqyubsh兄的方法是否麻烦了点?我只是想知道我的方法哪里不对。还有什么没考虑到的地方。

使用特权

评论回复
12
dqyubsh| | 2011-8-18 15:00 | 只看该作者
现在我的一块板子就是要计量深度的,还是用9楼那样的方案,我都觉得太耗单片机资源了。整个板子做下来,惟一的感觉就是单片机干事太费劲,尤其是51。

你这种方法应该可行,我之前看过一个AVR的例子就是你这样干的。你找一下avrlib,它是开源的。

使用特权

评论回复
13
catiya|  楼主 | 2011-8-18 15:35 | 只看该作者
谢谢!

使用特权

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

本版积分规则

45

主题

228

帖子

2

粉丝