程控DDS信号发生器的设计与实现.docx
- 文档编号:30569356
- 上传时间:2023-08-16
- 格式:DOCX
- 页数:22
- 大小:250.82KB
程控DDS信号发生器的设计与实现.docx
《程控DDS信号发生器的设计与实现.docx》由会员分享,可在线阅读,更多相关《程控DDS信号发生器的设计与实现.docx(22页珍藏版)》请在冰豆网上搜索。
程控DDS信号发生器的设计与实现
程控DDS信号发生器的设计与实现
一、设计任务书
1、目的
(1)培养学生以实际工程性的整体思路来完成整个项目;
(2)培养学生电子项目综合设计和管理及协作能力;
(3)通过完成项目设计制作,使学生完整地进行设计、制作、测试、总结等全过程。
2、具体任务
设计和制作一个程控DDS信号发生器,基本要求为有智能CPU芯片(单片机、嵌入式系统、FPGA)为主控芯片,以专用DDS芯片为实现手段,辅助输入、输出手段,完成程控DDS的设计与制作。
技术指标:
1)最终频率输出范围为10Hz——8MHz(正弦波);
2)外部供电电压+5v、0v;
3)八位LED数码管显示输出频率;
4)输出频率可设置调整(最小设置步长10Hz);
5)主控CPU和芯片自行选择;
6)绘制PCB电路板实现。
工程性要求:
1)三人为一个项目组,由一人当组长;
2)有项目整体设计报告、项目的进度表和最终的测试报告和使用手册;
4)以项目组为考核整体,兼顾小组分工;
5)制作焊接工艺(贴片工艺);
6)整体产品结构合理,使用方便、美观。
3、基本原理
DDS是直接数字式频率合成器(DirectDigitalSynthesizer)的英文缩写。
与传统的频率合成器相比,DDS具有低成本、低功耗、高分辨率和快速转换时间等优点,广泛使用在电信与电子仪器领域,是实现设备全数字化的一个关键技术。
一块DDS芯片中主要包括频率控制寄存器、高速相位累加器和正弦计算器三个部分。
频率控制寄存器可以串行或并行的方式装载并寄存用户输入的频率控制码;而相位累加器根据频率控制码在每个时钟周期内进行相位累加,得到一个相位值;正弦计算器则对该相位值计算数字化正弦波幅度(芯片一般通过查表得到)。
DDS芯片输出的一般是数字化的正弦波,因此还需经过高速D/A转换器和低通滤波器才能得到一个可用的模拟频率信号。
另外,有些DDS芯片还具有调幅、调频和调相等调制功能及片内D/A变换器。
图1DDS基本结构图
4、基本元器件(供参考)
1)DDS芯片——AD9833;
2)CPU板或芯片——8051系列;
3)按键;
4共阴级LED数码管;
5)驱动三极管;
6)电阻电容和连接线若干。
5、测试要求:
1)外接电源+5V、0V;
2)利用示波器测试输出正弦波(1路);
3)输出频率测试(10Hz-8MHz程控可调)。
二、设计框图及电路系统概述
图2系统结构框图
图3设计框图
选用89S51单片机为主控芯片,以专用DDS芯片9833为实现手段,6个按键控制输入、输出,并由8位数码管显示,从而完成程控DDS信号发生器的设计与制作。
三、各单元电路的设计方案及原理说明
AD9833的主要特点如下:
●频率和相位可数字编程;
●工作电压为3V时,功耗仅为20mW;
●输出频率范围为0MHz-12.5MHz;
●频率寄存器为28位(在25MHz的参考时钟下,精度为0.1Hz);
●可选择正弦波、三角波、方波输出;
●无需外界元件;
●3线SPI接口;
●温度范围为-40℃-+105℃。
总体设计原理图:
如图4所示
图4原理图
各部分功能:
⏹一:
LED显示电路:
采用LED显示波形的频率。
⏹二:
CPU控制板或控制电路:
形成扫描码,键值识别、键处理、参数设置;形成显示段码;产生定时中断;形成波形的数字编码,并输出到D/A接口电路和显示驱动电路。
⏹三:
DDS芯片:
用来产生波形,具有调幅、调频和调相等调制功能及片内D/A变换器。
⏹四:
幅度调整:
调整波形的幅度。
⏹五:
键盘输入电路:
用键盘输入,控制电路,用来调节波形输出地频率。
⏹六:
电源指示电路:
提供电源。
图5PCB版图
四、调试过程及结果分析
Protues仿真调试:
如图6所示
图6仿真图
程序清单:
Mian.c
#include
#include
#include
#include"timer.h"
#include"type.h"
#include"workkey.h"
ucharcxzt=0;
voidinitial()
{
P3=0xff;
TMOD=0x11;
TR0=0;
TH0=0xd0;
TL0=0x60;
TR0=1;
ET0=1;
EA=1;
}
voidmain()
{
initial();
while
(1)
{
workkey();
}
}
Timer.c
#include
#include
#include"main.h"
#include"type.h"
#include"timer.h"
#include"workkey.h"
sbitLed0=P1^0;//LED控制脚
sbitLed1=P1^1;
sbitLed2=P1^2;
sbitLed3=P1^3;
sbitLed4=P1^4;
sbitLed5=P1^5;
sbitLed6=P1^6;
sbitLed7=P1^7;
#defineKEYCOUNTER4
ucharxs0;/*8个数码管显示的数值*/
ucharxs1;
ucharxs2;
ucharxs3;
ucharxs4;
ucharxs5;
ucharxs6;
ucharxs7;
ucharwei;
bitkey_control=0;
bitanxia=0;
bitgetkey=0;
ucharkeyCont=0;
ucharkeynum=0;
ucharkeyvalue;
ucharM_key;
ucharkey;
ucharcurr=0;
ucharhalfsecond=0;
ucharsecond=0;
ucharminus=0;
ucharseconds=0;
codeunsignedcharDisplayy[31]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xff,0xbf,0x40,/*0.*/0x79,/*1.*/
0x24,/*2.*/0x30,/*3.*/0x19,/*4.*/0x12,/*5.*/0x02,/*6.*/0x78,/*7.*/0x00,/*8.*/0x10,/*9.*/0x89,/*H*/0xC7,/*L*/};
/*定时器0用于显示*/
voiddujianpan(void);
voidintT0()interrupt1
{
TH0=0xf8;
TL0=0xc0;//20ms
switch(curr)
{
case0:
Led7=0;
Led0=1;
P0=Displayy[xs0];
curr=1;
break;
case1:
Led0=0;
Led1=1;
P0=Displayy[xs1];
curr=2;
break;
case2:
Led1=0;
Led2=1;
P0=Displayy[xs2];
curr=3;
break;
case3:
Led2=0;
Led3=1;
P0=Displayy[xs3];
curr=4;
break;
case4:
Led3=0;
Led4=1;
P0=Displayy[xs4];
curr=5;
break;
case5:
Led4=0;
Led5=1;
P0=Displayy[xs5];
curr=6;
break;
case6:
Led5=0;
Led6=1;
P0=Displayy[xs6];
curr=7;
break;
case7:
Led6=0;
Led7=1;
P0=Displayy[xs7];
curr=0;
break;
}
if(key_control)
dujianpan();
key_control=!
key_control;
}
voiddujianpan(void)
{
ucharM_key;/*键盘数值暂存单元*/
M_key=P2;
M_key&=0xf8;
if(M_key!
=0xf8)/*认为有有效按键按下*/
{
keyvalue=M_key;
keyCont++;
if(keyCont>KEYCOUNTER)
anxia=1;
}
else
{
if(anxia==1)
{
switch(keyvalue)
{
case0xf0:
keynum=JW1;
getkey=1;
break;
case0xe8:
keynum=JW2;
getkey=1;
break;
case0xd8:
getkey=1;
keynum=JW3;
break;
case0xb8:
keynum=JW4;
getkey=1;
break;
case0x78:
keynum=JW5;
getkey=1;
break;
}
anxia=0;
keyCont=0;
}
keyCont=0;
anxia=0;
}
}
Workkey.c
#include
#include
#include
#include"main.h"
#include"type.h"
#include"timer.h"
#include"workkey.h"
ucharxnum;
ucharnum;
ucharzt=0;
bitbzw;
bitblb;
voidchangew(void);
ucharadd(void)
{
if(num==9)
num=0;
elsenum++;
return(num);
}
ucharsub(void)
{
if(num==0)
num=9;
elsenum--;
return(num);
}
voidworkkey(void)
{
if(getkey==1)
{
switch(keynum)
{
case0:
xnum=add();
if(bzw==1)
changew();
break;
case1:
xnum=sub();
if(bzw==1)
changew();
break;
case2:
if(bzw==1)
{
if(zt==7)
{
zt=0;
blb=1;
}
else
{
blb=1;
zt++;
}
}
changew();
break;
case3:
if(bzw==1)
{
if(zt==0)
{
zt=7;
blb=1;
}
else
{
blb=1;
zt--;
}
}
changew();
break;
case4:
bzw=!
bzw;
if(bzw==0)
P3=0xff;
break;
}
getkey=0;
}
}
voidchangew()
{
switch(zt)
{
case0:
if(blb==1)
{
xnum=xs0;
num=xs0;
blb=0;
}
xs0=xnum;
P3=0xfe;
P1=0;
break;
case1:
if(blb==1)
{
xnum=xs1;
num=xs1;
blb=0;
}
xs1=xnum;
P3=0xfd;
break;
case2:
if(blb==1)
{
xnum=xs2;
num=xs2;
blb=0;
}
xs2=xnum;
P3=0xfb;
break;
case3:
if(blb==1)
{
xnum=xs3;
num=xs3;
blb=0;
}
xs3=xnum;
P3=0xf7;
break;
case4:
if(blb==1)
{
xnum=xs4;
num=xs4;
blb=0;
}
xs4=xnum;
P3=0xef;
break;
case5:
if(blb==1)
{
xnum=xs5;
num=xs5;
blb=0;
}
xs5=xnum;
P3=0xdf;
break;
case6:
if(blb==1)
{
xnum=xs6;
num=xs6;
blb=0;
}
xs6=xnum;
P3=0xbf;
break;
case7:
if(blb==1)
{
xnum=xs7;
num=xs7;
blb=0;
}
xs7=xnum;
P3=0x7f;
break;
}
}
五、进度安排
第一周:
根据题目找资料、进行讨论。
设计并开始画电路原理图,protel板图。
答辩、制作PPT.
第二周:
进行软件编程设计。
检查并实现整个实训设计。
整理资料,并完成设计报告。
老师验收设计内容,并上交老师设计报告。
六、心得体会
通过两周的实训使我们学习并了解了DDS信号发生器的原理。
经过软件、硬件的综合调试,所有预定功能均基本完成,能准确地用单片机控制可以实现输出信号类型的选择设置、信号频率数字预设、信号幅度数字可调功能。
在本次试验中虽然遇到很多问题,通过小组成员共同协作,共同解决问题。
最后,感谢老师耐心的辅导与讲解。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 程控 DDS 信号发生器 设计 实现
![提示](https://static.bdocx.com/images/bang_tan.gif)