基于DDS的波形发生器设计 0805014141范华广.docx
《基于DDS的波形发生器设计 0805014141范华广.docx》由会员分享,可在线阅读,更多相关《基于DDS的波形发生器设计 0805014141范华广.docx(30页珍藏版)》请在冰豆网上搜索。
基于DDS的波形发生器设计0805014141范华广
中北大学
课程设计说明书
学生姓名:
范华广
学号:
01
学院:
信息与通信工程学院
专业:
电子信息科学与技术
题目:
基于DDS的波形发生器设计
指导教师:
程耀瑜职称:
教授
指导教师:
李永红职称:
讲师
2012年1月5日
中北大学
课程设计任务书
2011/2012学年第一学期
学院:
信息与通信工程学院
专业:
电子信息科学与技术
学生姓名:
范华广学号:
01
课程设计题目:
基于DDS的波形发生器设计
起迄日期:
12月19日~1月6日
课程设计地点:
主楼1318室,513教研室
指导教师:
程耀瑜李永红
系主任:
程耀瑜
下达任务书日期:
2011年12月19日
课程设计任务书
1.设计目的:
在学习专业基础课和专业课的基础上,主要在电子仪器、微机综合设计与实践、单片机与A/D和D/A和光、计、电综合应用等几个方面开展实践活动,巩固所学知识、培养动手能力。
2.设计内容和要求(包括原始数据、技术参数、条件、设计要求等):
1、学习DDS频率控制的原理。
2、研究AD9850芯片的工作原理和实用方法。
3、学习89C51单片机的基本理论。
4、设计流程图
5、根据流程图设计电路。
3.设计工作任务及工作量的要求〔包括课程设计计算说明书(论文)、图纸、实物样品等〕:
1)设计说明书符合要求;
2)相应器件的工作原理;
3)系统工作原理图;
4)参考文献原文不少于3篇。
课程设计任务书
4.主要参考文献:
1.盛启龙,董燕,汪小燕.基于DDS的高稳高纯频谱频率源的设计.无线电工程,2003年12期
2.游少芳.基于DDS的任意信号发生器设计.哈尔滨工程大学,2007年
3.白振华,赵兴群,夏翎,袁帅.基于DDS的任意波形发生器.现代科学仪器,2001年06期
4.毛敏,郑珍,周渭.基于DDS的低通滤波器的设计与实现.电子科技,2006年03期
5.张玉兴.DDS高稳高纯频谱频率源技术.系统工程与电子技术,1997年12期
5.设计成果形式及要求:
设计说明书及相关电路图
6.工作计划及进度:
12月19日~12月22日了解设计题目及熟悉资料
12月23日~12月26日确定各题目要求计算相关参数,确定具体设计方案
12月27日~1月2日结合要求具体设计与仿真
1月3日~1月6日整理课程设计说明书,答辩或成绩考核,
系主任审查意见:
签字:
年月日
1DDS介绍………………………………………6
2AD9850简介………………………………………112.1芯片性能……………………………………………11
2.2AD9850的控制字及控制时序…………………………………12
2.3管脚定义………………………………………13
3硬件部分……………………………………13
3.1基于AD9850的模块原理图…………………………………133.2硬件电路设计……………………………………14
4软件部分…………………………………16
4.1软件部分设计………………………………………16
4.2参考程序………………………………………17
5波形图………………………………………26
6结束语………………………………………29
7参考文献………………………………………30
基于DDS、AD9850芯片波形发生器的设计
摘要:
基于直接数字频率合成(DDS)原理,利用AT89C52单片机作为控制器件,采用AD9850型DDS器件设计一个信号发生器。
给出了信号发生器的硬件设计和软件设计参数,该系统可输出正弦波、方波,且频带较宽、频率稳定度高,波形良好。
该信号发生器具有更强的市场竞争力,在跳频技术、无线电通信技术方面具有比较广阔的发展前景。
关键词:
信号发生器;直接数字频率合成;AD9850芯片;AT89C52单片机
1DDS介绍
一、DDS引言
频率合成技术是将一个(或多个)基准频率变换成另一个(或多个)合乎质量要求的所需频率的技术。
在通信、雷达、导航、电子侦察、干扰与抗干扰等众多领域都有应用。
随着各种频率合成器和频率合成方案的出现,频率合成技术得到了不断的发展。
1971年3月美国学者J.Tierncy,DigitalSynthesis)技术。
这是一种从相位概念出发直接合成所需要的波形的新的全数字频率合成技术。
同传统的频率合成技术相比,DDS技术具有极高的频率分辨率、极快的变频速度,变频相位连续、相位噪声低,易于功能扩展和全数字化便于集成,容易实现对输出信号的多种调制等优点,满足了现代电子系统的许多要求,因此得到了迅速的发展。
目前市面上的DDS芯片,价格昂贵、功能固定单一,应用受到限制。
本综合实验项目采用基于FPGA的EDA技术设计实现DDS芯片,并可以根据实际需要对其功能进行灵活地修改,配置。
二、DDS工作原理
一个纯净的单频信号可表示为:
(2-1)
只要它的幅度U和初始相位
不变,它的频谱就是位于
的一条谱线。
为了分析简化起见,可令U=1,
=0,这将不会影响对频率的研究。
即:
(2-2)
如果对(2-2)的信号进行采样,采样周期为
(即采样频率为
),则可得到离散的波形序列:
(2-3)
相应的离散相位序列为:
(2-4)
式中:
(2-5)
是连续两次采样之间的相位增量。
根据采样定理:
(2-6)
只要从(2-3)出来的离散序列即可唯一的恢复出(2-2)的模拟信号。
从(2-2)可知,是相位函数的斜率决定了信号的频率;从(2-5)可知,决定相位函数斜率的是两次采样之间的相位增量
。
因此,只要控制这个相位增量,就可以控制合成信号的频率。
现将整个周期的相位2
分成M份,每一份为
,若每次的相位增量选择为
的K倍,即可得到信号的频率:
(2-7)
相应的模拟信号为:
(2-8)
式中K和M都是正整数,根据采样定理的要求,K的最大值应小于M的1/2。
综上所述,在采样频率一定的情况下,可以通过控制两次采样之间的相位增量(不得大于π)来控制所得离散序列的频率,经保持、滤波之后可唯一的恢复出此频率的模拟信号。
DDS工作原理框图如图2.1所示:
图2.1DDS原理框图
其实质是以基准频率源(系统时钟)对相位进行等间隔的采样。
由图2.1见,DDS由相位累加器和波形存储器(即,ROM查询表)构成的数控振荡器(NCO_NumericallyControlledOscillators)、数模转换器(DAC)以及低通滤波器(LPF)三部分组成。
在每一个时钟周期,N位相位累加器与其反馈值进行累加,其结果的高L位作为查询表的地址,然后从ROM中读出相应的幅度值送到DAC。
再由DAC将其转换成为阶梯模拟波形,最后由具有内插作用的LPF将其平滑为连续的正弦波形作为输出。
因此,通过改变频率控制字K就可以改变输出频率
。
在这里
,
。
由上面的分析可得DDS的输出频率:
(2-9)
由上式可知,DDS的最小输出频率为:
(2-10)
DDS的频率分辨率为:
(2-11)
DDS频率输入字的计算:
FW(N-1:
0)=2Nf0/fc(2-12)
三、DDS基本结构组成
一个基本的DDS系统由数控振荡器(NCO)、数模转换器(DAC)和低通滤波器(LPF)三部分构成,如图3.1所示:
图3.1DDS的基本结构
数控振荡器(NCO)产生频率可控制的数字正弦载波,通过数模转换器(DAC)得到模拟正弦波,最后经过低通滤波器(LPF)除去各种干扰信号。
本实验项目中的设计主要针对数控振荡器(NCO)部分,DAC部分直接采用实验系统箱提供的数/模转换电路。
四、DDS的设计
在DDS的设计中其最基本的构件是相位累加器和波形存贮器。
通常也可在波形存贮器前面加一个相位调制器,使其具有相位调制的功能,为了防止频率控制字、相位控制字改变时干扰相位累加器和相位调制器的正常工作,分别在这两个模块前面加入了两组寄存器,从而灵活且稳定地控制频率字和相位字的输入。
如图4.1所示:
图4.1DDS的构成图
图中相位累加器(phasea)是整个DDS的核心,在这里完成相位累加功能,其输入是相位增量,又可称为频率控制字
,由于
与输出频率
是简单的线性关系:
(4-1)
事实上当基准时钟
是
时,
就等于
。
相位调制器(phasemod)接收相位累加器的相位输出,在这里加一个相位偏移值,主要用于实现信号的相位调制,如PSK(相移键控)等,在不使用时可以去掉该部分,或加一个固定的相位控制字。
波形存储器(即,正弦ROM查找表)(sinlup)把存储在相位累加器中的抽样值转换成正弦波幅度的数字量函数,可理解为相位到幅度的转换。
它的输入是相位调制器输出的高M位(而并非全部N位)值,将其作为正弦ROM查找表的地址值;查询表把输入的地址相位信息映射成正弦波幅度信号;输出送往DAC,转化为模拟信号。
2AD9850简介
2.1芯片性能
随着数字技术的飞速发展,用数字控制方法从一个参考频率源产生多种频率的技术,即直接数字频率合成(DDS)技术异军突起。
美国AD公司推出的高集成度频率合成器AD9850便是采用DDS技术的典型产品之一。
AD9850采用先地蝗CMOS工艺,其功耗在3.3V供电时仅为155mW,扩展工业级温度范围为-40~80℃,采用28脚SSOP表面封装形式。
AD9850的引脚排列,图2为其组成框图。
图2中层虚线内是一个完整的可编程DDS系统,外层虚线内包含了AD9850的主要组成部分。
AD9850内含可编程DDS系统和高速比较器,能实现全数字编程控制的频率合成。
可编程DDS系统的核心是相位累加器,它由一个加法器和一个N位相位寄存器组成,N一般为24~32。
每来一个外部参考时钟,相位寄存器便以步长M递加。
相位寄存器的输出与相位控制字相加后可输入到正弦查询表地址上。
正弦查询表包含一个正弦波周期的数字幅度信息,每一个地址对应正弦波中0°~360°范围的一个相位点。
查询表把输入地址的相位信息映射成正弦波幅度信号,然后驱动DAC以输出模式量。
相位寄存器每过2N/M个外部参考时钟后返回到初始状态一次,相位地正弦查询表每消费品一个循环也回到初始位置,从而使整个DDS系统输出一个正弦波。
输出的正弦波周期To=Tc2N/M,频率fout=Mfc/2N,Tc、fc分别为外部参考时钟的周期和频率。
AD9850采用32位的相位累加器将信号截断成14位输入到正弦查询表,查询表的输出再被截断成10位后输入到DAC,DAC再输出两个互补的电流。
DAC满量程输出电流通过一个外接电阻RSET调节,调节关系为ISET=32(1.148V/RSET),RSET的典型值是3.9kΩ。
将DAC的输出经低通滤波后接到AD9850内部的高速比较器上即可直接输出一个抖动很小的方波。
AD9850在接上精密时钟源和写入频率相位控制字之间后就可产生一个频率和相位都可编程控制的模拟正弦波输出,此正弦波可直接用作频率信号源或经内部的高速比较器转换为方波输出。
在125MHz的时钟下,32位的频率控制字可使AD9850的输出频率分辨率达0.0291Hz;并具有5位相位控制位,而且允许相位按增量180°、90°、45°、22.5°、11.25°或这些值的组合进行调整。
流程如图
(2)。
2.2 AD9850的控制字及控制时序
AD9850的控制字有40位,其中32位是频率控制位,5位是相位控制位,1位是电源休眠控制位,2位是工作方式选择控制位。
在应用中,工作方式选择位设为00,因为01,10,11已经预留作为工厂测试用。
频率控制位可通过下式计算得到:
fout=(fr×W)/232其中:
fout要输出的频率值;fr为参考时钟频率;W为相应的十进制频率控制字,然后转换为十六进制即可。
AD9850有串行和并行两种控制命令字写入方式。
其中串行写入方式是采用D7作
为数据输入端,每次W_CLK的上升沿把一个数据串行移入到输入寄存器40位数据都移入后,FQ_UD上升沿完成输出信号频率和相位的更新。
串行控制字的写入时序如图3所示。
但是要注意的是,此时数据输入端的三个管脚不可悬空,其中D0,D1脚接高电平,D2脚要接地。
参考时钟
微控制器
相位累加器
低通滤波
模数转换器
波形转换和算法
Sin信号
矩形波端口
比较器
图
(2)
图(3)
2.3管脚定义
3硬件部分
3.1基于AD9850的模块原理图
3.2硬件电路设计
AD9850控制字的写入方式有串行和并行两种。
并行写入方式的优点是数据传输的速度快,能够提升整个系统的处理速度,但占用的单片机的I/O口资源太多。
与并行方式相比,串行写入方式在数据传输的速度上要慢些,但它更大优点是能节省很多I/O口资源[8]。
所以,本系统采用AT89S52单片机作为控制核心,通过串行写入控制字的方式控制AD9850芯片,加上键盘和LED显示部分等外围电路,构成整个系统电路。
为了详细介绍AD9850的用法,这里重点给出本系统中AT89S52单片机与AD9850芯片连接电路,如图4所示,其中R1=1kΩ,R2=10kΩ,R3=1kΩ,单片机晶振选用12MHz,电容采用30pF经典值。
单片机采用12MHz晶振时,它的高电平时间能够满足AD9850。
图(4)
4软件部分
4.1 软件部分设计
软件程序的功能就是通过程序使整个系统按照人们的设想要求工作起来,本系统中最主要的部分就是将AD9850的40位控制字通过单片机写入到AD9850芯片内,系统的程序流程图如图4所示。
要根据写入控制字方式的不同严格按照AD9850的时序图来编写控制字写入子程序。
本文主要给出串行写入方式的C源程序以供读者调试参考。
开始
单片机初始化
串口初始化
控制字下载到AD9850
N
控制子程序
更新AD9850的控制字
Y
4.2参考程序
/*******************************************
函数:
关于AD9850的DDS调频
********************************************/
#include
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
#defineWRITE_DATA_IOP1//定义AD9850数据端口
#defineLED_DATA_IOP0//定义LED灯数据端口
Unsignedcharcodeduanma[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x80};//设置数码管段码0-9
unsignedcharcodeweima[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//设置数码管位码
ucharWRITE_DATA[5];//9850频率和控制字,WRITE_DATA[5]为控制字,其他32位为频率字
uchardisplay_data[8];//8位数码管的数值
unsignedlongfrequence;//无符号长整形数值,我们需要输入的频率
uintMHZ,KHZ,HZ;//将需要的频率分解为MHZ,KHZ,HZ
ucharAD9850_temp;//AD9850工作标志位
sbitW_SLK=P2^0;//AD9850字节输入,上升沿有效
sbitDQ_VD=P2^1;//AD9850四字节输入后,上升沿有效
sbitkey_unit=P2^2;//按键的个位
sbitkey_decade=P2^3;//按键的十位
sbitkey_power=P2^4;//按键的十次幂
sbitkey_sure=P2^5;//按键确认
sbitweila=P2^6;//LED数码管的位码
sbitduanla=P2^7;//LED数码管的段码
/*******************************************
函数:
延时函数,延时tms
入口函数:
无
出口频率:
无
********************************************/
voiddelay1ms(uchart)
{
uchartt;
while(t--)
{
tt=125;
while(tt--);
}
}
/*************************LED显示函数**************************************/
/*******************************************
函数:
初始化定时器0
入口函数:
无
出口频率:
无
********************************************/
voidINIT_time0()
{
TMOD|=0x01;
TH0=-2000/256;
TL0=-2000%256;
EA=1;
ET0=1;
TR0=1;
}
/*******************************************
函数:
LED数码管在start位开始显示num数据
入口函数:
start是数据从第几位显示,num是显示多少位
出口频率:
无
********************************************/
voidLED_display(ucharstart,ucharnum)
{
staticunsignedchari=0;
uchardelay=15;
if(AD9850_temp==1)
{
display_data[0]=MHZ/10;//将频率分解让数码管显示
display_data[1]=MHZ%10;
display_data[2]=KHZ/100;
display_data[3]=KHZ%100/10;
display_data[4]=KHZ%10;
display_data[5]=HZ/100;
display_data[6]=HZ%100/10;
display_data[7]=HZ%10;
}
LED_DATA_IO=0xed;//显示两个小数点
weila=1;//位码锁存
weila=0;
LED_DATA_IO=duanma[10];
duanla=1;
duanla=0;
while(delay--);
LED_DATA_IO=weima[i+start];
weila=1;
weila=0;
LED_DATA_IO=duanma[display_data[i]];
duanla=1;
duanla=0;
i++;
if(i==num)
i=0;
}
/*******************************************
函数:
中断函数
入口函数:
无
出口频率:
无
********************************************/
voidINT_time0()interrupt1
{
TH0=-2000/256;
TL0=-2000%256;
LED_display(0,8);
}
/*************************按键函数*************************************/
/*******************************************
函数:
按键初始化,确定频率的大小
入口函数:
无
出口频率:
无
********************************************/
voidINIT_key()reentrant//可从入函数
{
ucharunit=0,decade=0,power=0,i;
AD9850_temp=0;//AD9850开始标志位关闭
memset(display_data,0,8);
while
(1)
{
if(key_unit==0)//个位键
{
delay1ms(20);//延时,防抖动
if(key_unit==0)
{
while(key_unit==0);
unit++;
if(unit==10)
unit=0;
display_data[6]=unit;
}
}
if(key_decade==0)//十位键
{
delay1ms(20);
if(key_decade==0)
{
while(key_decade==0);
decade++;
if(decade==10)
decade=0;
display_data[5]=decade;
}
}
if(key_power==0)//10次幂键
{
delay1ms(20);
if(key_power==0)
{
while(key_power==0);
power++;
if(power==7)
power=0;
display_data[