数字频率合成器的设计课件.ppt

上传人:小飞机 文档编号:1520050 上传时间:2022-12-02 格式:PPT 页数:100 大小:2.28MB
返回 下载 相关 举报
数字频率合成器的设计课件.ppt_第1页
第1页 / 共100页
数字频率合成器的设计课件.ppt_第2页
第2页 / 共100页
数字频率合成器的设计课件.ppt_第3页
第3页 / 共100页
数字频率合成器的设计课件.ppt_第4页
第4页 / 共100页
数字频率合成器的设计课件.ppt_第5页
第5页 / 共100页
点击查看更多>>
资源描述

《数字频率合成器的设计课件.ppt》由会员分享,可在线阅读,更多相关《数字频率合成器的设计课件.ppt(100页珍藏版)》请在三一办公上搜索。

1、第7章 数字频率合成器的设计,7.1 设计任务 7.2 设计方案论证7.3 系统硬件设计7.4 系统软件设计 7.5 系统设计总结,7.1 设计任务,设计一个数字频率合成器,该数字频率合成器的输出信号波形为正弦波,输出信号的频率为f0=01 MHz,频率最小步进间隔为0.08 Hz,输出电压峰峰值为Up-p=0.35 V,供电电源为+5 V。,7.2 设计方案论证,7.2.1 MCU和锁相环路相结合的实现方案MCU和锁相环路相结合的实现方案如图7.1所示。图中,在基本锁相环路的反馈支路中接入了具有高分频比的可变分频器,用MCU控制分频器的分频比就可得到若干个标准频率输出。为了得到所需的频率间隔

2、,往往在电路中还加入一个前置分频器。,图7.1 MCU和锁相环路相结合的实现方案电路框图,1. 前置分频器分频比的确定 由得 , 故 f=f0(N+1)-f0(N)=式中f为频率间隔。 由 得 ,若f0的范围为f0 minf0 max,则N对应有NminNmax。7.2.2 MCU和DDS芯片相结合的实现方案DDS的基本原理是利用采样定理,通过查表法产生波形。DDS的结构有很多种,其基本的电路原理可用图7.2表示。 ,图7.2 DDS 的原理框图,相位累加器由N位加法器与N位累加寄存器级联构成。每来一个时钟脉冲fs,加法器将频率控制字k与累加寄存器输出的累加相位数据相加,把相加后的结果送至累加

3、寄存器的数据输入端。累加寄存器将加法器在上一个时钟脉冲作用后所产生的新相位数据反馈到加法器的输入端,以使加法器在下一个时钟脉冲的作用下继续与频率控制字相加。这样,相位累加器在时钟作用下,不断对频率控制字进行线性相位累加。由此可以看出,相位累加器在每一个时钟脉冲输入时,把频率控制字累加一次,相位累加器输出的数据就是合成信号的相位,相位累加器的溢出频率就是DDS输出的信号频率。,用相位累加器输出的数据作为波形存储器(ROM)的相位取样地址,这样就可把存储在波形存储器内的波形抽样值(二进制编码)经查表查出,完成相位到幅值的转换。波形存储器的输出送到D/A转换器,D/A转换器将数字量形式的波形幅值转换

4、成所要求合成频率的模拟信号。低通滤波器用于滤除不需要的取样分量,以便输出频谱纯净的正弦波信号。 利用 MCU和DDS芯片相结合的实现方案如图7.3所示。,图7.3 MCU和DDS芯片相结合的电路框图,7.3 系统硬件设计,7.3.1 单片机与AD9835接口电路设计1. AD9835原理及结构1) DDS工作原理,AD9835 中使用的DDS 技术从连续信号的相位出发,将一个余弦信号取样、量化、编码,形成一个余弦函数表存储在ROM 中。合成时改变相位增量,由于相位增量不同,一个周期内的取样点数也不同,这样产生的正弦信号频率也就不同,从而达到频率合成的效果。 在这里,余弦波信号本身是非线性的,而

5、其相位是线性的(如图7.4 所示)。,图7.4 余弦波信号及其相位,因此,每隔一段时间t (时钟周期),有对应的相位变化P,即P=t=2ft (7.1)从式(7.1)可得合成信号的频率f为 (7.2)式中,fmt为固定时钟频率,fmt1t。因此,通过改变相位值P,就可以改变合成信号的频率f 。,DDS 芯片AD9835的原理框图如图7.5 所示。其中,相位累加器为32位,取其高12位作为读取余弦波形存储器的地址。当时钟使相位累加器的输出也即余弦ROM 寻址地址每递增频率设定为K时,对应的波形相位变化为,(7.3),图7.5 AD9835的原理框图,因此,改变相位累加器设定值K ,就可以改变相位

6、值,从而改变合成信号频率f。经简化,合成信号频率可由下式决定:式中,fmt=50 MHz,由高稳定度晶体振荡器获得,K值在1K232之间,最低频率fmin=fmt/232,为0.0116 Hz,这就是频率合成器的频率分辨率。根据Nyquist采样定律可知,重建信号频率最高可达fmt/2,但通常取最高频率fmax=fmt/3。,(7.4),2) AD9835芯片内部结构AD9835内部结构框图如图7.6所示,它有一个32位相位累加器,两个32位频率寄存器F0和F1(用于设定K值),四个12位相位寄存器P0、P1、P2、P3。程控切换F0、F1时,可实现相位PSK调制。余弦函数表存储在ROM中。3

7、2位相位累加器的输出值截取高12位后与12位相位寄存器Pi值相加,构成12位的相位地址,去寻址余弦ROM表,寻址得到的幅度值经10位的高速D/A转换后成为合成余弦信号。输出信号总谐波分量的畸变量与时钟频率和输出信号频率之比m=fmt/f有关,m值愈大,谐波畸变愈小;m值最小时,谐波畸变最大。为消除m值较小时的谐波畸变,输出端采用LC高阶低通滤波器滤除高次谐波。在设计中采用5阶Butterworth低通滤波器,可以将50 MHz以上的高次谐波功率降低60 dB,可完全满足高精度信号源的要求。,图7.6 AD9835内部结构框图,3) 引脚说明AD9835引脚功能说明如表7.1所示。,表7.1 A

8、D9835引脚功能说明,4) 命令及控制寄存器说明 AD9835的命令及控制寄存器说明见表7.2表7.8。,表7.2 控制寄存器,表7.3 控制寄存器地址,表7.4 命令,表7.5 控制AD9835,表7.6 写数据到寄存器,表7.7 设置SYNC、SELSRC,表7.8 开关、复位、清零,引脚PSELSCT 、PSEL0、 PSEL1是外加调制信号,可用于对DDS进行直接位控调制,实现数字二值调频(FSK)和数字四值调相(PSK)。引脚FSYNC、 SCLK 、SDATA用来对DDS进行程控工作模式设定。数据传输方式为同步串行方式。AD9835可以设定为SLEEP、 RESET工作方式。在S

9、LEEP工作方式下,功耗为1.75 mW。,2. AD9835的典型应用电路如图7.7所示,REFIN与REFOUT相连接,则参考电压为1.21 V。在引脚REFIN接一个10 nF电容到地。时钟电路由U2构成,U2为50 MHz晶体振荡信号源。SCLK、SDATA、 FSYNC与单片机的P1.0、P1.1、P1.2引脚相连,为AD9835提供命令和频率寄存器中的数据,以便实现信号频率的设置和初相位的设置。信号输出端IOUT接5阶Butterworth LC低通滤波器,通带截止频率为12 MHz,阻带截止频率为25 MHz,阻带衰减大于60 dB。,图7.7 AD9835 应用电路图,7.3.

10、2 单片机及按键电路设计1. AT89C2051的主要性能及引脚功能说明AT89C2051的引脚如图7.8所示。AT89C2051的性能如下:(1) 和MCS-51产品兼容。(2) 2K字节可重编程闪速存储器。(3) 1000写/擦除周期。(4) 2.76 V的操作范围。(5) 全静态操作:024 MHz。(6) 两级加密程序存储器。,图7.8 AT89C2051的引脚图,(7) 1288位内部RAM。(8) 两个16位定时器/计数器。(9) 六个中断源。(10) 编程串行UART通道。(11) 直接LED驱动输出,I/O引脚缓冲器可吸收20 mA电流。(12) 一个片内模拟比较器。(13)

11、低功耗空载和掉电方式。(14) 15根可编程I/O引线。,2. 单片机按键电路设计如图7.9所示,单片机采用Atmel公司的89C2051。在XTAL.1和XTAL.2之间并联12MHz晶振,XTAL.1和XTAL.2分别与地之间接27 pF电容,为单片机提供12 MHz时钟。单片机的机器周期为1s。,图7.9 单片机及按键电路图,复位电路采用X5045芯片。当程序“跑飞”时,看门狗芯片X5045将单片机复位,从而保证系统能够正常运行。4个按键中,S1为上键,S2为下键,S3为左键,S4为右键。系统通过4个按键对信号输出频率进行设定。上键S1增大频率步进间隔,下键S2减小频率步进间隔,左键S3

12、按照所设定的频率步进间隔减小信号的输出频率,右键S4按照所设定的频率步进间隔增大信号的输出频率。平时引脚在上拉电阻作用下保持高电平,当按键按下时,把引脚拉为低电平,通过程序来判断按键并实现相应的功能。频率间隔与对应值如表7.9所示。,表7.9 频率间隔与对应值表,7.3.3 显示电路设计1. PS7219基本原理PS7219是一个高性能、低价格的多位LED显示驱动器。PS7219是武汉力源公司的产品,它在性能上完全兼容国外的产品MAX7219,并且还增添了位闪等功能。其接口采用流行的同步串行外设接口(SPI),可与任何一种单片机方便地接口,并可同时驱动八位共阴极LED数码管或64只独立LED发

13、光二极管。PS7219A型内置一个可靠的P监控电路,可为外部提供一个脉宽大于140 ms、触发门限典型值为4.63 V的高电平复位信号。,图7.10 PS7219引脚图,PS7219内部具有158 bit RAM功能控制寄存器,可方便寻址,对每位数字可单独控制,刷新不需重写整个显示器。显示亮度可数字控制,每位都具有闪烁使能控制位,引脚CON置高电平,可禁止所有显示,达到降低功耗的效果,但同时并不影响对控制寄存器的修改。PS7219还有一个掉电模式、一个允许用户选择从1位数显示到8位数显示的扫描界限寄存器和一个强迫所有LED接通的测试模式。N个PS7219级联,可实现N8位LED数码管的显示。P

14、S7219的应用很广泛,例如条形图显示、7段显示、工业控制、仪表控制面板、LED模型显示等。PS7219是共阴极显示驱动器,采用脚和两种封装,其引脚排列如图7.10所示。,2. 显示部分电路设计 如图7.11所示,PS7219与AT89C2051的连接为:RST、LOAD、DIN、CLK分别与单片机的RESET、P3.3、P3.4、P3.5相连,通过串行连接方式,单片机把命令和要显示的数据传送给PS7219。八位数码管用来显示信号发生器的输出频率,其中六位为整数部分,两位为小数部分。即频率最小显示分辨率为0.01Hz,最大输出频率为999 999.99 Hz。,图7.11 显示电路原理图,7.

15、3.4 系统总体电路图系统总体电路图如图7.12所示。图中,运放AD817构成输出信号幅度调节电路。,图7.12 系统整体电路图,7.4 系统软件设计,7.4.1 概述整个软件采用模块化程序设计,用C语言编程,便于移植,可读性强,主要分为显示模块disp.c、dds模块ad9835.c、看门狗模块x5045.c及主模块mainpr.c。改变频率时,仅需要改变FREGO寄存器的值,就可以改变输出频率,输出频率,(7.5),因此寄存器值为通过按键S1、S2、S3、S4可改变输出信号频率,结合软件设计完成按键的功能。7.4.2 程序主模块程序主模块负责键扫描及其他模块的调用,其框图如图7.13所示。

16、程序主模块(mainpr.c)的源代码如下。,(7.6),图7.13 程序主模块框图,#include #include intrins.h#define uchar unsigned char#define uint unsigned int#define ushort unsigned short#define ulong unsigned long,uchar data ms_10;uchar data ms_20;uchar data ms_100;uchar data mdelay;uchar keyolddata;ulong data frqvalue;uchar data frq

17、stepvalue;/*设置数码管显示0,1,2,3,4,5,6,7,8 9,-(中),-(上),_(下)对应数据 */uchar code led_buf14= 0X7e,0 x30,0 x6d,0 x79,0 x33,0 x5b,0 x5f,0 x70,0 x7f,0 x7b,0 x01,,0 x40,0 x08,0 x00;void start_prg();void interrupt_set(void);void delay(uint x);void Key_Handle();uint binarytobcd(uint x);uint bcdtobinary(uint x);exter

18、n initad9835();extern open_watchdog();extern watch_dog();extern disp_data(void);/*=,TIMER 0 interrupt ;20ms=*/void timer0() interrupt 1 using 1TH0=256-(20000/256); TL0=256-(20000%256); ms_10+;ms_20+;if (ms_10+=10) ms_10=0;ms_100+ /*=*/,main()start: ms_10=0; ms_20=0; ms_100=0; frqvalue=0 x897; frqste

19、pvalue=1; keyolddata=0 xf0;,sclk=0; dio=1; rst=0; start_prg(); interrupt_set(); delay(100); open_watchdog(); delay(100); watch_dog(); /*=*/,for(;) if (ms_20=2) Key_Handle(); ms_20=0; if (ms_100 = 1) /* 100ms */ ms_100 = 0; watch_dog(); ,/*=*/void delay(uint x)uchar i;while(x-0) for(i=0;i125;i+) ; ,v

20、oid start_prg() Init_Led(); initad9835(); /*=*/,void interrupt_set() TMOD=0 x21; SCON=0 x50; TH0=256-(10 000/256); TL0=256-(10 000%256); TR0=1; ET0=1; EA=1;,void Key_Handle() uchar data keydata; keydata=P1 else if (keydata=0 xf0)&(keyolddata!=0 xf0) /*有键按下*/, switch (keyolddata) case 0 x70: upaddfrq

21、(); break;,case 0 xb0: downsubfrq(); break; case 0 xd0: upstep(); break; case 0 xe0: downstep(); break; default: keyolddata=0 xf0; ,else keyolddata=keydata; void upaddfrq() uchar disp_buf8; switch(frqstepvalue) case 0: if (frqvalue0 xffffffff-0 xdc), frqvalue=frqvalue+0 xdc; disp_buf0=0; disp_buf1=0

22、; disp_buf2=0; disp_buf3=0; disp_buf4=0; disp_buf5=0; disp_buf6=0; disp_buf7=0;/*显示缓冲区放待显示数据*/ disp_data(); ,case 1: if (frqvalue0 x897) frqvalue=frqvalue-0 x897; disp_buf0=0; disp_buf1=0; disp_buf2=0; disp_buf3=0; disp_buf4=0; disp_buf5=0; disp_buf6=0; disp_buf7=0; disp_data(); ,p() if (frqstepvalu

23、e7) frqstepvalue+; disp_data(); downstep() if (frqstepvalue0) frqstepvalue-; disp_data(); ,7.4.3 显示模块 显示模块完成对PS7912的控制。显示模块(disp.c)的源代码如下。#include #include intrins.hsbit din=P34; sbit clk=P35;sbit cs=P33;extern uchar disp_buf8;extern uchar code led_buf13;/*=*/,/* FUNCTION define*/*=*/void Init_Led(v

24、oid);void Test_led(void);void WriteLed(uchar combyte,uchar data0);void WriteLe(uchar combyte,uchar data0);void WriteLed0(uchar data1);void WriteLedx0(uchar data1);void disp_data(void);uchar bcd_byte(uchar x);uchar byte_bcd(uchar x);,/*初始化数码管显示 =*/void Init_Led(void) uchar combyte,data0; combyte=0 xf

25、f;data0=0 x00; WriteLe(combyte,data0); /*控制显示测试为正常方式*/ combyte=0 xfc;data0=0 x01; WriteLe(combyte,data0); /*控制关闭模式为正常方式*/,combyte=0 xfb;data0=0 x07; WriteLe(combyte,data0); /*控制为8位数码管显示*/ combyte=0 xfa;data0=0 x00; WriteLe(combyte,data0); /*控制显示强度为1/32*/ combyte=0 xf9;data0=0 x00; WriteLe(combyte,da

26、ta0); /*控制显示为非编码方式*/ ,/*=*/void Test_Led(void) uchar i,combyte,data0; combyte=0 xf1;data0=1; for (i=1;i=8;i+) WriteLed(combyte,led_bufdata0); combyte+;data0+; /*=*/,void WriteLed(uchar combyte,uchar data0) WriteLed0(combyte); WriteLedx0(data0); cs=1; void WriteLe(uchar combyte,uchar data0) WriteLed0

27、(combyte); WriteLed0(data0); cs=1; ,/*=*/void WriteLedx0(uchar data1) cs=0; ACC=data1; din=a3;clk=1;_nop_();clk=0; din=a4;clk=1;_nop_();clk=0; din=a7;clk=1;_nop_();clk=0; din=a2;clk=1;_nop_();clk=0; din=a1;clk=1;_nop_();clk=0; din=a0;clk=1;_nop_();clk=0; din=a5;clk=1;_nop_();clk=0; din=a6;clk=1;_nop

28、_();clk=0; ,/*=*/void WriteLed0(uchar data1) cs=0; ACC=data1; din=a7;clk=1;_nop_();clk=0; din=a6;clk=1;_nop_();clk=0; din=a5;clk=1;_nop_();clk=0; din=a4;clk=1;_nop_();clk=0; din=a3;clk=1;_nop_();clk=0; din=a2;clk=1;_nop_();clk=0; din=a1;clk=1;_nop_();clk=0; din=a0;clk=1;_nop_();clk=0; ,/*/void disp_

29、data(void) uchar i,combyte; combyte=0 xf1; for (i=0;i=7;i+) WriteLed(combyte,disp_bufi); combyte+; ,uchar bcd_byte(uchar x) uchar y,z; z=x; y=(x4) ,uchar byte_bcd(uchar x) uchar y,z; z=x; y=x/10; y=y4; x=(z%10) ,7.4.4 看门狗模块 看门狗模块完成对x5045的控制。看门狗模块(x5045.c)的源代码如下。#include #include intrins.h#define uch

30、ar unsigned char#define uint unsigned int#define ushort unsigned short,sbit SO = P30; /* used for serial output */sbit SI = P32; /* used for serial input */sbit SCK = P31; /* used for serial clock */sbit CS = P13; /* used for serial choice */#define WREN_INST 0 x06 /* Write enable latch instruction

31、(WREN)*/#define WRDI_INST 0 x04 /* Write disable latch instruction (WRDI)*/,#define WRSR_INST 0 x01 /* Write status register instruction (WRSR)*/#define RDSR_INST 0 x05 /* Read status register instruction (RDSR)*/#define WRITE_INST 0 x02 /* Write memory instruction (WRITE)*/#define READ_INST 0 x03 /

32、* Read memory instruction (READ)*/,#define STATUS_REG 0 x00 /*status register*/#define MAX_POLL 0 x99 /* Maximum number of polls*/*= sending a byte to EEPROM=*/void outbyt(uchar aadata) uchar x; for(x=0;x8;x+) SCK=0; if(aadata,else SI=1; _nop_(); SCK=1; aadata=aadata1; SI=0;/*=;* Name: WREN_CMD;* De

33、scription: Set write enable latch;* Function: This routine sends the command to enable writes to;* the EEPROM memory array or status register,=*/void wren_cmd(void) SCK=0; /* Bring SCK low*/ CS=0; /* Bring /CS low*/ outbyt(WREN_INST); SCK=0; /* Bring SCK low*/ CS=1; /* Bring /CS high*/*=,;* Name: RD

34、SR_CMD;* Description: Read Status Register;* Function: This routine sends the command to read the status register;* Calls: outbyt, inbyt=*/uchar rdsr_cmd(), uchar x; SCK=0; CS=0; outbyt(RDSR_INST); x=inbyt(); SCK=0; CS=1; return (x);,/*=;* Name: WIP_POLL;* Description: Write-In-Progress Polling;* Fu

35、nction: This routine polls for completion of a nonvolatile write;* cycle by examining the WIP bit of the status register=*/,void wip_poll() uchar x; for(x=0;xMAX_POLL;x+) uchar y=rdsr_cmd(); if(y,/*=;* Name: WRSR_CMD;* Description: Write Status Register;* Function: This routine sends the command to

36、write the WD0, WD1, BP0;* and BP0 EEPROM bits in the status register=*/void wrsr_cmd(uchar reg_status), wren_cmd(); SCK=0; CS=0; outbyt(WRSR_INST); outbyt(reg_status); SCK=0; CS=1; wip_poll(); /* Poll for completion of write cycle*/,void watch_dog(void) /* setting the watchdog time */ CS=1; CS=0; CS

37、=0; CS=1; void open_watchdog() uchar c; c = rdsr_cmd(); c =c ,7.4.5 dds模块 dds模块完成对ad9835的控制。dds模块(ad9835.c)的源代码如下。#include #include intrins.h#define uchar unsigned char#define uint unsigned int#define FMIN1 0#define FMIN2 0,#define FMIN3 0#define FMIN4 0 xdc /*频率间隔0.01*/#define FA1 0#define FA2 0#de

38、fine FA3 8#define FA4 0 x97 /*频率间隔0.1*/#define FB1 0#define FB2 0,#define FB3 0 x55#define FB4 0 xf6 /*频率间隔1*/#define FC1 0#define FC2 3#define FC3 0 x5a#define FC4 0 xfe /*频率间隔10*/#define FD1 0#define FD2 0 x21#define FD3 0 x8d#define FD4 0 xff /*频率间隔100*/,#define FE1 0#define FE2 0 x4f#define FE3

39、0 x8b#define FE4 0 x59 /*频率间隔1000*/#define FF1 0 x01#define FF2 0 x1b#define FF3 0 x71#define FF4 0 x76 /*频率间隔10 000*/,#define FG1 0 x0a#define FG2 0 x12#define FG3 0 x6e#define FG4 0 x98 /*频率间隔100 000*/sbit SCLK = P10; sbit SDATA = P11; sbit FSYNC= P12; /*=,sending a command to ad9835=*/void outtoa

40、d9835(uchar command,uchar data) uchar x; for(x=0;x8;x+) FSYNC=0; SCLK=0; if(command ,for(x=0;x8;x+) SCLK=0; if(data,void writefrq0(uchar databuf4) uchar combyte; uchar databyte; uchar i; combyte=0 x30; for (i=0;i4;i+) databyte=databufi; outtoad9835(combyte,databyte); combyte+; ,void initad9835(); uc

41、har data combyte; uchar data databyte; uchar data databuf4; combyte=0 xd8; databyte=0; outtoad9835(combyte,databyte); /*reset ad9835*/ combyte=0 xb0; databyte=0;,outtoad9835(combyte,databyte); /*set SYNC=1,SELSRC=1*/ combyte=0 xb0; databyte=0; outtoad9835(combyte,databyte); /*set SYNC=1,SELSRC=1*/ d

42、atabuf0=FA1; databuf1=FA2; databuf2=FA3; databuf3=FA4; writefrq0(*databuf);,7.5 系统设计总结,采用DDS芯片与MCU相结合实现的数字频率合成器,输出信号可调,最小频率分辨率为0.02 Hz,最高输出频率为1 MHz,具有非常高的精度和频率稳定性。根据不同应用场合的要求,还可进行功能扩展,如产生调频信号、调相信号等。数字频率合成器较之其他形式的频率合成器,具有频率间隔小,稳定性高等特点,既可作为高精度的合成信号源,也可用于无线通信中的收、发信机,数字通信中的载波同步、网同步及调制解调电路和电子对抗、电子测量等方面。因此,利用AD9835与AT89C2051相结合实现的数字频率合成器具有重要的应用价值。,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号