OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 21086|回复: 15

关于编码器正反转计数(原创程序)

[复制链接]

43

主题

228

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1073
金钱
1073
注册时间
2012-1-10
在线时间
237 小时
发表于 2012-8-31 09:15:40 | 显示全部楼层 |阅读模式

又人问我关于编码器正反转计数的问题,在此发表我自己写的关于编码器正反转计数程序,
此程序主要是判断正反转和计数值。(转载请注明原帖)
程序为51汇编,中断接收A相,得到计数值,并判断正/反转。
 ;进入中断(A相低电平),端口(B相)如果是高电平,正转(脉冲加1);否则 反转(脉冲减1)
;注释:【硬件有光耦隔离,电平信号要取反(A相和B相),结果不变】
;B相两次判断,如果相同则脉冲有效加减,否则认为是干扰回复原脉冲值。
;B相两次判断时间为脉冲加减处理时间[加46T;减100T]
;中断处理运行时间:脉冲正 88T;脉冲负142T
;------------------------------------------------------------------------------------
XINT0:
        CLR     EA
        PUSH    ACC
        PUSH    B
        PUSH    PSW
        PUSH    SUMM_MINU_CELL_L
        PUSH    SUMM_MINU_CELL_L-1
        PUSH    SUMM_MINU_CELL_L-2
        PUSH    PULSE_XINT0_BUF-2
        PUSH    PULSE_XINT0_BUF-1
        PUSH    PULSE_XINT0_BUF
       
        SETB    RS0
        SETB    XINT0_MARK              
        JB      HEIGHT0_B,XINT0_C
        LJMP    XINT0_R
;------------------------------------------------------------------------------------                        
;正转
XINT0_C:       
        SETB    C_R_MARK0       
        MOV     A,PULSE_XINT0_BUF-2
        JB      ACC.7,XINT0_C_0
ULSE0_XINT0_BUF 值为正;PULSE0_XINT0_BUF 加 1       
        MOV     SUMM_MINU_CELL_L,#01H
        MOV     SUMM_MINU_CELL_L-1,#00H
        MOV     SUMM_MINU_CELL_L-2,#00H
        MOV     R0,#SUMM_MINU_CELL_L
        MOV     R1,#PULSE_XINT0_BUF
        MOV     R2,#03H
        LCALL   MBCDADD                 ;加法,结果在R1中
        LJMP    XINT0_END_F
ULSE0_XINT0_BUF 值为负       
XINT0_C_0:
        MOV     A,PULSE_XINT0_BUF-2       
        CLR     ACC.7
        MOV     PULSE_XINT0_BUF-2,A
        JNZ     XINT0_C_1
        MOV     A,PULSE_XINT0_BUF-1        
        JNZ     XINT0_C_1
        MOV     A,PULSE_XINT0_BUF        
        JNZ     XINT0_C_1
        LJMP    XINT0_C_2
ULSE0_XINT0_BUF 值为负,且不等于0;PULSE0_XINT0_BUF 减 1;结果负
XINT0_C_1:
        MOV     SUMM_MINU_CELL_L,#01H
        MOV     SUMM_MINU_CELL_L-1,#00H
        MOV     SUMM_MINU_CELL_L-2,#00H
        MOV     R0,#PULSE_XINT0_BUF
        MOV     R1,#SUMM_MINU_CELL_L
        MOV     R2,#03H
        LCALL   MBCDSUB                                                  ;减法
        MOV     PULSE_XINT0_BUF,SUMM_MINU_CELL_L
        MOV     PULSE_XINT0_BUF-1,SUMM_MINU_CELL_L-1       
        MOV     A,SUMM_MINU_CELL_L-2
        SETB    ACC.7
        MOV     PULSE_XINT0_BUF-2,A
        LJMP    XINT0_END_F       
ULSE0_XINT0_BUF 值为负,且等于0;PULSE0_XINT0_BUF 加 1;结果正
XINT0_C_2:  
        MOV     PULSE_XINT0_BUF,#01H
        MOV     PULSE_XINT0_BUF-1,#00H       
        MOV     PULSE_XINT0_BUF-2,#00H 
        LJMP    XINT0_END_F                 
;------------------------------------------------------------------------------------          
;反转       
XINT0_R:
        CLR     C_R_MARK0               ;反转       
        MOV     A,PULSE_XINT0_BUF-2
        JNB     ACC.7,XINT0_R_0
ULSE0_XINT0_BUF 值为负;PULSE0_XINT0_BUF 加 1;结果 负
        MOV     SUMM_MINU_CELL_L,#01H
        MOV     SUMM_MINU_CELL_L-1,#00H
        MOV     SUMM_MINU_CELL_L-2,#00H
        MOV     R0,#SUMM_MINU_CELL_L
        MOV     R1,#PULSE_XINT0_BUF
        MOV     R2,#03H
        LCALL   MBCDADD                 ;结果在R1中        
        MOV     A,PULSE_XINT0_BUF-2
        SETB    ACC.7
        MOV     PULSE_XINT0_BUF-2,A
        LJMP    XINT0_END_R
ULSE0_XINT0_BUF 值为正
XINT0_R_0:       
        MOV     A,PULSE_XINT0_BUF-2       
        JNZ     XINT0_R_1
        MOV     A,PULSE_XINT0_BUF-1        
        JNZ     XINT0_R_1
        MOV     A,PULSE_XINT0_BUF        
        JNZ     XINT0_R_1
        LJMP    XINT0_R_2
ULSE0_XINT0_BUF 值为正,且不等于0;PULSE0_XINT0_BUF 减 1;结果正
XINT0_R_1:
        MOV     SUMM_MINU_CELL_L,#01H
        MOV     SUMM_MINU_CELL_L-1,#00H
        MOV     SUMM_MINU_CELL_L-2,#00H
        MOV     R0,#PULSE_XINT0_BUF
        MOV     R1,#SUMM_MINU_CELL_L
        MOV     R2,#03H
        LCALL   MBCDSUB                                                                 ;减法 
        MOV     PULSE_XINT0_BUF,SUMM_MINU_CELL_L
        MOV     PULSE_XINT0_BUF-1,SUMM_MINU_CELL_L-1       
        MOV     PULSE_XINT0_BUF-2,SUMM_MINU_CELL_L-2
        LJMP    XINT0_END_R
ULSE0_XINT0_BUF 值为正,且等于0;PULSE0_XINT0_BUF 减 1;结果负        
XINT0_R_2:
        MOV     PULSE_XINT0_BUF,#01H
        MOV     PULSE_XINT0_BUF-1,#00H       
        MOV     PULSE_XINT0_BUF-2,#80H     
        LJMP    XINT0_END_R      
;------------------------------------------------------------------------------------       
;判断是否真是 正转?
XINT0_END_F:
        JB      HEIGHT0_B,XINT0_END
        AJMP    XINT0_END_ERR
;判断是否真是 反转?
XINT0_END_R:
        JNB     HEIGHT0_B,XINT0_END
        AJMP    XINT0_END_ERR
XINT0_END:       
        POP     ACC
        POP     ACC
        POP     ACC
        POP     SUMM_MINU_CELL_L-2       
        POP     SUMM_MINU_CELL_L-1 
        POP     SUMM_MINU_CELL_L
        POP     PSW
        POP     B
        POP     ACC
        SETB    EA
        RETI
XINT0_END_ERR:       
        POP     PULSE_XINT0_BUF
        POP     PULSE_XINT0_BUF-1
        POP     PULSE_XINT0_BUF-2
        POP     SUMM_MINU_CELL_L-2       
        POP     SUMM_MINU_CELL_L-1 
        POP     SUMM_MINU_CELL_L
        POP     PSW
        POP     B
        POP     ACC
        SETB    EA
        RETI

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165312
金钱
165312
注册时间
2010-12-1
在线时间
2108 小时
发表于 2012-8-31 09:22:07 | 显示全部楼层
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

31

主题

270

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
450
金钱
450
注册时间
2012-5-18
在线时间
6 小时
发表于 2012-8-31 10:01:03 | 显示全部楼层
回复【楼主位】magicoctoy:
---------------------------------
来自天国的程序~~
谁来买我的火柴.....
回复 支持 反对

使用道具 举报

43

主题

228

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1073
金钱
1073
注册时间
2012-1-10
在线时间
237 小时
 楼主| 发表于 2012-8-31 10:55:36 | 显示全部楼层
这个程序是我在一个高度计当中的程序,使用51单片机对编码器进行采样后传输到上位机。因为担心实时性问题(采样跟不上编码器实际转动速度),所以使用了汇编。
回复 支持 反对

使用道具 举报

43

主题

228

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1073
金钱
1073
注册时间
2012-1-10
在线时间
237 小时
 楼主| 发表于 2012-8-31 11:31:40 | 显示全部楼层
增量型编码器设计 资料

光电编码器的信号处理电路研究.pdf

348.96 KB, 下载次数: 1963

增量式编码器数据采集.pdf

165.55 KB, 下载次数: 1898

增量式光电编码器计数与接口电路的设计.pdf

173.28 KB, 下载次数: 1720

增量式光电编码器与单片机的接口设计.pdf

713.96 KB, 下载次数: 2028

回复 支持 反对

使用道具 举报

25

主题

157

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
281
金钱
281
注册时间
2013-11-24
在线时间
5 小时
发表于 2013-12-22 00:25:07 | 显示全部楼层
回复【4楼】magicoctoy:
---------------------------------
你好NB
回复 支持 反对

使用道具 举报

2

主题

255

帖子

0

精华

高级会员

Rank: 4

积分
821
金钱
821
注册时间
2013-6-5
在线时间
141 小时
发表于 2014-3-6 16:55:37 | 显示全部楼层
你试试,用C会比你的汇编还快,
回复 支持 反对

使用道具 举报

0

主题

6

帖子

0

精华

新手上路

积分
26
金钱
26
注册时间
2014-6-4
在线时间
0 小时
发表于 2014-6-4 16:27:07 | 显示全部楼层
厉害 ,膜拜大神。
回复 支持 反对

使用道具 举报

16

主题

253

帖子

0

精华

高级会员

Rank: 4

积分
565
金钱
565
注册时间
2013-10-16
在线时间
52 小时
发表于 2014-6-10 15:15:51 | 显示全部楼层
先下载下来看看,楼猪牛逼,佩服
回复 支持 反对

使用道具 举报

33

主题

253

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
412
金钱
412
注册时间
2012-8-16
在线时间
0 小时
发表于 2014-6-20 09:44:14 | 显示全部楼层
我靠,纯汇编啊 !!膜拜一下!!!
开源的世界,你可以做主!!
回复 支持 反对

使用道具 举报

126

主题

820

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1683
金钱
1683
注册时间
2012-10-28
在线时间
62 小时
发表于 2014-6-20 14:01:20 | 显示全部楼层
汇编啊 !!膜拜一下!!!以前有研究同事的产品,没弄明白,多谢了!
坚持学习!就能成功!
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
21
金钱
21
注册时间
2015-12-24
在线时间
0 小时
发表于 2015-12-24 15:44:28 | 显示全部楼层
正要用到这个程序!
Proteus里用到了motor encoder,需要用单片机判断正反转,计数。不会啊求助大神
外部怎么接线?最终返回的计数值是哪一个变量?汇编看不懂啊!
回复 支持 反对

使用道具 举报

9

主题

85

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3832
金钱
3832
注册时间
2014-7-26
在线时间
525 小时
发表于 2016-1-2 16:46:36 | 显示全部楼层
大神,有C语言的吗
回复 支持 反对

使用道具 举报

1

主题

5

帖子

0

精华

新手入门

积分
18
金钱
18
注册时间
2016-1-4
在线时间
6 小时
发表于 2016-1-4 16:40:31 | 显示全部楼层

原子哥,我想问一下增量式编码器接入stm32 f407 使用定时器的编码器模式,可不可以测量单摆角度,即初始值是cnt值为0,正转时递增,反转时递减,当递减到0时,回到最低点,继续反转会不会是负值,还是设定值递减。
回复 支持 反对

使用道具 举报

0

主题

81

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
208
金钱
208
注册时间
2014-9-18
在线时间
21 小时
发表于 2017-8-9 02:29:39 | 显示全部楼层
我见到汇编写程序的牛人,基本都跪拜!!
回复 支持 反对

使用道具 举报

43

主题

228

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1073
金钱
1073
注册时间
2012-1-10
在线时间
237 小时
 楼主| 发表于 2017-8-13 21:54:00 | 显示全部楼层
这个是程序是用51单片机的汇编程序,使用1000线的欧姆龙编码器,实际工程已经用了快5年,速度跟的上,没有严重的漏码。但是最近在改用STM32F103RBT6的编码器接口时,发现速度没有51单片机的反应快,
同样的高速度时STM32的容易漏码。有谁仔细测试过?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-23 21:44

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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