|
这个问题比较宽泛,建议找下无线电09年的全期,记的里面有介绍MCU做的DDS。或是去www.hellocq.net的QRP—DIY版块,那里都是玩无线电的高人,做DDS的人很多!我帮你贴一个上来,希望有点参考:
直接数字频率合成
AD9851的原理
AD9851可以产生一个频谱纯净、频率和相位都可编程控制且稳定性很好的模拟正弦波,这个正弦波能够直接作为基准信号源,或通过其内部高速比较器转换成标准方波输出,作为灵敏时钟发生器来使用。
AD9851的各引脚功能如下,引脚排列,如图5:
D0~D7:8位数据输入口,可给内部寄存器装入40位控制数据。
PGND:6倍参考时钟倍乘器地。
PVCC:6倍参考时钟倍乘器电源。
W-CLK:字装入信号,上升沿有效。
FQ-UD:频率更新控制信号,时钟上升沿确认输入数据有效。
FREFCLOCK:外部参考时钟输入。
CMOS/TTL脉冲序列可直接或间接地加到6倍参考时钟倍乘器上。在直接方式中,输入频率即是系统时钟;在6倍参考时钟倍乘器方式,系统时钟为倍乘器输出。
AGND:模拟地。
AVDD:模拟电源(+5V)。
DGND:数字地。 图5
DVDD:数字电源(+5V)。
RSET、DAC:外部复位连接端。
VOUTN:内部比较器负向输出端。
VOUTP:内部比较器正向输出端。
VINN:内部比较器的负向输入端。
VINP:内部比较器的正向输入端。
DACBP:DAC旁路连接端。
IOUTB:“互补”DAC输出。
IOUT:内部DAC输出端。
RESET:复位端。低电平清除DDS累加器和相位延迟器为0Hz和0 相位,同时置数据输入为串行模式以及禁止6倍参考时钟倍乘器工作。
AD9851在信号源中的应用
为了能够完成调频、调幅、调相的各种功能,要向AD9851输入频率/相位控制字,这是通过AD9851和微处理器相连接来实现。可以和AD9851的数据线直接相连接的单片机类型很多,本文中选用的是Atmel公司生产的单片机AT89S51,如图6所示,为AT89S51和AD9851的硬件串行接口框图。当然也可以选用AT89S52、MCS51、AD9851、AD9850等。
AD9851在本系统的应用电路
由于AD9851是贴片式的体积非常小,引脚排列比较密,焊接时必须小心,还要防静电,焊接不好就很容易把芯片给烧坏。还有在使用中数据线、电源等接反或接错都很容易损坏芯片。所以在AD9851外围采用了电源、输入、输出、数据线的保护电路。为了不受外界干扰,添加了不少的滤波电路,显得整个电路完美。
图6
低通滤波器(LPF)
为了使输出的频率不受高频斜波的干扰,所以选用了两级的π型LC低通滤波器,其动态范围宽0~83MHZ,增益高83MHZ时刚衰减1.4DB,波形图如图8。输入、输出阻抗为50Ω。原理图如图7。
图7
图8
锁相环频率合成
由于DDS的准确度决定于它的基准信号,所以采用准确度、稳定度比较高的锁相环频率合成为DDS芯片提供基准信号。MC145151是MOTOROLA公司生产的大规模集成电路,它是一块采用半行码输入方式置定、由14根并行输入数据编程的双模CMOS-LSI锁相环频率合成器,其内部组成框图如图9。
图9
RA0、RA1、RA2(5、6、7端):参考分频地址码输入端。14×8ROM参考(基准)译码器通过地址码的控制对14位÷R分频器进行编程,使得R分频比有8种选择。本电路中选用的是第二种分频比128,分频模式为:RA0 1,RA1 0,RA2 0。地址码与分频的关系如表1:
表1
锁相环频率合成MC145151在本电路中的应用
为了使锁相环频率合成能够锁定在30MHz,本电路(图10)的基准选用12.8MHz的高精度、高稳定度的温度补偿晶体振荡器,分频比为128,所以根据公式,它的步进为100KHz。它的N应该为300,化为二进制为100101100。把N送到MC145151就能准确的把频率锁定在30MHz 的稳定频率。
图10
压控振荡器(VCO)
本电路(图11)选用了电容三点式分立元件的压控振荡器(VCO),它与MC145151芯片构成锁相环,为了使AD9851能够经6倍频后输出最高频率,VCO必须控制在30MHz。
图11
缓冲放大器
由于压控振荡器(VCO)起振产生的频率的电压幅度远达不到DDS的基准5V所要的要求。为了使压控振荡产生的频率更加稳定,所以先加了一级电流缓冲,后再放大,正好满足DDS的基准的要求。详细电路如下图12:
图12
单片机控制的整体电路
本系统的微处理控制器选用的是AT89S51,它是美国Atmel公司生产新一代的51芯片,Atmel公司对89S51/2在工艺上进行了改进,采用0.35新工艺,成本降低,而且将功能提升,增加了竞争力。89CXX与89SXX可以兼容。更重要的是AT89SXX支持在线编程,非常方便。
存储芯片采用I2C总线标准的是容量是2K的普通外部存储芯片24C02,它也是美国ATMEL公司的低功耗CMOS串行EEPROM,它是内含256×8位存储空间,具有工作电压宽(2.5~5.5V)、擦写次数多(大于10000次)、写入速度快(小于10ms)等特点。
系统中的 DM-162带有背光的液晶模块,它是字符型液晶模块,是5x7点阵图形显示字符的液晶显示器,它显示的容量为2行16个字,具有简单而功能较强的指令集,可实现字符移动/闪烁等功能。与MCU的传输可采用8位并行传输或4位并行传输两种方式。其微功耗、体积小、显示内容丰富、超薄轻巧的诸多优点,在仪表、仪器和低功耗应用系统中得到越来越广泛的应用。整体电路如图案13。
图13
功率放大
根据设计要求,选择能够满足功率增益10dB,输出1W,频率领域1M~50MHz条件的晶体管。在此,使用2SCl970。输入电路可以将阻抗做50Ω---12.5Ω之变换。频带为1MHz~50MHz之宽带,因此,使用变压器L1做为阻抗变换。T2直接使用了RFC(高频扼流圈),使其在1MHz~50MHz时的阻抗值比50Ω大。详细电路如图14。
图14
本系统的软件设计
本系统在显示平台上采用了2行16个字的显示界面,操作平台上是3X4的键盘,所以在软件设计上采用了菜单的形式进行显示。使得整个平台更加美观、简洁操作起来方便、易懂更能显示出电子科技现代化的味道。整体的大概程序流程图如下:
(1)DDS(AD9851)启动和数据传送
AD9851时序图:
时间规格表:
;**********************************************************
根据上面的时序图,AD9851启动、送数的子程序如下:
;初始化DDS
;DDS启动、设置
;**************************************************************
;初始化DDS
;================================================
;------------------------------------------------
SETUP_AD9851:
CLR W_CLK ;初始化信号脚
CLR FQ_UD
SETB W_CLK ;设置为串行输入
CLR W_CLK
SETB FQ_UD
CLR FQ_UD
RET
;-------------------------------------------------
;=================================================
;发送数据到DDS
;=================================================
;-------------------------------------------------
W_AD9851: CLR FQ_UD
MOV A,R0
LCALL SEND_PLLRDATA
MOV A,R1
LCALL SEND_PLLRDATA
MOV A,R2
LCALL SEND_PLLRDATA
MOV A,R3
LCALL SEND_PLLRDATA
MOV A,#001B ;000B关倍频,001B是开倍频
LCALL SEND_PLLRDATA
SETB FQ_UD
CLR FQ_UD
RET
;--------------------------------------------------
;==================================================
;==================================================
;--------------------------------------------------
SEND_PLLRDATA:
MOV C,ACC.0
MOV DATA7,C
SETB W_CLK
CLR W_CLK
MOV C,ACC.1
MOV DATA7,C
SETB W_CLK
CLR W_CLK
MOV C,ACC.2
MOV DATA7,C
SETB W_CLK
CLR W_CLK
MOV C,ACC.3
MOV DATA7,C
SETB W_CLK
CLR W_CLK
MOV C,ACC.4
MOV DATA7,C
SETB W_CLK
CLR W_CLK
MOV C,ACC.5
MOV DATA7,C
SETB W_CLK
CLR W_CLK
MOV C,ACC.6
MOV DATA7,C
SETB W_CLK
CLR W_CLK
MOV C,ACC.7
MOV DATA7,C
SETB W_CLK
CLR W_CLK
RET
;-------------------------------------
;=====================================
;**********************************************************
(2)LCD与单片机连接
DM-162采用标准的14脚接口,其中VSS为地电源,VDD接5V正电源,V0为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高,对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度。RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。RW为读写信号线,高电平时进行读操作,低电平时进行写操作。当RS和RW共同为低电平时可以写入指令或者显示地址,当RS为低电平RW为高电平时可以读忙信号,当RS为高电平RW为低电平时可以写入数据。E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。D0~D7为8位双向数据线。
DM-162液晶模块内部的字符发生存储器(CGROM)已经存储了160个不同的点阵字符图形,如表1所示,这些字符有:阿拉伯数字、英文字母的大小写、常用的符号、和日文假名等,每一个字符都有一个固定的代码,比如大写的英文字母“A”的代码是01000001B(41H),显示时模块把地址41H中的点阵字符图形显示出来,我们就能看到字母“A”
DM-162液晶模块内部的控制器共有11条控制指令,如表2所示,它的读写操作、屏幕和光标的操作都是通过指令编程来实现的。(说明:1为高电平、0为低电平) 指令1:清显示,指令码01H,光标复位到地址00H位置 指令2:光标复位,光标返回到地址00H 指令3:光标和显示模式设置 I/D:光标移动方向,高电平右移,低电平左移 S:屏幕上所有文字是否左移或者右移。高电平表示有效,低电平则无效 指令4:显示开关控制。 D:控制整体显示的开与关,高电平表示开显示,低电平表示关显示 C:控制光标的开与关,高电平表示有光标,低电平表示无光标 B:控制光标是否闪烁,高电平闪烁,低电平不闪烁 指令5:光标或显示移位 S/C:高电平时移动显示的文字,低电平时移动光标 指令6:功能设置命令 DL:高电平时为4位总线,低电平时为8位总线 N:低电平时为单行显示,高电平时双行显示 F: 低电平时显示5x7的点6:功能设置命令 DL:高电平时为4位总线,低电平时为8位总线 N:低电平时为单行显示,高电平时双行显示 F: 低电平时显示5x7的点阵字符,高电平时显示5x10的点阵字符
表2
指令7:字符发生器RAM地址设置 指令8:DDRAM地址设置 指令9:读忙信号和光标地址 BF:为忙标志位,高电平表示忙,此时模块不能接收命令或者数据,如果为低电平表示不忙。 指令10:写数据 指令11:读数据
DM-162液晶显示模块可以和单片机AT89C51直接接口,电路如图15所示。
图15
液晶显示模块是一个慢显示器件,所以在执行每条指令之前一定要确认模块的忙标志为低电平,表示不忙,否则此指令失效。要显示字符时要先输入显示字符地址,也就是告诉模块在哪里显示字符,表3是DM-162的内部显示地址.
表3
比如第二行第一个字符的地址是40H,那么是否直接写入40H就可以将光标定位在第二行第一个字符的位置呢?这样不行,因为写入显示地址时要求最高位D7恒定为高电平1所以实际写入的数据应该是01000000B(40H)+10000000B(80H)=11000000B(C0H)
以下程序显示“S”
START:
ACALL LCDSTART
MOV A,#01H;清屏
LCALL WRTC
MOV A,#'S' ;'S'
LCALL WRTS
AJMP $
;**********************************************************
;LCD子程序
;**********************************************************
;==============================================
LCDSTART:
MOV A,#101000B;4位总线
LCALL WRTC
MOV A,#10B
LCALL WRTC
MOV A,#01H;清屏
LCALL WRTC
MOV A,#1111B;显示开,光标开,闪烁开
LCALL WRTC
MOV A,#110B;光标自动右移,显示文字不动
LCALL WRTC
MOV A,#10000000B;设置显示地址00h
LCALL WRTC
;MOV A,#11000000B;设置显示地址00h
;LCALL WRTC
RET
;==================
READBUSY:
SETB DB7
CLR RS
SETB RW
WAIT: SETB E
MOV C,DB7
JC WAIT
RET
;==================
WRTC: ;送指令
LCALL READBUSY
CLR RS
CLR RW
SETB E
MOV C,ACC.7
MOV DB7,C
MOV C,ACC.6
MOV DB6,C
MOV C,ACC.5
MOV DB5,C
MOV C,ACC.4
MOV DB4,C
CLR E
SETB E
MOV C,ACC.3
MOV DB7,C
MOV C,ACC.2
MOV DB6,C
MOV C,ACC.1
MOV DB5,C
MOV C,ACC.0
MOV DB4,C
CLR E
RET
;===================
WRTS: ;送数据
LCALL READBUSY
SETB RS
CLR RW
SETB E
MOV C,ACC.7
MOV DB7,C
MOV C,ACC.6
MOV DB6,C
MOV C,ACC.5
MOV DB5,C
MOV C,ACC.4
MOV DB4,C
CLR E
SETB E
MOV C,ACC.3
MOV DB7,C
MOV C,ACC.2
MOV DB6,C
MOV C,ACC.1
MOV DB5,C
MOV C,ACC.0
MOV DB4,C
CLR E
RET
;====================
|
|