基于DDS的基本原理设计的低频信号发生器
- 格式:doc
- 大小:701.35 KB
- 文档页数:14
摘要本课程设计是基于DDS的基本原理设计的低频信号发生器。
以AT89C51单片机为核心。
通过R-2R网络作为数模转换器件,将已经生成的数字信号进行数模转换,最终实现模拟信号的输出。
本次课程设计使用了KILE软件对程序进行编译和PROTEUS软件对实验电路和结果进行仿真,波形的产生和相应的频率由软件编程来实现;波形类型选择和频率大小由按键来控制输出的信号经过滤波放大最后由输出终端输出。
这个信号发生器最终可以产生正弦波、三角波、方波、锯齿波。
关键词:信号发生器;AT89C51;R-2R;DDS目录1引言 (3)1.1设计目的 (3)1.2设计要求 (3)2 设计方案和原理 (3)2.1设计原理 (3)2.2主程序设计 (4)2.3设计思想 (5)3 硬件设计 (5)3.1硬件原理框图 (5)3.2资源分配 (6)3.3振荡器特性 (6)3.4芯片擦除 (6)3.5 R-2R网络 (6)3.6电路结构及原理 (7)4 软件设计 (7)4.1正弦波程序设计 (7)4.2三角波程序设计 (8)4.3方波程序设计 (8)4.4锯齿波程序设计 (8)5 仿真及调试 (9)5.1 R-2R网络的仿真 (9)5.2仿真结果 (9)6 总结 (10)7 参考文献 (11)附录1 在PROTEUS下面的仿真图 (11)附录2源程序 (11)基于51单片机的函数信号发生器1引言1.1设计目的波形发生器是信号源的一种,主要给被测电路提供所需要的已知信号(各种波形),然后用其它仪表测量感兴趣的参数。
可见信号源在各种实验应用和试验测试处理中,它的应用非常广泛。
它不是测量仪器,而是根据使用者的要求,作为激励源,仿真各种测试信号,提供给被测电路,以满足测量或各种实际需要。
1.2设计要求本文是做基于R-2R网络的低频信号发生器的设计,将采用编程的方法来实现三角波、锯齿波、矩形波、正弦波的发生。
根据设计的要求,对各种波形的频率和幅度进行程序的编写,并将所写程序装入单片机的程序存储器中。
在程序运行中,当接收到来自外界的命令,需要输出某种波形时再调用相应的中断服务子程序和波形发生程序,经电路的数/模转换器和运算放大器处理后,从信号发生器的输出端口输出。
制作低频信号发生器可以用八位的R-2R网络作为DA转换器来实现,将输出的模拟量通过低通滤波器,即可得到频率稳定、失真度小的波形。
2 设计方案和原理2.1设计原理数字信号可以通过数/模转换器转换成模拟信号,因此可通过产生数字信号再转换成模拟信号的方法来获得所需要的波形。
89C51单片机本身就是一个完整的微型计算机,具有组成微型计算机的各部分部件:中央处理器CPU、随机存取存储器RAM、只读存储器ROM、I/O接口电路、定时器/计数器以及串行通讯接口等,只要将89C51再配置键盘及其接口、数模转换及波形输出等部分,即可构成所需的波形发生器,其信号发生器构成原理框图如图1。
图1 信号发生器原理框图89C51是整个波形发生器的核心部分,通过程序的编写和执行,产生各种各样的信号,并从键盘接收数据,进行各种功能的转换和信号幅度的调节。
当数字信号经过接口电路到达转换电路,将其转换成模拟信号也就是所需要的输出波形。
2.2主程序设计整个设计的流程图如图2。
图2主程序流程图本设计过程中主要实现利用按键来控制不同波形的输出,当按键KEY1按下1次时,信号发生器就输出正弦波;当按键KEY1按下2次时,信号发生器就输出三角波;当按键KEY1按下3次时,信号发生器就输出方波;当按键KEY1按下4次时,信号发生器就输出锯齿波。
通过按键可以以任意循环方式输出不同波形。
按键KEY4按下时复位。
2.3设计思想(1)利用单片机产生方波、正弦波、三角波和锯齿波等信号波形,信号的频率和幅度可变。
(2)将一个周期的信号分离成256个点(按X 轴等分),每两点之间的时间间隔为∆T ,用单片机的定时器产生,其表示式如下式1所示。
256/T T =∆ (1)如果单片机的晶振为12MHz ,采用定时器方式0,则定时器的初值如下式2所示。
m e c T T X /213∆-= (2) 定时时间常数如下式3和4所示。
)256/(X MOD TL = (3)256/X TH = (4)MOD32表示除32取余数。
(3)正弦波的模拟信号是D/A 转换器的模拟量输出,其计算公式如下式5所示。
)1(s i n 2+∆=t A Y (5) 其中(A=VREF ∆t=N ∆T N=1~256)那么对应着存放在计算机里的这一点的数据如下式所示。
2)2551(sin /)256(⨯+∆=⨯=t A Y Di (6) (4)一个周期被分离成256个点,对应的四种波形的256个数据存放在以TAB1--TAB4为起始地址的存储器中。
3 硬件设计3.1硬件原理框图硬件原理方框图如图3。
89C51是整个低频信号发生器的核心部分,通过程序的编写和执行,产生各种各样的信号,并从键盘接收数据,进行各种功能的转换和信号幅度的调节。
当数字信号经过接口电路到达转换电路,将其转换成模拟信号也就是所需要的输出波形。
其工作原理为当分别每按下按键一次就会分别出现正弦波、三角波、方波、锯齿波。
图3硬件原理框图3.2资源分配软、硬件设计是设计中不可缺少的,为了满足功能和指标的要求,资源分配如下:(1)晶振采用12MHZ;(2)内存分配(4K字节的ROM用来存储软件程序);(3)P0口与R-2R网络的八位数据输入端相连;(4)P1口用来接按键(key1、key2、key3)。
3.3振荡器特性XTAL1和XTAL2分别为反向放大器的输入和输出。
该反向放大器可以配置为片内振荡器。
石晶振荡和陶瓷振荡均可采用。
如采用外部时钟源驱动器件,XTAL2应不接。
输入至内部时钟信号要通过一个二分频触发器,因此对外部时钟信号的脉宽无任何要求,但必须保证脉冲的高低电平要求的宽度。
3.4芯片擦除整个EPROM阵列和三个锁定位的电擦除可通过正确的控制信号组合,并保持ALE管脚处于低电平10ms 来完成。
在芯片擦操作中,代码阵列全被写“1”且在任何非空存储字节被重复编程以前,该操作必须被执行。
此外,AT89C51设有稳态逻辑,可以在低到零频率的条件下静态逻辑,支持两种软件可选的掉电模式。
在闲置模式下,CPU停止工作。
但RAM,定时器,计数器,串口和中断系统仍在工作。
在掉电模式下,保存RAM的内容并且冻结振荡器,禁止所用其他芯片功能,直到下一个硬件复位为止。
3.5 R-2R网络由于单片机产生的是数字信号,要想得到所需要的波形,就要把数字信号转换成模拟信号,本文所使用的N位电压型R-2R梯形电阻网络。
应用R-2R电阻网络实现DAC 功能,其优点是成本低、结构简单、分辨率高、容易实现、响应速度快,其电路结构及原理如下所述。
3.6电路结构及原理图4为T型R-2R网络。
(1)电阻网主要由R和2R两种电阻呈T型构成。
(2)模拟开关由两级CMOS反相器产生两路反相信号,各自控制一个NMOS 开关管,实现模拟单刀双掷的开关功能。
(3)读出电路是一个求和放大器。
(4)基准源V R 。
V图4 T形R-2R电阻网络4 软件设计软件设计上,根据功能分了几个模块编程。
模块主要有:主程序模块、正弦波模块、三角波模块、方波模块、锯齿波模块等。
4.1正弦波程序设计正弦波产生的程序如下:if(fun==1){D1=tosin[b];b++;}程序中的tosin[b]是正弦波的采样表,其包含了在一个周期内,正弦波的256个采样值。
生成码表的过程中要注意四舍五入和溢出的问题,既可以采用等时间间隔而采样点数不同的方法,也可以使用采样点数相同改变采样间隔的方法。
码表和采样间隔等相关数据可以固化在FLASH 中,也可以由上位机或其它微控制器把数据生成后通过UART 接口下载到单片机中,单片机把数据存储到EPROM 中,每次上电时读入到RAM中,以加快执行速度。
4.2三角波程序设计三角波产生首先将D1口地址至为0000H,通过A中数值的加一递升,当A 中的内容与0FFH相等时,A中的内容减一递减,从而循环产生三角波。
程序如下:If(fun==2){If(c<128) D1=c;else D1=255-c;c++;}4.3方波程序设计方波产生首先将D1口地址至为0000H,当A中的内容为0时,输出对应模拟量,然后延时,当A中的内容为0FFH时,同样输出对应模拟量,再延时,从而得到方波。
程序如下:If(fun==3){d++;if(d<=128) D1=0X00;else D1=0X80;}4.4锯齿波程序设计锯齿波产生首先将D1口地址至为0000H,通过A中数值的加一递升,当A 中的内容为255时,延时一段时间,再通过A中的内容减一递减,当A的内容减至0时,延时一段时间,从而循环产生锯齿波。
5 仿真及调试5.1 R-2R网络的仿真本次设计中采用八位的R-2R网络,如图5,由于使用电阻网络作DAC 其输出电阻较高,实际使用中输出端还有跟随器以及低通滤波器。
5.2仿真结果在仿真的过程中,图像较清晰的显示了调频的各个过程,如截图所示。
图6至图9均是本信号源可得到的部分频率。
图5 八位R-2R网络在本次仿真中,运用256点15HZ的正弦信号采样生成的码表,间距为1/256*15=260us,信号源所用的芯片的机器周期为1us(系统时钟为12MHz),可求出定时器的初值是65276,当定时器计到65536 时会溢出,即中断产生。
按此初值设定后,得到图6至9,观察图形,波形的周期约为72.00ms,频率约为14HZ。
比较二者的数值可知结果几乎相等,所以证实了该设计较为精确。
按键2和3分别对应于频率增加和减小,按键1用于转化波形。
图6正弦波图7 三角波图8 方波图9锯齿波6 总结通过这一周多的单片机课程设计,我们将理论学习的知识运用到实践中去,对单片机有了更深刻的认识。
我还学会了对kile和proteus软件的使用。
课程设计中也遇到了很多困难,对程序不能够很好的编译和使用,通过老师和同学们的指导最后完成这次课程设计。
我感觉到现在学习的知识和生活的练习越来越紧密,以后我将加强对理论知识的学习。
7 参考文献[1]王思明.单片机原理及应用系统设计[M].北京:科学出版社,2012,70-378.[2] 谭浩强.C 程序设计[M]. 北京:清华大学出版社,2002,128-148.附录1 在PROTEUS下面的仿真图附录2源程序#include <reg52.h>#include <stdio.h>#include <absacc.h>#define D1 P0#define uchar unsigned charsbit keyn0=P1^0; //波形选择键sbit keyn1=P1^1; //频率加键sbit keyn2=P1^2; //频率减键uchar code tosin[256]={ //正弦波数据表0x80,0x83,0x86,0x89,0x8d,0x90,0x93,0x96,0x99,0x9c,0x9f,0xa2,0xa5,0xa8,0xab,0xae ,0xb1,0xb4,0xb7,0xba,0xbc,0xbf,0xc2,0xc5,0xc7,0xca,0xcc,0xcf,0xd1,0xd4,0xd6,0xd8,0xda,0xdd,0xdf,0xe1,0xe3,0xe5,0xe7,0xe9, 0xea,0xec,0xee,0xef,0xf1,0xf2,0xf4,0xf5,0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc,0xfd,0xfd,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x ff,0xff,0xff,0xff,0xff,0xfe,0xfd,0xfd,0xfc,0xfb,0xfa,0xf9,0xf8,0xf7,0xf6,0xf5,0xf4,0xf2,0xf1,0xef,0xee,0xec,0xea,0xe 9,0xe7,0xe5,0xe3,0xe1,0xde,0xdd,0xda,0xd8,0xd6,0xd4,0xd1,0xcf,0xcc,0xca,0xc7,0xc5,0xc2,0xbf,0xbc,0xba,0xb7,0xb4,0xb1, 0xae,0xab,0xa8,0xa5,0xa2,0x9f,0x9c,0x99,0x96,0x93,0x90,0x8d,0x89,0x86,0x83,0x80,0x80,0x7c,0x79,0x76,0x72,0x6f,0x6c,0x6 9,0x66,0x63,0x60,0x5d,0x5a,0x57,0x55,0x51,0x4e,0x4c,0x48,0x45,0x43,0x40,0x3d,0x3a,0x38,0x35,0x33,0x30,0x2e,0x2b,0x29,0x2 7,0x25,0x22,0x20,0x1e,0x1c,0x1a,0x18,0x16,0x15,0x13,0x11,0x10,0x0e,0x0d,0x0b,0x0a,0x09,0x08,0x07,0x06,0x05,0x04,0x03,0x0 2,0x02,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x02,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x 09,0x0a,0x0b,0x0d,0x0e,0x10,0x11,0x13,0x15,0x16,0x18,0x1a,0x1c,0x1e,0x20,0x22,0x25,0x27,0x29,0x2b,0x2e,0x30,0x33,0x35,0x3 8,0x3a,0x3d,0x40,0x43,0x45,0x48,0x4c,0x4e,0x51,0x55,0x57,0x5a,0x5d,0x60,0x63,0x66,0x69,0x6c,0x6f,0x72,0x76,0x79,0x7c,0x8 0 };uchar fun=0,b=0,c=0,d=0,e=0,tl,th;void key1(void); //波形选择void key2(void); //频率加void key3(void); //频率减void keyscan(void); //按键扫描delay1ms(unsigned int ); //延时void main(void) //主程序{TMOD=0X01;TR0=1;th=0xfe;tl=0xfc;TH0=th;TL0=tl;ET0=1;EA=1;while(1){keyscan();}}/*************1ms delay**********/delay1ms(unsigned int t){unsigned int i,j;for(i=0;i<t;i++)for (j=0;j<120;j++);}void keyscan(){if(keyn0==0){delay1ms(10);while(keyn0==0);key1();}if(keyn1==0){delay1ms(10);while(keyn1==0);key2();}if(keyn2==0){delay1ms(10);while(keyn2==0);key3();}}void key1(void) //1键选择发波类型,1为正弦波,2为三//角波,3为方波{fun++;if(fun==5)fun=0x00;}void key2(void) //2键加大频率{tl=tl+5;if(tl==0x1f)th++;}void key3(void) //3键减小频率{tl=tl-5;if(tl==0x00)th--;}void time0_int(void) interrupt 1 //中断服务程序{TR0=0;if(fun==1){D1=tosin[b]; //正弦波b++;}else if(fun==2) //三角波{if(c<128)D1=c;else D1=255-c;c++;}else if(fun==3) //方波{d++;if(d<=128)D1=0x00;else D1=0x80;}else if(fun==4) //锯齿波{D1=e;e++;}TH0=th;TL0=tl;TR0=1;}。