51单片机检测鼠标滚轮(旋转编码器)成功~采用外部中断模式未添加其他器件
RT接线很简单,公共端接地,其他两个引脚A,B分别接到P3.2和P3.3通过10K电阻上啦,因为这个小编码器中午被我拆开了一次,所以有点不大灵敏,不过调调音量这类的功能应该没问题,回头在对火个废鼠标试试。
只发中断程序吧,显示用的12864
//定义了一个char全局变量b最大计数到255
//AA--P3.2
//BB--P3.3
void ini0() interrupt 0
{
IE0=0;
EX0=0;
delayms(15);
if (AA==0)
{
if(BB==0) //如果旋转方向和计数方向相反修改此处
{
b++;
if(b>255){b=0;}
}
else
{
b--;
if(b<0){b=0;}
}
}
EX0=1;
} 什么原理呢?有时间研究一下 本人以前一直用汇编,初学C,如有什么语法等问题,还望各路高手指教~用的就是普通鼠标的机械滚轮,应该和阿莫淘金3中那种是一样的,旋转柄是我拆了个电位器自己磨的,将就着用了呵呵 回复【1楼】deiwgah
什么原理呢?有时间研究一下
-----------------------------------------------------------------------
居然没抢到自己的沙发~~
原理你可搜下本坛的:编码器,高手们介绍的很详细,下班了我就不多说了~~ 正好手上有好几个坏鼠标 呵呵,那就拆个试试~我那个程序因为延时15MS所以转的快了会丢脉冲,但延时太少又容易干扰~~ mark 路过留个脚印
电平中断()
{
if(A脚)
{
time=超时值;
if(方向}方向=1;
else if(方向==2)if(b<255)b++;
}
if(B脚)
{
time=超时值;
if(方向}方向=2;
else if(方向==1)if(b>)b--;
}
}
main()
{
while(time)
{
time--;
延时;
}
方向=0;
}
不知是否uc吃加号 first of all, your solution is wrong: you should never ever use "delay" in an interrupt routine.
2ndly, there are much simpler solutions out there. google "state machine". 我前两天用cpld也做了个编码器,
是用在大型机器上的,要求来回转一个星期都不能丢步!…
看你的程序用着玩还行,可靠性不行啊…
如果要做好要考虑干扰脉冲问题,呵呵
而且每个跳变都要检查到 不知LZ这么做,有没有丢步,有没有因为抖动引起的误操作 回复【8楼】millwood0
first of all, your solution is wrong: you should never ever use "delay" in an interrupt routine.
2ndly, there are much simpler solutions out there. google "state machine".
-----------------------------------------------------------------------
不懂英文。。。
回复【9楼】Ian11122840船儿
我前两天用cpld也做了个编码器,
是用在大型机器上的,要求来回转一个星期都不能丢步!…
看你的程序用着玩还行,可靠性不行啊…
如果要做好要考虑干扰脉冲问题,呵呵
而且每个跳变都要检查到
-----------------------------------------------------------------------
回复【10楼】huangdog
不知lz这么做,有没有丢步,有没有因为抖动引起的误操作
-----------------------------------------------------------------------
呵呵这个就是为了玩的,而且目前刚开始学习C语言(以前全是用汇编)看公司的“海马”车上的收音机音量是这样调的,就想弄个做个音量调节这样的东西,电子市场也没找到那种机械式的编码器(以前阿莫淘金中买过不过我没赶上。。。)好像是20线的,线数也不高,就想试试鼠标的这个怎么样。。 话说能够用鼠标的滑轮测轮子的速度吗? mark 回复【11楼】xiaomage_2000
-----------------------------------------------------------------------
回复【8楼】millwood0
first of all, your solution is wrong: you should never ever use "delay" in an interrupt routine.
2ndly, there are much simpler solutions out there. google "state machine".
-----------------------------------------------------------------------
首先,你的方案是错的:绝不应该在中断例程中使用“延时”
其次,在其他地方有许多更简便的方案,请google“状态机” 以前做了一个速度达到了纳秒级的。单片机处理不过来,用了个SPLD在前面判断方向 mark 有时间也玩玩 思路不错,有DIY的价值. 滚轮硬件设计上面,最好加上104滤波 滚轮软件上要注意倍频 这种方式在低速应用下是可以,不过也得在硬件上做一消抖电容,要不然整个稳定性在会变差。如果再深入做一个带加速,或一个高精度编码开关时,这些考虑的事更多。所以一个看似简单,做起来也不容易 关注一下,鼠标的滚轮还可以当编码器? auto01 发表于 2012-6-26 09:50 static/image/common/back.gif
关注一下,鼠标的滚轮还可以当编码器?
鼠标的滚轮就是编码器,只是精度低了一点而已 Ian11122840 发表于 2010-11-7 10:25 static/image/common/back.gif
我前两天用cpld也做了个编码器,
是用在大型机器上的,要求来回转一个星期都不能丢步!…
看你的程序用着玩 ...
个人觉得像鼠标的滚轮就是编码器这一类编码器,只是应用在一般的场合,当然不能应用在严格的工业场所,就所电脑鼠标用硬件驱动,对于快速转向就经常出现丢步现象。
其它的精密的编码器我没没用过,就没发言权了。 void CodingSwitchPolling(void)
{
static unsigned char st,Aold,Bold;
if(CodingSwitch_A==1&&CodingSwitch_B==1)
st=1;
if(st==1)
{
if(CodingSwitch_A==0&&CodingSwitch_B==0) //如果当前编码开关的两个引脚都为底电平执行下面的步骤
{
if(Bold==1) //B为高说明编码开关在向加大的方向转
{CW_count++;CW++;st=0;}
else if(Aold==1) //else不能省! 省了右旋会同时加减
{CW_count--;CCW++;st=0;}
}
}
Aold = CodingSwitch_A;
Bold = CodingSwitch_B;
}
这个我在用,未使用中断。求批判{:tongue:} 这个有点意思,报废鼠标好多个呢,去试试 学习{:smile:} {:smile:}参考旋转编码器,好贴! 本帖最后由 easier 于 2019-11-19 16:19 编辑
MARK; 填塞
页:
[1]