等精度频率计
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
精度频率计的设计
一摘要
本设计是基于MCS-51单片机的等精度频率计。输入信号为峰峰值5v的正弦信号,频率测量范围10HZ~100MHZ ,频率测量精度为0.1%。采用1602液晶显示器显示测量结果。信号源由PROTEUS 的虚拟信号发生器产生。
二关键词频率计等精度单片机分频
三设计原理与总体方案
测量一个信号的频率有两种方法:第一种是计数法,用基准信号去测量被测信号的高电平持续的时间,然后转换成被测信号的频率。第二种是计时法,计算在基准信号高电平期间通过的被测信号个数。
根据设计要求测量10HZ~100MHZ的正弦信号,首先要将正弦信号通过过零比较转换成方波信号,然后变成测量方波信号。如果用第一种方法,当信号频率超过1KHZ的时候测量精度将超出测量极度要求,所以当被测信号的频率高于1KHZ的时候需要将被测信号进行分频处理。如果被测信号频率很高需要将被测信号进行多次分频直到达到设计的精度要求。
根据设计要求用单片机的内部T0产生基准信号,由INTO输入被测信号,通过定时方式计算被测信号的高电平持续时间。通过单片机计算得出结果,最后有1062液晶显示器显示测量结果。等精度频率计的系统设计框架如下图1所示。
图1 等精度频率计系统设计框图
四芯片以及电路介绍
硬件电路主要分为信号转换电路、分频电路、数据选择电路、单片机系统和显示电路
五部分。
电平转换电路:
要将正弦信号转换成方波信号可以用过零比较电路实现。正弦信号通过LM833N与零电平比较,电压大于零的时候输出LM833N的正电源+5V,电压小于零的时候输出负电源0V。具体电路如图2所示。
图2信号转换电路
分频电路:
分频电路采用十进制的计数器74HC4017来分频,当被测信号脉冲个数达到10个时74HC4017产生溢出,C0端输出频率为输入频率的1/10,达到十分频的作用。如果当频率很高是需要多次分频只需将多片74HC4017级联就可以了。74HC4017时序图如图3所示,系统分频电路如图4所示。
图374HC4017时序图
图4分频电路
数据选择电路:
根据设计要求要根据计数脉冲个数来选择分频次数,可以用74151来选择分频次数,74151的选择控制信号有单片机的I/O口来控制。数据选择电路如图5所示。
图5数据选择电路
单片机系统:
单片机采用AT89C51,采用12MHZ的晶振频率。单片机的P3.2口接被处理后的被测信号,P0口接液晶显示器的数据输入端,ALE,RD,WR,P0.0,P0.1通过外接控制电路接液晶显示器的控制端。单片机系统的电路如图6所示。
图6 单片机系统显示电路:
显示电路由1602组成,其电路如图7所示。
图7显示电路
电路总图
图8电路总图
五 程序设计
等精度频率计的软件设计主要由主程序、分频选择程序、显示程序组成。 等精度频率计的算法设计:
根据设计要求频率范围是10HZ~100MHZ ,当频率为10HZ 时,T=100000us ,高电平为50000us ,0.1%的误差为100us ,由单片机产生的基准频率为1MHZ ,T0=1us ,最大误差为1us ,计数个数为50000(方式1),满足设计要求。当频率增加到1KHZ 时,产生的误差刚刚能达到设计要求,这时计数个数为500。当频率大于1KHZ 时(即计数个数小于500)就需要将被测频率分频后再测量,如当频率为10KHZ 时,先计算计得的脉冲数等于50,小于了500,所以将10KHZ 的信号10分频得到1KHZ ,这时就满足要求了。
最后得到的频率 f=i n
102106
其中n 为计得的脉冲个数,i 为分频的次数。 主程序:
主程序首先对系统环境初始化,设置分频选通信号P2=0x00,选通0通道。设置T0工作方式,采用硬件启动方式,GATE=1,当INT0和TR0同时为1时启动计时,计数方式为方式1(16位),TH0和TL0都置零。当外部中断INT0=1时等待,当外部中断为0时启动T0即TR0=1,当INT0一直为0时就等待,一旦INT0=1就启动计数同时等待,当INT0为0时跳出并关闭T0即TR0=0。这样就计得高电平期间基准脉冲个数,当脉冲个数小于500时就选择10分频信号,即P2自加1,同时记录分频一次;如果分频后脉冲个数还小于500则再次分频,直到计数个数大于500。其示意图如图9所示,主程序流程图如图10所示。
图9 计数工作示意图
图10 主程序流程图
六程序清单
主程序:
#include
#include
#include
#include
sbit p32=P3^2;
main()
{
unsigned long int period,k,j,i=0;
float f,m;
char buff[30];
init_LCD();
P2=0x00;
while(1)
{
TMOD=0X09;
TH0=0;
TL0=0;
while(p32==1);
TR0=1;
while(p32==0);
while(p32==1);
TR0=0;
period=TH0*256+TL0;
while(period<=500) /*判断是否分频及计算分频次数*/ { P2++;
i++;
period=period*10;
if(i==6)
{P2=0x00;
break;
}
}
k=pow(10,i); /* 10的i次方*/
f=(1000000.0/(2*period))*k;
if(f<1000)
sprintf(buff,"f=%5.2fHZ",f);
else
{m=f/1000.0;
sprintf(buff,"f=%5.2fKHZ",m);
}
lcdprintf(0,0,buff);