各位大神,求教下,我用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晶振,执行一次捕获需要多久时间呢?
|