xiaole01 发表于 2011-1-16 19:15:34

旋转编码开关程式,看各位写的太复杂,我写了个精简的,才5行,M8,测试稳定。

今天做一个信号发生器,想用旋转编码开关,看了一个坛子里的程式,写的太复杂,

于是乎我写了个简单的,测试稳定,大家看看吧,

(我用的这个转一档,AB脚上的电压只变化一次。坛子里图都是转一档变化两次,所以大家用的时候只用把中断触发方式改一下就行了)

M8,,12MHZ,INT0,--------PD2--PD3.



/****************************************************************
//函数名称:int0_isr(void)
//功    能:中断0处理函数
//入口参数:无
//出口参数:无
*****************************************************************/
#pragma interrupt_handler int0_isr:iv_INT0
void int0_isr(void)
{
    char i,j;
    SREG=0x00;                                       // 我试过,不用关中断也没问题。

       i=(PIND&0B00001000);                      //读第一脚值
       j=(PIND&0B00000100);                      //读第二脚值
       if(i){i=1;}else{i=0;}                     //整理
       if(j){j=1;}else{j=0;}
       if(i==j){pp--;}else{pp++;}                    //如果一样就是+,不一样就-
       SREG=0x80;                                 // 不用关中断的话,当然这句也可以不用,
       }
/****************************************************************
//函数名称:MAIN
//功    能:
//入口参数:无
//出口参数:无
*****************************************************************/
   void main()
       {                  
           MCUCR=0B00000001;                           //我用的这个和大家画的那个图不一样,所以只要变动就触发。
           GICR=0b01000000;                           //INT0
           SREG=0x80;                                  //使能全局中断

   while(1)
   {
      show1(pp);

          }}

wwwdege 发表于 2011-1-16 19:27:45

顶一下

xiaole01 发表于 2011-1-16 19:38:03

测试,最快旋转和最慢旋转没有掉步现象。4.7K上拉,104滤波。

hsztc 发表于 2011-1-16 20:02:25

哈哈,有空试试

MicroPLC 发表于 2011-1-16 20:13:38

mark.

hsztc 发表于 2011-1-16 20:14:22

给你简化一下只剩一行

//i=(PIND&0B00001000);                      //读第一脚值
//j=(PIND&0B00000100);                      //读第二脚值
//if(i){i=1;}else{i=0;}                     //整理
//if(j){j=1;}else{j=0;}

if(!((PIND^(PIND>>1))&4)) {pp--;} else {pp++;}             //如果一样就是+,不一样就-

hsztc 发表于 2011-1-16 20:17:22

或者:

if((PIND^(PIND>>1))&4) {pp++;} else {pp--;}

rafd 发表于 2011-1-16 20:23:35

记号一下

xiaole01 发表于 2011-1-16 20:30:25

【6楼】 hsztc

积分:1815
派别:
等级:------
来自:福建省
或者:

if((PIND^(PIND>>1))&4) {pp++;} else {pp--;}

哈哈,强 我试试,

可以用,
这下子剩一行了,

xiaomage_2000 发表于 2011-1-16 20:33:15

居然没看明白,还是MARK吧

hero245 发表于 2011-1-16 20:42:52

;mark

albert_w 发表于 2011-1-16 20:44:32

还真是这么写的...自己都没注意,这是两步一脉冲周期那种

wangguanfu 发表于 2011-1-16 20:50:37

MARK

tfavr2008 发表于 2011-1-16 22:07:41

顶顶顶!

ylei12 发表于 2011-1-16 22:47:44

mark

Yaksa 发表于 2011-1-16 22:48:27

这个不叫一行,用?:改写才是一行

给你简化一下只剩一行 //i=(PIND&0B00001000); //读第一脚值 //j=(PIND&0B00000100); //读第二脚值 //if(i){i=1;}else{i=0;} //整理 //if(j){j=1;}else{j=0;} if(!((PIND^(PIND>>1))&4)) {pp--;} else {pp++;} //如果一样就是+,不一样就-

eezm 发表于 2011-1-16 23:13:19

mark

hdd961140543 发表于 2011-1-16 23:45:51

mark!

albert_w 发表于 2011-1-17 00:03:26

U8 direction = (PIND&_BV(PD2))!= (PIND & _BV(PD0));

xiaole01 发表于 2011-1-17 00:17:08

突然想明白了,这东西就是这么简单,所以我总结出一句话:


<< 一个被按下后判断另一个,如果两脚一样就是正向,如果两脚不一样,就是反向>>

就这么简单,而且超稳定。

看过各前辈写的程式,都复杂化了,看有一个前辈竟然写了两三页。

如有不对,请多多指教、、、

fy024 发表于 2011-1-17 00:21:07

mark

fy024 发表于 2011-1-17 00:21:43

mark

xjavr 发表于 2011-1-17 00:24:45

回复【19楼】xiaole01 潇乐
突然想明白了,这东西就是这么简单,所以我总结出一句话:
&lt;&lt; 一个被按下后判断另一个,如果两脚一样就是正向,如果两脚不一样,就是反向&gt;&gt;
就这么简单,而且超稳定。
看过各前辈写的程式,都复杂化了,看有一个前辈竟然写了两三页。
如有不对,请多多指教、、、

-----------------------------------------------------------------------

其实两三页是正常的,还要考虑到加速的问题,多功能这些问题,比如照你的程序要是加1W的话,你扭到手断都扭不到目标,哈哈.

bjj9217 发表于 2011-1-17 00:28:25

Mark

heguang 发表于 2011-1-17 00:33:12

如果是汇编的要几行呢,一点也不懂C的说。

xiaole01 发表于 2011-1-17 00:48:40

【22楼】 xjavr

积分:63
派别:
等级:------
来自:
回复【19楼】xiaole01 潇乐
突然想明白了,这东西就是这么简单,所以我总结出一句话:
<< 一个被按下后判断另一个,如果两脚一样就是正向,如果两脚不一样,就是反向>>
就这么简单,而且超稳定。
看过各前辈写的程式,都复杂化了,看有一个前辈竟然写了两三页。
如有不对,请多多指教、、、

-----------------------------------------------------------------------

其实两三页是正常的,还要考虑到加速的问题,多功能这些问题,比如照你的程序要是加1W的话,你扭到手断都扭不到目标,哈哈.

---------------------------------------------------------------------------

这倒有可能,没仔细看,多谢,

joni 发表于 2011-1-17 00:57:40

mark

zhenke 发表于 2011-1-17 10:16:52

Mark!

phone 发表于 2011-1-17 11:43:51

先作个记号。

ndt2000 发表于 2011-1-17 13:58:14

mark

hemjidn 发表于 2011-1-17 15:09:49

不考虑去抖?光电的应该可以机械的……

by886 发表于 2011-3-19 19:01:08

mark

chinabox 发表于 2011-6-30 16:08:28

mark

tomy 发表于 2011-6-30 17:32:18

学习了!用了几个IO??

henry 发表于 2011-6-30 18:19:18

mark

xiaole01 发表于 2011-8-10 19:08:29

yong 2 IO.

topdog 发表于 2011-8-10 19:30:29

linxquan 发表于 2011-8-10 20:13:42

我不太理解它的工作原理

more 发表于 2011-8-11 00:06:27

学习一下

jack_yu 发表于 2011-8-11 00:26:04

mark!

wxws 发表于 2011-8-11 00:35:21

中断后 保存一下时间,
主程序中判断一下就能处理速度问题了

szgr 发表于 2011-8-11 06:30:34

要是按楼上各位的用法,恐怕也只能自己玩玩了。
用过的都知道,编码器这样得出的数误差很大,具体原因是因为运动时的抖动造成的。

xiaobendan 发表于 2011-8-11 06:47:06

不错,思路很新颖,加上去抖动就更好了。

wxfhw 发表于 2011-8-11 06:52:38

记号

1ongquan 发表于 2011-8-11 08:25:25

搞过定时扫描的,不用中断

dongls 发表于 2011-8-11 09:48:26

MARK,很不错.

zhonghua_li 发表于 2011-8-11 11:52:55

我感觉在某个位置时,会出现连续自加,自减呢?

wayhe 发表于 2011-8-11 12:28:19

留个记号!

huangdongle 发表于 2011-8-11 12:48:05

MARK

yibunihao 发表于 2011-8-11 13:43:31

哈哈,顶一下~~

vtte 发表于 2011-8-11 14:06:36

收藏,人多力量大啊

xiaobendan 发表于 2011-8-11 14:11:33

回复【46楼】zhonghua_li 蓝色天空
我感觉在某个位置时,会出现连续自加,自减呢?
-----------------------------------------------------------------------

详细说说?具体那个部位?

Ye_gan 发表于 2011-8-11 19:31:47

学习

cuikai12345 发表于 2011-8-11 20:31:43

mark

madara 发表于 2011-8-11 20:36:45

这样弄在用高分辨率的编码器时是会出问题的。

powercxz 发表于 2011-8-11 20:41:16

不错,准备在stm32试一下

lningbd 发表于 2011-8-11 21:03:31

oK!mark

jydq 发表于 2011-8-11 21:39:20

留个记号,学习了。

zph888 发表于 2011-9-30 10:38:46

MARK

FreeRTOS 发表于 2011-9-30 10:46:23

;mark

root_007 发表于 2011-9-30 11:31:27

mark

kazuyuki 发表于 2011-10-3 20:00:29

mark一下,先藏着,等回头再来学习

henry 发表于 2011-10-3 20:03:54

mark

monlika 发表于 2011-10-4 09:49:15

68336016 发表于 2011-10-4 10:21:21

回复【19楼】xiaole01 潇乐
突然想明白了,这东西就是这么简单,所以我总结出一句话:
<< 一个被按下后判断另一个,如果两脚一样就是正向,如果两脚不一样,就是反向>>
就这么简单,而且超稳定。
看过各前辈写的程式,都复杂化了,看有一个前辈竟然写了两三页。
如有不对,请多多指教、、、
-----------------------------------------------------------------------
楼主似乎忽略了一点,按你的说法就是X4模式,在每个相位引脚上升下降沿都会产生中断,你应该判断该中断是由A相还是B相触发后才能这么说。

假如A相超前B相90度

A相产生中断时
if(A==B)
{计数--;}
else
{计数++;}

而B相产生中断时
if(A==B)
{计数++;}
else
{计数--;}
http://cache.amobbs.com/bbs_upload782111/files_46/ourdev_682049A02Q8N.jpg
(原文件名:X4模式.jpg)

zlj2008 发表于 2011-10-5 12:04:52

mark

stm8s 发表于 2011-10-5 15:10:54

mark 谢谢好东西有时间再看

gameboy22 发表于 2011-10-31 10:06:20

mark

njchenmin 发表于 2011-11-1 06:42:28

这样可能会有问题的

wpnx 发表于 2011-11-1 09:44:24

简单 MARK

zhy980 发表于 2011-11-1 10:40:06

抗干扰能力不行,玩玩可以

lcmdw 发表于 2011-11-1 11:31:27

mark

aura 发表于 2011-11-2 00:30:23

自己做实验可以,但用在产品上就不严谨了,要考虑的东西太多,干扰 抖动 等。。。。

xiaole01 发表于 2011-12-29 09:19:24

回复【65楼】68336016
-----------------------------------------------------------------------

只用一个中断就行了,要么用A相的,要么用B相的,进入中断后判断另一个脚的状态就行了,

lintel 发表于 2011-12-29 09:27:44

mark ,测试下

xiaole01 发表于 2012-1-18 10:27:18

不知道大家有没有真正的测试,具我这么长时间的测试很稳定,
比我示波器上的稳定多了,示波器上的我要它加它就减,要它减它就加,

hyzqq 发表于 2012-1-19 23:17:21

mark

hygs 发表于 2012-1-20 09:38:40

谢谢分享

looklooktom 发表于 2012-1-20 10:25:47

mark

liulwn 发表于 2012-1-20 11:10:53

mark

cdust 发表于 2012-1-20 11:21:41

标记下,过几天有用

lsy_forever 发表于 2012-1-20 20:18:08

Mark哟~涨楼很快~

yy945 发表于 2012-1-20 20:22:20

Mark

dingliming 发表于 2012-1-21 07:25:06

记号

luoqs 发表于 2012-2-16 16:57:39

好东西,我验证一下看看!!

jz701209李 发表于 2012-5-26 21:51:36

记号一下。

kcfoo1 发表于 2012-5-29 09:45:38

开边沿中断可以,不开中断是不行的,因为必须在上下沿判断出的结果才有效

chengtina 发表于 2012-5-29 10:57:15

这个吧,只能自己玩玩和认识下编码器的,真用起来没这么简单的。。。。。

zhuangchao12 发表于 2012-5-30 00:25:53

有空试一下楼主的行不行

ksh84222 发表于 2012-9-13 23:11:02

正准备用这个

atl0402 发表于 2012-10-18 23:05:56

现在学习一下

lishunfu 发表于 2012-12-24 22:49:11

学习了,谢谢!

tangwq 发表于 2013-4-4 00:54:04

不错,记号

whyjld 发表于 2013-4-4 07:47:28

学习,不想用mark

15802770321 发表于 2013-4-4 11:07:22

逻辑越简单,程序越稳定

jackee 发表于 2013-12-5 19:54:44

正需要,马上试试

iixin 发表于 2013-12-6 00:04:24

好好学习一下,先记号。

jesen_2010 发表于 2013-12-6 00:12:07

这个要MARK一下            

kuanglf 发表于 2014-2-24 09:08:14

谢谢66楼,看懂了

xiaole01 发表于 2014-10-11 15:38:49

68336016 发表于 2011-10-4 10:21
回复【19楼】xiaole01 潇乐
突然想明白了,这东西就是这么简单,所以我总结出一句话:
>


只用一个中断就可以了,不用两个的,
页: [1] 2
查看完整版本: 旋转编码开关程式,看各位写的太复杂,我写了个精简的,才5行,M8,测试稳定。