打印
[AVR单片机]

EC11旋转编码器的使用

[复制链接]
5255|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
SD10A|  楼主 | 2015-9-10 15:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
目前按网上的方法使用中断的方法接INT0  INT1
在中断判断另外一个脚的电平,如果是高电平
数目加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 | 只看该作者
要记录之前的状态,改变时去比较就知道方向了

使用特权

评论回复
5
gaoyang9992006| | 2023-9-5 20:57 | 只看该作者

使用特权

评论回复
6
zwsam| | 2023-12-9 19:47 | 只看该作者

使用特权

评论回复
7
闻则123| | 2023-12-12 11:53 | 只看该作者

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

29

主题

169

帖子

4

粉丝