实验五数字频率计设计

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
必须用模块化方法进行C语言程序设计。
四、实验仪器和设备
PC机、Keil uVision2软件,C8051F020单片机,EC3在线仿真器。
五、实验原理
频率测量的方法常用的有测频法和测周法两种。
(1)测频法
测频法的基本思想是让计数器在闸门信号的控制下计数1秒时间,计数结果是1秒内被测信号的周期数,即被测信号的频率。若被测信号不是矩形脉冲,则应先变换成同频率的矩形脉冲。测频法的原理框图如图6所示。
六、程序流程图
七、实验结果与分析
利用函数信号发生器产生各种频率大小在1HZ~10KHZ的方波信号,当频率≥100HZ时,响应时间为约1s,当频率<100HZ时,响应时间约10s。
当频率在10HZ~100HZ时显示格式为xx.x,LED灯0亮起,表示单位是HZ;
当频率在100HZ~1KHZ时显示格式为xxx.,LED灯0亮起,表示单位是HZ;
图可知,无论被测信号的频率是多少,测量时可能产生的最大绝对误差均为±1Hz,即
f测-f真=±1Hz
所以,最大相对误差为
σmax=(f测-f真)/ f真=±1/f真
由上式可知,在闸门信号相同时,测频法的相对误差与被测信号的频率成反比。因此测频法适合于测量频率较高的信号。
(2)测周法
当被测信号频率较低时,为保证测量精度,常采用测周法。即先测出被测信号的周期,再换算成频率。测周法的实质是把被测信号作为闸门信号,在它的高电平的时间内,用一个标准频率的信号源作为计数器的时钟脉冲。若计数结果为N,标准信号频率为f1,则被测信号的周期为
{
bdwtd();//关闭看门狗
SYSCLK_Init();//选用外部时钟,12M
ZLG7289_Init(40);//ZLG芯片初始化
XBR1=0x04;//配置交叉开关,将INT0连到交叉开关
XBR2=0x40;//使能交叉开关
P3MDOUT=0xff;//将P3设置为推挽输出
CKCON=0x00;//定时器时钟选择,用系统时钟12分频
}
else
{
P5=0xfe;
ZLG7289_Download(1,0,0,maichong/100);
ZLG7289_Download(1,1,0,maichong%100/10);
ZLG7289_Download(1,2,1,maichong%100%100%10);
}
}
//当频率小于100时,需要计时十秒,maichong/10就是频率值
delay(20);
while(!(OSCXCN &0x80))
{;}
OSCICN=0x08;
}
//////////////////////////////////////////////////////////////////////////
//初始化函数,系统的初始化
void chushihua()
else
{
P5=0xfe;
ZLG7289_Download(1,0,0,maichong/100);
ZLG7289_Download(1,1,1,maichong%100/10);
ZLG7289_Download(1,2,0,maichong%10);
}
}
//////////////////////////////////////////////////////////////////////////
(1)测频率范围:10Hz ~ 10K Hz。为保证测量精度分为三个频段:
10Hz ~ 100 Hz
100Hz ~ 1K Hz
1 K Hz ~ 10K Hz
当信号频率超过规定的频段上限时,设有超量程指示。三个频段之间用手动切换。
(2)输入波形:低频函数信号发生器输出的矩形波,幅度为3V。
(3)测量误差:σ≤±1%。
IE0=0;//中断标志自动清零
}
//////////////////////////////////////////////////////////////////////////
//频率显示函数
void xianshi()
{
//当频率大于100时,maichong值就是频率大小,将其直接按位显示即可
//否则用模式1测量
if(maichong<100)
{
model=1;
}
xianshi();//显示频率
maichong=0;//将脉冲数清零
ms=0;
}
}
else if(ms>=1000)
{
if(maichong>=1000)//判断如果频率大于100就将模式切换到模式0
{
model=0;
}
xianshi();
图中,秒脉冲作为闸门信号,当其为高电平时,计数器计数;低电平时,计数器停止计数。显然,在同样的闸门信号作用下,被测信号的频率越高,测量误差越小。当被测频率一定时,闸门信号高电平的时间越长,测量误差越小。但是闸门信号周期越长,测量的响应时间也越长。
例如,闸门信号高电平时间为1秒,被测信号频率的真值为2Hz,如图2-2-2所示。由
(3)低频段的测量
鉴于上述困难,对于低频信号,为了达到规定的精度,要采取一些比较特殊的方法。例如,可考虑将被测信号倍频后再用测频法测量。或将闸门信号展宽。由于倍频电路比较复杂,所以一般采用后一种方法,实际上闸门信号展宽与被测信号倍频在效果上是相同的。闸门信号展宽比较容易做到,例如采用分频电路就可以实现。若闸门信号高电平时间从1秒展宽到10秒,则相对误差可以按比例下降,但响应时间也增大相同的比例。
WDTCN=0XAD;
EA=1;
}
#endif
#ifndef _delay_H_
#define _delay_H_
/*
这是一个可以控制延时的头文件,其中的函数可以
延时x*100倍机器时钟
*/
void delay(unsigned char x)
{
unsigned int i,j;
for(i=0;i<x;i++)
TMOD=0x01;//定时器方式设置为方式0
TH0=(65536-10000)/256;//为T0装初值
TL0=(65536-10000)%256;//
TR0=0;//关闭T0
ET0=1;//允许T0中断
PX0=1;//设置INT0为高优先级
EX0=1;//允许INT0中断
IT0=1;//将INT0设置为边沿触发
实验项目名称:数字频率计设计
姓名:雷锋一号学号:123456789班级:通信121实验时间:星期四晚上
姓名:雷锋二号学号:123456789班级:通信121实验地点:407
一、实验目的
1.掌握单片机片内定时器的使用方法。
2.掌握基于单片机片内定时器的数字频率计设计方法。
二、实验内容
基于单片机片内定时器的数字频率计设计。要求:
//用测频法测量,测量有两种模式
//模式0:当频率大于等于100时,测量1s内的脉冲数,频率就是脉冲数大小
//模式1:当频率小于100时,测量10s内的脉冲数,频率为脉冲数大小的十分之一
void F_measure()
{
if(model==0)
{
if(ms>=100)
{
//判断频率的范围,当用测频率的方法测得频率≥100,继续用模式0测量
T = T1·N
被测信号的频率为
f = 1/T1·N = f1/N
利用测周法所产生的最大绝对误差,显然也等于±1个标准信号周期。如果被测信号周期的真值为T真=T1·N,则T测=T1·(N±1)
σmax=(f测-f真)/ f真= T真/T测–1=±1/(N±1)
由上式可知,对于一定的被测信号,标准信号的频率越高,则N的值越大,因而相对误差越小。
TH0=(65536-10000)/256;//定时器初值重载
TL0=(65536-10000)%256;//
}
//////////////////////////////////////////////////////////////////////////
//外部中断0的服务程序,当此中断出现时,说明脉冲数增加1
{
F_measure();//调用测量频率的函数
}
}
//////////////////////////////////////////////////////////////////////////
//定时器0的溢出中断服务程序
void ser1() interrupt 1 using 2
{
ms++;//ms+1表示时间增加10ms
//定义maichong为记录脉冲数变量
//////////////////////////////////////////////////////////////////////////
//外部时钟,12M,需要调用delay()函数
void SYSCLK_Init(void)
{
OSCXCN=0x77;
当频率在1KHZ~10KHZ时显示格式为x.xx,LED灯1亮起,表示单位是KHZ。
各频段实验数据见下表。
输入频率/HZ
实测频率/HZ
相对误差(绝对值)
10
10.0
0
35
35.0
0
72
72.0
0
88
88.3
0.ຫໍສະໝຸດ Baidu4%
105
105
0
365
365
0
852
852
0
1.02K
1.01K
0.98%
3.55K
3.54K
//初始化的显示
void xianshi0()
{
char i;
for(i=0;i<8;i++)
{
ZLG7289_Download(1,i,0,0);
}
}
//////////////////////////////////////////////////////////////////////////
void ser0()interrupt 0
{
maichong++;
}
各个头文件程序:
#ifndef _bdwtd_H_
#define _bdwtd_H_
/*
这是一个关闭看门狗的头文件,并且开启所有中断,为方便主程序里对
看门狗的处理
*/
void bdwtd(void)
{
EA=0;
WDTCN=0XDE;
{
for(j=0;j<100;j++);
}
}
#endif
0.28%
7.18K
7.16K
0.28%
9.99K
9.97K
0.20%
10K
9.98K
0.20%
实验结论:
通过实验,自主设计了利用测频法测量频率的程序,通过实验数据可知,测频的范围、显示格式以及精度要求都符合实验要求。掌握了单片机片内定时器的使用方法,掌握了基于单片机片内定时器的数字频率计设计方法。但是这种设计方法尚有不足,当频率较低时,利用测频法响应时间太长,以后的设计可以采用低频是测周期大小的方法会更好!
(4)显示和响应时间:
测量结果用三位半导体数码管显示,要求显示数码稳定清晰。三个频段的最大显示数分别为99.9 Hz,999. Hz,9.99 K Hz,为此需要控制小数点位置,并用两个发光二极管分别显示频率单位:Hz或K Hz,详见表1。
三、实验说明
通过本实验,掌握单片机片内定时器的使用方法,了解数字频率计的测量原理及测量电路设计方法。掌握基于单片机的数字频率计工作原理与设计方法。
maichong=0;
ms=0;
}
}
void main()
{
chushihua();//系统的初始化
xianshi0();//初始化的显示
ms=0;//闸门时间开始时设为0
model=0;//初始默认用模式0测量
maichong=0;//脉冲数计数变量,初值为0
TR0=1;//开启计时器T0
while(1)//进入死循环
if(model==0)
{
if(maichong>=1000)
{
P5=0xfd;
ZLG7289_Download(1,0,1,maichong/1000);
ZLG7289_Download(1,1,0,maichong%1000/100);
ZLG7289_Download(1,2,0,maichong%1000%100/10);
八、源代码
源代码必须有必要的注释,且要与流程图的逻辑关系对应。
# include<ZLG7289.h>
# include<bdwtd.h>
# include<delay.h>
bit model;//定义一个测试模式标识位,0:测频,1:测周期
unsigned int ms,maichong;//定义ms为计时器计时基本单位,表示10ms
相关文档
最新文档