资源描述
等精度频率计
摘 要:本文设计的频率计将8051微处理器的智能特性与数字逻辑器件相结合,采用硬 件逻辑与软件指令巧妙配合的智能闸门控制方式,实现了0.1~10MHz范围内的等精度无档切换测量功能,精度可达0.0001。
关键词:等精度;高精度;频率计;智能仪表。
正文目录
一、概述 3
八、实验原理 3
1.测量频率的工作原理 3
2.提高精度的工作原理 3
3.计数器的工作原理 4
4.放大与整形原理 5
5.LCD的工作原理 5
三、硬件电路 6
四、软件程序 6
五、实验数据与数据分析 12
1.基数据测量结果 12
2.数据分析 12
六、误差分析 12
七、总结分析与结论 13
八、参考文献 13
一.概述
频率计是用来测量信号频率或周期的仪器,在工程领域有广泛的应用。设计频率计一般有两种方案。一种是专用芯片,如利用MAXIM 公司的ICM7240实现。其特点是简单易行,其最高计数频率是15MHz,而且测量精度也受到芯片本身的限制;另一种方案是以单片机为主再附加一些逻辑电路。一般最常用的方法是用一个T/C通道作为定时器,另一个T/C通道作为计数器,定时时间到产生中断,在中断服务程序中处理计数结果,求出频率。
本文设计的频率计是按第二个方案设计的:将8051微处理器的智能特性与数字逻辑器件相结合,采用硬件逻辑与软件指令巧妙配合的智能闸门控制方式,实现了0.1~10MHz范围内的等精度无档切换测量功能,精度可达0.0001。
二.实验原理
1.测量频率的工作原理
将两个T/C通道都设置为计数器方式,其中由记数器1对标准2M脉冲(从单片机8051的ALE脚引出)经两片74LS161芯片进行32分频后由CPU的T/C1通道进行记数;待测信号经74LS161芯片进行256分频后,经二选一通道选择器后由CPU的T/C0通道进行计数。闸门开通期间两计数器进行计数,而关闭期间停止计数。如果设各通道计数满产生的中断次数分别为v和w,外部分频计数器结果为nbz和ncs,设通道1计数结果为mbz,通道0计数结果为mcs,则标准信号的计数脉冲累计结果为:
mbz=v*65536*32+TH0*256*32+TL0*32+nbz
待测信号经过分频和未经分频的的计数脉冲累计结果为:
mcs=w*65536*256+TH0*65536+TL0*256+ndc (经过分频)
mcs=w*65536+TH0*256+TL0 (未经分频)
而实际上,当高频信号产生中断的时候就立刻终止计数,因此待测信号不会产生中断,故待测信号经过分频和未经分频的的计数脉冲累计结果也可以写成:
mcs=TH0*65536+TL0*256+ndc (经过分频)
mcs=TH0*256+TL0 (未经分频)
因标准信号频率为2MHz,故可计算出待测信号的频率为:
F=(mcs/mbz)*2000000Hz
2.提高精度的工作原理
提高频率测量精度的关键因素是保证闸门的开启与关闭必须与被测信号保持严格的同步,即在被测信号某一周期的上升沿(或下降沿)开启闸门,而在另一周期的上升沿(或下降沿)关闭闸门,这样才能确保采样一个或几个完整的信号周期,这一点对于低频段尤为重要。采样一个完整周期的示意图如图一所示。
图一 采样一个完整周期示意图
本系统通过D触发器、单片机软件指令巧妙配合共同完成这一任务。标准信号源直接取自微处理器的频率为12M的晶振经6分频后在ALE脚输出的脉冲,频率为2MHz。而12MHz晶振频率的51系列单片机所能记数的最高频率只能达到500KHz,因而考虑到要测量高达10MHz的高频信号必须经过分频器进行分频处理。
如图二所示,标准信号的待测信号是完全同步的。
图二 D触发器控制信号同步
3.计数器的工作原理
当待测信号为高频时,数据选择器选择经256分频的信号,进入T/C0通道;当待测信号为低频时,数据选择器选择未经分频的信号,进入T/C0通道。与此同时标准信号经32分频进入T/C1通道。
如图三、图四所示:
图三 标准信号32分频
图四 待测信号256分频,二选一数据选择
4.放大与整形原理
由于待测信号的幅度和频率的大小、以及信号波的类型未知,故待测信号必须先经过放大和整形,使之成为幅值在3——5V之间的脉冲波,以便正确测量频率。
图五 放大与整形
5.LCD的工作原理
单片机中的WR、RD和P2.7控制LCD使能E,P2.6 和P2.5分别控制读/写R/W和寄存器选择RS。
如图六所示
图六 LCD原理与接口
三.硬件电路
四.软件程序
#include<stdio.h>
#include<reg51.h>
#include<math.h>
#include<absacc.h>
#define lcdxs XBYTE[0xdfff]
#define lcdkz XBYTE[0x9fff]
bdata int lcdsm;
#define lcdsm XBYTE[0xbfff]
sbit K1=P3^1;
sbit x0=P3^0;
sbit x2=P3^2;
sbit K2=P3^6;
int r,m,k,i,j,dp,k,a;
int v=0;
long d,n;
unsigned char code dispcode[]={0x30,0x31,0x32,0x33,0x34,
0x35,0x36,0x37,0x38,0x39,
0x2e,0x4b,0x48,0x7a};
float f,mbz ,mcs,nbz,ncs;
int haha[10]={0},hehe[12]={0},p=6;
f_busy() //************查询忙标志*******************//
{int p2,y;
int t7;
p2=0x80;
do{y=lcdsm;t7=p2&y;}
while (t7==0x80);
}
void delay(void)
{ int i;
for(i=100;i>0;)
{i--;
}
}
void delay100(void)
{ int i,j;
for(i=0;i<100;i++)
for(j=124;j>0;j--) ;
}
void div(void) //******************分频子程序**************-//
{ P3=0xfe;
TMOD=0x55;
TH0=0x00;
TL0=0x00;
TR0=1;
P3=0xff;
delay100();
x0=0;
n=TH0*256+TL0;
a=P1;
}
void shuju(void) //*****************计算子程序***************//
{ while(v==00);
while(x2!=0&&TL0!=0);
if(x2==0)
{ nbz=P2&0x1f;
ncs=P1;
mbz=65536*32*v+TH1*32*256+TL1*32+nbz;
if(r==0)
{mcs=TH0*256+TL0;
}
else
{
mcs=TH0*65536+TL0*256+ncs;
}
f=(mcs*2000000)/mbz;
if(f>9000000)
f=f+10000;
}
}
void chuli(void) //*****************数据处理************//
{if(f>1000)
d=f*100;
else
d=f*1000000;
for(j=0;j<10; j++)
{ hehe[j]=d%10;
d=d/10;
}
for(i=11;i>=0;i--)
{ if(hehe[i]!=0)
break;}
haha[0]=hehe[i];
haha[1]=hehe[i-1];
haha[2]=hehe[i-2];
haha[3]=hehe[i-3];
haha[4]=hehe[i-4];
haha[5]=hehe[i-5];
haha[6]=hehe[i-6];
haha[7]=hehe[i-7];
dp=log10(f);
if(dp>=3)
{ for(j=8;j>=dp-2;j--)
{ haha[j+1]=haha[j];
}
haha[dp-2]=10;
haha[7]=11;
}
else if (dp>0&&dp<3)
{ for(j=8;j>=dp+1;j--)
{haha[j+1]=haha[j];
}
haha[dp+1]=10;
}
else if(dp==0)
{ if(f<1)
{ for(j=7;j>=0;j--)
{
haha[j+2]=haha[j];
}
haha[0]=0;
haha[1]=10;
}
else if(f>=1)
{ for(j=8;j>=dp+1;j--)
{haha[j+1]=haha[j];
}
haha[dp+1]=10;
}
}
else if(dp<0)
{
for(j=6;j>=0;j--)
{ haha[j+3]=haha[j]; }
haha[0]=0;
haha[1]=10;
haha[2]=0;
}
haha[8]=12;
haha[9]=13;
}
void lcd00(void) //****************LCD清屏*******************//
{ K2=1;
P0=0x00;
f_busy();
lcdkz=0x01;
f_busy();
lcdkz=0x38;
f_busy();
lcdkz=0x0e;
f_busy();
lcdkz=0x06;
}
void lcd(void) //--------------*******************显示子程序************--//
{ for(k=0;k<8;k++)
{ f_busy();
lcdxs=dispcode[haha[k]];
}
f_busy();
lcdkz=0xc0;
f_busy();
lcdxs=dispcode[haha[8]];
f_busy();
lcdxs=dispcode[haha[9]];
for(i=0;i<10;i++)
delay100();
}
void main(void) //--------------*****************主函数*******************---//
{
TT:v=0;
P3=0X7e;
delay();
div();
TH0=0x00;
TL0=0x00;
TH1=0X00;
TL1=0X00;
TR1=1;
ET1=1;
TR0=1;
EA=1;
P3=0X7e;
delay();
if(n>=24)
{r=1;
P3=0Xff;
delay100();
shuju();
}
else if((n>=1)||(n==0&&a>20))
{r=0;
P3=0xf7;
delay100();
shuju();
}
else
{P3=0xfe;
TR0=0; //触发器清零
TMOD=0x51;
TH0=0x00;
TL0=0x00;
ET0=1;
EA=1;
P3=0X7e;
P3=0xf1;
while(x2==0);
x0=0;
while(x2==1);
TR0=1;
x0=1;
while(x2==0) ;
TR0=0;
mcs=v*65536+TH0*256+TL0;
f=1000000.0/mcs;
chuli();
lcd00();
lcd();
delay100();
goto TT;
}
void t1(void) interrupt 3 using 2 //*****计数器中断 T1******//
{
x0=0;
v++;
}
void t0(void) interrupt 1 using 2 //***********计数器中断 T0*******//
{
v++;}
五.实验数据与数据分析
1.数据测量结果
实际频率(Hz)
测量显示结果
实际频率(Hz)
测量显示结果
15M
14986.7KHz
1K
999.960Hz
10M
9999.84KHz
500
499.894Hz
8M
7999.60KHz
200
199.943Hz
2M
1999.71KHz
100
99.9864Hz
1M
999.945KHz
50
49.9923Hz
500K
499.999KHz
10
9.99836Hz
200K
199.999KHz
1
0.99983Hz
100K
99.9897KHz
0.5
0.49999Hz
50K
49.9983KHz
0.1
0.09987Hz
2.数据分析
◆ 测试环境有影响。
◆ 信号不稳定引起的数据上下波动。
◆ 实验数据整体偏小。
六.误差分析
◆ 电路不稳定引起误差。
◆ 实验中用到大频率,频率间相互影响产生误差。
◆测量仪器范围、精度引起的误差。
◆ 实验中用全是TTL器件速度较慢。
◆ 两信号不是绝对同步导致误差。
七、总结分析与结论。
根据本设计理论分析及实际测试结果,表明:
◆ 本设计达到了0.1——10M的频率测量范围。
◆ 本设计总体上达到了0.0001误差的要求。
◆ 本设计中实际测量结果表明没有完全达到等精度的要求。
◆ 频率测量范围没有进一步的扩展,例如测量15M频率时,误差比较大。
◆ 本设计所用器件较少,基本达到要求。
◆ TTL器件反应速度较慢,若用CMOS器件,测量精度将更高。
八、参考文献
1.书
[1]谢自美编,<<电子线路设计·实验·测试>>,武汉:华中理工大学出版社,2000年第二版。
[2]阎石主编,<<数字电子技术基础>>,北京:高等教育出版社,1998年11月第四版。
[3]康光华编,<<电子技术基础·模拟部分>>,北京:高等教育出版社,1999年6月第四版。
[4]李华编,<<电子线路设计·实验·测试>>,武汉:华中理工大学出版社,2000年第二版。
2.论文
[1] 白海成、陈星、郝刚、何熙文,<<智能等精度频率计的设计与实现>>,大连理工大学微电子中心。
展开阅读全文