打印
[Atmel]

求助:AVR单片机用光电编码器测电机转速

[复制链接]
1312|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
paco_cai|  楼主 | 2014-9-14 10:44 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
ATMEGA48,增量型光电编码器,LCD1602显示,我的思路是:


ISR(INT0_vect) //编码器的一相接入外部中断,通过记录上升沿脉冲来决定电机的状况
{ // 400个脉冲为旋转一周
s++; //s存放脉冲数
if(s==1){TIMSK1=0X01;}//有脉冲后开定时器计时
if(s>=400) {TIMSK1=0X00;s=0;device();}//旋转一周后关定时器并处理数据

}
void device(void)
{

temp=TCNT1;//得到的定时器值送至寄存器
speed=15625/temp*60;//1M晶振,64分频,单位是转/分钟
}


得不到满意的效果,请教大神提出建议。

相关帖子

沙发
ddllxxrr| | 2014-9-14 21:35 | 只看该作者
INT0应在记400后关闭,一下,等处理完了再开开.再有中断里边最好不要套函数。我就这么两点意见,楼主试试吧

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
paco_cai + 1 赞一个!
板凳
paco_cai|  楼主 | 2014-9-15 13:42 | 只看该作者
ddllxxrr 发表于 2014-9-14 21:35
INT0应在记400后关闭,一下,等处理完了再开开.再有中断里边最好不要套函数。我就这么两点意见,楼主试试吧 ...

谢谢建议,最后还是自己搞定了,看错了关闭定时器的方法,还有计算转速需要先将整型变量变成浮点型。
ISR(INT0_vect)
{
        s++;
        if(s>=400) {s=0;device();}
}

void device(void)
{       
        TCCR1B^=0B00000011;
        if(TCCR1B==0X00) {temp=TCNT1;TCNT1=0X0000;speed=15625/(float)temp*60;}
}

使用特权

评论回复
地板
ddllxxrr| | 2014-9-15 18:43 | 只看该作者
paco_cai 发表于 2014-9-15 13:42
谢谢建议,最后还是自己搞定了,看错了关闭定时器的方法,还有计算转速需要先将整型变量变成浮点型。
ISR ...

使用特权

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

本版积分规则

27

主题

62

帖子

1

粉丝