基于CPLD与51单片机的数字频率计的设计.docx
《基于CPLD与51单片机的数字频率计的设计.docx》由会员分享,可在线阅读,更多相关《基于CPLD与51单片机的数字频率计的设计.docx(31页珍藏版)》请在冰豆网上搜索。
基于CPLD与51单片机的数字频率计的设计
课
程
设
计
报
告
项目名称:
基于CPLD与51单片机的数字频率计的设计
组员:
赵聪(2012128089)
关珊珊(2012128022)
谢叶青(2012128068)
成民民(2012128011)
刘慧(2012128040)
马商牟司(2012128044)
指导老师:
张静
基于CPLD与51单片机的数字频率计的设计
摘要:
频率测量是电子测量领域中重要的也是基本物理的测量量之一。
基于传统频率测量原理的频率计的测量精度将随被测频率信号频率的下降而下降,在实际应用中有较大的局限性,而基于CPLD与51单片机的数字频率计采用等精度测量方法,利用CPLD实现了频率、周期、占空比的测量计数。
基于CPLD与51单片机的数字频率计的设计采用自上向下的设计方法,用STC12C5A60S2单片机作为系统的主控部件,实现整个电路的测试信号控制、数据运算处理、键盘扫描和控制液晶的显示输出。
复杂可编程逻辑器件CPLDEPM240完成各种时序逻辑控制、计数功能。
本系统实现了测频范围为0.1Hz~10MHz,测频精度:
测频全域相对误差恒为百万分之一;脉宽测试范围0.1μs~1s;测试精度0.01μs;占空比测试范围1%~99%,测试精度1%。
关键字:
数字频率计;CPLD;STC12C5A60S2;EDA技术;EPM240
目录
1引言1
2总体方案的分析和设计1
2.1测频原理分析1
2.1.2基于CPLD与51单片机的数字频率计原理2
2.1.3误差分析3
2.2数字频率计的系统设计4
3硬件设计与设计5
3.1电源部分电路5
3.2按键检测及蜂鸣器电路5
3.3单片机最小系统6
3.4CPLD测频模块6
3.4.1测频/测周期的实现6
3.4.2.控制部件设计7
3.4.3计数部件设计7
3.5液晶显示模块9
4软件设计与实现10
4.1CPLD软件设计10
4.1.1CPLD模快实现的功能10
4.1.2标准频率测试计数器10
4.1.3测脉宽逻辑11
4.2单片机软件设计11
4.2.1单片机的编程与流程图11
5性能测试与误差分析15
5.1性能测试15
5.2误差分析16
6结束语16
[参考文献]16
附录17
1引言
数字频率计是通信设备、视、音频等科研项目生产领域不可缺少的重要测量仪器[1]。
基于传统频率测量原理的频率计的测量精度将随被测频率信号频率的下降而下降,在实际应用中有较大的局限性。
如果要求只使用一种测量方法而对整个频率范围内的频率信号的测量都能达到同样的精度,就只能采用等精度频率测量方法。
而基于CPLD与51单片机的数字频率计不但能在整个频率测量区域内保持恒定的频率测量精度,且具有较高的频率测量精度。
因此,等精度频率测量技术在现实的应用非常广泛。
基于CPLD与51单片机的数字频率计的设计采用自上向下的设计方法,用STC12C5A60S2单片机作为系统的主控部件,实现整个电路的测试信号控制、数据运算处理、键盘扫描和控制液晶的显示输出。
复杂可编程逻辑器件CPLDEPM240完成各种时序逻辑控制、计数功能,在OuartusII平台上用Verilog硬件描述语言设计以及编译,调试,仿真和下载[3]。
本系统实现了测频范围为0.1Hz~10MHz,测频精度:
测频全域相对误差恒为百万分之一;脉宽测试范围0.1μs~1s;测试精度0.01μs;占空比测试范围1%~99%,测试精度1%。
2总体方案的分析和设计
2.1测频原理分析
2.1.1频率测量方案
方案一:
周期频率测量法。
通过测量被测信号的周期
,由公式
求出待测信号的频率
。
这种频率测量方法需要有标准倍的频率信号,在待测信号的一个周期内,对提供的标准信号进行周期计数。
这种方法的计数值会产生最大为±1个脉冲误差,并且测试精度与计数器中记录的数值有关,为了保证频率的测量精度,周期测量法仅适用于频率较低的待测信号的频率测量。
方案二:
直接频率测量法。
直接率测量的方法就是在确定的单位时间内,检测被测信号的脉冲数。
由于设置的单位时间通常不是被测频率信号的周期的整数倍数,这种测量方法的脉冲计数也会产生最大为±1个脉冲误差。
当我们进一步分析测量误差:
设待测信号脉冲周期为
频率为
,当测量时间为
时,测量准确度为
,由上面的推导可知直接频率测量的准确度与被测信号的频率有关:
当被测信号的频率越高则测量精度也就越高,反之频率的测量精度也越低。
因此直接频率测量的方法一般只适合测量频率较高的被测信号,不能满足在整个频率段内测量精度保持不变的要求。
方案三:
等精度频率测量法,测量的精度保持一个定值,不随所测信号频率的变化而变化。
在快速测量的要求下,如果要得到较高的频率测量精度,那么必须采用较高频率的标准信号。
由于单片机本身时钟频率不高,同时受到若干指令运算的限制,测频速度较慢,无法满足高精度、高速的测频要求;而采用集成度高、速度快的现场可编程门阵列CPLD能够实现高精度、高速的频率测量。
综上所述,选择方案三。
2.1.2基于CPLD与51单片机的数字频率计原理
基于CPLD与51单片机的数字频率计测频方法:
它的闸门时间的大小不是固定的,可以人为自己设定闸值时间,但是在测量的时候实际闸门时间是被测信号周期的整数倍,即与被测信号同步[3]。
其测频原理说明图如下图所示。
在测量过程当中,用两个计数器分别对被测频率信号和标准脉冲信号同时计数。
首先给出闸门使能信号(预置闸门开启信号为上升沿)[4],这时两个计数器并不开始计数,而是等到之后被测信号的上升沿到来时,两个计数器才真正开始计数。
然后等待预置闸门信号关闭(这里是下降沿)[5],两个计数器并没有立即停止计数,而是等到之后被测信号的上升沿到来时才同时结束两个计数器的计数,完成一次测量。
可以看出,在这个测量过程中,实际两个计数器计数的闸门时间t与之前预置闸门时间t1并不是完全的等同,但这个两个时间差值不会超过被测频率信号的一个周期。
图2.1等精度测频测量原理波形图
图2.2等精度测频实现原理图
2.1.3误差分析
假设在一次测量中,实际闸门时间为t,对标准信号的计数值为
,计数器对被测信号的计数值为
。
标准信号的频率为
,则被测信号的频率如式(2-1):
(2-1)
由式
(1)可知,若忽略标频
的误差,则等精度测频可能产生的相对误差如式(2-2):
(2-2)
其中
为被测信号频率的准确值。
在测量中,由于
计数的起停时间都是由该信号的上升沿触发的,在闸门时间t内对
的计数
无误差(
);对
的计数
最多相差一个数的误差,即
其测量频率如式(2-3):
(2-3)
将式
(1)和(3)代入式
(2),并整理如式(2-4):
(2-4)
由上式可以看出,等精度频率测量法测量频率的相对误差与被测周期信号的频率大小无关,仅与预置闸门时间长短和标准信号频率大小有关,即实现了在整个测试的频率段内的等精度测量。
有上式,可得闸门时间越长,标准频率越高,频率测量的相对误差就越小。
因此,为了得到较高的频率测量精度,标准频率可由稳定度好、精度高的高频率晶体振荡器产生[7]。
同时,在保证测量精度不变的前提下,提高标准信号频率,可使闸门时间缩短,即提高测试速度。
由上面的分析,本设计运用高速的CPLD和单片机相结合的设计机构。
用高速的CPLD完成都待测信号和标准频率信号的计数;利用单片机来完成各种数据的计算和液晶显示等控制功能。
2.2数字频率计的系统设计
由于单片机的运算能力强,速度较慢,CPLD的速度快但是运算能力有限,故本设计采用CPLD与单片机组合的测量方法,本设计主要包括CPLD测频部分,单片机数据处理以及LED显示部分,整体结构框图如下图。
图2.3系统结构图
3硬件设计与设计
3.1电源部分电路
通过MINIUSB口输入5V电压一路直接给单片机的需要5V的电路供电。
另外,在5V输出端引出一路通过AMS1117降压稳压芯片转换,得到3.3V电压输出,供CPLD和液晶模块使用。
图3.1电源部分电路图
3.2按键检测及蜂鸣器电路
这部分主要有两块:
一个是按键模块,另一个是蜂鸣器驱动模块。
通过按键的识别来处理频率测量,占空比测量或者周期测量,蜂鸣器鸣响作为按键按下提示。
图3.2按键识别与蜂鸣器驱动部分电路图
3.3单片机最小系统
本电路是系统中央控制部分,实现对按键的识别,控制液晶显示,以及控制和采集得到CPLD的数据。
图3.3单片机最小系统
3.4CPLD测频模块
CPLD部分主要是计数部分。
在测量频率时计数器是对被测信号和标准信号进行计数,在测量占空比时计数完成分别在待测信号的高电平对标准信号计数和低电平对标准信号计数。
图3.4CPLD部分电路
3.4.1测频/测周期的实现
(1)令TF=0,选择等精度测频,然后在CONTRL的CLR端加一个正脉冲信号已完成测试电路的初始化。
(2)由预置门控信号将CONTRL的START端置高电平,预置门开始定时,此时又被测信号的上沿打开计数器CNT1进行计数,同时使标准频率信号进入计数器CNT2。
(3)预置门定时结束信号把CONTRL的START端置为低电平(由单片机来完成),在被测信号的下一个脉冲的上沿到来时,CNT1停止计数,同时关断CNT2对fs的计数。
(4)计数结束后,CONTRL的EEND端将输出低电平来指示测量计数结束,单片机得到此信号后,即可利用ADRC(P2.1),ADRA(P2.0)分别读回CNT1和CNT2的计数值,并根据等精度测量公式进行运算,计算出被测信号的频率或周期值。
图3.5频率测量演示图3.6周期测量演示
3.4.2.控制部件设计
如图所示,当D触发器的输入端START为高点平时,若FIN端来一个上升沿,则Q端变为高电平,导通FIN到CLK1和FSD到CLK2,同时EEND被置为高电平作为标志;当D触发器的输入端START为低电平时,若FIN端输入一个脉冲上沿,则FIN到CLK1与FSD到CLK2的信号通道被切断。
图3.7测频与测周期控制部分电路
3.4.3计数部件设计
图中的计数器CNT1/CNT2是32位二进制计数器,通过DSEL模块的控制,单片机可分为4次将其32位数据全部读出。
3.4.4脉冲宽度测量和占空比测量模块设计
根据上述脉宽测量原理,设计如图所示的电路原理示意图
图3.8CONTRL2子模块内部结构
测量脉冲宽度的工作步骤如下:
(1)向CONTRL2和CLR端送一个脉冲以便进行电路的工作状态初始化。
(2)将GATE的CNL端置高电平,表示开始冒充宽度测量,这时CNT2的输入信号为FSD。
(3)在被测脉冲的上沿到来时,CONTRL2的PUL端输出高电平,标准频率信号进入计数器CNT2。
(4)在被测脉冲的下沿到来时,CONTRL2的PUL端输出低电平,计数器CNT2被关断。
(5)由单片机读出计数器CNT2的结果,并通过上述测量原理公式计算出脉冲宽度。
CONTRL2子模块的主要特点是:
电路设计保证了只有CONTRL2被初始化后才能工作,否侧PUL输出始终为零。
只有在先检测到上沿后PUL才能为高电平,然后在检测到下沿时,PUL输出为低电平;ENND输出高电平以便通知单片机测量计数已经结束;如果先检测到下沿,PUL输出低电平;在检测到上沿并紧接一个下沿后,CONTRL2不再发生变化直接下一个初始化信号到来。
占空比的测量方式是通过测量脉冲宽度记录CNT2的计数值N1。
然后将输入信号反相。
,在测量脉冲宽度,测得CNT2计数值N2则可以计算出:
(3.1)
图3.9占空比测量演示
3.5液晶显示模块
本设计中,液晶显示部分用的是能够显示汉字的价格便宜的Nokia5110液晶作为显示器。
Nokia5110液晶显示器由48行X84列输出,所有的显示功能集成在一块芯片上,包括LCD电压及偏置电压发生器,并且只须很少外部元件,采用CMOS工艺,且功耗小。
使用的是串行总线外部连线少。
管脚与功能表如下表:
表3.1管脚与功能表
管脚编号
管脚名称
功能
1
RST
复位
2
CE
片选
3
DC
数据/指令选择
4
DIN
串行数据线
5
CLK
串行时钟线
6
3.3V
电源正极
7
LIGHT
背光控制,接地时背光灯亮
8
GND
电源负极
4软件设计与实现
4.1CPLD软件设计
4.1.1CPLD模快实现的功能
当SPUL信号为高电平时系统允许完成频率测量,首先CLR一个正脉冲是内部的32位数据清零,再将CL置为高电平,此时斌没有开始计数,当被测信号出现上升沿时SPULP=1,计数器才开始对被测信信号和标准信号计数,等待一会再将CL置0,计数并未停止,知道待测信号的出现上升沿为止START=0;计数结束标志。
当SPUL信号为低电平时人、允许占空比测量,此时CL和CLR的功能发生了变化,当CL=1时测量信号高电平的脉宽,当CL=0时,测量信号低电平的脉宽,CLR变为1时系统初始化,由1变为0时启动计数,而允许计数的条件此后的第一个脉宽。
状态信号EEND变为1是作为计数完成告诉单片机。
图4.1EDA设计总体电路
4.1.2标准频率测试计数器
100MHz的标准频率信号源可通过锁相环倍频从CPLD内部获得,接入CPLD。
如图4.2所示。
图4.2标准频率测试计数器
4.1.3测脉宽逻辑
在测脉宽阶段SPUL被设置成0,当由低电平变到高电平时指示脉宽计数结束。
图4.3测脉宽逻辑
编程后的软件仿真图如下:
图4.4CPLD频率测量仿真图
4.2单片机软件设计
4.2.1单片机的编程与流程图
单片机的编程主要采用的是从上到下的编程设计方法,主要有三块:
一、主函数的编程;二、中断及按键识别的编程;三、显示函数编程;四、频率测量函数编程。
主函数编程思路是:
首先初始化相关外围器件,然后在主循环里面循环执行显示函数。
流程图如下:
图4.5主函数流程图
按键识别函数的编程思路是:
本设计用到了5个按键,K1到K4四个按键分别标记执行4个过程函数,通过按键按下设置标识F=x(1.2.3.4)。
按键K5为启动暂停按键,在周期测量,占空比测量和频率测量中实现开始测量和暂停读数的功能。
程序流程图如下:
图4.6按键识别函数流程图
显示函数的编程思路为:
在显示函数中判断标识F=x(1.2.3.4)执行相应的过程函数。
K=1主界面显示,K=2频率测量及液晶显示,K=3周期测量及液晶显示,K=4占空比测量及显示,K=5启动与暂停。
程序流程图如下:
图4.7显示函数流程图
频率测量函数的编程思路是:
单片机给CPLD一个频率测量信号,CPLD开始频率测量,检测等待知道测量完成,读取相应的信号。
计算输出此时的频率。
流程图如下:
图4.8频率测量函数流程图
5性能测试与误差分析
5.1性能测试
用信号发生器做信号源,用一个示波器测量信号频率,同时也用我们设计的等精度频率计测量信号发生器输出信号的频率,表2是该频率计在不同的输入信号频率下的测量数据。
表5.1频率测量数据
实际频率
示波器测量值
测量频率
作品测量误差
相对误差
50
51.1
52
2
4.0%
750
755.2
760
10
1.3%
2000
2000
2.0K
0
0.0%
300k
300.2k
302.2k
2.2k
0.7%
500k
503.5k
505.6k
5.6k
1.1%
1M
999.8k
998.7k
1.3k
0.1%
10M
10.1M
9.9M
0.1M
1.0%
表5.2周期测量数据
信号源频率
示波器测量值
测量周期
作品测量误差
相对误差
100Hz
10.0ms
10.2ms
0.2ms
2.0%
10KHz
100.0us
100.1us
0.1us
0.1%
100KHz
10.1us
9.9us
0.2us
2.0%
1MHz
999.8ns
1.0us
0.2ns
0.2%
表5.3占空比测量数据
信号源显示占空比
测量占空比
作品测量误差
相对误差
10%
8.6%
1.4%
14%
19%
17.7%
1.3%
6.8%
37%
36.9%
0.1%
0.3%
50%
50.4%
0.4%
0.8%
66%
66.1%
0.1%
0.2%
85%
85.0%
0.0%
0.0%
90%
89.9%
0.1%
0.1%
5.2误差分析:
1.在实际测量中,被测信号有时不一定能达到仿真时的效果,在闸门打开的时候,由于CPLD各内部逻辑单元延时的不一致,从而不能使标准信号与被测信号同时计数,也会导致误差。
2.单片机在产生门宽信号时其上升沿与下降沿建立的时间过长,每次产生的门宽信号不一样,产生误差。
6结束语
该频率计经软硬设计,各项功能到达预定目标。
本作品的特点克服了传统的测频法和测周期法的不足,能在频率范围变化较大时,都有比较高的测量精度具有相对测量误差与被测信号的频率无关;增大Tpr或Fs可以增大Ns,减小测量误差,提高测量精度;测量精度与预置门宽度和标准频率有关,与被测信号的频率无关,预置门和常规测频闸门时间相同而被测信号频率不同的情况下,等精度测量法的精度不变。
系统拓展:
由于时间和实验室条件有限,还存在一些不足,需要进一步的完善和改进。
系统用方波信号源,直流电源;
应进一步提高系统的精度。
[参考文献]
[1]吴小所.等精度频率计的研究与设计[J].中国新技术新产品,2011,(24)
[2]潘明,龚然礼.等精度测频仪的低成本微控制器实现[J].广西科学院学报,2004,20(4)
[3]张琼,杜祖升.等精度测频的VerilogHDL实现[C].全国抗恶劣环境计算机第十七届学术年会,2007
[4]李红丽,马耀锋.基于FPGA的多功能等精度频率计的设计[J].中州大学学报,2010,27(6)
[5]蔡教武.一种基于等精度测频原理的频率计[J].电子测试,2007,(11)
附录
1总体电路图
2单片机程序
2.1主函数程序
#include"12c5a60s2.h"
#include"display.h"
#include"keyscan.h"
voidmain()
{
LCD_init();
bee=1;
Interrupt_Init();
while
(1)
{
display();
}
}
2.2按键中断识别函数
#include"keyscan.h"
unsignedcharK=1,F=0;
voiddi()
{
bee=0;
delayms(100);
bee=1;
}
voidInterrupt_Init()//中断初始化
{
EA=1;//开总中断
EX0=1;//开外部中断0
IT0=0;//低电平触发方式
}
voidKeyscan_INT0()interrupt0//INT0处理函数(按键的识别)
{
if(key_1==0)
{
delayms(15);
if(key_1==0)
{
di();
K=1;
F=0;
}
while(!
key_1);
}
if(key_2==0)
{
delayms(15);
if(key_2==0)
{
di();
K=2;
F=0;
}
while(!
key_2);
}
if(key_3==0)
{
delayms(15);
if(key_3==0)
{
di();
K=3;
F=0;
}
while(!
key_3);
}
if(key_4==0)
{
delayms(15);
if(key_4==0)
{
di();
K=4;
F=0;
}
while(!
key_4);
}
if(key_5==0)
{
delayms(15);
if(key_5==0)
{
di();
F=~F;
}
while(!
key_5);
}
}
2.3周期占空比测量函数
#include"cpld.h"
#include"zzy.h"
unsignedlongread_pl()
{
uinti,j,temp;
unsignedlongN1=0,N2=0,DATA1=0,DATA2=0;
CLL=0;
CLR=0;
SPUL=1;
CLR=1;
delay(10);
CLR=0;
delay(50);
CLL=1;
delay(25000);
//delay(10000);
CLL=0;
while(START);
//delay(50000);
for(i=0;i<4;i++)
{
temp=P0;
temp=((temp&0xf8)|i);
SEL=temp;
DATA1=DATA;
for(j=0;j
DATA1=DATA1*256;
N1+=DATA1;
}
for(i=4;i<8;i++)
{
temp=P0;
temp=((temp&0xf8)|i);
SEL=temp;
DATA2=DATA;
for(j=4;j
DATA2=DATA2*256;
N2+=DATA2;
}
SPUL=0;
return(Fs/N1)*N2;
}
unsignedintread_zkb()
{
unsignedlongN1=0,N2=0,DATA1=0,DATA2=0;
uchari,j,temp;
SPUL=0;
CLR=0;
CLL=0;
delay(1000);
CLR=1;
delay(1000);
CLR=0;
while(!
EEND);
//delay(50000);
for(i=0;i<4;i++)
{
temp=P0;
temp=((temp&0xf8)|i);
SEL=temp;
DATA1=DATA;
for(j=0;j
DATA1=DATA1*256;
N1+=DATA1;
}
delay(100);
CLL=1;
delay(1000);
CLR=1;
delay(1000);
CLR=0;