搜索
bottom↓
回复: 11

用AVR单片机读取两个旋转编码器,最高速时有脉冲丢失情况 。

[复制链接]

出0入0汤圆

发表于 2010-3-23 15:41:21 | 显示全部楼层 |阅读模式
电路连接:左轮编码器A相接INTO,B相接PA4
          右轮编码器A相接INT1,B相接PA5
         
          外部晶振:16M
          最高转速时 编码器每分钟脉冲数为 8000转*512线
         
源程序:
ISR(INT0_vect) //左轮脉冲中断
{
       //sei();
       if(!(PINA&0x10))
       {PulseLeft++;}
       else
       {PulseLeft--;}
}

ISR(INT1_vect)//右轮脉冲中断
{
         //sei();   
        if(!(PINA&0x20))
        {PulseRight++;}
        else
        {PulseRight--;}

}
void Timer0_Init(void)//采样0,01s定时器 初始化
{

        TCCR0 = 0x00;                      //T/C0不工作
        TCNT0 = 100;                      // (256-100)*1024/16000000=0.01s
        TIMSK|=1<<TOIE0;                   //T/C0 溢出中断使能
        TCCR0|= (1<<CS02)|1<<(CS00);       //启动T/C0,1024分频
}

ISR(TIMER0_OVF_vect)//计算0.01s脉冲数
{
          PulseLeftDelta=PulseLeft;
        PulseLeft=0;
        PulseRightDelta=PulseRight;
        PulseRight=0;       
   
        Timer0Flag=1;
        TCNT0 = 100;
}
void SpeedCal(unsigned char chn)//速度计算函数
{
        float SpeedTemp;
        if(chn==0)
        {
                 SpeedTemp=PulseLeftDelta*100.16*60.0/(512*24);//(转速=(每秒产生的脉冲*60秒)/(一转的脉冲数*减速比))
            SpeedLeft=SpeedTemp;
        }
    if(chn==1)
        {
                 SpeedTemp=PulseRightDelta*100.16*60.0/(512*24);//(转速=(每秒产生的脉冲*60秒)/(一转的脉冲数*减速比))
            SpeedRight=SpeedTemp;
        }         
}

出现的问题:
当只用一个编码器的时候出来的数据很稳定~
但是再加上一个编码器后,到300R/min 的时候显示只有200R/min,有丢脉冲丢失的现象~
我觉得应该是中断过于频繁,不知道各位大牛有没有什么解决的办法
两个中断加入嵌套我也试过,但是出来的数据更加不稳定~~

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入4汤圆

发表于 2010-3-23 16:07:52 | 显示全部楼层
看看以前坛子里的频率计是怎么做的

出0入0汤圆

 楼主| 发表于 2010-3-23 16:39:17 | 显示全部楼层
回复【1楼】electricit
-----------------------------------------------------------------------

关键是那个频率计 不需要两路脉冲进行中断吧。。

出0入0汤圆

 楼主| 发表于 2010-3-23 22:40:20 | 显示全部楼层
回复【2楼】werookies
-----------------------------------------------------------------------

我自己解决了~~

ISR(TIMER0_OVF_vect)
{
     Ti++;  
    if(Ti==1)
        {
                PulseLeftDelta=PulseLeft;
            PulseLeft=0;
                GICR|=(1<<INT1);
        GICR&=~(1<<INT0);

     }
         if(Ti==2)
         {
                PulseRightDelta=PulseRight;
                PulseRight=0;
        GICR|=(1<<INT0);
        GICR&=~(1<<INT1);
                Ti=0;       
     }
     
        TCNT0 = 100;
}

使两路中断不同时进行~~

出0入0汤圆

发表于 2011-1-4 00:51:19 | 显示全部楼层
“使两路中断不同时进行~~ ”
这样两路同时高速运行时会出现冲突丢步吧。
建议硬件鉴向用计数器实现……

出0入0汤圆

发表于 2011-8-6 03:22:15 | 显示全部楼层
学习中

出0入0汤圆

发表于 2012-11-26 11:06:38 | 显示全部楼层
学习中

出0入0汤圆

发表于 2012-11-26 12:57:43 | 显示全部楼层
mark~~~~~~~~~~~~~~~~~~

出0入0汤圆

发表于 2012-11-26 14:21:47 | 显示全部楼层
用扫描吧

出0入0汤圆

发表于 2012-11-26 16:27:06 | 显示全部楼层
请问哪里有卖旋转编码器的

出0入0汤圆

发表于 2012-11-26 16:35:10 | 显示全部楼层
两路输入,建议一路用外部中断输入,一路用捕捉中断输入

出0入0汤圆

发表于 2013-4-8 22:45:17 来自手机 | 显示全部楼层
路过.........
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-24 03:25

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表