DDS频率发生器 通过单片机如何控制

liuxiufang555 2010-03-20 09:18:46
我想用AD9851DDS芯片产生10M到20M联系可调的方波 目前不知道单片机怎样和AD9851 连接 怎么控制过程?谢谢大家啊 急用 谢谢 如果能有程序的话最好 我可以先学学 再改进
...全文
1589 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
shiypj 2011-08-25
  • 打赏
  • 举报
回复
按照网上的电路图进行画图,然后向DDS芯片送入频率控制字(FTW)就好了
guangmingdeshenju 2011-08-25
  • 打赏
  • 举报
回复
按芯片的接口接在单片机上就行(查芯片手册)。然后编程 传递控制字,就可以实现
mcgradyyc 2011-08-24
  • 打赏
  • 举报
回复
一楼说的很详细了,百度一下找些程序应该没问题!
顽皮的希望 2011-08-21
  • 打赏
  • 举报
回复
HAHA 这个挺好
qq297021227 2011-08-20
  • 打赏
  • 举报
回复
上网搜一下关于AD9851的外围电路,前些天就是按照那个图连接的,现在可以用了,产生的是正弦波,还需要买个晶振,根据你要产生的频率而定。关于程序百度文库有,你自己可以找找。我就是用那个参考程序,改一下,就能用了。如果实在不行,就去淘宝买个已经封装好的,用跳线和单片机连接就成
小跑 2011-08-15
  • 打赏
  • 举报
回复
我这有现成的程序,要用可以找我要
yxp058 2010-06-06
  • 打赏
  • 举报
回复
楼上的转载的那片论文可行性没有考证,,,程序不一定能用
我今年的毕业设计论文就是用9851产生正弦波波形,目前由于用的是椭圆滤波器最后输出正弦波波形最大到10M,不过从9851输出口可以在示波器上看到72M的波形,,,,这不知道怎么贴图 可以贴图证明
至于单片机和9851的连接 我采用的1.0 1.1 1.2 分别连接9851的数据串行端口 时钟端口 时能信号端口 程序用的是C语言 也比较简单 最终达到了不同频率的扫描 由于示波器没有自动换挡功能 因此高频时示波器无法同时看到,,,只能不断调整示波器可以看到清晰的波形
tcdzyq 2010-03-22
  • 打赏
  • 举报
回复
楼上给的就可以了。
kyzf 2010-03-22
  • 打赏
  • 举报
回复
1楼的兄弟 说得很很详细啦。

其实楼主可以百度或GOOGLE下,
单片机控制DDS的原理图或源代码,网上已有很很多,
JAZZLAM 2010-03-20
  • 打赏
  • 举报
回复
这个问题比较宽泛,建议找下无线电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
;====================

27,383

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧