您的当前位置:首页基于单片机的锁相频率合成器

基于单片机的锁相频率合成器

来源:小侦探旅游网


摘要 .................................................. 2 1、引言 ............................................... 2 2、设计任务及要求 ..................................... 2 2.1 设计任务 ....................................... 2 2.2 设计要求 ....................................... 2 3、频率合成的基本原理框图 ............................. 2 4、硬件系统的设计 ..................................... 3 4.1 原理图 ......................................... 3 4.2 74HC4046 ....................................... 3 4.2.1 74HC4046引脚功能介绍 ....................... 3 4.2.2 74HC4046内部电路原理图 ..................... 4 4.2.3 74HC4046典型应用 .......................... 5 4.3 CD4522引脚功能介绍 ............................. 5 4.4 CD4518引脚功能介绍 ............................. 6 4.5 1602LCD的基本参数及引脚功能 .................... 7 5、软件系统的设计 ..................................... 8 5.1 流程图 ......................................... 8 5.2 程序代码 ...................................... 11 6、实训小结 .......................................... 11 参考文献 ............................................. 15

1

基于单片机控制的频率合成器

摘要

给出一种以单片集成PLL芯片74HC4046为核心, 并通过AT89C51 单片机对74HC4046进行控制来实现锁相频率合成器的设计方法。文中在介绍了74HC4046芯片的内部功能结构的基础上, 探讨了锁相频率合成器的基本原理和工作特性; 给出了基于74HC4046的锁相频率合成器的硬件电路结构和软件程序设计方法。该设计经仿真测试证明, 锁相效果良好, 结构精简, 性能可靠。

关键词: 74HC4046; AT89C51; 频率合成器

1、引言

在现代电子技术的设计与开发过程中,特别是在通信、雷达、航空、航天以及仪器仪表等领域, 都需要进一步提高一系列高精度、高稳定度的频率源的频率精度。这样,一般的振荡器已经无法满足各种应用的发展要求,而晶体振荡器的性能虽然比较好, 但其频率单一, 或只能在极小的范围内进行微调。因此, 本文提出了一种基于单片机AT89C51控制的利用锁相技术以频率合成器芯片74HC4046为核心,来实现锁相频率合成器的设计方案。

2、设计任务及要求

2.1 设计任务

设计一个基于单片机控制的频率合成器 2.2 设计要求

1.输入信号为1KHz的方波信号。 2.合成的频率范围为1KHz~999KHz。 3.可设置分频比为1~999。 4.采用LCD显示。

3、频率合成的基本原理框图

R1MHZNfi1KHZPDCPFVCOf0单片机可编程置数

2

4、硬件系统的设计

4.1 原理图

4.2 74HC4046

4.2.1 74HC4046引脚功能介绍

3

上图是74HC4046的引脚排列,采用16脚双列直插式,各管脚功能:1脚相位输出端,环路入锁时为高电平,环路失锁时为低电平。 2脚相位比较器Ⅰ的输出端。 3脚比较信号输入端。 4脚压控振荡器输出端。

5脚禁止端,高电平时禁止,低电平时允许压控振荡器工作。 6、7脚外接振荡电容。

8、16脚电源的负端和正端。 9脚压控振荡器的控制端。

10脚解调输出端,用于FM解调。 11、12脚外接振荡电阻。 13脚相位比较器Ⅱ的输出端。 14脚信号输入端。

15脚内部独立的齐纳稳压管负极。 4.2.2 74HC4046内部电路原理图

74HC4046工作原理:输入信号Ui从14脚输入后,经放大器A1进行放大、整形后加到相位比较器Ⅰ、Ⅱ的输入端,开关K拨至2脚,则比较器Ⅰ将从3脚输入的比较信号Uo与输入信号Ui作相位比较,从相位比较器输出的误差电压UΨ则反映出两者的相位差。UΨ

4

经R3、R4及C2滤波后得到一控制电压Ud加至压控振荡器VCO的输入端9脚,调整VCO的振荡频率f2,使f2迅速逼近信号频率f1。VCO的输出又经除法器再进入相位比较器Ⅰ,继续与Ui进行相位比较,最后使得f2=f1,两者的相位差为一定值,实现了相位锁定。若开关K拨至13脚,则相位比较器Ⅱ工作,过程与上述相同,不再赘述。 4.2.3 74HC4046典型应用

74HC4046是通用的CMOS锁相环集成电路,其特点是电源电压范围宽(为3V-18V),输入阻抗高(约100MΩ),动态功耗小,在中心频率f0为10kHz下功耗仅为600μW,属微功耗器件。上图是用74HC4046的VCO组成的方波发生器,当其9脚输入端固定接电源时,电路即起基本方波振荡器的作用。振荡器的充、放电电容C1接在6脚与7脚之间,调节电阻R1阻值即可调整振荡器振荡频率,振荡方波信号从4脚输出。按图示数值,振荡频率变化范围在20Hz至2kHz。 4.3 CD4522引脚功能介绍

CF反馈输入端 CP时钟输入端

D0~D3并行数据输入端

VDDQ3D3CFQCD2CRQ2161514131211109452212345678VSSQ4D4PEEND1CPQ1INH禁止端 ID置数控制端

Q0~Q3计数器输出端 QZ计数器零输出端 VDD正电源 VSS地

CD4522是可预置数的二一十进制1/N减计数器。其引脚见上图。其中D1-D4是预置端,Q1—Q4是计数器输出端,其余控制端的功能如下:

5

PE(3)=“1”时D1—D4值置进计数器;EN(4)=“0”且CP(6)时,计数器(Q1—Q4)减计数;CF(13)=“1”且计数器(Q1—Q4)减到“0”时,QC(12)=“1”;Cr(10) =“1”时,计数器清零。

单片4522分频器如下图所示:

9V100K100K9V9VA42161514131211109452212345678拨盘开关18100K100K

CP拨盘开关为BCD码开关,如当数据窗口显示“3”时则A和“1”“2”相连;当显示“5”时,则A和“1”“4”相连,其余类推。4个100K电阻用来保证当拨盘开关为某脚不和A相连,也就是悬空时,为低电平。工作过程是这样的:设拨盘开关拨到“N”,当某时刻PE(3)=“1”,则N置到IC内的计数器中,下一个CP来时,计数器减计数变为N-1,一直到第N个CP来时,计数器为0。这时由于CF(13)=“1”,∴QC(12)=“1”,也即PE(3)=“1”又恢复到开始状态,开始一个新的循环。很显然,每来个N个CP,QC(12)就会出现一个高电平,也就是QC(12)应是CP的N分频信号。 4.4 CD4518引脚功能介绍

CD4518是一个双BCD同步加计数器,由两个相同的同步4级计数器组成。 CD4518引脚功能(管脚功能)如下: 1CP、2CP:时钟输入端。 1CR、2CR:清除端。 1EN、2EN:计数允许控制端。

6

1Q0~1Q3:计数器输出端。 2Q0~2Q3:计数器输出端。

Vdd:正电源。 Vss:接地。

CD4518是一个同步加计数器,在一个封装中含有两个可互换二/十进制计数器,其功能引脚分别为1~7和9~{15}.该CD4518计数器是单路系列脉冲输入(1脚或2脚;9脚或10脚),4路BCD码信号输出(3脚~6脚;{11}脚~{14}脚)。

CD4518控制功能:CD4518有两个时钟输入端CP和EN,若用时钟上升沿触发,信号由CP输入,此时EN端为高电平(1),若用时钟下降沿触发,信号由EN输入,此时CP端为低吨平(0),同时复位端Cr也保持低电平(0),只有满足了这些条件时,电路才会处于计数状态.否则没办法工作。

将数片CD4518串行级联时,尽管每片CD4518属并行计数,但就整体而言已变成串行计数了。需要指出,CD4518未设置进位端,但可利用Q4做输出端。有人误将第一级的Q4端接到第二级的CP端,结果发现计数变成“逢八进一”了。原因在于Q4是在CP8作用下产生正跳变的,其上升沿不能作进位脉冲,只有其下降沿才是“逢十进一”的进位信号。正确接法应是将低位的Q4端接高位的EN端,高位计数器的CP端接USS。 4.5 1602LCD的基本参数及引脚功能 1602LCD主要技术参数: 显示容量:16×2个字符 芯片工作电压:4.5—5.5V 工作电流:2.0mA(5.0V) 模块最佳工作电压:5.0V

字符尺寸:2.95×4.35(W×H)mm 引脚功能说明 序列号 属性 1 2 3 符号 VSS VDD VL 引脚说明 电源地 电源正极 编号 9 10 符号 引脚说明 D2 D3 D4 数据 数据 数据 液晶显示偏11 压 4 RS 数据/命令12 选择 D5 数据 5

R/W 读/写选择 13 D6 数据 7

6 7 E D0 使能信号 数据 14 15 D7 数据 BLA 背光源正极 8 D1 数据 16 BLK 背光源负极 第1脚:VSS为地电源。 第2脚:VDD接5V正电源。

第3脚:VL为液晶显示器对比度调整端,接正电源时对比度最弱,接地时对比度最高,对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度。 第4脚:RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。 第5脚:R/W为读写信号线,高电平时进行读操作,低电平时进行写操作。当RS和R/W共同为低电平时可以写入指令或者显示地址,当RS为低电平R/W为高电平时可以读忙信号,当RS为高电平R/W为低电平时可以写入数据。

第6脚:E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。 第7~14脚:D0~D7为8位双向数据线。 第15脚:背光源正极。 第16脚:背光源负极。

5、软件系统的设计

5.1 流程图

8

开始系统初始化调键盘扫描子程序调脉冲计数子程序调显示子程序结束 主程序流程图 9

开始系统初始化YNK0是否按下Y软件去抖动N送P2口输出K1是否按下NK2是否按下Y软件去抖动NNK0是否按下Y软件计数器加1K2是否按下送P3口输出YY软件计数器加1K0是否按下NK1是否按下Y软件去抖动送P2口输出NK2是否按下结束YK1是否按下Y软件计数器加1N 键盘扫描流程图 10

开始 存储计数结果定时计数器赋初值调将计数器得到的结果转成BCD码子程序开相应的中断启动定时计数器调显示程序调将BCD码转成ASCII码子程序定时计数器重赋初值是否有中断信号Y进入中断服务程序N中断返回N 存储计数结果一秒钟是否到YT0停止计数 脉冲计数流程图 5.2 程序代码

#include

#define uchar unsigned char #define uint unsigned int sbit P34=P3^4; sbit lcdrs=P3^7; sbit lcden=P3^6; sbit P32=P3^2; sbit P33=P3^3;

uchar dispbuf[3]={0,0,1};

uchar code table[]=\"0123456789\"; int i=0,temp;

char temp_g,temp_s,temp_b; void delay(uchar z) {

uchar x,y;

for(x=z;x>0;x--)

11

for(y=110;y>0;y--); }

void write_data(uchar date) {

lcdrs=1; P0=date; delay(2); lcden=1; delay(2); lcden=0; }

void write_com(uchar com) {

lcdrs=0; P0=com; delay(2); lcden=1; delay(2); lcden=0; }

void main() {

TMOD=0x10;

TH1=(65536-500)/256; TL1=(65536-500)%256; ET1=1; PT1=1; EX0=1; EX1=1; EA=1; TR1=1; lcden=0;

write_com(0x38); write_com(0x0c); write_com(0x04); write_com(0x01); write_com(0x80); write_data('F'); write_data('r'); write_data('e'); write_data('q'); write_data('u'); write_data('e'); write_data('n'); write_data('c'); write_data('y'); write_data(':'); write_data('*');

write_com(0xc0+13); write_data('K'); write_data('H');

12

write_data('z'); while(1) {

if(temp==0) {

temp=1; if(i==0) {

write_com(0x80+10); write_data('*'); }

else {

write_com(0x80+10); write_data(' '); }

if(i==1) {

write_com(0x80+11); write_data('*'); }

else {

write_com(0x80+11); write_data(' '); }

if(i==2) {

write_com(0x80+12); write_data('*'); }

else {

write_com(0x80+12); write_data(' '); }

write_com(0xc0+10);

write_data(table[dispbuf[0]]); write_data(table[dispbuf[1]]); write_data(table[dispbuf[2]]); temp_g=dispbuf[2]&0x0f; temp_s=dispbuf[1]&0x0f; temp_s=temp_s<<4; temp_b=dispbuf[0]&0x0f; P2=temp_b|temp_s; P1=temp_g; } } }

void int50ms() interrupt 3 {

13

TR1=0;

TH1=(65536-500)/256; TL1=(65536-500)%256; P34=~P34; TR1=1; }

void INEX0() interrupt 0 {

delay(2); if(P32==0); {

temp=0; ++i; if(i>3) i=0; }

while(P32==0); }

void INEX1() interrupt 2 {

delay(2); if(P33==0); {

temp=0; dispbuf[i]++; if(dispbuf[i]>9) dispbuf[i]=0; }

while(P33==0); }

6、实训小结

开学第一周我们进行了这学期的第一个实训,基于单片机的频率合成器。对于这个实训,最开始是对电路图的设计,我们从网上搜集了一些资料,然后结合平时所学,最终将电路图设计完整,经过老师检查没有问题之后我们就开始了软件系统的设计,主要就是写程序。说到程序这是我们最头疼的事,大都只懂得一些基础的,更深层次的就不行了。我们也借助了网络,在网上找了一些类似的代码,然后自己再修改一下,不过花了很多心思才弄好了。最后就是焊接电路板,这可真是一件伟大的工程,主要是需要焊接的线太多了,很容易出现错焊,漏焊,虚焊,短路的情况,所以第一次焊接完后一般都有很多问题,还要对照电路图一个点一个点的仔细检查,功夫不负有心人,最后我们还是成功了。这次实训收获真的很多,参与了每一个过程,从最初的一脸茫然,到最后的成功喜悦,都是我们大家一起努力的结果。

14

参考文献

[1] 李全利.单片机原理及接口技术.北京:高等教育出版社,2009

[2] 周航慈,朱跃忠.智能仪器原理与设计.北京:北京航空航天大学出版社,2005 [3] 罗杰,谢自美.电子线路设计•实验•测试.北京:电子工业出版社,2008

15

因篇幅问题不能全部显示,请点此查看更多更全内容