《基于DDS技术的交流信号发生器设计报告(25页).docx》由会员分享,可在线阅读,更多相关《基于DDS技术的交流信号发生器设计报告(25页).docx(25页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、-基于DDS技术的交流信号发生器设计报告-第 25 页基于DDS技术的的信号产生器设计报告目录摘要2第一章、背景31.1题目要求31.2选题背景3第二章、基本原理及元件42.1设计环境42.2 DDS原理42.3 AD9851芯片功能原理42.4 系统结构设计5第三章、系统设计7 3.1单片机与AD9851的连接7 3.2 信号处理模块电路设计9第四章、实验总结与心得体会15附录:单片机代码16摘 要: 本设计是根据直接数字频率合成 (DDS) 原理,由AD9851为核心的DDS模块和单片机ADUC7026为核心的按键LCD显示控制模块、滤波模块等构成的DDS函数信号发生器,该系统可输出正弦波
2、、方波、三角波和锯齿波,主要思路是由单片机控制芯片AD9851产生固定频率的正弦波,然后通过外部电路进行滤波和整波,分别得到相应频率的方波、三角波和锯齿波。设计过程主要通过软件Multisim 11.0 设计与仿真。关键词: 信号发生器;直接数字频率合成;AD9851 芯片;ADUC7026 单片机第一章、 背景一、 题目及要求:1.计并实现一个由AD9850或AD9851为核心的DDS模块和单片机为核心的按键LCD显示控制模块、滤波模块等构成的DDS函数信号发生器。基本功能:a、产生波形:正弦波、方波、三角波、锯齿波b、频率范围:正弦波为1Hz10MHz,其它波形为1Hz1MHzc、频率分辨
3、率0.1Hzd、幅度范围:20mVp-p10Vp-p;e、可测试外部输入信号的频率。频率测量范围:1 Hz100 MHz;输入信号幅度:100mVp-p10Vp-p扩展功能:a、方波可实现波形占空比可调b、可实现其它更多波形;用户自定义波形的输入与产生c、可实现波形的定频、扫频、2PSK、ASK和FSK等d、提高所设计实现的波形发生器与频率计的量程与精度e、其他功能与性能。2.用C51语言对设计进行描述,并下载到实验板上调试成功。3.按照设计流程,写出设计性实验报告(包括设计环境、硬件电路框图、主要芯片介绍),画出程序流程框图,并打印有注释的源文件。 并谈谈此次实验的收获、感想及建议。二、 选
4、题背景:信号发生器是我们平时做实验时必不可少的器件之一,一台好的信号发生器能为我们做实验带来很多方便。但是当我们在使用信号发生器的时候,几乎没有人去思考它的工作原理,更是有很少人想过要亲自做一个信号发生器出来。市场上一台信号发生器要几百元到几千元不等,而不同价格的波形发生器性能也会有很大的差异,波形发生器的性能会受哪些因素的影响也是一个值得我们去思考的问题。因此,我们组选择这个题目,希望利用我们已学到的知识,亲手做一个信号发生器,同时,也更深一步的探索信号发生器的工作原理。第二章、基本原理及元件1、设计环境:由AD9851为核心的DDS模块和ADuC7026单片机为核心的按键LCD显示控制模块
5、、滤波模块等构成DDS函数信号发生器。2、DDS原理:图1.DDS原理框图DDS即直接数字频率合成器(Direct Digital Synthesizer),是从相位概念出发直接合成所需波形的一种频率合成技术。一个直接数字频率合成器又相位累加器、加法器、波形储存ROM、D/A转换器和低通滤波器(LPF)构成。其原理框图如图1所示:3、 AD9851芯片功能原理:图2.AD9851引脚图AD9851采用CMOS工艺,其功耗在3.3V左右供电所仅为155mW,采用28脚SSOP表面封装形式,其引脚图如图2所示:AD9851芯片的内部组成原理如下图3,虚线内包含了AD9851的主要组成部分。图3.A
6、D9851组成原理图AD9851内含可编程DDS系统和高速比较器,能实现全数字编程控制的频率合成。可编程DDS系统的核心是相位累加器,它由一个加法器和一个N位相位寄存器组成,N一般为2432。每来一个外部参考时钟,相位寄存器便以步长M递加。相位寄存器的输出与相位控制字相加后可输入到正弦查询表地址上。正弦查询表包含一个正弦波周期的数字幅度信息,每一个地址对应正弦波中0360范围的一个相位点。查询表把输入地址的相位信息映射成正弦波幅度信号,然后驱动DAC以输出模式量。相位寄存器每过2N/M个外部参考时钟后返回到初始状态一次,相位地正弦查询表每消费品一个循环也回到初始位置,从而使整个DDS系统输出一
7、个正弦波。输出的正弦波周期To=Tc2N/M,频率fout=Mfc/2N,Tc、fc分别为外部参考时钟的周期和频率。4、系统结构设计硬件部分只要实现对信号的采集、处理、输出以及按键参数的设置和波形参数的显示,其结构框图如下图4:图4.硬件结构框图软件部分主要实现对芯片AD9850的控制,其结构框图如下图5:图5.软件结构框图第三章,系统设计采用单片机控制AD9851产生正弦波,外围积分电路改变波形,幅值及占空比,最后由单片机选择输出波形的方法进行设计。单片机不断扫描键盘,可通过键盘控制波形和频率。外围可变电阻控制幅值及占空比。故本设计硬件主要分为单片机与AD9851连接模块,和外围积分电路模块
8、。软件则主要是AD9851的控制模块,键盘模块,液晶模块。一、 单片机与AD9851连接模块根据官网资料画出如下电路图: 选用30MHZ的有源晶振作为时钟信号,控制信号W_CLK,FQ_UD,RESET,strobe 触发器74HCT574连接芯片,并对这四个信号使用上拉电阻接至电源。另外使用电容对电源进行滤波。通用端口P1连接D7-D0,并行加载控制字,P4.5分配给W_CLK,P4.6分配给FQ_UD,P4.7分配给RESET,P0.1分配给strobe。控制字用五个W_CLK信号分五次加载,然后用FQ_UD更新即可。RESET是复位信号,连接中使用了74HCT574,Strobe触发使得
9、信号确保送达AD9851。 一开始,我们手工焊制了两块电路板,得到波形效果十分不好。于是订制了PCB板,采用altium designer绘制,注意元件布局可以获得更好的效果,比如对电源处理的电容要离电源引脚近一点,晶振离芯片近一点。altium designer我们之前也没有使用过,都是从零开始学习的。覆铜前截图如下:根据AD9851的技术手册,可以得知芯片并行工作的时序如下:在系统时钟(本设计选用了30MHZ)控制下,给芯片5个W_CLK上升沿信号可以依次加载五个八位控制字,W0控制相位,电源,以及工作模式,W1, W2, W3, W4依次是加载频率的高位到低位。加载完控制字,单片机给出一
10、个FQ_UD信号上升沿,即可更新控制字到AD9851寄存器中,之后芯片就可以按照写入的控制字进行工作。软件部分工作较为简单,就是将键盘输入的频率加载到寄存器,注意信号时序即可。这部分难点在于硬件电路的焊接,由于芯片较小,容易烧坏,以及工作频率较高等原因,对于电路的焊接技术提出了较高的要求。(单片机代码见附录)二、信号处理模块电路设计:1外部信号处理模块基本原理及框图外部信号处理模块主要完成对DDS芯片所产生的正弦波进行整波、变波以得到所需要波形的功能,起主要原理是先对DDS芯片所产生的正弦波进行放大,得到一定幅值的正弦波,将此正弦波接入比较器可以产生相同频率的方波,对方波进行占空比和偏置的调整
11、后,通过积分电路,可以产生相应的三角波和锯齿波;对得到的正弦波、方波、三角波和锯齿波进行选择后接入调幅电路可以得到可调幅值的正弦波,方波,三角波或者锯齿波。其原理框图如下图6所示:图6.原理框图2.各模块电路设计与仿真结果1)正弦波整波模块该模块是一个由运放组成的放大电路,其功能一方面将AD9851芯片输出的电流信号转化为电压信号,另一方面是得到峰-峰值为1V的正弦波信号,其电路图及参数如下图所示:该模块仿真波形如下图所示:2)方波产生模块该模块包括一个比较器电路和一个运算放大电路,其中比较器电路用以将正弦波转化为方波,同时可以调节方波的占空比;运算放大电路用以将得到的方波进行一定的放大,以得
12、到一定幅值的方波,同时可以给方波增加一个直流偏置,其电路图如下图所示:由正弦波得到方波的仿真波形如下图所示:3)三角波和锯齿波产生模块该模块包括一个可选电容积分电路和一个可选电阻放大电路组成;其中,积分电路的作用是由方波积分得到三角波或者改变方波的占空比和偏置后积分得到锯齿波,积分电容有一个7选1电路进行选择,对于不同的频率段,选择不同的电容进行积分;选择电路有CD4051芯片组成;放大电路的作用是为了补偿因频率变化而导致幅值的变化,以得到幅值比较稳定的三角波或锯齿波,同样使用CD4051芯片组成八选一电路,其电路图如下图所示:由正弦波得到三角波的仿真波形如下图:由正弦波得到锯齿波的仿真波形如
13、下图所示:4)幅值调节模块该模块主要是由运放组成的可变倍数放大电路,对输入的峰-峰值为1V的正弦波、方波、三角波或锯齿波进行放大或是衰减,以调节最终输出波形的幅值,其输入端为二选一电路,由模拟单刀双掷开关ADG849实现,当需要峰-峰值小于1V时,开关置于衰减端,即端口1,当需要峰-峰值大于1V时,开关置于放大端,即端口2,然后通过调节反馈电阻的阻值,就能够达到调节波形峰-峰值的目的;其设计电路图如下图所示:5)整机电路图:附录:单片机代码主函数:#include ./lcd/AD9851.h#include ./lcd/keyb.h#include irq_arm.c#include ./l
14、cd/OCM12864.hint main(void) uchar k ; lcd_initial(); clear_screen(0); disp_chn(10,0,4); / 正 disp_chn(30,0,5); / 弦 disp_chn(50,0,6); / 波 disp_str(80,3, HZ); / HZ disp_str(80,5, V); / V writecom_AD(); while(1) kbscan(); keyshow();AD9851模块:头文件ad9851.h#ifndef _AD9851#define _AD9851typedef unsigned char
15、uchar;typedef unsigned long int ulint;#define ad_data_out GP1DAT /P1#define ad_data_in (char)(GP1DAT & 0x000000FF)#define ocm_DOUT_EN GP1DAT=(GP1DAT|0xFF000000)#define ocm_DIN_EN GP1DAT=(GP1DAT&0x00FFFFFF)#define set_W_CLK() GP4DAT=(GP4DAT|0x20200000)/P4.5#define clear_W_CLK() GP4DAT=(GP4DAT|0x20000
16、000)&(0x00200000)#define set_FQ_UD() GP4DAT=(GP4DAT|0x40400000)/P4.6#define clear_FQ_UD() GP4DAT=(GP4DAT|0x40000000)&(0x00400000)#define set_RESET() GP4DAT=(GP4DAT|0x80800000)/P4.7#define clear_RESET() GP4DAT=(GP4DAT|0x80000000)&(0x00800000)#define strobe() GP0DAT=(GP0DAT|0x02020000)/P0.1#define cle
17、arstrobe() GP0DAT=(GP0DAT|0x02000000)&(0x00020000)/*函数声明*/void delay_AD(unsigned int i);void chang_AD(ulint t);void writecom_AD(void);#endif#includeOCM12864.h#include AD9851.hextern float Fin;/*f是输出的频率*/*32位控制字为:Fm=(f*0xFFFFFFFF)/内部时钟*/ulint Fm=0x00000000;uchar adtab =0x01,0x00,0x09,0x00,0x00;/*(w0)
18、(w4 w3 w2 w1) 高-低*/ /*ad9851延时函数*/void delay_AD(unsigned int i) while(i-);/*分解32位数据为四个字节*/void chang_AD(unsigned long int t) unsigned long int *i; i=&t; adtab1=(char)*i; adtab2=(char)*(i+1); adtab3=(char)*(i+2); adtab4=(char)*(i+3);void writecom_AD(void) uchar i; Fm=(Fin*0xFFFFFFFF)/12000000); clear
19、strobe(); clear_FQ_UD(); delay_AD(1); clear_W_CLK(); delay_AD(1); set_RESET(); strobe(); delay_AD(1);/上电复位一次 clearstrobe(); clear_RESET(); strobe(); delay_AD(1); chang_AD(Fm); for(i=0;i5;i+) clearstrobe(); clear_W_CLK(); strobe(); clearstrobe(); ad_data_out=(adtabi0;i-);/*键盘扫描*/void kbscan(void) uin
20、t temp,hang0=5,lie0=5; kbdata=0x0f0000f0; if(kbdata!=0x0f0000f0) delayms(25); kbdata=0x0f0000f0; if(kbdata!=0x0f0000f0) /判断行 keypressed=1; temp=kbdata; switch(temp&0x0f0000f0) case 0x0f000070: lie0=3; break; case 0x0f0000b0: lie0=2; break; case 0x0f0000d0: lie0=1; break; case 0x0f0000e0: lie0=0; bre
21、ak; else keypressed=0; kbdata=0xf000000f; if(kbdata!=0xf000000f) keypressed=1; temp=kbdata; switch(temp&0xf000000f) case 0xf000000e: hang0=0; break; case 0xf000000d: hang0=1; break; case 0xf000000b: hang0=2; break; case 0xf0000007: hang0=3; break; else keypressed=0; if(hang=hang0)&(lie=lie0) keypres
22、sed=0; else hang=hang0; lie=lie0; keyvalue=keytabhanglie;/*按键显示*/void keyshow(void) int i=0,j=0; / int flag=0; if(keypressed) switch(keyvalue) case 0x00: disp_word(10+keyi*7,3,0); /0 keyinputkeyi=0; if(keyi9) keyi+; break; case 0x01: disp_word(10+keyi*7,3,1); /1 keyinputkeyi=1; if(keyi9) keyi+; brea
23、k; case 0x02: disp_word(10+keyi*7,3,2); /2 keyinputkeyi=2; if(keyi9) keyi+; break; case 0x03: disp_word(10+keyi*7,3,3); /3 keyinputkeyi=3; if(keyi9) keyi+; break; case 0x04: disp_word(10+keyi*7,3,4); /4 keyinputkeyi=4; if(keyi9) keyi+; break; case 0x05: disp_word(10+keyi*7,3,5); /5 keyinputkeyi=5; i
24、f(keyi9) keyi+; break; case 0x06: disp_word(10+keyi*7,3,6); /6 keyinputkeyi=6; if(keyi9) keyi+; break; case 0x07: disp_word(10+keyi*7,3,7); /7 keyinputkeyi=7; if(keyi9) keyi+; break; case 0x08: disp_word(10+keyi*7,3,8); /8 keyinputkeyi=8; if(keyi9) keyi+; break; case 0x09: disp_word(10+keyi*7,3,9);
25、/9 keyinputkeyi=9; if(keyi9) keyi+; break; case # : disp_word(10+keyi*7,3,.); /. keyinputkeyi=.; if(keyi9) keyi+; break; case * : for(i=0;i10;i+) disp_str(10+i*7,3, ); keyi=-1; break; case a : keya+; if(keya=4) keya=0; if(keya=0) disp_chn(10,0,4); / 正 disp_chn(30,0,5); / 弦 disp_chn(50,0,6); / 波 brea
26、k; else if(keya=1) disp_chn(10,0,7); / 方 disp_str(30,0, ); disp_str(35,0, ); disp_str(40,0, ); disp_chn(50,0,6); / 波 break; else if(keya=2) disp_chn(10,0,8); / 三 disp_chn(30,0,9); / 角 disp_chn(50,0,6); / 波 break; else if(keya=3) disp_chn(10,0,10); / 锯 disp_chn(30,0,11); / 齿 disp_chn(50,0,6); / 波 bre
27、ak; case b : keyb+; if(keyb=3) keyb=0; if(keyb=0) disp_str(80,3, HZ); break; else if(keyb=1) disp_str(80,3,KHZ); break; else if(keyb=2) disp_str(80,3,MHZ); break; case c : keyc+; if(keyc=2) keyc=0; if(keyc=0) clear_screen(0);disp_chn(10,0,4); / 正 disp_chn(30,0,5); / 弦 disp_chn(50,0,6); / 波 disp_str(
28、80,3, HZ); / HZ disp_str(80,5, V); / V else if(keyc=1) clear_screen(0); disp_str(80,3, HZ); / HZ break; case d : keyi=-1; for(i=0;i0;i-) Fin=Fin+keyinputi*(10(j-i); Fin=Fin+keyinputj+2/10; Fin=Fin*(10keyb); / writecom_AD(); break; keypressed=0; keyvalue=0;液晶模块:头文件:OCM12864.h#ifndef _OCM12864#define
29、_OCM12864#include ./main.htypedef unsigned char uchar;typedef unsigned int uint;#define lcddata_out GP3DAT /P3#define lcddata_in (char)(GP3DAT & 0x000000FF)#define LCD_DOUT_EN GP3DAT=(GP3DAT|0xFF000000)#define LCD_DIN_EN GP3DAT=(GP3DAT&0x00FFFFFF)#define set_rs() GP4DAT=(GP4DAT|0x01010000)/P4.0 A0#d
30、efine clear_rs() GP4DAT=(GP4DAT|0x01000000)&(0x00010000)#define set_rw() GP4DAT=(GP4DAT|0x02020000) /P4.1#define clear_rw() GP4DAT=(GP4DAT|0x02000000)&(0x00020000)#define set_en() GP4DAT=(GP4DAT|0x04040000) /P4.2#define clear_en() GP4DAT=(GP4DAT|0x04000000)&(0x00040000)#define set_cs() GP4DAT=(GP4DA
31、T|0x08080000)/P4.3#define clear_cs() GP4DAT=(GP4DAT|0x08000000)&(0x00080000)#define set_reset() GP4DAT=(GP4DAT|0x10100000)/P4.4#define clear_reset() GP4DAT=(GP4DAT|0x10000000)&(0x00100000)/*函数声明*/void LCD_Delay(unsigned long v);void check_busy(void);void write_data(unsigned long dat);void write_comm
32、and(unsigned long command);void reset(void);void clear_screen(uchar m);void lcd_initial(void);void set_page_address(uchar page);void set_colume_address(uchar colume);void disp_word(uchar col,uchar pag,uchar ascii);void disp_chn(uchar col,uchar pag,uchar ascii);void disp_str(uchar col,uchar page,ucha
33、r *cn);void setpoint(uchar x,uchar y);void point(uchar x,uchar y);void disp_bmp( uchar const *puts );void shuxian(uchar n,uchar e,uchar f);void hengxian(uchar k);void delaynum(unsigned char num);#endif#includeOCM12864.h/*将字符生产软件得到的每个汉字的32个字符依次存于tab表中*/*用PCtoLCD2002软件设置列行式和顺向输出得到对于汉字字符串*/const uchar
34、tab13*32= /*- 宋体16*16; 此字体下对应的点阵为:宽x高=16x16 -*/0x00,0x00,0x1F,0x11,0x11,0x11,0x11,0xFF,0x11,0x11,0x11,0x11,0x1F,0x00,0x00,0x00,0x00,0x00,0xF8,0x10,0x10,0x10,0x10,0xFE,0x11,0x11,0x11,0x11,0xF9,0x01,0x0F,0x00,/*电,0*/0x00,0x20,0x20,0x20,0x20,0x20,0x20,0x3F,0x20,0x20,0x20,0x20,0x20,0x20,0x00,0x00,0x04,0
35、x04,0x04,0x04,0x04,0x04,0x04,0xFC,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x00,/*工,1*/0x00,0x20,0x20,0x20,0xFF,0x2A,0x2A,0x2A,0x2A,0x2A,0xFF,0x20,0x20,0x20,0x00,0x00,0x88,0x88,0x91,0xA1,0xC9,0x89,0x89,0xBF,0x89,0x89,0xC9,0xA1,0x91,0x88,0x88,0x00,/*基,2*/0x04,0x04,0x04,0xFF,0x04,0x04,0x01,0x1F,0x01,0x02,0x
36、FF,0x04,0x08,0x0F,0x00,0x00,0x08,0x0C,0x08,0xF0,0x10,0x10,0x00,0xFC,0x02,0x02,0xFA,0x42,0x22,0xC2,0x1E,0x00,/*地,3*/0x00,0x40,0x40,0x43,0x40,0x40,0x40,0x40, 0x7f,0x41,0x41,0x41,0x41,0x41,0x40,0x00, 0x04,0x04,0x04,0xfc,0x04,0x04,0x04,0x04, 0xfc,0x04,0x04,0x04,0x04,0x04,0x04,0x00,/*正,4*/0x40,0x4f,0x48,0x48,0x7c,0x00,0x20,0x21, 0x22,0xad,0x61,0x21,0x27,0x22,0x20,0x00, 0x80,0xc4,0x82,0x81,0xfe,0x00,0x84,0x8e, 0x94,0xa4,0x44,0x84,0x14,0x0e,0x04,0x00,/*弦”,5*/ 0x08,0x06,0x80,0x60,0x00,0x1f,0x11,0x11, 0x11,0xff,0x11,0x11,0x11,0x18,0x10,0x00, 0x06,0x0c,0x31,0x02,0x0c,0xf1,0x01,0x82, 0x64,0x18,0x18,0x6