基于51单片机和CPLD技术数字频率计的设计.docx
《基于51单片机和CPLD技术数字频率计的设计.docx》由会员分享,可在线阅读,更多相关《基于51单片机和CPLD技术数字频率计的设计.docx(28页珍藏版)》请在冰豆网上搜索。
基于51单片机和CPLD技术数字频率计的设计
基于51单片机和CPLD技术数字频率计
课题设计方案
自动化09-9班李雄、张杰、马勇
1绪论
测量频率是电子测量技术中最常见的测量之一。
不少物理量的测量,如时间、速度等都涉及到或本身可转化为频率的测量。
目前,市场上有各种多功能、高精度、高频率的数字频率计,但价格不菲。
而在实际工程中,并不是对所有信号的频率测量都要求达到非常高的精度。
本系统以单片机AT89C51为核心,采用自上向下的设计方法,设计了基于复杂可编程逻辑器件的数字频率计。
以AT89C51单片机作为系统的主控部件,完成电路的测试信号控制、数据运算处理、键盘扫描和控制数码管显示。
用VHDL语言编程,由CPLD(ComplexProgrammableLogicDevice)完成各种时序控制及计数功能。
不仅能够测量正弦波、方波和三角波等信号的频率,而且还能对其他多种物理量进行测量。
该系统具有结构紧凑、可靠性高、测频范围宽和精度高等特点。
2系统设计方案的选择
常用的频率测量方案一下几种:
①直接测频法:
把被测频率信号经脉冲整形电路处理后加到闸门的一个出入端,只有在闸门开通时间T(以秒计)内,被计数的脉冲送到十进制计数器进行计数;设计数器的值为N,则可得到被测信号频率为f=N/T,经分析,本测量在低频率的相对测量误差较大,即在低频段不能满足本设计的要求。
②组合测频法:
这种方法可以在一定程度上弥补方法
(1)中的不足,但是难以确定最佳分测点,且电路实现较复杂。
③倍频法:
是指把频率测量范围分成多个频段,使用倍频技术,根据频段设置倍频系数,将经整形的低频信号进行倍频后在进行测量,对高频段则直接进行测量。
倍频法较难实现。
④等精度测频法:
其实现方式可用图2.1来说明。
图中,预置门控信号是宽度为TPR的一个脉冲,CNT1和CNT2是两个可控计数器。
标准频率信号从CNT1的时钟输出端CLK输入,其频率为fs,经整形后的被测信号从CNT2的时钟输入端CLK输入,设其实际频率为fx;当预置门控信号为高时,经整形后的被测信号的上升沿通过D触发器的Q端同时启动计数器CNT1和CNT2。
CNT1和CNT2分别对被测信号(频率为fs)和标准频率信号(频率为fx)同时计数。
当预置门信号为低时,随后而至的被测信号的上升沿将两个计数器同时关闭。
设在一次预置门时间Tpr内对被测信号的计数值为Nx,对标准信号的计数值为Ns。
则下式成立:
fx/Nx=fs/Ns
由此推得:
fx=fs*Nx/Ns
图2.1等精度测频法原理框图
若所测频率值为fx,其真实值为fxe,标准频率为fs,一次测量中,由于fx计数的起停时间都是该信号的上跳沿触发的,因此在Tpr时间内对fx的计数Nx无误差,在此时间内的计数Ns最多相差一个脉冲,即fx/Nx=fs/Ns,则下式成立:
fxe/Nx=fs/Ns+△et
可分别推得fx=fs*Nx/Nsfxe=fs*Nx/Ns+△et
根据相对误差的公式有:
△fxe/fxe=fxe-fx/fxe
经整理可得到:
△fxe/fxe=△et/Ns
因△et≤1,故△fxe/fxe≤1/NsNs=Tpr*fs
根据以上分析,我们可知等精度测频法具有三个特点:
1,相对测量误差与被测频率的高低无关;2,增大Tpr或fs可以增大Ns,减少测量误差,提高测量精度;3,测量精度与预置门宽度和标准频率有关,与被测信号的频率无关,在预置门和常规测频闸门时间相同而被测信号频率不同的情况下,等精度测量法的测量精度不变;
经过综合考虑,结合设计需求,选用第④种方案,即用等精度测频法来实现本设计频率测量。
3系统总体设计方案
3.1系统整体结构
电路系统原理框图如图3.1所示,其中单片机完成整个测量电路的测试控制、数据处理和显示输出;CPLD完成各种测试功能;键盘控制命令通过一片74LSl65并入串出移位寄存器读入单片机,实现测频、测脉宽及测占空比等功能,单片机从CPLD读回计数数据并进行运算,向显示电路输出测量结果;显示器电路采用七段LED动态显示,由8个芯片74LSl64分别驱动数码管。
系统总体设计本系统的硬件电路包括键盘控制模块、显示模块、输入信号整形模块以及单片机主控和CPLD模块。
键控制模块设置5个功能键和3个时间选择键,键值读入采用一片74LSl65来完成,显示模块用8只74LSl64完成LED的串行显示。
系统由一片CPLD完成各种测试功能,对标准频率和被测信号进行计数。
单片机对整个测试系统进行控制,包括对键盘信号的读入与处理;对CPLD测量过程的控制、测量结果数据的处理;最后将测量结果送LED显示输出。
被测信号整形电路主要对被测信号进行限幅、放大、再经施密特触发器整形后送入CPLD。
用50MHz的有源晶振作为CPLD的测试标准频率,单片机由外接12MHz标准晶振提供时钟电路。
图3.1系统原理框图
3.2显示电路
系统硬件电路中,单片机MCU与FPGA进行数据交换占用了P0口、P1口和P3口,因此数据显示电路的设计采用静态显示的方式,显示电路由8个共阳极七段数码管和8片1位串入8位并出的74LS164芯片组成。
图3.2显示电路图
这种显示方式不仅占用单片机端口少,而且充分利用了单片机的资源,容易掌握其编码规律,简化了软件编程,在实验过程中,也体现出较高的可靠性。
数据显示电路如图4.4所示。
74LS164是一种8位高速串入/并出的移位寄存器,随着时钟信号的高低变化,串行数据通过一个2输入与门同步的送入,使用独立于时钟的主控复位端让寄存器的输出端变为低电平,并且采用肖特基钳位电路以达到高速运行的目的。
并且还具有以下的特点:
①典型的35MHZ移位频率;②异步主控复位;③门控串行输入;④同步数据传输;⑤采用钳位二极管限制高速的终端;⑥静电放电值大于3500V。
在本系统中,74LS164的连接方式为:
74LS164的输出Q0~Q7分别接LED数码管的dp、g、f、e、d、c、b、a,并且Q7连接下一个74LS164的A,B端,时钟CLK连接单片机的TXD端,第一片芯片的AB端连接单片机的RXD端,74LS164芯片的主控复位端接高电平VCC。
在这种状态下,数码管的编码如下表所示。
数码管的编码表
显示数码
段码
显示数码
段码
0
0c0h
8
80h
1
0f9h
9
90h
2
0a4h
A
88h
3
0b0h
B
83h
4
99h
C
0c6h
5
92h
D
0a1h
6
82h
E
86h
7
0f8h
F
8eh
3.3电源模块
整个电路的供电电源如图3.3所示,220V交流电经变压、整流、滤波后,由一片7805三端稳压器向系统提供+5V电压信号。
本设计采用5V电源电压供电,直流稳压电源一般由电源变压器、整流滤波电路以及稳压电路所组成。
电源变压器时将交流电网220V的电压变为所需要得值,然后经过整流电路将交流电压变成脉动的直流电压。
由于此脉动的直流电压还含有较大的纹波,必须经过滤波电路加以滤除,从而得到平滑的直流电压。
但这样的电压还随时电网波动(一般由10%左右的波动)负载和温度的变化变化。
因而再整流、滤波电路之后,还需接稳压电路。
稳压电路的作用是当电网电压波动、负载和温度变化时,维持输出直流电压稳定。
选用输出电压固定为+5V的三端集成稳压器7805。
变压器将电网220V电压变为+9V电压,经二极管桥式整流后,为7~8V的电压送入7805的输入端,电容C5和C6用来实现频率补偿,防止稳压器7805产生高频自激和抑制电路引入的高频干扰,C4和C7是电解电容,以减少稳压电源输出端由输入电源引入得低频干扰。
D8为大电流保护二极管,防止在输入端偶然短路到地时,输出端大电容上存储的电压反极性加到输出、输入端之间而损坏芯片。
图中用一个发光二极管来检测电源电路是否通电,同时还可作为电源电路是否出现故障的标志,当LED亮则完好,否则电源电路可能未上电或出现错误,起到一个很好的自动电源检测功能。
图3.3电源电路
3.4信号整形电路
图3.4为输入信号整形电路。
放大整形电路由9018和74F14等组成,其中9018组成放大电路将输入为FX得周期信号如正弦波、三角波等进行放大。
74F14施密特触发器对放大器得输出信号进行整形,使之称为矩形脉冲。
其连线如图所示。
待测信号经过时,由D1、D2两个二极管进行限幅,以免电压过大而烧毁,信号经过9018进行放大,由74F14对其进行整形,产生出得波形为标准方波,方便CPLD进行计数。
图3.4被测信号整形电路
3.4其它电路
单片机的时钟电路由12MHz的晶振提供。
CPLD的标准频率信号由50MHZ的有源晶振提供。
自校输入信号取自单片机的12MHZ晶振。
被测信号经过放大整形电路调理后输入。
4.单片机控制与运算程序的设计
4.1.1单片机控制电路
单片机测频控制电路如图4.1所示,由单片机完成整个测量电路的测试控制、数据处理和显示输出,CPLD完成测频功能。
(1)由于CPLD在对频率进行计数时,采用32位二进制计数器,8位数据总线的单片机分四次将32立数据全部读出。
利用AT89C51的PO口读计数器COUNT输出B[7..0]标准频率信号的值,P2口读计数器COUNT输出B[15..8]被测信号的值。
被读出的四组8位数据通过AT89C51的SSO,SSl地址编码选择。
由Pl口输出控制。
(2)CS:
由单片机的P1.0口控制。
CS=0时,等精度测频;CS=1时,测脉宽。
(3)CLR:
系统全清零功能。
(4)ED2:
脉宽计数结束状态信号,ED2=1计数结束。
图4.1单片机控制电路
(5)AS:
自校和测频选择。
AS=1测频,AS=0自校。
(6)STROBE:
为预置门闸,门宽可通过键盘由单片机控制,打开;STROBE=0时,预置门关闭。
(7)ED1:
测频计数结束状态信号,ED1=0时计数结束。
(8)SSO,SSl:
计数值读出选通控制。
若令SS=[SS1,SSO],STROBE=1时,预置门则当SS=0,1,2,3时可从PO口和P2口由低8位至高8位分别读出两组4个8位计数值。
(9)FS为标准频率信号输入,此频率来源于50MHZ的有源晶振。
(10)FX为被测信号输入,此信一号是经过限幅整形电络后的信号。
(11)FC为自校频率,取自单片机的外接晶振。
4.1.2单片机主程序
图4.2表示单片机主程序流程图。
各种测试功能流程如下:
系统初始化后,主程序不断扫描键盘子程序,当开始键按下后,程序转到测频子程序执行测频功能。
那么读入开始键之后马上跳转到测频子程序,测频子程序先置测频控制位CLR(P1.0),将CPLD内的计数器清零,然后通过健盘将顶置门的时间值读入单片机,打开预置门进行测频计数,等预置门时间到后,关断预置门,CPLD关断预置门后将给单片机一个结束信号,单片机读到结束信号后,通过置[SS1,SS0」的四个状态,分四次将测频结果的32位数据读入单片机,计算后将结果转换为BCD码送LED显示输出。
显示子程序通过查表方式,将频率测量值以十进制的形式显示出来。
空闲状态程序始终扫描键盘,等待输入,并在LED上显示CPUREADY的字样,执行完某一功能后程序又会回到键盘扫描状态上来。
图4.2主程序流程图
4.2.1测频程序流程图
测频程序先置测频控制位CLR(P1.6).AS(P1.4),将CPLD内的计数器清零,选择测量被测信号。
并将CS(P1.3)置零,即为选择测频。
然后通过键盘将预置门的时间值读入单片机,打开预置门进行测频计数,等预置门时间到后,关断预置门,CPLD关断预置门后将给单片机一个结束信号,单片机读到结束信号后,通过置[SS1,SSO]的四个编码状态,分四次将测频结果的3位数据读入单片机,计算后将结果转换为BCD码送LED显示输出。
图4.1测频程序流程图
4.2.2具体程序见附录
5.系统调试的方法
本系统既含有FPGA自编程硬件设计电路,又含有单片机控制电路,整个系统比较复杂,因此我们采用自底向上的调试方法,也就是先进行各个单元电路的软件仿真和硬件调试,在各个单元电路调试好后再进行系统联调,最后进行硬件的编程固化及系统的组装。
5.1调试的软/硬件
系统设计开发软件:
MAX+plusⅡ10.0,伟福6000(WAVE6000forwindows)。
(2)单片机及FPGA/CPLD调试设备:
PIV计算机,伟福E6000L单片机仿真器及POD—8X5XP仿真头,GW48-CKEDA实验开发系统及EPF10K20TC144-4FPGA适配板,GWDVPB电子设计开发板单片机最小系统,炜煌WH-500B程序编写加密器,GDS-820S数字存储示波器。
5.2系统的硬件验证
①单元电路的调试
FPGA/CPLD测频专用电路的调试:
使用MAX+plusⅡ10.0,计算机,GW48-CKEDA实验开发系统等软件和设备,对FPGA/CPLD测控电路进行VHDL程序的调试,有关仿真以及编程下载,硬件测试等。
②统的联合调试
在各个单元电路调试好后即可进行系统联调。
③统的硬件验证
系统联合调试成功后,可将单片机程序通过编程器固化到单片机中并插入EDA实验开发系统中的单片机插座上,将VHDL设计经过综合适配后的网表对CPLD/FPGA进行编程下载,输入相关的信号,并进行有关性能指标的测试,直到满足系统的设计要求为止。
5.3系统扩展思路
(1)设计并制作系统工作的外围电路:
系统用方波信号源、直流工作电源。
(2)系统联合调试成功后,可将单片机程序通过编程器固化到单片机中,将VHDL设计经过综合适配后的网表对CPLD/FPGA进行编程下载,将整个系统的外围电路设计制作印刷电路板。
6.技术难点分析
本设计因采用单片机与CPLD结合设计系统,难点在于单片机程序编写和写入,CPLD的自学以及调试软件的学习以及VDHL语言的学习和运用。
在调试成功后的外围电路制版焊接也是难点之一。
附录
附录Ⅰ单片机控制程序清单
***************************主程序*********************************
ORGOOOOH
KEYIN:
ACALLLOAD;装入CPUREADY
ACALLDISP;调显示子程序
START:
STEBP3.5;开键盘控制
CLRP3.2;并行置入键值
STEBP3.2;允许串行移位
MOVSCON,#00010000B;设置串行口模式0,启动接收
WAIT1:
JNBRI,WAIT1;等待接受一帧数据的结束
CLRRI
MOVA,SBUF;取键值
ANLA,#01H;屏蔽高三位
MOVR3,A;暂存键值
ACALLD_10MS;延时,去抖
CLRP3.2
STEBP3.2
MOVSCON,#00010000H
WAIT2:
JNBRI,WAIT2
CLRRI
MOVA,SBUF
ANLA,#01H
MOV20H,A
MOVAR3
CJNEA,20H,KEYIN;判断键值是否由抖动引起的
CJNEA,FEH,KEYIN;判断开始键是否按下
CLRP3.5;关键盘控制
ACALLKEY;调测频子程序
ACALLDISP;调显示子程序
JMPKEYIN
*************************测频子程序*********************************
KEY:
LCALLCLEAR;调LED熄灭子程序
LCALLTIME;调预置时间值
MOVR0,20H;读入预置门时间值
STEBP1.0;计数器清零
CLRP1.0
STEBP1.1;开始计数
DELY:
ACALLD_100MS
DJNZR0,DELY
CLRP1.1
EEND:
MOVC,P1.2;读计数结束标志位
JCEEND
MOVA,#11100111B;置SS=0,读数
ANLP1,A
NOP
MOVA,P0;将NS的值存入70-73H
MOV70H,A
MOVA,P2
MOV71H,P2
STEBP1.3;置SS=1
NOP
MOVA,P0
MOV72H,A
MOVA,P2
MOV73H,A
STEBP1.4;将NX的值存入74-77H
CLRP1.3
NOP
MOVA,P0
MOV74H,A
MOVA,P2
MOV75H,A
STEBP1.3
NOP
MOVA,P0
MOV76H,A
MOVA,P2
MOV77H,A
MOVR0,#00H;40HZ标准频率转换为16进制为2625A00H
MOVR1,#O5AH
MOVR2,#O62H
MOVR3,#02H
MOVR4,74H
MOVR5,75H
MOVR6,76H
MOVR7,77H
ACALLMUL_SUB;调四字节乘法子程序FS*NX
ACALLNDIV;调除法子程序FX=(FS*NX)/NS
ACALLBIN_BCD;调二进制转换BCD码子程序
ACALLEXTD;调字节展开子程序
RET
*************************显示子程序*******************************
DISP:
SETBP3.4;开显示控制
MOVR7,#08H;设置显示个数
MOVR0,#30H;置显示缓冲区指针
MOVSCON,#00H;设串行口方式
SEND:
MOVA@RO
ADDA,#0DH;设置偏移值
MOVCA,@A+PC
MOVSBUF,A;启动发送
WAIT:
JNBTI,WAIT;判断1帧数据是否发送完毕
CLRTI
INCRO
DJNZR7,SEND;判断数据是否发送完毕
CLRP3.4;关显示控制
RET
TAB:
DB0C0H,0F9H,0A4H,0B0H,99H,;0,1,2,3,4
DB92H,82H,0F8H,80H,98H,;5,6,7,8,9
DB88H,83H,0C6H,0A1H,86H,8EH,;A,B,C,D,E,F
DB7FH,0FFH,0C6,8CH,0C1H,;.,暗,C,P,U
DB0CEH,86H,88H,0A1H,91H;R,E,A,D,Y
DB86H,0C8H,0F8H,86H,0CEH,;E,,N,T,E,R
DB0BFH,92H,0F0H,;-,S,J
************************提示字装入子程序************************
LOAD:
MOVR7,#08H
MOVR0,#30H
MOVA,#13H;CPUREADY
LD:
MOV@R0,A
INCR0
INCA
DJNZR7,LD
RET
LED熄灭子程序
CLEAR:
MOVR7,#08H
MOVR0,#30H
MOVA,#12H;显示熄灭
ABCL:
MOV@R0,A
INCR0
DJNZR7,ABCL
RET
************************时间值输入子程序************************
TIME:
MOVR7,#08H
MOVR0,#30H
MOVA,#19H;显示ENTER-SJ
LP:
MOV@R0,A
INCR0
INCR0
DJNZR7,LP
LCALLDISP
BEGIN:
STEBP3.5;开键盘控制
CLRP3.2;并行置入键值
STEBP3.2;允许串行移位
MOVSCON,#00010000B
WTI:
JNBRI,WTI;判断是否接收完毕
CLRRI
MOVA,#0EH;屏蔽开始键
MOVR3,A
LCALLD_10MS;延时,消抖
CLRP3.2
STEBP3.2
MOVSCON,#00010000B
WT2:
JNBRI,WT2
CLRRI
MOVA,SBUF
ANLA,#0EH
MOV22H,A
MOVA,R3
CJNEA,22H,BEGIN
CJNEA,#FDH,S_10
MOV20H,#01H;预置门时间0.1S
CLRP3.5;关键盘控制
RET
S_10:
CJNEA,#FBH,S_20
MOV20H,#0AH;预置门时间1S
CLRP3.5
RET
S_20:
CJNEA,,#F7H,BEGIN
MOV20H,#64H;预置门时间10S
CLRP3.5
RET
*************************延时10MS子程序*************************
D_10MS:
MOVR7,#14H
LOOP1:
MOVR6,#0F9H
LOOP2:
DJNZR6,LOOP2
DJNZR7,LOOP1
RET
************************延时100MS子程序*************************
D_100MS:
MOVR7,#0C8H
DL1:
MOVR6,#0F9H
DL2:
DJNZR6,DL1
DJNZR7,DL2
RET
*************************字节展开子程序****************************
EXTD:
MOVR1,#30H
MOVR7,#04H
AGAN:
MOVA,@R0
MOVR3,A
ANLA,#00001111B
MOV@R1,A
MOVA,R3
INCR1
ANLA,#11110000B
MOV@R1,A
INCR1
INCR0
DJNZR7,AGAN
RET
*********************4字节乘法子程序FS*NX*************************
MUL_SUB:
MOV A,M
ADD A,R0
MOV R5,A
XCH A,R1
XCH A,R5
ADD A,N
XCH A,R0
MOV R6,A
MOV B,M
MOV NCNT,B
NMLMN1 :
DEC R0
DEC R1
CLR A
XCH A,@R1
MO