#基于CPLD和单片机的频率计设计_第1页
#基于CPLD和单片机的频率计设计_第2页
#基于CPLD和单片机的频率计设计_第3页
#基于CPLD和单片机的频率计设计_第4页
#基于CPLD和单片机的频率计设计_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、基于 CPLD和单片机的频率计设计引言:随着电子技术与计算机技术的不断发展, 以单片机为核心的测量控制系统层 出不穷。在被测信号中, 较多的是模拟和数字开关信号, 而且还经常遇到以频率 为参数的被测信号, 例如流量、 转速、晶体压力传感器以及经过参变量一频率转 换后的信号等。本次试验采用测频法,通过方案优化,达到了较高的精度。该测频系统的设计采用 AT89C51 单片机和具有内部结构重组、现场可编程 的 CPLD 芯片相结合起来,实现了对 IHz10MHz 信号频率的高精度测量。系统 的整体稳定性和精度较高,达到了测频对精准度的要求。正文: 一、实验设计原理1.1 实验基本被测框架 信号信号放

2、大和整形测频电路显示图一传统的测频原理是在一定的时间间隔 T 内测某个周期信号的重复变化次数 N,其频率可表示为 f=N/T ,其原理框图如图 2 所示。这种测量方式的精度随被 测信号频率的下降而降低。图二 关于误差的分析将在下文中阐述。1.2 本实验采用等精度测频的原理为:首先, Clock 即标准时钟信号进过分频产生周期为1.25s,占空比为 80%的闸门信号, 从而闸门宽度为 1s,将分频产生的信号和被测信号相与的结果即为计数器的技术时钟信号, 在这 1s 的时间宽度内技术到的结果就是被测信号的频率值,通过多路选择器,有单片机发 送地址,每次四位将数据传送给单片机, 经过单片机的代码转换

3、, 使用 7 个 8 段数码管显示。 具体原理如图三所示。1.3 CPLD 模块逻辑设计1.3.1 分频模块的实现分频器采用 25 位的二进制计数器, 下图为在 ISE 仿真环境下的闸门输出。图三产生周期 1.25s,占空比 80%的宽度为 1s 的闸门信号图四1.3.2 计数器 计数器采用 28 的 BCD 码计数,局部计数方式如下: if(en=1b1)&(clr=1b0)&(q34b1001)beginq3 =q3+4b0001;end else begin q3=4b0000; 下图为在 ISE 仿真环境下的计数结果:图五 鉴于数据较大,所以,我们仿真时候只选取了 12 位数据,结果是

4、正确的。 1.3.2 多路选择器 有单片机提供 3 位地址信号,每次送四位数据给单片机,传送7次数据即可。1.4 单片机主控模块P1 口用来作为数码管的 7 个位选信号;P2 口用来向单片机提供段选码;(3)Latch :即与案例框图中由分频链给单片机的时钟信号,为了实现单片机与 CPLD 工作的同步而做的;在 Latch 信号为高电平期间单片机取数据,而此时, CPLD 由于闸门为低电 平使得计数停止;在 Latch 为低电平时,单片机部取数,而 CPLD 在计数。从而保证两者的 正常工作。(4)P0 口的低四位用来取数, P3 口地高三位用来传送地址;(5)单片机采用定时中断显示,每 1m

5、s 改变一位,实现动态显示。 二、测频精度分析图六 计数法测频误差示意图说明: f x = NT由误差合成公式有fx N TfxNT上式中第一项为量化误差设主门的开启时间为,是由于被测信号与门控闸门信号不相关引起的。T , 被测信号周期为Tx ,主门开启时刻至下一个计数脉冲的前沿为t1, 主门关闭时刻至下一个计数脉冲的前沿为t2 ,如上图所示。11。N Tfx其最大误差为 1 个量化单位 ,则最大量化误差的相对值为由式得到 ,被测频率越高 ,闸门时间越长 ,则量化误差越小 . 但闸门时间太长 ,则降低测量速度 且受到显示位数的限制。三、实验结果 在试验中,频率计在 1HZ 到 1KHZ 段的误

6、差很小,几乎可仪忽略不计,在高频时的进度也很好,如下表示:信号/HZ33355577710k100k500k1M5M9M测量值/HZ33355577710024100K500012100013450001549000223附录: mcu 部分#include sbit Dig1 = P10;sbit Dig2 = P11;sbit Dig3 = P12;sbit Dig4 = P13;sbit Dig5 = P14;sbit Dig6 = P15;sbit Dig7 = P16;sbit Latch = P30; /latch insbit Clr_data = P34;sbit Dig_se

7、l2 = P35;sbit Dig_sel1 = P36;sbit Dig_sel0 = P37;#define T0_High_Init 0 xfa;#define T0_Low_Init 0 x00;unsigned int Counter;unsigned char Digit1,Digit2,Digit3,Digit4,Digit5,Digit6,Digit7;/字形表int Get_7_Segment160 x7E,0 x30,0 x6D,0 x79,0 x33,0 x5B,0 x5F,0 x70,0 x7F,0 x7B,0 x77,0 x1f,0 x4e,0 x3d,0 x4f,0

8、 x47; unsigned char indata;/主函数/初始化函数void Initial(void)Counter = 0;TMOD = 0 x11;/定时器工作方式TH0 = T0_High_Init;TL0 = T0_Low_Init;/ 设置定时器初值TR0 = 1;/启动定时器ET0 = 1;/允许定时器中断EA = 1;/开中断/延时void delay()int ti;for(ti=0;ti10;ti+)/判断 Latch 是否为高电平int latch_high(void)int reci;/ 返回值if(Latch)delay();if(Latch) reci = 1

9、;elsereci = 0;elsereci = 0;return reci;/判断 Latch 是否为低电平int latch_low(void)int reci;/ 返回值if(!Latch)delay();if(!Latch)reci = 1;elsereci = 0;elsereci = 0;return reci;void get_data(void)Dig_sel2 = 0;Dig_sel1 = 0;Dig_sel0 = 0;delay(); indata = P0;Digit7 = indata & 0 x0f;Dig_sel0 = 1;delay();indata = P0;D

10、igit6 = indata & 0 x0f;Dig_sel1 = 1;Dig_sel0 = 0; delay();indata = P0;Digit5 = indata & 0 x0f;Dig_sel0 = 1; delay(); indata = P0;Digit4 = indata & 0 x0f;/*Dig_sel2 = 1;Dig_sel1 = 0;Dig_sel0 = 0; delay();indata = P0;Digit3 = indata & 0 x0f;Dig_sel0 = 1; delay(); indata = P0;Digit2 = indata & 0 x0f;Di

11、g_sel1 = 1;Dig_sel0 = 0; delay(); indata = P0;Digit1 = indata & 0 x0f;/主函数void main()Initial();while( 1 )while( latch_high() ); get_data();Clr_data = 0; delay();Clr_data = 1; while( latch_low() );/中断/显示void Display_Digit(unsigned int Digit_Selected)if( Digit_Selected = 1 )Dig7 = 1;P2 = Get_7_Segment

12、Digit1;Dig1 = 0;if( Digit_Selected = 2 )Dig1 = 1;P2 = Get_7_SegmentDigit2;Dig2 = 0;if( Digit_Selected = 3 )Dig2 = 1;P2 = Get_7_SegmentDigit3;Dig3 = 0;if( Digit_Selected = 4 )Dig3 = 1;P2 = Get_7_SegmentDigit4;Dig4 = 0;if( Digit_Selected = 5 )Dig4 = 1;P2 = Get_7_SegmentDigit5;Dig5 = 0;if( Digit_Select

13、ed = 6 )Dig5 = 1;P2 = Get_7_SegmentDigit6;Dig6 = 0;if( Digit_Selected = 7 )Dig6 = 1;P2 = Get_7_SegmentDigit7;Dig7 = 0; /中断处理函数 void display(void) interrupt 1 ET0 = 0;TR0 = 0;TH0 = T0_High_Init;TL0 = T0_Low_Init;/ 重装定时器初值TR0 = 1;if( +Counter = 8 ) Counter = 1;Display_Digit(Counter); / 显示ET0 = 1; Cpld

14、 部分 module fcounter(clk, clr, selector, single, gate, data);input clk;input clr; input 2:0selector; input single; output gate; output 3:0data;reg 3:0data; wire gate;/输出数据/时钟闸门reg 24:0gcount; reg 27:0count; reg a,b,c,d,e,f,g; wire clock; wire ssingle; assign gate=clock; always begincase (selector)3b0

15、00: data=count3:0; 3b001: data=count7:4; 3b010: data=count11:8; 3b011: data=count15:12; 3b100: data=count19:16; 3b101: data=count23:20; 3b110: data=count27:24; 3b111: ;endcase end always(posedge clk)begin if(gcount24:0=25h01e8480)gcount=25h185ee00;elsegcount=gcount+1;endassign clock=gcount24;assign

16、ssingle=single&clock; / 有效信号 always(negedge ssingle or negedge clr)/计数beginif(clr=0) count=0;else if(count3:0=4h9) beginif(count7:4=4h9)begin if(count11:8=4h9) beginif(count15:12=4h9) beginif(count19:16=4h9) beginif(count23:20=4h9) beginif(count27:24=4h9) count27:24=0;else count27:24=count27:24+1; count23:20=0;endelse

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论