打印
[AVR单片机]

捕获测频问题,求助

[复制链接]
882|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
letao2013|  楼主 | 2015-6-25 22:36 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
各位大神,求教下,我用atmega128做了一个小产品,大概原理就是根据不同的频率,给不同的变量加一个固定的常量,主程序如下
                     
   if(flag)//如果标志位不为0
                        {
                             flag = 0;//显示完成后,清零标志位
                             numf=i_want;//显示得到的频率值
                        }          
          switch(rline)
                     {
            
       case     1:
          
            if(numf<=2000)                  /////            
                {
                    
                     if(mDISDATA<2)                           mDISDATA= mDISDATA+0;
                         else if(2<=mDISDATA&&mDISDATA<105)       mDISDATA= mDISDATA+33;
                     else if(105<mDISDATA&&mDISDATA<=170)     mDISDATA= mDISDATA+40;
                         else if(170<mDISDATA&&mDISDATA<=260)     mDISDATA= mDISDATA+48;
                         else if(mDISDATA>260)                    mDISDATA= mDISDATA+54;
                         else        ;                    
                    }
                                  
                else if(2000<numf&&numf<=7200)   /////   
                          {
                          if(mDISDATA<2)                           mDISDATA= mDISDATA+0;
                         else if(2<=mDISDATA&&mDISDATA<105)       mDISDATA= mDISDATA+35;
                     else if(105<mDISDATA&&mDISDATA<=170)     mDISDATA= mDISDATA+41;
                         else if(170<mDISDATA&&mDISDATA<=260)     mDISDATA= mDISDATA+50;
                         else if(mDISDATA>260)                    mDISDATA= mDISDATA+56;
                         else        ;
                          }
                else if(7200<numf&&numf<=14400)   //1.5-3  
                          {
                          if(mDISDATA<2)                           mDISDATA= mDISDATA+0;
                         else if(2<=mDISDATA&&mDISDATA<105)       mDISDATA= mDISDATA+37;
                     else if(105<mDISDATA&&mDISDATA<=170)     mDISDATA= mDISDATA+43;
                         else if(170<mDISDATA&&mDISDATA<=260)     mDISDATA= mDISDATA+51;
                         else if(mDISDATA>260)                    mDISDATA= mDISDATA+58;
                         else        ;                                     
                          }   
           else if(14400<numf&&numf<=24000) //3-5
                          {
                          if(mDISDATA<2)                           mDISDATA= mDISDATA+0;
                         else if(2<=mDISDATA&&mDISDATA<105)       mDISDATA= mDISDATA+38;
                     else if(105<mDISDATA&&mDISDATA<=170)     mDISDATA= mDISDATA+45;
                         else if(170<mDISDATA&&mDISDATA<=260)     mDISDATA= mDISDATA+53;
                         else if(mDISDATA>260)                    mDISDATA= mDISDATA+60;
                         else        ;
                          }
                                                               
                                                               
          else if(24000<numf&&numf<=33600)  //5-7
                         {
                         
                          if(mDISDATA<2)                           mDISDATA= mDISDATA+0;
                         else if(2<=mDISDATA&&mDISDATA<105)       mDISDATA= mDISDATA+40;
                     else if(105<mDISDATA&&mDISDATA<=170)     mDISDATA= mDISDATA+47;
                         else if(170<mDISDATA&&mDISDATA<=260)     mDISDATA= mDISDATA+55;
                         else if(mDISDATA>260)                    mDISDATA= mDISDATA+62;
                         else        ;
                         }
                                                  
         else  if(33600<numf)                  /////
                        {
                          if(mDISDATA<2)                           mDISDATA=mDISDATA+0;
                           else if(2<=mDISDATA&&mDISDATA<105)      mDISDATA=mDISDATA+41;
                           else if(105<mDISDATA&&mDISDATA<=170)    mDISDATA=mDISDATA+49;
                           else if(170<mDISDATA&&mDISDATA<=260)    mDISDATA=mDISDATA+57;
                           else if(mDISDATA>260)                   mDISDATA=mDISDATA+64;
                           else   ;                          
                        }
                                  
          else   ;         
                 
                 
                break;

/********************************************************************************/        .....
        .....
        .....
        case    26:..................................................................
                      ...................................................................
                     .....................................................................                     
                 
         default :    break;            
                               
          }



以下是我的捕获程序:
void timer1_init(void)//定时器1 初始化
{
        SREG |= 0x80;//使能总中断
        DDRD &= ~(1<<4);//脉冲输入口置为输入模式
        PORTD |= (1<<4);//脉冲输入口使能上拉电阻
       
        TCCR1A = 0X00;//定时器1控制寄存器设置
       
        TCNT1H = 0Xc2;//计数器高位
        TCNT1L = 0Xf6;//计数器低位
        TIFR |= (1<<ICF1)|(1<<TOV1);//0x20写"1"清输入捕获标志位
        TIMSK |= (1<<TOIE1)|(1<<TICIE1) ;//溢出中断和 捕获中断使能
        TCCR1B = 0b11000100;//捕获开 噪声抑制,上升沿触发捕获  时钟256预分频
}

//////
#pragma interrupt_handler Timer1_icp_isr:12
void Timer1_icp_isr(void)
    {
       
      Freq++;//每产生一次捕获中断,变量加1

    }


#pragma interrupt_handler timer1_ovf_isr:15
void timer1_ovf_isr(void)
   {

    TCNT1 = 0Xc2f6;//计数器计数重装值
        i_want = Freq;//将频率值赋给i_want变量用于主循环显示
        flag =1;//置高标志位
        Freq = 0;//将频率计数清零,以准备测量下一次频率
  
   }
   
我主要实现的功能是:用mega128A 外部16M 晶振 ,用T1的捕获功能,采样0-64Khz的频率,然后根据频率(numf)的数值,给变量mDISDATA加上一个常量,然后显示出来(显示是4位数码管显示,20毫秒定时显示),现在程序运行的结果,时好时坏,有时候数据加上,有时候数据好像没有加上去,就像是频率没有捕获到一样,求教各位专家,给指点指点,万分感谢!!
另外请教下,我的128单片机接16M晶振,执行一次捕获需要多久时间呢?

相关帖子

沙发
huangxz| | 2015-6-26 09:30 | 只看该作者
频率太高了吧,不适合用AVR,64K,不太准了.

使用特权

评论回复
板凳
694844985| | 2015-6-26 11:31 | 只看该作者
如楼上所说,你的采样频率太高了,如果低频就能用,高频就会有问题,所以会出现你说的有时好用,有时不好用,输入频率起码是采样时钟的0.5倍,或者更小才会准确,否则就会出问题的

使用特权

评论回复
地板
letao2013|  楼主 | 2015-6-26 15:21 | 只看该作者
huangxz 发表于 2015-6-26 09:30
频率太高了吧,不适合用AVR,64K,不太准了.

如果我用msp430G2553怎么样?可以吗?我这个小东西已经出样品了,有什么好的补救办法么?我打算改成用T1的外部计数功能,来实现,捕获功能可能比较耗时间,专家给点建议?

使用特权

评论回复
5
letao2013|  楼主 | 2015-6-26 15:22 | 只看该作者
694844985 发表于 2015-6-26 11:31
如楼上所说,你的采样频率太高了,如果低频就能用,高频就会有问题,所以会出现你说的有时好用,有时不好用 ...

这句话是什么意思?

使用特权

评论回复
6
694844985| | 2015-6-26 16:24 | 只看该作者
就是你avr系统时钟的频率已经比你要采样的信号的频率低了或者接近了,这样采样信号肯定不准,说白了,就是你的输入信号频率太高了没办反正确采样

使用特权

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

本版积分规则

30

主题

54

帖子

1

粉丝