外设驱动(编码开关)

<img src="file:///c:/users/user18/appdata/roaming/360se6/User Data/temp/3097494864862.jpg" alt="" style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);" />
(1)1、3脚要外接上拉电阻,一般10K就足矣;
(2)2脚一般接地就行;
(3)4、5脚是下按键的开关接线(按下时,4脚为低电平);

废话不说先上两张测试图:
下图是编码开关正转的情况 (红线跟着蓝线变)

下图是编码开关反转的情况 ( 蓝线跟着红线变)

我们假设 A为蓝线  B为红线   
这样就清楚啦 其实编码开关的编码原理也不难,看A,B信号那个跟着那个变就可以判断转的方向



但是如何检测了?
(正转为列:)
根据测试可以知道  在编码开关刚刚转时蓝线出现跳变沿  当转动一格完成 红线也 出现跳变沿。红线和蓝线跳变的时间差取决于你转动的速度,转的越快,时间差越短。


对于速度比较快的单片机而言 (检测周期小于2MS 假设人转动最大的速度是1/MS)我们可以 当BMA为低电平时,BMB的跳变沿是怎样的——上升沿表示正转,下降沿表示反转。反之当BMA为高电平时,BMB的跳变沿是怎样的——下升沿表示正转,上降沿表示反转。

	bimdirR = 0;
	bimdirL = 0;
	if(bm1 == 1)
	{
		if(bimold == 0)  //状态改变
		{
			bimold = 1;
			if(BM2 == 1)
			{
				Set1  	bimdirR
			}
			else
			{
				Set1  	bimdirL
			}
		}
	}
	else
	{
		if(bimold == 1)
		{  //状态改变
			bimold = 0;
			if(BM2 == 1)
			{
				Set1  	bimdirL
			}
			else
			{
				Set1  	bimdirR
			}
		}
	}



那快速的怎么办了,编码开关 ,编码二字如何而来了。其实我们仔细观察就会发现:
当正转时 AB的关系如下

单反转时 AB的关系为:



table[16] = {
<span style="white-space:pre">	</span>no_move,phase_dec,phase_inc,phase_bad,
<span style="white-space:pre">	</span>phase_inc,no_move,phase_bad,phase_dec,
<span style="white-space:pre">	</span>phase_dec,phase_bad,no_move,phase_inc,
<span style="white-space:pre">	</span>phase_bad,phase_inc,phase_dec,no_move
};

uchar whell_scan(void)
{
		static uchar PhaseCount = 0;
	        static uchar PhaseShift= 0;   //记录值
		if(PINA)     PhaseShift |=0X01;
		IF(PINB)   PhaseShift |=0X02;
		PhaseShift &=0X0F;
		if(table[PhaseShift ] == phase_inc)    PhaseCount ++;
	        if(table[PhaseShift ] == phase_dec)    PhaseCount --;
 }





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值