跳到主要内容

频率计电路

在本项目中,我将设计并演示一个简单的频率计电路,用于测量信号的频率。本项目基于8051微控制器,当然你也可以设计一个非微控制器版本。

alt text

1. 引言

频率计是一种用于测量信号频率的仪器。从科学角度讲,频率是信号每秒的周期数。通俗来说,信号的频率表示信号在一定时间内发生的次数。频率计基本上是具有有限计数时间的简单计数系统。

在此我们设计了一个使用两个定时器和两个计数器的简单频率计系统。其中一个定时器用于产生时钟信号,另一个用于产生持续一秒的时间限制信号。

2. 频率计电路工作原理

本电路基于频率的简单定义,即每秒的周期数。基本上,使用方波发生器电路产生简单的脉冲波。将这些脉冲输入8051微控制器的定时器/计数器,计数脉冲的数量。

经过简单计算后,得到的频率以赫兹为单位显示在16×2 LCD显示屏上。

需要注意的一点是,我使用Arduino UNO作为方波源。你可以使用Arduino,也可以完全使用555定时器IC搭建自己的方波发生器,并将其配置为无稳态多谐振荡器。

3. 频率计电路原理图

alt text

4. 频率计电路设计

由于我使用Arduino生成方波,因此只需要几行代码并访问单个数字I/O引脚即可。如果你计划使用555定时器IC构建方波发生器电路,请理解以下说明。

555定时器电路的主要要求是生成占空比约为99%的振荡信号,使得输出信号的低电平时间小于高电平时间。由于占空比仅取决于阈值和放电电阻的值,因此可通过选择合适的电阻值进行调节。

alt text

占空比由下式给出:D=R1+R2R1+2R2D = \frac{R1 + R2}{R1 + 2R2}

D=0.99D = 0.99 代入,可得 R1=98×R2R1 = 98 \times R2。因此选择 R2=100ΩR2 = 100\OmegaR1=9.8kΩR1 = 9.8k\Omega。实际中通常选择 R1=10kΩR1 = 10k\Omega

下一步是设计计数器电路。我们的需求是测量几千赫兹量级的频率。如电路原理所述,我将使用8051的定时器/计数器。实际上,我将使用8051的Timer0和Timer1。

Timer0用于生成时间延迟,Timer1用于计数来自脉冲发生器的脉冲。Timer0配置为模式1的定时器,而Timer1配置为模式1的计数器。

5. 代码

以下是使用8051微控制器的频率计电路代码:

#include<reg51.h>
#define lcd P1
sbit rs=P3^0;
sbit e=P3^1;

unsigned long z=0;
void delay (int);
void display (unsigned char);
void cmd (unsigned char);
void init (void);
void string (char *);
void intro (void);
char i=0;


void delay (int i)
{
int j=0;
for(j=0;j<i;j++)
{
TMOD=0x51;
TH0=0xFC;
TL0=0x66;
TR0=1;
while(TF0==0);
TR0=0;
TF0=0;
}
}

void cmd (unsigned char c)
{
lcd=c;
rs=0;
e=1;
delay(10);
e=0;
}
void display (unsigned char c)
{
lcd=c;
rs=1;
e=1;
delay(10);
e=0;
}
void string (char *c)
{
while(*c)
{
display(*c++);
}
}
void init (void)
{
cmd(0x38);
cmd(0x01);
cmd(0x0c);
cmd(0x80);
}
void intro (void)
{
cmd(0x80);
string(" Electronics ");
cmd(0xc0);
string(" Hub ");
delay(2000);
cmd(0x01);
cmd(0x80);
string(" Frequency ");
cmd(0xc0);
string(" Counter ");
delay(2000);
cmd(0x01);
cmd(0x80);
}

void main()
{
unsigned int temp=0;
unsigned int temp1=0;
unsigned int frequency;
init();
intro();
delay(100);
while(1)
{

TMOD=0x51;
TH1=0;
TL1=0;
TR1=1;
delay(100);
TR1=0;
frequency=(TH1*256)+TL1;
frequency=frequency*10;


////////////////////////////////////////////////////////////////////////////////////////////////////////////
if(i==0)
{
string("Frequency In Hz");
i++;
}


cmd(0xc5);
if((frequency>=1) && (frequency<10))
{
string(" ");
temp=frequency*10000;
temp1=((temp/10000)+48);
display(temp1);

}
else if((frequency>=10) && (frequency<100))
{
string(" ");
temp=frequency*1000;
temp1=((temp/10000)+48);
display(temp1);

temp1=(((temp/1000)%10)+48);
display(temp1);

}
//////////////////////////////////////////////////////////////////////
else if((frequency>=100) && (frequency<1000))//1234
{
string(" ");
temp=frequency*100;
temp1=((temp/10000)+48);
display(temp1);

temp1=(((temp/1000)%10)+48);
display(temp1);

temp1=(((temp/100)%10)+48);
display(temp1);

}

else if((frequency>=1000) && (frequency<10000))//1234
{
string(" ");
temp=frequency*10;
temp1=((temp/10000)+48);
display(temp1);

temp1=(((temp/1000)%10)+48);
display(temp1);

temp1=(((temp/100)%10)+48);
display(temp1);

temp1=(((temp/10)%10)+48);
display(temp1);

}
else if((frequency>=10000) && (frequency<100000))//12345
{
temp=frequency*1;
temp1=((temp/10000)+48);
display(temp1);

temp1=(((temp/1000)%10)+48);
display(temp1);

temp1=(((temp/100)%10)+48);
display(temp1);

temp1=(((temp/10)%10)+48);
display(temp1);

temp1=((temp%10)+48);
display(temp1);


}
else
{
string(" 0");
}
delay(500);
}
while(1);
}

6. 频率计电路操作

按照电路图进行连接,并将Arduino产生的脉冲施加到端口3引脚P3.5,即Timer1引脚。由于我将Timer1配置为计数器,通过使TR1置高和置低来计数约100毫秒内的脉冲数。脉冲计数存储在Timer1中,即TH1和TL1寄存器。

要获得频率值,请使用以下公式:

frequency=(TH1×256)+TL1\text{frequency} = (TH1 \times 256) + TL1

为了将频率值转换为赫兹(每秒周期数),需要将结果值乘以10。之后,通过简单数学运算对结果进行格式化,以便在16×2 LCD显示屏上显示。

alt text

7. 本电路的应用

  • 使用8051微控制器的频率计电路可用于准确测量信号的频率。
  • 由于我们是在计数脉冲,因此只能测量方波及其派生波(具有不同占空比)的频率。