SD10A 发表于 2015-9-10 15:58

EC11旋转编码器的使用

目前按网上的方法使用中断的方法接INT0INT1
在中断判断另外一个脚的电平,如果是高电平
数目加1反之减去1,但是在实际应用中无论选择
INT0为低电平 上升沿 下降沿 ,无论是正转还是反转
都判断的另一个脚为低电平也就是数目减去1
这个不能判断方向的问题怎么解决?
volatile unsigned char feng=0;//
volatile unsigned char tong=0;//
#pragma interrupt_handler INT0_tongfengfu:2
#pragma interrupt_handler INT1_fengliang:3
/*--------------------------------
//INT0中断函数
//全局变量tong为编码器的数值
//-------------------------------*/
void INT0_tongfengfu(void)
{if((PIND&BIT(1))==1)
tong++;
else
tong--;
//GIFR|=BIT(INTF0);//清除标志
}
/*--------------------------------
//INT1中断函数
//全局变量feng为编码器的数值
//-------------------------------*/
void INT1_fengliang(void)
{
if((PIND&BIT(4))==1)
feng++;
else
feng--;
//GIFR|=BIT(INTF1);//清除标志
}
/*--------------------------------
//INT0初始化函数
//PD2 输入带内部上拉
//INT0下降沿产生中断
//PD1为编码器的比较端
//-------------------------------*/
void INT0_init()
{
DDRD&=~BIT(1);//PD1输入
PORTD|=BIT(1);//PD1上拉
DDRD&=~BIT(2);//PD2输入
PORTD|=BIT(2);//PD2上拉
CLI();
MCUCR|=BIT(ISC01);//10下降沿产生中断
MCUCR&=~BIT(ISC00);//
TIMSK=0X00;
GICR|=BIT(INT0);
SEI();//全局中断
}
/*--------------------------------
//INT1初始化函数
//PD3 输入带内部上拉
//INT1下降沿产生中断
//PD4为编码器的比较端
//-------------------------------*/
void INT1_init()
{
DDRD&=~BIT(4);//PD4输入
PORTD|=BIT(4);//PD4上拉
DDRD&=~BIT(3);//PD3输入
PORTD|=BIT(3);//PD3上拉
CLI();
MCUCR|=BIT(ISC11);//10下降沿产生中断
MCUCR&=~BIT(ISC10);//
TIMSK=0X00;
GICR|=BIT(INT1);
SEI();//全局中断
}

huangxz 发表于 2015-9-10 16:25

这个东西要硬件要接对才行啊.然后看看示波器波形,是不是自己想象的那样

68dysyase 发表于 2015-9-11 17:50

我覺得答案就在 WIKI /旋转编码器/增量型编码器 這個章節
方向的問題就只是順序!

lrhsx33 发表于 2015-9-12 17:36

要记录之前的状态,改变时去比较就知道方向了

gaoyang9992006 发表于 2023-9-5 20:57

https://bbs.21ic.com/icview-3325360-1-1.html
看我的神贴

zwsam 发表于 2023-12-9 19:47

闻则123 发表于 2023-12-12 11:53

页: [1]
查看完整版本: EC11旋转编码器的使用