完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
又人问我关于编码器正反转计数的问题,在此发表我自己写的关于编码器正反转计数程序,
此程序主要是判断正反转和计数值。(转载请注明原帖) 程序为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 |
|
相关推荐
15个回答
|
|
|
|
|
|
来自天国的程序~~
|
|
|
|
这个程序是我在一个高度计当中的程序,使用51单片机对编码器进行采样后传输到上位机。因为担心实时性问题(采样跟不上编码器实际转动速度),所以使用了汇编。
|
|
|
|
增量型编码器设计 资料光电编码器的信号处理电路研究.pdf (348.96 KB )
增量式编码器数据采集.pdf (165.55 KB ) 增量式光电编码器计数与接口电路的设计.pdf (173.28 KB ) 增量式光电编码器与单片机的接口设计.pdf (713.96 KB ) |
|
|
|
你好NB
|
|
|
|
你试试,用C会比你的汇编还快,
|
|
|
|
厉害 ,膜拜大神。
|
|
|
|
先下载下来看看,楼猪牛逼,佩服
|
|
|
|
我靠,纯汇编啊 !!膜拜一下!!!
|
|
|
|
汇编啊 !!膜拜一下!!!以前有研究同事的产品,没弄明白,多谢了!
|
|
|
|
正要用到这个程序!
Proteus里用到了motor encoder,需要用单片机判断正反转,计数。不会啊求助大神 外部怎么接线?最终返回的计数值是哪一个变量?汇编看不懂啊! |
|
|
|
大神,有C语言的吗
|
|
|
|
原子哥,我想问一下增量式编码器接入stm32 f407 使用定时器的编码器模式,可不可以测量单摆角度,即初始值是cnt值为0,正转时递增,反转时递减,当递减到0时,回到最低点,继续反转会不会是负值,还是设定值递减。
|
|
|
|
我见到汇编写程序的牛人,基本都跪拜!!
|
|
|
|
这个是程序是用51单片机的汇编程序,使用1000线的欧姆龙编码器,实际工程已经用了快5年,速度跟的上,没有严重的漏码。但是最近在改用STM32F103RBT6的编码器接口时,发现速度没有51单片机的反应快,
同样的高速度时STM32的容易漏码。有谁仔细测试过? |
|
|
|
只有小组成员才能发言,加入小组>>
3280 浏览 9 评论
2958 浏览 16 评论
3460 浏览 1 评论
9004 浏览 16 评论
4052 浏览 18 评论
1115浏览 3评论
573浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
571浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2303浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1860浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-25 19:12 , Processed in 1.807970 second(s), Total 108, Slave 88 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号