




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
光电与通信工程学院课程设计报告书课设名称:等精度频率计年级专业及班级:姓名:学号:一、课程设计目的1、进一步熟悉QuartusⅡ的软件使用方法,熟悉keil软件使用;2、熟悉单片机与可编程逻辑器件的开发流程及硬件测试方法;3、掌握等精度频率计设计的基本原理。4、掌握独立系统设计及调试方法,提高系统设计能力。实验设备EDA最小系统板一块(康芯)、PC机一台、示波器一台、信号发生器一台、万用表一个。二、设计任务利用单片机与FPGA设计一款等精度频率计,待测脉冲的检测及计数部分由FPGA实现,FPGA的计数结果送由单片机进行计算,并将最终频率结果显示在数码管上。要求该频率计具有较高的测量精度,且在整个频率区域能保持恒定的测试精度,具体指标如下:a)具有频率测试功能:测频范围100Hz~5MHz。测频精度:相对误差恒为基准频率的万分之一。b)具有脉宽测试功能:测试范围10μs~1s,测试精度:0.1μs。c)具有占空比测试功能:测试精度1%~99%。d)具有相位测试功能。(注:任务a为基本要求,任务b、c、d为提高要求)三、基本原理基于传统测频原理的频率计的测量精度将随被测信号频率的下降而降低,在实用中有较大的局限性,而等精度频率计不但具有较高的测量精度,而且在整个频率区域能保持恒定的测试精度。3.1等精度测频原理等精度频率计主控结构如图1所示四、实验现象占空比五、心得体会这周课程设计的题目是等精度频率计的设计,由于书本上有一段程序,所以一开始只是将书上的程序和显示波形研究了一下。当到课程设计的时候,将书上程序敲入并实现效果后有点茫然的感觉。于是,我又仔仔细细地分析了一遍设计原理,从新改变了输入的代码,加上自己的思路,并能自己添加预置控制信息CL模块。原本我还想将测试频率显示在数码管上,但是最终没能实现,这应该是我的一个遗憾吧。设计中,我感受到了硬件描述语言的强大,我可以几乎不用考虑硬件条件,将代码导入就可实现功能。不要总想着去依靠书本上的原题或者是他人,自己思考的做出来的,才算是自己真正收获的。本次实验最大的收获莫过于,独立系统的去完成一项任务。在其中我查阅了大量的资料,尤其是数字电路、quartersⅡ软件使用说明、EDA设计等方面的资料。
通过本次学习使我对时序电路有了更深的理解,具体体现在复位、计数、锁存多环节的控制上。同时,在这次实验中,我第一次联合单片机和EDA一起完成一个项目。EDA充分的发挥其高频工作的特点,使得频率测量的上限很高。单片机则在整个系统中充当控制及数据处理的作用设计的优点及缺点
本频率计最大优点在于它的高精度。信号频率的测量,不受闸门信号精度的影响。在被测信号送入计数器之前,先通过D触发器,使闸门信号和被测信号同步,有效地避免了±1误差。不仅如此,本频率计对100HZ至5MHZ的全域相对误差均小于百万之一。
当然,本频率计也存在缺点。在频率计的设计中,乘法器为32位,除法器采用64位,资源占用率太大。单片机处理32位数据的方式有待改进,要是它变得更优化六、系统设计步骤及程序,结果FPGA:LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYEQUALFRECOUNTIS PORT( BCLK,TCLK:INSTD_LOGIC; DATA_OUT:OUTSTD_LOGIC_VECTOR(7DOWNTO0); EN:INSTD_LOGIC; ADDRESS:INSTD_LOGIC_VECTOR(3DOWNTO0) );ENDEQUALFRECOUNT;ARCHITECTUREARCHOFEQUALFRECOUNTIS SIGNALEN2,WIDE_TEST:STD_LOGIC; SIGNALWIDE_COUNT,B_COUNT,T_COUNT:STD_LOGIC_VECTOR(31DOWNTO0); SIGNALSAVE_WIDE,SAVE_B,SAVE_T:STD_LOGIC_VECTOR(31DOWNTO0);BEGIN PROCESS(EN,TCLK) BEGIN IFRISING_EDGE(TCLK)THEN EN2<=EN; ELSENULL; ENDIF; ENDPROCESS; PROCESS(EN2,TCLK,BCLK) BEGIN IFEN2='1'THEN IFRISING_EDGE(TCLK)THEN IFT_COUNT=X"FFFF_FFFF"THEN T_COUNT<=(OTHERS=>'1'); ELSET_COUNT<=T_COUNT+1; SAVE_T<=T_COUNT+1;--SAVET_COUNT ENDIF; ELSENULL; ENDIF; IFFALLING_EDGE(TCLK)THEN IFWIDE_TEST='0'THEN WIDE_COUNT<=B_COUNT; WIDE_TEST<='1'; ELSESAVE_WIDE<=WIDE_COUNT;--SAVEWIDE_COUNT ENDIF; ENDIF; IFRISING_EDGE(BCLK)THEN IFB_COUNT=X"FFFF_FFFF"THEN B_COUNT<=(OTHERS=>'1'); ELSEB_COUNT<=B_COUNT+1; SAVE_B<=B_COUNT+1;--SAVEB_COUNTINSAVE_B ENDIF; ELSENULL; ENDIF; ELSE --WHENENA=0,WEOUTPUTTHEDATAANDRESETTHECOUNTER. WIDE_COUNT<=(OTHERS=>'0'); B_COUNT<=(OTHERS=>'0'); T_COUNT<=(OTHERS=>'0'); WIDE_TEST<='0'; ENDIF; ENDPROCESS; PROCESS(ADDRESS,EN2,SAVE_T,SAVE_B,SAVE_WIDE,BCLK) BEGIN IFRISING_EDGE(BCLK)THEN IFEN2='0'THEN --USESOMECONSTANTSTOTEST CASEADDRESSIS WHENX"0"=>DATA_OUT<=SAVE_T(7DOWNTO0); WHENX"1"=>DATA_OUT<=SAVE_T(15DOWNTO8); WHENX"2"=>DATA_OUT<=SAVE_T(23DOWNTO16); WHENX"3"=>DATA_OUT<=SAVE_T(31DOWNTO24); WHENX"4"=>DATA_OUT<=SAVE_B(7DOWNTO0); WHENX"5"=>DATA_OUT<=SAVE_B(15DOWNTO8); WHENX"6"=>DATA_OUT<=SAVE_B(23DOWNTO16); WHENX"7"=>DATA_OUT<=SAVE_B(31DOWNTO24); WHENX"8"=>DATA_OUT<=SAVE_WIDE(7DOWNTO0); WHENX"9"=>DATA_OUT<=SAVE_WIDE(15DOWNTO8); WHENX"A"=>DATA_OUT<=SAVE_WIDE(23DOWNTO16); WHENX"B"=>DATA_OUT<=SAVE_WIDE(31DOWNTO24); WHENOTHERS=>NULL; ENDCASE; ELSENULL; ENDIF; ELSENULL; ENDIF; ENDPROCESS;ENDARCH; 单片机:/**.c文件,文件名:EqualFre_main.c*各模块的流程控制*/#include"EqualFre_main.h"intmain(void){ communicationInit_Ex(); while(1){ mode=getMode_Ex(); //确定选择的模式 askForData_Ex(); //请求数据 if(HOLD_DATA_MODE!=mode){ //表示没有固定数据时,则载入数据 loadData(); } disData(); //数据显示 }}//数据载入staticvoidloadData(){ fre=getFre_Ex(); wide=getWide_Ex(); duty=getDuty_Ex();}/***************************************数据显示中:wData(uchar)传入的参数意义0-9数字0-910-19 跟了点号的0-920 暗选***************************************/staticvoiddisDelay(){ //显示延时 uchardatax,y; for(x=250;x>0;x--) for(y=50;y>0;y--);}//数据显示--总控staticvoiddisData(){ switch(mode){ caseSHOW_FRE_MODE: disFre(); disDelay();break; caseSHOW_WIDE_MODE: disWide(); disDelay();break; caseSHOW_DUTY_MODE: disDuty();disDelay();break; default:break; } }/*staticvoiddisFre(){ uchardatai; for(i=0;i<8;i++) wData_Ex(1);}staticvoiddisWide(){ uchardatai; for(i=0;i<8;i++) wData_Ex(2);}staticvoiddisDuty(){ uchardatai; for(i=0;i<8;i++) wData_Ex(3);}*///数据显示--显示频率,单位Hz或MHz(双模式)staticvoiddisFre(){ uchardatadataTemp[8],i; ulongdatafreTemp=fre;//为了显示1位小数,这里已经将频率扩大10倍 uchardataflag=0;//消零标志位 if(1000000<=freTemp){//当频率值大于1M时,使用兆显示模式 freTemp/=100000;//0.00MHz for(i=2;i<8;i++){//数据从低位到高位装入数据暂存器dataTemp,这里保留2位,用于显示nH(即MHz) dataTemp[i]=(uchar)(freTemp%10); freTemp/=10; } dataTemp[4]+=10;//取2位小数,这里是加入小数点 dataTemp[1]=21;//n dataTemp[0]=22;//H } else{ for(i=1;i<8;i++){ dataTemp[i]=(uchar)(freTemp%10); freTemp/=10; } dataTemp[2]+=10; dataTemp[0]=22;//H } for(i=0;i<8;i++){//数据从高位到低位显示,并进行高位消零操作 if(0!=dataTemp[7-i]){ flag=1; } if((0==dataTemp[7-i])&&(0==flag)){ dataTemp[7-i]=20; } wData_Ex(dataTemp[7-i]); //显示数据 }}//数据显示--显示脉宽,单位us,意味着最大只能测1MHz的频率staticvoiddisWide(){ uchardatadataTemp[8],i; ulongdatawideTemp=wide; uchardataflag=0; for(i=0;i<8;i++){ dataTemp[i]=(uchar)(wideTemp%10); wideTemp/=10; } for(i=0;i<8;i++){//数据从高位到低位显示,并进行高位消零操作 if(0!=dataTemp[7-i]){ flag=1; } dataTemp[1]|=10; if((0==dataTemp[7-i])&&(0==flag)){ dataTemp[7-i]=20; } wData_Ex(dataTemp[7-i]); }}//数据显示--显示占空比staticvoiddisDuty(){ uchardatadataTemp[4],i; uintdatadutyTemp=duty; for(i=0;i<4;i++){ dataTemp[i]=(uchar)(dutyTemp%10); dutyTemp/=10; } dataTemp[2]+=10; wData_Ex(20);//补4个暗选 wData_Ex(20); wData_Ex(20); wData_Ex(20); for(i=0;i<4;i++){ wData_Ex(dataTemp[3-i]); }} /**.h文件,文件名:EqulaFre_SGMDisplay.h*SGM显示模块,用于显示由主程序传过来的数据*硬件资源: 164时钟端--P3.1 164数据端--P3.0*/#ifndef_EQUALFRE_SGMDISPLAY_H_H_#define_EQUALFRE_SGMDISPLAY_H_H_#include<reg52.h>#include<intrins.h>#defineucharunsignedcharsbitsgm_clk=P3^1; //164时钟端sbitsgm_data=P3^0; //164数据端staticucharcodenum[]={//从低位到高位,高电平有效 0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6,//数字0-9 0xfd,0x61,0xdb,0xf3,0x67,0xb7,0xbf,0xe1,0xff,0xf7,//带点号的0-9 0x00,0x2a,0x6e//暗选,n,h};//接口函数voidwData_Ex(uchar); //在数码管上显示数据#endif/**.c文件,文件名:EqualFre_SGMDisplay.c*/#include"EqualFre_SGMDisplay.h"//接口函数voidwData_Ex(ucharindex){ uchardatai,byte; byte=num[index]; for(i=0;i<8;i++){ sgm_clk=0; sgm_data=(bit)((byte>>i)&0x01); _nop_(); sgm_clk=1; _nop_(); }}/**.c文件,文件名:EqualFre_modeFromKey.c*/#include"EqualFre_modeFromKey.h"//**************内部函数************//按键检测延时staticvoidkeyDelay(){ uchardatax,y; for(x=100;x>0;x--); for(y=200;y>0;y--);}//按键扫描staticvoidkeyScan(){ //选择模式 if(0==Key_Mode){ keyDelay(); if(1==Key_Mode)return; switch(mode){ caseSHOW_FRE_MODE: //测频率 mode=SHOW_WIDE_MODE; //下一次测的是脉宽 break; caseSHOW_WIDE_MODE: //测脉宽 mode=SHOW_DUTY_MODE; //下一次测的是占空比 break; caseSHOW_DUTY_MODE: //测占空比 mode=SHOW_FRE_MODE; //下一次测的是频率 break; default: mode=SHOW_FRE_MODE; break; } while(0==Key_Mode); keyDelay(); } if(0==Key_Hold_Data){ keyDelay(); if(1==Key_Hold_Data)return; mode=HOLD_DATA_MODE; //按下 Key_Hold_Data,即为P1^1时,数据保持不变 while(0==Key_Hold_Data); keyDelay(); }}//*******************接口函数**************uchargetMode_Ex(void){ //返回mode,确定选择的模式 keyScan(); returnmode;}/**.h文件,文件名:equalFre.h*模式控制模块,通过键盘来控制模式的选择,并将所选模式传递给函数*所使用的硬件资源:频率显示、脉宽显示、占空比显示的切换建---P1.0测试值保持键--P1^1*/#ifndef_EQUALFRE_MODEFROMKEY_H_H_#define_EQUALFRE_MODEFROMKEY_H_H_#include<reg52.h>#defineSHOW_FRE_MODE0#defineSHOW_WIDE_MODE1#defineSHOW_DUTY_MODE2#defineHOLD_DATA_MODE3#defineucharunsignedcharsbitKey_Mode=P1^0; //实现频率显示,脉宽显示,占空比显示的转化sbitKey_Hold_Data=P1^1; //将测得的数值定住staticuchardatamode;//内部函数staticvoidkeyDelay(); //按键检测延时staticvoidkeyScan(); //按键扫描//接口函数uchargetMode_Ex(void); //在数码管上显示数据#endif/**.h文件,文件名:EqulaFre_communication.h*通信模块,用于和FPGA通信,获取频率、脉宽、占空比的原始数据。*并将处理好数据传给主程序*所使用的硬件资源:地址线0---P2.0地址线1---P2.1地址线2---P2.2地址线3---P2.3测频标志位---P2.4数据线----P0定时器T0*/#ifndef_EQUALFRE_COMMUNICATION_H_H_#define_EQUALFRE_COMMUNICATION_H_H_#include<reg52.h>#include<intrins.h>#defineucharunsignedchar#defineulongunsignedlong#defineuintunsignedint#defineMY_TH00x5d//对于20Mhz晶振来说,25ms#defineMY_TL00x3d#defineFREE_TIME80//空闲时间,即让FPGA测频率的时间,50ms*FREE_TIME#defineDATA_INP0#defineBASE_FRE100000000//FPGA的基准频率sbitaddress0=P2^0;sbitaddress1=P2^1;sbitaddress2=P2^2;sbitaddress3=P2^3;sbitTEST_EN=P2^4;//当它为1表示测频结束staticulongdatafre,wide;staticuintdataduty;//内部函数staticulonggetSourceData(uchar); //从FPGA中获得基准信号,被测信号的数据//接口函数voidcommunicationInit_Ex(void);voidaskForData_Ex(void); //请求数据ulonggetFre_Ex(void); //计算频率值ulonggetWide_Ex(void); //计算脉宽值uintgetDuty_Ex(void); //计算占空比#endif/**.c文件,文件名:EqualFre_communication.c*/#include"EqualFre_communication.h"//从FPGA那里获得频率、脉宽、占空比的原始值staticulonggetSourceData(ucharsourceKind){ uchardatabyte0,byte1,byte2,byte3; ulongdatatemp=0; byte0=byte1=byte2=byte3=0; switch(sourceKind){ case1://被测信号T值 address3=0;address2=0;address1=0;address0=0; _nop_();_nop_();_nop_();_nop_();//FPGA反应时间 byte0=DATA_IN; address3=0;address2=0;address1=0;address0=1; _nop_();_nop_();_nop_();_nop_();//FPGA反应时间 byte1=DATA_IN; address3=0;address2=0;address1=1;address0=0; _nop_();_nop_();_nop_();_nop_();//FPGA反应时间 byte2=DATA_IN; address3=0;address2=0;address1=1;address0=1; _nop_();_nop_();_nop_();_nop_();//FPGA反应时间 byte3=DATA_IN; break; case2://基准信号B值 address3=0;address2=1;address1=0;address0=0; _nop_();_nop_();_nop_();_nop_();//FPGA反应时间 byte0=DATA_IN; address3=0;address2=1;address1=0;address0=1; _nop_();_nop_();_nop_();_nop_();//FPGA反应时间 byte1=DATA_IN; address3=0;address2=1;address1=1;address0=0; _nop_();_nop_();_nop_();_nop_();//FPGA反应时间 byte2=DATA_IN; address3=0;address2=1;address1=1;address0=1; _nop_();_nop_();_nop_();_nop_();//FPGA反应时间 byte3=DATA_IN; break; case3://脉宽W值 address3=1;address2=0;address1=0;address0=0; _nop_();_nop_();_nop_();_nop_();//FPGA反应时间 byte0=DATA_IN; address3=1;address2=0;address1=0;address0=1; _nop_();_nop_();_nop_();_nop_();//FPGA反应时间 byte1=DATA_IN; address3=1;address2=0;address1=1;address0=0; _nop_();_nop_();_nop_();_nop_();//FPGA反应时间 byte2=DATA_IN; address3=1;address2=0;address1=1;address0=1; _nop_();_nop_();_nop_();_nop_();//FPGA反应时间 byte3=DATA_IN; break; default:break; } temp=byte0+byte1*256+byte2*65536+byte3*256*65536; //转化为十进制 returntemp;}//20MHz,25msvoidt0()interrupt1{ staticuchardatacount; TH0
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年高校学期个人工作方案
- 2025年双十二营销活动策划方案
- 《金融工程》 课件 第12-14章 期权的二叉树模型;随机积分与资产价格建模;Black-Scholes-Merton期权定价模型
- 投标报价决策
- 木制品幼儿园课程
- 《投资学》(第十一章)
- 金融制度的变迁
- 湖南化工职业技术学院《企业管理学》2023-2024学年第二学期期末试卷
- 河南省许昌鄢陵县联考2025年初三下学期教学质量检测试题化学试题试卷含解析
- 江西水利职业学院《儿童文学》2023-2024学年第一学期期末试卷
- 2025届广东省高三第一次调研考试语文试题讲评课件
- 山东省名校联盟2024-2025学年高一3月校际联考英语试题(原卷版+解析版)
- 京剧头饰美术课件
- 数据库应用技术-第三次形考作业(第10章~第11章)-国开-参考资料
- 垃圾分类我宣讲(课件)三年级下册劳动人民版
- 重庆市2025届高三3月适应性月考语文试卷及参考答案
- T-CECS 10390-2024 建筑幕墙用背栓
- 国旗下讲话第三周校长讲话稿:以习惯铸舟楫 以品格扬云帆-让成长在坚守中绽放华章
- 三门峡水库实习报告
- 文化产业项目风险管理及应对措施
- 民用无人机操控员执照(CAAC)考试复习重点题库500题(含答案)
评论
0/150
提交评论