keli2046 发表于 2011-8-9 20:05:56

millwood0 发表于 2011-8-9 20:50:26

"EA=0;
...
EA=1; "

only an idiot will do that.

xsh2005105326 发表于 2011-8-9 21:01:29

编码器是机械接触的吧,LZ去抖动了没?

MZMMZMMZM 发表于 2011-8-9 21:08:14

多快?

zqy517 发表于 2011-8-9 21:22:50

用状态机写比较好的!

keli2046 发表于 2011-8-9 21:39:48

keli2046 发表于 2011-8-10 09:07:32

ayumi8 发表于 2011-8-10 16:02:36

我做过不过不是中断的方式

http://cache.amobbs.com/bbs_upload782111/files_44/ourdev_666220OZ4TFT.jpg
(原文件名:1110.jpg)

是这种吗???????????

keli2046 发表于 2011-8-10 17:17:35

zqy517 发表于 2011-8-10 19:25:08

把那个资料发上来,让我们大伙帮你想想看,或许帮你写个!

gutao007 发表于 2011-8-10 19:55:27

原来搞过,手车得再快都不掉码,不知 楼主程序中knob_count 是16bit还是8bit, 估计在中断中做加减比较耗时间, 贴个我的:
/* External Interrupt 0 Service Routine */
void INT0_ISR(void) interrupt 0
{
        DISABLE            // EA = 0;
        RES_C_B = 1;       // RES_C_B是口线
        _nop_();
        if(!RES_C_B)                 // C.W.
                RES_C = CW;       // RES_C是8 bit
        else                        // C.C.W.
                RES_C = CCW;
        bRES_C = 1;      // bRES_C是1 bit位型
        ENABLE         // EA = 1;
}// end of "INT0_ISR()"

在后台程序判断bRES_C和RES_C的值, 再做knob_count累加/减

xiaobendan 发表于 2011-8-10 19:59:59

回复【8楼】keli2046
不是,是增量式的
-----------------------------------------------------------------------

谁说7楼的不是增量型的?

说说你用的是多少线的,转到多快会不好使吧。根据你的速度和分辨率,计算一下频率是多少HZ?看看你的CPU能否胜任?

gutao007 发表于 2011-8-10 20:18:59

不知道你用的型号,上个我的相关电路图
点击此处下载 ourdev_666288IX21WL.pdf(文件大小:115K) (原文件名:LED.pdf)
可能有差别

gutao007 发表于 2011-8-10 20:21:06

请上增量式数据手册

heky 发表于 2011-8-10 20:29:01

靠中断来做的,基本不靠谱。

keli2046 发表于 2011-8-10 21:12:14

vvwvvw 发表于 2011-8-10 21:32:27

回复【15楼】keli2046
回复【10楼】gutao007
-----------------------------------------------------------------------
cw ccw是什么啊
-----------------------------------------------------------------------

转向,顺时针和逆时针

zqy517 发表于 2011-8-10 21:32:41

CW CCW是什么啊--顺时针与逆时针
贴个我的代码:
/*********************************************************************************************
函数名:unsigned char Mouse(void)
功能:    飞梭函数
调 用:
参 数:无
返回值:飞梭旋转方向,1为向左转,2为向右转,0为飞梭不动作
结 果:
备 注:
修改:
时间:2010-09-03
*********************************************************************************************/
/*
unsigned char Mouse(void)                                                        //采用状态机写法,测量飞梭旋转方向
{//机械式
        if (0 == mouse_stat)
        {
                if ((!KEY_ENCODER_A) && KEY_ENCODER_B)//向左转
                {
                        mouse_dir = 0;
                        mouse_stat = 1;
                }
                else if (KEY_ENCODER_A && (!KEY_ENCODER_B))//向右转
                {
                        mouse_dir = 1;
                        mouse_stat = 1;
                }
        }
        else if (1 == mouse_stat)
        {
                if (0 == mouse_dir)
                {
                        if ((!KEY_ENCODER_A) && (!KEY_ENCODER_B))
                        {
                                mouse_stat = 2;
                                return 2;//向右转
                        }
                        else if (KEY_ENCODER_A)
                        {
                                mouse_stat = 3;
                        }
                }
                else
                {
                        if ((!KEY_ENCODER_A) && (!KEY_ENCODER_B))
                        {
                                mouse_stat = 2;
                                return 1;//向左转
                        }
                        else if (KEY_ENCODER_B)
                        {
                                mouse_stat = 3;
                        }
                }
        }
        else if (2 == mouse_stat)
        {
                if (0 == mouse_dir)
                {
                        if (KEY_ENCODER_A && (!KEY_ENCODER_B))
                        {
                                mouse_stat = 3;
                        }
                        else if (KEY_ENCODER_B)
                        {
                                mouse_stat = 3;
                        }
                }
                else
                {
                        if ((!KEY_ENCODER_A) && KEY_ENCODER_B)
                        {
                                mouse_stat = 3;
                        }
                        else if (KEY_ENCODER_A)
                        {
                                mouse_stat = 3;
                        }
                }               
        }
        else if (mouse_stat >= 3)
        {
                if (KEY_ENCODER_A && KEY_ENCODER_B)
                {
                        mouse_stat = 0;
                }
        }
        return 0;
}

*/

gutao007 发表于 2011-8-10 21:33:11

顺时针, 逆时针
CW,CCW随便定义成不同的常数

xiaobendan 发表于 2011-8-10 21:53:00

不如我来上个照片吧,就用我那700元的松下相机吧。哈哈
唉,没办法,老是传不上来啊
http://cache.amobbs.com/bbs_upload782111/files_44/ourdev_666384UWQV69.JPG
(原文件名:P1000132.JPG)

szyjh 发表于 2011-8-10 22:01:58

请试试89c52的TIMER2可以设为加减计数器,硬件的,T2MOD的DCEN位设为1,P1.0,P1.1接A,B相脉冲输入

tonyone 发表于 2011-8-11 22:02:05

学习一下

880705lpdhr 发表于 2011-8-12 10:34:45

多快 丢码呢

keli2046 发表于 2011-8-12 11:41:44

xiaobendan 发表于 2011-8-13 18:01:20

回复【23楼】keli2046
顶多4k
-----------------------------------------------------------------------

4K是什么意思?4KHZ的频率?
是比较快了,换分辨率低点的吧,要不别用51了

yzlyear 发表于 2011-8-20 10:10:19

TO【17楼】 zqy517 燎原星火
用你的程序测试了,反应很慢,要转4到5格,才动作一次,用STM32,频率72M

youmeng 发表于 2011-9-1 03:08:28

mark

maninblack 发表于 2011-11-28 16:33:37

我用51做的旋转编码器检测,中断方式,也是旋转速度一块就容易丢,有时还会检测成反向的,看来要测下是多快的时候回丢,才能解决问题了.

lin_g 发表于 2011-12-15 11:02:25

回复【17楼】zqy517 燎原星火
-----------------------------------------------------------------------


17楼 if (1 == mouse_stat)有这样写的习惯想必是发现KEIL的编译存在一个问题,很多人还是这样写的 if (mouse_stat == 1)

qinhya 发表于 2011-12-15 17:43:08

mark!

dyxganj 发表于 2011-12-17 19:11:40

c51速度不够啊!我也做过,没成功!!我是读脉冲(倍频再分频)!一项目可惜没好!

shi_90 发表于 2012-3-26 11:22:23

我先看看,然后好好学习!!

lpc1788 发表于 2012-3-26 11:49:40

QEI功能的完全可以解决这个问题,但2051我都做出来都没问题哦,兄弟,是不是你程序有问题

liulingo1 发表于 2012-3-26 12:37:08

需要对 AB相进逻辑行处理。不能直接把AB相接入到管脚。

lryxr2507 发表于 2012-3-27 19:53:36

值得学习!

wubingqp 发表于 2012-3-27 20:10:15

mark      

lryxr2507 发表于 2012-3-28 09:33:43

lin_g 发表于 2011-12-15 11:02 static/image/common/back.gif
回复【17楼】zqy517 燎原星火
-----------------------------------------------------------------------
...

请教了:到目前为止我还没搞清这是为什么,请大侠不惜赐教.

YATAOME 发表于 2012-9-22 20:16:58

求增量式编码器的程序啊

小油猪儿 发表于 2012-11-19 13:30:43

zqy517 发表于 2011-8-10 21:32 static/image/common/back.gif
CW CCW是什么啊--顺时针与逆时针
贴个我的代码:
/***************************************************** ...

很懒的盗用了哈哈~

kanping 发表于 2013-3-21 14:40:03

晚上我也试试 {:shy:}

yyinfo263 发表于 2013-7-13 22:43:03

有兄弟试了t2定时计数器来做的吗

lmt50211 发表于 2013-7-29 09:51:10

求大侠讲解下...

add00 发表于 2013-7-29 14:10:18

yyinfo263 发表于 2013-7-13 22:43 static/image/common/back.gif
有兄弟试了t2定时计数器来做的吗

T2定时器做的就基本全硬件的了,前面加触发器,如果要求高最好加比较器去随机干扰

lmt50211 发表于 2013-7-29 15:13:53

zqy517 发表于 2011-8-10 21:32 static/image/common/back.gif
CW CCW是什么啊--顺时针与逆时针
贴个我的代码:
/***************************************************** ...

旋转速度快了后会出现丢码.不知道到您是多少时间扫描一次的?

fastweb 发表于 2013-7-29 19:21:35

本帖最后由 fastweb 于 2013-7-29 19:28 编辑

YATAOME 发表于 2012-9-22 20:16 static/image/common/back.gif
求增量式编码器的程序啊

首先AB相正交编码器如果直接进入管脚不用XOR门处理的话,MCU管脚必须支持上升沿和下降沿中断模式。光下降沿中断的MCU无法使用。
其次如果使用2倍频计数的话,只要有一个管脚支持上升下降沿中断就可以了。另外一相用状态读入的方式运行。

最后提醒:信号很重要,要快而准确,不能用OC门加上拉之类的输入方式,要推挽方式,远距离的话,要差分驱动,到板后差分转换。

下面是一个例子,使用C8051F3xx的PCA的CEX3输入通道(x相关注释已经修改掉)此程序经久耐用,在纺织机上一年四季不停电工作,不出错
(用来绝对值定位的,出错就打掉机器了。)
//定义编码器输入脚:其中一根必须能分配到PCA的某个通道上
sbit                BIT_IN09 = P2^0;        //这个脚引起中断
sbit                BIT_IN10 = P2^1;        //这个脚位置任意

I32        RealCnt;                        //光电编码器反馈实时的脉冲计数:计算实际绝对位置
bit        Encoder_Dir;




//初始化时,将编码器的一个输入脚配置为沿变化中断,并配到此管脚上。
        PCA0CPM3 = 0x31;                //沿变化捕获,中断允许:分配A相输入到P2.0


/******************************************************************************
*功能:PG光电编码器A-B相线的触发沿中断处理
*A相=BIT_IN09,A相=1/P20=0;B相=BIT_IN10
×内部分配:A=CEX3(P2.0),B=CEX4(P2.1)
2010-11-9:A相上升沿和下降沿触发中断,B相不中断,只在中断中用于判断方向
编码器计数器每个脉冲周期计两次(倍频)
每次中断耗时约2.5uS(@24.5Mhz),10%CPU强度时,A相频率=1000000/2.5*10%=40000Hz
*****************************************************************************/
void        PCA_ISR(void) interrupt 11
{
        if (CCF3){                                                        //A相电平变化中断
                CCF3 = 0;
                //检测到A变化后,A和B反相则:反向CCW;A和B同相则:正向CW
                Encoder_Dir = !(BIT_IN09^BIT_IN10);//Encoder_Dir=1为CCW,=0为CW
                if(Encoder_Dir)                                        //反向中
                        RealCnt++;
                else                                                //正向中
                        RealCnt--;                                //
        }
}


xly 发表于 2013-8-1 12:28:09

正要用到这个,记号一下学习

szzxl10 发表于 2013-8-1 13:02:35

学习学习。{:lol:}

kuanglf 发表于 2013-12-10 14:03:48

18楼的用了,能行

zhongzhouAVR 发表于 2013-12-22 11:03:22

Mark, 编码器的资料好像不多啊~
留着~

unifax001 发表于 2013-12-22 11:11:13

是电机转速用的编码器吗

jz701209李 发表于 2013-12-22 19:23:00

路过,看看               

pnsyzx20088hlq 发表于 2013-12-23 21:46:11

这里真是精彩,今后要多来向各位前辈学习~谢谢!

macp 发表于 2014-1-9 15:40:53

mark学习啦!~

zjk 发表于 2014-4-17 16:00:56

mark。。。

lizheng2013 发表于 2015-2-5 11:52:46

没看明白

wpami 发表于 2015-2-15 08:28:41

我以为是模拟旋转编码器,原来是检测旋转编码器。

1125526801 发表于 2015-3-16 22:30:25

zqy517 发表于 2011-8-10 21:32
CW CCW是什么啊--顺时针与逆时针
贴个我的代码:
/***************************************************** ...

好用不?明天试试

lcmdw 发表于 2015-4-22 11:41:53

mark{:smile:}

霸气侧漏 发表于 2017-10-29 18:16:36

fastweb 发表于 2013-7-29 19:21
首先AB相正交编码器如果直接进入管脚不用XOR门处理的话,MCU管脚必须支持上升沿和下降沿中断模式。光下降 ...

你用的什么电路,好奇,公司在做检测,有时候方向会有问题,不知道是不是硬件的原因

霸气侧漏 发表于 2017-10-29 18:17:11

fastweb 发表于 2013-7-29 19:21
首先AB相正交编码器如果直接进入管脚不用XOR门处理的话,MCU管脚必须支持上升沿和下降沿中断模式。光下降 ...

你这个测速度,应该没问题吧

huangxiaolpbany 发表于 2017-10-29 21:44:42

我之前遇到的旋钮比较坑,AB相占空比不是50%的,脉冲高电平只有1ms左右。不知道这一种程序怎么写比较好
页: [1]
查看完整版本: C51旋转编码器问题