经测试,快或慢转动时都能正常计数,但如果很暴力那种快就识别不了。
电路见图1,电容实际用的是103(10n),
原理:正转时,A端先低电平,再到B端低电平,过一段时间后两者都是高电平,这里就是读取从其中一个是低电平到同时高电平这过渡状态从而判断正反转,看图2
编程算法:用定时器中断,每1ms就把EC11的A端和B端移入变量EC11_AB里面,跟着判断正反转,过渡前过渡后各读两次,如果是01011111(0x5f)那就是正转,10101111(0xaf)是反转。
单片机使用的是STC8G1K08
图1
图2
sbit EC11_A = P1^6; //EC11 A端
sbit EC11_B = P1^7; //EC11 B端
sbit EC11_D = P5^4; //EC11 压按开关
//------EC11编码器相关的数组和变量
unsigned char xdata EC11_AB=0x00; //ec11的AB端定时扫描输入
unsigned char xdata EC11_AOUT=0; //ec11的A端状态
unsigned char xdata EC11_BOUT=0; //ec11的B端状态
//--------------------
void EC11SM();//EC11输入扫描函数声明
void EC11CL();//EC11处理函数声明
//------------------------
void main()
{
P0M0=0x00; //初始化
P0M1=0x00;
P1M0=0x00;
P1M1=0x00;
P2M0=0x00;
P2M1=0x00;
P3M0=0x00;
P3M1=0x00;
P5M0=0x00;
P5M1=0x00;
AUXR |= 0x04; //定时器时钟1T模式
T2L = 0x9A; //设置定时初值
T2H = 0xA9; //设置定时初值
AUXR |= 0x10; //定时器2开始计时
IE2 = 0x04;
EA = 1; //中断使能
//主函数//********************
while (1) //下面重复循环
{
EC11CL();//EC11处理函数
}
}
//* 定时器2中断服务函数 */
void InterruptTimer2() interrupt 12
{
EC11SM();//EC11输入扫描函数
}
//EC11输入扫描函数
void EC11SM()
{
EC11_AB=(EC11_AB<<1)|EC11_A; //把EC11的A端值移入
EC11_AB=(EC11_AB<<1)|EC11_B; //把EC11的B端值移入
if(EC11_AB==0x5f)
{
EC11_AOUT=1; //正转时就置A端状态为1
}
if(EC11_AB==0xaf)
{
EC11_BOUT=1; //正转时就置B端状态为1
}
else;
}
//EC11处理函数
void EC11CL()
{
if(EC11_AOUT==1)
{
//************这里是正转时需要执行的内容*******
EC11_AOUT=0;
}
if(EC11_BOUT==1)
{
//***********这里是反转时需要执行的内容*********
EC11_BOUT=0;
}
else;
}
|