...
EA=1; "
only an idiot will do that. 编码器是机械接触的吧,LZ去抖动了没? 多快? 用状态机写比较好的! 我做过不过不是中断的方式
http://cache.amobbs.com/bbs_upload782111/files_44/ourdev_666220OZ4TFT.jpg
(原文件名:1110.jpg)
是这种吗??????????? 把那个资料发上来,让我们大伙帮你想想看,或许帮你写个! 原来搞过,手车得再快都不掉码,不知 楼主程序中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累加/减 回复【8楼】keli2046
不是,是增量式的
-----------------------------------------------------------------------
谁说7楼的不是增量型的?
说说你用的是多少线的,转到多快会不好使吧。根据你的速度和分辨率,计算一下频率是多少HZ?看看你的CPU能否胜任? 不知道你用的型号,上个我的相关电路图
点击此处下载 ourdev_666288IX21WL.pdf(文件大小:115K) (原文件名:LED.pdf)
可能有差别 请上增量式数据手册 靠中断来做的,基本不靠谱。 回复【15楼】keli2046
回复【10楼】gutao007
-----------------------------------------------------------------------
cw ccw是什么啊
-----------------------------------------------------------------------
转向,顺时针和逆时针 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;
}
*/ 顺时针, 逆时针
CW,CCW随便定义成不同的常数 不如我来上个照片吧,就用我那700元的松下相机吧。哈哈
唉,没办法,老是传不上来啊
http://cache.amobbs.com/bbs_upload782111/files_44/ourdev_666384UWQV69.JPG
(原文件名:P1000132.JPG) 请试试89c52的TIMER2可以设为加减计数器,硬件的,T2MOD的DCEN位设为1,P1.0,P1.1接A,B相脉冲输入 学习一下 多快 丢码呢 回复【23楼】keli2046
顶多4k
-----------------------------------------------------------------------
4K是什么意思?4KHZ的频率?
是比较快了,换分辨率低点的吧,要不别用51了 TO【17楼】 zqy517 燎原星火
用你的程序测试了,反应很慢,要转4到5格,才动作一次,用STM32,频率72M mark 我用51做的旋转编码器检测,中断方式,也是旋转速度一块就容易丢,有时还会检测成反向的,看来要测下是多快的时候回丢,才能解决问题了. 回复【17楼】zqy517 燎原星火
-----------------------------------------------------------------------
17楼 if (1 == mouse_stat)有这样写的习惯想必是发现KEIL的编译存在一个问题,很多人还是这样写的 if (mouse_stat == 1) mark! c51速度不够啊!我也做过,没成功!!我是读脉冲(倍频再分频)!一项目可惜没好! 我先看看,然后好好学习!! QEI功能的完全可以解决这个问题,但2051我都做出来都没问题哦,兄弟,是不是你程序有问题 需要对 AB相进逻辑行处理。不能直接把AB相接入到管脚。 值得学习! mark lin_g 发表于 2011-12-15 11:02 static/image/common/back.gif
回复【17楼】zqy517 燎原星火
-----------------------------------------------------------------------
...
请教了:到目前为止我还没搞清这是为什么,请大侠不惜赐教. 求增量式编码器的程序啊 zqy517 发表于 2011-8-10 21:32 static/image/common/back.gif
CW CCW是什么啊--顺时针与逆时针
贴个我的代码:
/***************************************************** ...
很懒的盗用了哈哈~ 晚上我也试试 {:shy:} 有兄弟试了t2定时计数器来做的吗 求大侠讲解下... yyinfo263 发表于 2013-7-13 22:43 static/image/common/back.gif
有兄弟试了t2定时计数器来做的吗
T2定时器做的就基本全硬件的了,前面加触发器,如果要求高最好加比较器去随机干扰 zqy517 发表于 2011-8-10 21:32 static/image/common/back.gif
CW CCW是什么啊--顺时针与逆时针
贴个我的代码:
/***************************************************** ...
旋转速度快了后会出现丢码.不知道到您是多少时间扫描一次的? 本帖最后由 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--; //
}
}
正要用到这个,记号一下学习 学习学习。{:lol:} 18楼的用了,能行 Mark, 编码器的资料好像不多啊~
留着~ 是电机转速用的编码器吗 路过,看看 这里真是精彩,今后要多来向各位前辈学习~谢谢! mark学习啦!~ mark。。。 没看明白 我以为是模拟旋转编码器,原来是检测旋转编码器。 zqy517 发表于 2011-8-10 21:32
CW CCW是什么啊--顺时针与逆时针
贴个我的代码:
/***************************************************** ...
好用不?明天试试 mark{:smile:} fastweb 发表于 2013-7-29 19:21
首先AB相正交编码器如果直接进入管脚不用XOR门处理的话,MCU管脚必须支持上升沿和下降沿中断模式。光下降 ...
你用的什么电路,好奇,公司在做检测,有时候方向会有问题,不知道是不是硬件的原因 fastweb 发表于 2013-7-29 19:21
首先AB相正交编码器如果直接进入管脚不用XOR门处理的话,MCU管脚必须支持上升沿和下降沿中断模式。光下降 ...
你这个测速度,应该没问题吧 我之前遇到的旋钮比较坑,AB相占空比不是50%的,脉冲高电平只有1ms左右。不知道这一种程序怎么写比较好
页:
[1]