基于STC89C52RC的DDS信号发生器设计.docx
《基于STC89C52RC的DDS信号发生器设计.docx》由会员分享,可在线阅读,更多相关《基于STC89C52RC的DDS信号发生器设计.docx(33页珍藏版)》请在冰豆网上搜索。
基于STC89C52RC的DDS信号发生器设计
xxxxxxx大学
信息学院
专业综合实训实验报告
——基于STC89C52RC单片机的DDS程控信号发生器设计
课程名称:
数字电路逻辑设计基础实验
学院:
信息学院专业:
电子信息工程
姓名:
学号:
***********
2013年01月10日
课程设计成绩评定表
姓名
电话
专业
E-MAIL
学号
指导老师
所选题目
考核分数组成
说明
分数
考勤与工作态度10%
包括开题、中期、答疑是否参加
电路设计与测试40%
焊接工艺与组装10%
是否使用PCB
功能30%
根据任务书测试各功能是否完整、正确
指标10%
根据任务书测试指标是否达到
答辩15%
PPT制作与讲述10%
PPT制作是否合理、逻辑思维是否清楚、表达是否准确
回答问题5%
对提问是否能准确回答
课程设计报告25%
设计报告与进度表10%
格式是否规范、内容是否充实
测试报告与结果分析15%
对整体的方案及数据测试的分析是否完整、财务分析报告
发挥部分10%
性价比、工艺、使用方便性等。
成绩
指导教师签字
一、概述
1.DDS结构简介
1971年,美国学者J.Tierney等人撰写的“ADigitalFrequencySynthesizer”-文首次提出了以全数字技术,从相位概念出发直接合成所需波形的一种新组成原理。
限于当时的技术和器件产,它的性能指标尚不能与已有的技术相比,故没受到重视。
近几年间,随着微电子技术的迅速发展,直接数字频率合成器(DirectDigitalFrequencySynthesis简称DDS或DDFS)得到了飞速的发展,它以有别于其它频率合成方法的优越性能和特点成为现代频率合成技术中的佼佼者。
具体体现在相对带宽、频率转换时间短、频率分辨率高、输出相位连续、可产生宽带正交信号及其他多种调制信号、可编程和全数字化、控制灵活方便等方面,并具有极高的性价比。
DDS是直接数字式频率合成器(DirectDigitalSynthesizer)的英文缩写。
与传统的频率合成器相比,DDS具有低成本、低功耗、高分辨率和快速转换时间等优点,广泛使用在电信与电子仪器领域,是实现设备全数字化的一个关键技术。
直接数字频率合成器(DirectDigitalSynthesizer)是从相位概念出发直接合成所需波形的一种频率合成技术。
一个直接数字频率合成器由相位累加器、加法器、波形存储ROM、D/A转换器和低通滤波器(LPF)构成。
DDS的原理框图如下所示:
图1.1.1DDS原理框图
2.设计指标要求
设计和制作一个程控DDS信号发生器,基本要求为有智能CPU芯片(单片机、嵌入式系统、FPGA)为主控芯片,以专用DDS芯片为实现手段,辅助输入、输出手段,完成程控DDS的设计与制作。
技术指标:
1、最终频率输出范围为10Hz—8MHz(正弦波);
2、外部供电电压+5v、-5v;
3、输出波形幅度范围(正弦波峰峰值):
0到3V连续可调;
4、八位LED数码管或点阵LCD显示输出频率;
5、输出频率可设置调整(最小设置步长10Hz);
6、主控CPU和芯片自行选择;
7、绘制PCB电路板实现。
工程性要求:
1、两人为一个项目组,由一人当组长;
2、每个项目器件成本控制在100元以下(不包括PCB和单独的CPU板),同等条件下,成本低的项目分数有加分;
3、有项目整体设计报告、项目的进度表和最终的测试报告和使用手册;
4、以项目组为考核整体,兼顾小组分工;
5、制作焊接工艺(贴片工艺);
6、整体产品结构合理,使用方便、美观
二、系统总体设计方案
1.系统设计原理
本文提出的采用DDS作为信号发生核心器件的全数控函数信号发生器设计方案,根据输出信号波形类型可设置、输出信号幅度和频率可数控、输出频率宽等要求,选用了美国A/D公司的DDS芯片,并通过单片机程序控制和处理DDS器件的32位频率控制字,再经放大后加至以数字电位器为核心的数字衰减网络,从而实现了信号幅度、频率、类型以及输出等选项的全数字控制。
本系统主要由单片机、DDS直接频率信号合成器、数字衰减电路、真有效值转换模块、A/D转换模块、数字积分选择电路等部分组成。
单片机STC89C52RC是整个系统关键部分,通过对键盘进行扫描读入相位信息,经转换后输出到DDS芯片,输出波形。
键盘输入的数字信息经STC89C52RC控制的LCD1602显示。
2.总体设计方案选择
在设计初期,我小组一共提出两套设计方案。
方案一:
采用AD9850作为DDS器件,配以椭圆滤波电路,运算放大电路。
系统框图如下:
图1.2.1选用AD9850的方案一设计系统框图
方案3:
采用AD9833作为DDS器件,配以运算放大电路组成方案二。
系统框图如下:
图1.2.2选用AD9833的方案二设计系统框图
经过认真比较选择,我们小组最终确定采用方案二进行设计实现。
主要原因有一下几点:
1、相比于方案一,AD9833芯片管脚少,电路更加简洁明了,方便进行布线焊接。
2、AD9833芯片开发时间比较晚,技术更加成熟,芯片内部内置了滤波部分,使得系统整体的电路设计更加简单,而且输出波形更加稳定。
所以,最终我们选定方案二,作为本次DDS信号发生器的设计方案。
三、系统硬件模块的设计实现
系统整体硬件设计如下图所示:
图3.1系统整体硬件设计图
图3.2系统整体硬件实物图
1.键盘控制模块
图3.1.1键盘控制电路原理图
通过键盘对波形的频率进行控制。
按键1:
功能切换键。
按下之后,进入频率改变步长选择功能,分别由按键2、3控制频率步长选择,步长分别由10Hz、1kHz、10kHz、100kHz、1MHz几个选项。
按键2:
在默认系统模式下,控制频率增加默认步长1kHz。
在按键1按下进入步长调整模式下,控制步长增加。
按键3:
在默认系统模式下,控制频率增加默认步长1kHz。
在按键1按下进入步长调整模式下,控制步长减小。
按键4、5:
默认系统模式下无功能。
在按键1按下进入调整模式下,控制输出信号的频率按照当前选择的步长分别增加、减小。
图3.1.2键盘控制电路实物图
2.MCU(单片机)控制模块以及最小系统组成
主控电路中,以单片机为主体,通过分析键盘输入的数字值,对AD9833写入相应的控制字。
它是系统的大脑。
单片机(MICROCONTROLLER,又称微控制器)是在一块硅片上集成了各种部件的微型机算计,这些部件包括中央处理器CPU、数据存贮器RAM、程序存贮器ROM、定时器/计数器和多种I/O接口电路。
2.1时钟电路:
图3.2.2时钟电路组成
XTAL1是片内振荡器的反相放大器输入端,XTAL2则是输出端,使用外部振荡器时,外部振荡信号应直接加到XTAL1,而XTAL2悬空。
内部方式时,时钟发生器对振荡脉冲二分频,如晶振为12MHz,时钟频率就为6MHz。
晶振的频率可以在1MHz-24MHz内选择。
电容取30PF左右。
STC89C52RC中有一个用于构成内部振荡器的高增益反相放大器,引脚XTAL1和XTAL2分别是该放大器的输入端和输出端。
这个放大器与作为反馈元件的片外石英晶体或者陶瓷谐振器一起构成自激振荡器。
片外石英晶体或者陶瓷谐振器及电容C1、C2接在放大器的反馈回路中构成并联振荡电路。
对外接电容C1、C2虽然没有十分严格的要求,但电容容量的大小会轻微影响振荡频率的高低、振荡器工作的稳定性、起振的难易程序及温度稳定性,这里采用电容30pF,晶振采用12MHz。
2.2复位电路:
STC89C52RC的外部复位电路有上电自动复位和手动按键复位。
上电复位电容充电来实现。
图3.2.3单片机最小系统电路组成
3.LCD显示模块连接设计
现在的字符型液晶模块已经是单片机应用设计中最常用的信息显示器件。
1602型LCD显示模块具有体积小,功耗低,显示内容丰富等特点。
1602型LCD可以显示2行16个字符,有8位数据总线D0~D7和RS,R/W,EN三个控制端口,工作电压为5V,并且具有字符对比度调节和背光功能。
基本操作程序
读状态:
输入:
RS=L,RW=H,E=H输出:
D0~D7=状态字
读数据:
输入:
RS=H,RW=H,E=H输出:
无
写指令:
输入:
RS=L,RW=L,D0~D7=指令码,E=高脉冲输出:
D0~D7=数据
写数据:
输入:
RS=H,RW=L,D0~D7=数据,E=高脉冲输出:
无
LCD1602与单片机连接如下图所示:
图3.3.1LCE1602与单片机连接示意图
1、管脚1,接地GND
2、管脚2,接VCC电源+5V
3、管脚3,在GND与VCC之间接电位器,然后把电位器滑动调整口接3,实现对LCD灰度(对比度)的调整功能。
4、管脚4-6,对应接单片机STC89C52RC的管脚10-12,用以写入控制字。
5、管脚7-14,对应接单片机STC89C52RC的管脚21-28,即为第二组IO口。
4.AD9833与单片机的连接。
图3.4.1单片机与AD9833的连接示意图
图3.4.2AD9833外围电路设计图
图3.4.3单片机最小系统组成、单片机与AD9833连接以及AD9833外围电路实物图
5.AD8055运算放大电路
本身AD9833所输出的波形经过内置的滤波放大之后,可是成为便于示波器显示的波形,干扰小,幅值稳定,但是考虑到幅值可调功能的实现,因此加入运算放大电路,通过反馈接入的电位器的阻值与运算放大器正接入的电阻阻值的比值,对输出信号进行放大,通过电位器的调节实现对信号幅值可调功能。
至于选用AD8055运算放大器,而不选用成本更低的LM324等,是因为本次设计的信号发生器输出信号范围在10Hz到8MHz之间,属于高频信号,超过普通TTL运算放大器件的运算放大范围。
AD8055运算放大电路部分设计如图:
图3.5.1AD8055运算放大电路原理图
图3.5.2AD8055运算放大电路实物图
四、软件设计与调试
1.程序流程图
通过程序预置频率,并实现对频率步进的控制,处理用户由键盘键入的频率值,判断是否超出范围,生成频率控制字,经并行方式送入DDS,合成用户所需的频率,并通过程序实现频率的显示。
程序流程图如下
DDS的时钟频率很高,对周围电路有一定影响,在电路中采取了一些抗干扰措施,如:
引线尽量短,减少交叉,每个芯片的电源与地之间都解忧去耦电容,数字地与模拟地分开。
在LCD的显示调节时也要选取适当的电阻才能使液晶屏正常的显示,常选取的阻值为1000Ω左右
2.软件调试
本系统的软件调试可以在Keiluvision2的环境中完成,Keil系统为软件的开发和调试提供了良好的用户界面和强大的功能,程序调试无误后,可以装入Proteus7.6中进行仿真,也可以直接下载到单片机中进行调试。
采用自下而上即单独调试好每一个模块后,再连接成一个完整的系统调试。
系统软件完整代码,见本报告最后附录。
五、系统调试及测试结果
图5.1测试结果图(图中信号输出频率4MHz)
六、专业综合实践总结
本次专业综合实践完成的主要工作是完成单片机控制AD9850产生正弦信号,并能显示出相对应的频率,且使频率在10Hz-8Hz的范围内,以10Hz、1kHz、10kHz、100kHz、1MHz的步长进行调整。
通过搜集目前DDS技术的相关资料,了解国内外DDS信号发生器的相关制作方法,并通过设计方案的比较,针对设计任务提出了可行方案。
在设计方案中,结合单片机的功能特点及其控制特性,利用简便的单片机C-51语言和其内部时钟,以单片机作为控制的核心。
根据设计方案,详细地阐述了单片机的控制原理、AD9833的使用方法、PCB板的制作,设计了相应的硬件电路和系统软件,制作了电路原理样机并进行调试。
结果表明,所设计的电路和软件能完成基本的测试功能。
本次专业综合实训结束了,留给了我很深的思考,只有通过学习才能获得知识,开始时并不是什么都会,但是只要努力了就一定会有收获虽然中间的过程很辛苦,但是只要有结果,在繁琐复杂的过程,也是值得的。
当然,在比呢此综合实训中,我也深切体会到,电子信息工程师的设计工作是必须严谨的,仔细的。
一开始,本打算使用AD9850的PCB板设计,因为布线错误,导致PCB板无法使用,给自己实验造成困难的同时,也极大地浪费了实验资源和成本。
最后在此,感谢为我们实验过程中提供指导的XXX老师,在开放性实验过程中,为我们提供实验室元件方便的各位信息学院实验室管理老师。
在焊接制作过程中,由于器材问题无法自己动手焊接AD9833贴片转直插,北京XXXXX研究生XXXX同学也无私的为我们提供帮助,帮助我们焊接了AD9833贴片转直插,在此特地表示感谢。
在大学生涯即将结束的时候,进行的这次专业综合实践,即是对整个大学生涯学习的检验,也是为下学期的毕业设计做预言。
经过本次专业综合实训,我们一定以更加严谨认真的治学态度,面对以后的求学、职业生涯,以本次实验中的经验和教训,为以后成为一名合格的电子信息工程师打下坚实的基础,为国家现代化信息化建设作出自己的贡献。
七、参考文献
[1]张景璐.51单片机项目教程[M].北京:
人民邮电出版社,2010.3
[2]姜志海.单片机原理及应用[M].北京:
电子工业出版社,2005.7
[3]沈德金.MCS-51系列单片机接口电路与应用程序设计[M].北京:
北京航空航天大学出版社,1999.5
[4]李群芳.单片机微型计算机与接口技术[M].北京:
电子科技大学出版社,1999.7
[5]公茂法.单片机人机接口实例集[M].北京:
北京航空航天大学出版社,1998.4
[6]DWHart.Foundationandapplicationofmicrocontroller[M].北京:
HigherEducationPress,2004.2
[7]刘建辉.单片机智能控制技术[M].北京:
国防工业出版社,2007.4
[8]闫玉德.MCS-51单片机原理与应用(C语言版)[M].北京:
机械工业出版社,2003.1
[9]张永瑞.电子测量技术基础[M].西安:
西安电子科技大学出版社,1994.12
[9]刘伟.基于AD9850芯片的信号发生器的研究[M].苏州:
苏州大学出版社,2002.4
[10]马明建.数据采集与处理技术[M].西安:
西安交通大学出版社,2009.8
八、附录
附录1:
电路原理图设计
附录2:
软件设计完整代码
#include
#include
//*********************定义端口
sbitrs=P3^0;
sbitrw=P3^1;
sbitep=P3^2;
sbitp33=P3^3;
sbitp34=P3^4;
sbitp35=P3^5;
sbitp36=P3^6;
sbitp37=P3^7;
sbitFSYNC1=P1^1;//DDS使能引脚,低电平有效
sbitSCLK9833=P1^0;//DDS串行时钟输入
sbitSDATA9833=P1^2;//DDS串行数据输入
//*********************
#defineFSELECT11//频率寄存器选择
#definePSELECT10//相位寄存器选择
#defineRESET8//
#defineOPBITEN5
#defineDIV23
#defineMODE1
#defineWAVE_SIN0//正弦波
#defineWAVE_RAMP1//三角波
#defineWAVE_SQUARE2//方波
#defineWAVE_SQUARED23//方波(频率为1/2)
//*********************定义显示能容
unsignedcharcodeword1[16]={"MADEBY:
WangCY"};
unsignedcharcodeword2[16]={"AndHuangYi"};
unsignedcharcodeword3[16]={"TheFOUTis:
"};
unsignedcharword4[16]={",,HZ"};
unsignedcharcodeword5[16]={"change:
*1M"};
unsignedcharcodeword6[16]={"change:
*100KHZ"};
unsignedcharcodeword7[16]={"change:
*10KHZ"};
unsignedcharcodeword8[16]={"change:
*1KHZ"};
unsignedcharcodeword9[16]={"change:
*100HZ"};
unsignedcharcodeword10[16]={"change:
*10HZ"};
unsignedcharcodeword11[16]={"change:
*1HZ"};
//*********************
//*********************延时子程序
voiddelay(unsignedcharms)
{
unsignedchari;
while(ms--)
{
for(i=0;i<250;i++)
{
_nop_();_nop_();_nop_();_nop_();
}
}
}
//*********************
//*********************忙测试子程序
bitlcd_bz()
{
bitresult;
rs=0;rw=1;ep=1;
_nop_();_nop_();_nop_();_nop_();
result=(bit)(P2&0x80);
ep=0;
returnresult;
}
//*********************
//*********************写指令到LCD子程序
voidlcd_wcmd(unsignedcharcmd)
{
while(lcd_bz());
rs=0;rw=0;ep=0;
_nop_();_nop_();
P2=cmd;
_nop_();_nop_();_nop_();_nop_();
ep=1;
_nop_();_nop_();_nop_();_nop_();
ep=0;
}
//*********************
//*********************设置显示位置子程序
voidlcd_pos(unsignedcharpos)
{
lcd_wcmd(pos|0x80);
}
//*********************
//*********************写入显示数据到LCD子程序
voidlcd_wdat(unsignedchardat)
{
while(lcd_bz());
rs=1;rw=0;ep=0;
P2=dat;
_nop_();_nop_();_nop_();_nop_();
ep=1;
_nop_();_nop_();_nop_();_nop_();
ep=0;
}
//*********************
//*********************LCD初始化子程序
voidlcd_init()
{
lcd_wcmd(0x38);
delay
(1);
lcd_wcmd(0x0c);
delay
(1);
lcd_wcmd(0x06);
delay
(1);
lcd_wcmd(0x01);
delay
(1);
}
//*********************
//*********************显示WORD
voidlcd_xs(unsignedcharword[])
{
unsignedchari;
for(i=0;i<16;i++)
{
lcd_wdat(word[i]);
}
}
//*********************
//*********************
voidprofess(unsignedlongpl)
{
word4[5]=(unsignedchar)(pl/1000000);
word4[7]=(unsignedchar)(pl%1000000/100000);
word4[8]=(unsignedchar)(pl%100000/10000);
word4[9]=(unsignedchar)(pl%10000/1000);
word4[11]=(unsignedchar)(pl%1000/100);
word4[12]=(unsignedchar)(pl%100/10);
word4[13]=(unsignedchar)(pl%10);
word4[5]+=48;
word4[7]+=48;
word4[8]+=48;
word4[9]+=48;
word4[11]+=48;
word4[12]+=48;
word4[13]+=48;
}
//*********************
//*********************AD9833写入
voidAD9833_write(unsignedintwdat)
{
unsignedchari;
unsignedinttemp=wdat;
SCLK9833=1;
_nop_();
_nop_();
for(i=0;i<16;i++)
{
if(temp&0x8000)
{
SDATA9833=1;
}
else
{
SDATA9833=0;
}
_nop_();
_nop_();
SCLK9833=0;//时钟信号下降沿数据送入I/O口
_nop_();
_nop_();
SCLK9833=1;
temp=temp<<1;//16位数据从高位到低位送入
}
}
//*********************
voidAD9833_OutputWave0(unsignedlongf/*频率*/,unsignedintp/*相位*/,unsignedcharboxing/*波形选择*/)
{
unsignedintt=0;
FSYNC1=1;
SCLK9833=1;
SDATA9833=1;
_nop_();
_nop_();
FSYNC1=0;
_nop_();
_nop_();
////////////////////////////////////////SU