信号发生器设计分析.ppt
信号发生器设计分析信号发生器设计分析信号发生器是一种常用的信号源,广泛应用于科学研究、生产实践和教学实验等领域。特别是在通信系统的科研实验中,常常需要用到多种不同频率和相位的信号,因此多功能信号发生器应用非常广泛。本章采用单片机编程的方法设计信号发生器,可以产生方波、正弦波、三角波、和锯齿波等信号。由于通过编程方法产生的是数字信号,所以信号的稳定性和精确度很高,电路简洁,并且可以通过改变程序来实现信号的频率变换。11.3 硬件电路设计下面从硬件电路着手对信号发生器进行设计,主要包括主控模块、信号数据处理模块和显示电路的设计。11.3.1 主控模块设计1RF-X1开发板(STC89C52)最小系统RF-X1开发板(STC89C52)的最小系统包括时钟振荡电路和复位电路。(1)时钟振荡电路时钟振荡电路为单片机提供各种微操作的时间基准,STC89S52片内设有一个由反向放大器所构成的震荡电路,所以外部只要连接一个晶振和两个电容即可。具体电路如图11-2所示,电容C1、C2起稳定震荡频率,快速起振的作用,电容值一般为533pF。本设计采用22pF的电容和12MHz的晶振。(2)复位电路复位控制信号在STC89S52的第9管脚输入,当在此引脚输入高电平并保持2个机器周期时,单片机内部就执行复位操作。在本设计中,复位电路由按键复位和上电复位组成,STC89S52单片机为高电平复位,通常在复位引脚RST上连接一个电容到VCC,在连接一个电阻到GND,由此形成一个RC充放电回路保证单片机在上电时RST脚上有足够时间的高电平进行复位,随后回归到低电平进入正常工作状态。当单片机已运行时,也可以通过按下复位键使RST持续一段时间的高电平,实现复位操作。本设计采用10F电容和10K的电阻。2 键盘控制电路RF-X1开发板提供了一个3*4的矩阵键盘和6个独立按键。但是6个独立按键与P3口进行连接,与TLC5615(数模转换)的连接相冲突,所以这里采用矩阵键盘。矩阵键盘的行信号分别接P1.0P1.3,列信号分别接P1.4P1.6,识别按键的方法是:先让P1.0输出低电平,检测P1.4P1.6,如果在某个时刻为低电平,则可确定第一行的哪个按键被按下,接着让P1.1输出低电平(其他都为高电平),检测列的电平,为低则被按下,依次就可以确定按键号了。键盘控制电路如图11-3所示。本设计采用了矩阵键盘中的6个按键,在系统工作时,STC89C52不断的扫描键盘,看是否有键按下,如有,则根据相应按键作出反应。其中按键“S7”代表正弦波输出,按键“S11”代表锯齿波输出,按键“S15”代表三角波输出,按键“S8”代表方波输出,按键“S12”为频率选择键,可选择输出100Hz和500Hz的信号,按键“S16”为波形幅度调节键,幅度范围为15V。11.3.2 信号数据处理模块设计1数模转换电路(1)TLC5615数模转换电路由于单片机产生的是数字信号,要想得到所需的波形,就要把数字信号转换成模拟信号。为了得到较高的设计精度,RF-X1开发板采用了一个10位的DAC芯片TLC5615。TLC5615具有接口连接简单、转换速率快、微功耗等特点,并且输出的最大电压可以达到基准输入电压的2倍。8脚直插式TLC5615各引脚功能如下:DIN:串行二进制数输入端;AGND:模拟地;SCLK:串行时钟输入端;REFIN:基准电压输入端;CS非:芯片选择,低电平有效;OUT:DAC模拟电压输出端;DOUT:用于级联的串行数据输出;VCC:工作电压输入端,+5V;将STC89C52的P3口与TLC5615相连,构成DAC电路如图11-4所示。用P3.5触发片选CS非使DAC进如工作状态,P3.6模拟串行时钟与SCLK连接,待转换的二进制数从P3.7输出到TLC5615的数据输入端DIN,进行数模转换。图图11-4 TLC561511-4 TLC5615硬件电路硬件电路(2)TLC5615的工作原理为了使TLC5615能够正常稳定的工作,编程时必须掌握它的工作时序和工作方式。1)TLC5615的工作时序TLC5615的工作时序如图11-5所示。从图中可以看出,只有当片选CS非为低电平时,串行输入数据才能被移入16位移位寄存器。当CS非为低电平时,在每一个SCLK时钟的上升沿将DIN的一位数据移入16位移位寄存器。注意,二进制最高有效位被导前移入。然后,在CS非的上升沿将16位移位寄存器的10位有效数据锁存于10位DAC寄存器,供DAC电路进行转换;当片选CS非为高电平时,串行输入数据不能被移入16位移位寄存器。此外,CS非的上升和下降都必须发生在SCLK的低电平期间。图11-5 TLC5615时序图2)TLC5615的工作方式TLC5615的内部功能框图如图11-6所示,主要由16位移位寄存器、10位DAC寄存器、10位DAC电路、电压跟随器、2电路和控制电路等部分组成,它有两种工作方式。第一种是串行工作方式,从图中可以看出,16位移位寄存器分为高4位虚拟位、低2位填充位和10位有效位。在TLC5615工作时,只需要向16位移位寄存器按先后顺序输入10位有效位和2位填充位即可,2位填充位数据任意,即12位数据序列。第二种是级联方式,即16位数据序列,可以将本片TLC5615的DOUT接到下一片TLC5615的DIN,需要向16位移位寄存器按先后顺序输入高4位虚拟位、10位有效位和低2位填充位,由于增加了高4位虚拟位,所以需要16个时钟脉冲。但是,无论TLC5615工作在那一种方式,输出电压:其中,VREFIN是参考电压,N为输入的二进制数。图11-6 TLC5615的内部功能框图2滤波放大电路设计经TLC5615数模转换后,可得到比较准确的15V的模拟电压输出,可以达到设计要求。若想得到更加宽泛的信号电压输出范围,可以通过运算放大器进行放大。常用的运放种类很多,如OP07、LM324、LM258等。本设计采用了具有低失调、高开环增益特性的OP07,其各引脚功能如下:Offset Null 1:偏置平衡(调零端);Offset Null 2偏置平衡(调零端);Inverting Input:反向输入端;VCC+:电源;Non-inverting Input:同向输入端;Output:信号输出端;VCC-:接地端;N.C.:空脚;由数模转换电路输出的模拟电压信号通过R56进入OP07反向端,构成了反向放大电路如图11-7所示。图11-7 OP07运算放大电路11.3.3 11.3.3 显示电路设计显示电路设计显示电路用来显示波形信号的频率,使波形信号更加直观。在此选用可显示两行字符的LCD1602就可以满足设计要求,RF-X1开发板为LCD1602提供了接口(见开发板插口J24),与单片机P1口相连接,但与矩阵键盘接口相冲突,所以在此将LCD1602的数据口改接到单片机的P0口。其电路连接图如图11-8所示,LCD1602引脚说明如表11-1所示。此外,由于52单片机P0口内部是开漏的,不管驱动能力多大,都相当于它是没有电源的,而LCD显示屏是需要电源驱动才能点亮的。因此,在这里需要外接上拉电阻来提供驱动电源。表11-1 LCD1602引脚说明编号编号符号符号引脚说明引脚说明编号编号符号符号引脚说明引脚说明0VSS电源地8D2Data I/O1VDD电源正极9D3Data I/O2VL液晶显示偏压信号10D4Data I/O3RS数据/命令选择端(H/L)11D5Data I/O4R/W读写选择端(H/L)12D6Data I/O5E使能信号13D7Data I/O6D0Data I/O14BLA背光源正极背光源正极7D1Data I/O15BLK背光源负极背光源负极图11-8 LCD1602液晶显示电路11.4 软件设计1主程序流程图本设计中子程序的调用是通过按键的选择来实现的,在取得相应按键的键值后,根据键值来确定各种波形的输出,以及信号幅度和频率调节,并将相应的数据送入D/A转换器转换成模拟信号,等到所需信号波形。主程序流程图如图11-9所示,在程序开始运行之后,首先是对TLC5615进行初始化,之后判断是否有按键按下,根据键值输出相应波形,然后判断是否进行幅度和频率调节,确定波形频率后,显示其频率。图图11-911-9 主程序流程图主程序流程图2 2波形发生子程序波形发生子程序(1)正弦波正弦波是幅度和相位随时间呈周期性变化的一种波形。利用正弦波数据生成器可以方便的产生离散的正弦波形采样点,描绘出正弦波信号。如图11-10所示,输出点数为256,输出精度为10,即用256个离散的采样点来描绘正弦波形。在编程时,只要循环输出这256个离散值就可以得到所需正弦波形,正弦波的频率可以通过延时时间来调节。图11-10 正弦波数据生成器正弦波数据生成软件生成的离散正弦数据如下:正弦波数据生成软件生成的离散正弦数据如下:uint code sin1256=0 x1FF,0 x20C,0 x218,0 x225,0 x231,0 x23E,0 x24A,0 x256,0 x263,0 x26F,0 x27B,0 x287,0 x293,0 x29F,0 x2AB,0 x2B7,0 x2C3,0 x2CE,0 x2DA,0 x2E5,0 x2F0,0 x2FB,0 x306,0 x311,0 x31B,0 x326,0 x330,0 x33A,0 x343,0 x34D,0 x357,0 x360,0 x369,0 x371,0 x37A,0 x382,0 x38A,0 x392,0 x39A,0 x3A1,0 x3A8,0 x3AF,0 x3B6,0 x3BC,0 x3C2,0 x3C8,0 x3CD,0 x3D3,0 x3D8,0 x3DC,0 x3E1,0 x3E5,0 x3E8,0 x3EC,0 x3EF,0 x3F2,0 x3F5,0 x3F7,0 x3F9,0 x3FB,0 x3FC,0 x3FD,0 x3FE,0 x3FE,0 x3FE,0 x3FE,0 x3FE,0 x3FD,0 x3FC,0 x3FB,0 x3F9,0 x3F7,0 x3F5,0 x3F2,0 x3EF,0 x3EC,0 x3E8,0 x3E5,0 x3E1,0 x3DC,0 x3D8,0 x3D3,0 x3CD,0 x3C8,0 x3C2,0 x3BC,0 x3B6,0 x3AF,0 x3A8,0 x3A1,0 x39A,0 x392,0 x38A,0 x382,0 x37A,0 x371,0 x369,0 x360,0 x357,0 x34D,0 x343,0 x33A,0 x330,0 x326,0 x31B,0 x311,0 x306,0 x2FB,0 x2F0,0 x2E5,0 x2DA,0 x2CE,0 x2C3,0 x2B7,0 x2AB,0 x29F,0 x293,0 x287,0 x27B,0 x26F,0 x263,0 x256,0 x24A,0 x23E,0 x231,0 x225,0 x218,0 x20C,0 x1FF,0 x1F2,0 x1E6,0 x1D9,0 x1CD,0 x1C0,0 x1B4,0 x1A8,0 x19B,0 x18F,0 x183,0 x177,0 x16B,0 x15F,0 x153,0 x147,0 x13B,0 x130,0 x124,0 x119,0 x10E,0 x103,0 x0F8,0 x0ED,0 x0E3,0 x0D8,0 x0CE,0 x0C4,0 x0BB,0 x0B1,0 x0A7,0 x09E,0 x095,0 x08D,0 x084,0 x07C,0 x074,0 x06C,0 x064,0 x05D,0 x056,0 x04F,0 x048,0 x042,0 x03C,0 x036,0 x031,0 x02B,0 x026,0 x022,0 x01D,0 x019,0 x016,0 x012,0 x00F,0 x00C,0 x009,0 x007,0 x005,0 x003,0 x002,0 x001,0 x000,0 x000,0 x000,0 x000,0 x000,0 x001,0 x002,0 x003,0 x005,0 x007,0 x009,0 x00C,0 x00F,0 x012,0 x016,0 x019,0 x01D,0 x022,0 x026,0 x02B,0 x031,0 x036,0 x03C,0 x042,0 x048,0 x04F,0 x056,0 x05D,0 x064,0 x06C,0 x074,0 x07C,0 x084,0 x08D,0 x095,0 x09E,0 x0A8,0 x0B1,0 x0BB,0 x0C4,0 x0CE,0 x0D8,0 x0E3,0 x0ED,0 x0F8,0 x103,0 x10E,0 x119,0 x124,0 x130,0 x13B,0 x147,0 x153,0 x15F,0 x16B,0 x177,0 x183,0 x18F,0 x19B,0 x1A8,0 x1B4,0 x1C0,0 x1CD,0 x1D9,0 x1E6,0 x1F2;/*正弦波子程序*/void sin()uint i;for(i=0;i256;i+)output(sin1i);delay2(250);/*/(2)方波方波是实验中最常见的一种信号波形,它只有“高”和“低”两个值,所以在编程时,只要循环输出高低电平即可。/*方波子程序*/void fangbo()uchar i;for(i=0;i0;i-)output(0 x0000);/TLC5615转换后为0V(3)锯齿波锯齿波是常见的波形之一,其波形与时间成正比上升,到达一定值,快速下降到零,再重复上升,下降,形成锯齿形。/*锯齿波子程序*/void saw()uint i;for(i=0;i0 x8000;i+1)_nop_();_nop_();output(i);/锯齿波i的值从00 x8000变化 delay2(250);/*/(4)三角波三角波波形首先与时间成正比上升,到大一定值,然后在与时间成正比下降,如此循环。其程序与锯齿波相似。/*三角波子程序*/void trigle()uint i;for(i=0;i0;i-1)_nop_();_nop_();output(i);/i的值从0 x8000到0 delay2(250);/*/3TLC5615输出子程序TLC5615是一个串行的10位数模转换器,首先上电初始化,将片选CS非置高电平,串行时钟信号置低电平。当片选CS非为低电平时,芯片进入正常工作状态,在每一个SCLK时钟的上升沿将DIN的一位数据移入16位移位寄存器,供DAC进行转换输出。/*TLC5615输出子程序*/void output(uint a)unsigned char i;cs=1;/初始化clock=0;cs=0;/低电平有效,低电平芯片处于工作状态di=1;for(i=12;i0;)/送数i-;if(a&0 x8000)/取12位数据的最高位,如果为1输出高电平,否则输出低电平di=1;elsedi=0;clock=1;/时钟为高电平_nop_();_nop_();clock=0;/时钟为低电平_nop_();_nop_();a=a1;/左移一位,准备下一个数据/*/4按键扫描子程序本设计采用了RF-X1开发板上提供的矩阵键盘中的6个。先将第一行P1.0置低电平,检测列信号P1.4P1.6,当某一列为低电平时,则第一行该列按键被按下;然后令P1.1输出低电平(其他都为高电平),检测第二行按键的状态,依次确定前两行6个按键的键值。/*按键扫描子程*/uchar keyscan()P1=0 x7e;/给P1口最低位(即P1.0)置0 delay(1);temp=P1;/读P1口temp=temp&0 x70;/屏蔽第四位,保留高三位while(temp!=0 x70)/判断是否有键按下delay(5);/延时去抖temp=P1;/读P1口 temp=temp&0 x70;/屏蔽第四位,保留高三位 while(temp!=0 x70)/判断是否有键按下temp=P1;switch(temp)case 0 x6D:num=4;/按键S8按下,键值为3break;case 0 x5D:num=5;/按键S12按下,键值为4break;case 0 x3D:num=6;/按键S16按下,键值为5break;while(temp!=0 x70)/等待按键释放temp=P1;temp=temp&0 x70;return num;/*/5频率选择子程序当频率选择按键S12被按下时,键值num=4。当flag1=0时,输出频率为100Hz的信号波形;flag1=1时,输出频率为500Hz的信号波形。以正弦波形为例,频率选择子程序如下。/*频率选择子程序*/void tiaopin()uchar flag1,i;if(num=4)if(flag1=1)flag1+;else flag1=0;switch(flag1)case 0:for(i=0;i256;i+0 x8000/256)_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();output(sin1i);/输出频率为100HZ的正弦波 delay(250);break;case 1:for(i=0;i256;i+0 x8000/256)_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();output(sin1i);/输出频率为500HZ的正弦波 delay(250);break;/*/6幅度选择子程序当幅度选择按键S16被按下时,键值num=5,每按一次flag加1,对应输出波形幅值加1V,flag4,按满4次,flag清零。信号输出幅值范围为15V。以正弦波形为例,幅度选择子程序如下。/*幅度选择子程序*/void tiaofu(uchar aa)uchar flag,i;/按键次数标志位 aa=num;if(aa=5)/S16键按下 if(flag=4)flag+;else flag=0;/S16满四次清0 switch(flag)case 0:for(i=0;i256;i+)output(sini/5);/输出1V正弦波 delay(250);break;case 1:for(i=0;i256;i+)output(sini*2/5);/输出2V正弦波 delay(250);break;case 2:for(i=0;i256;i+)output(sini*3/5);/输出3V正弦波 delay(250);break;case 3:for(i=0;i256;i+)output(sini*4/5);/输出4V正弦波 delay(250);break;case 4:for(i=0;i256;i+)output(sini);/输出5V正弦波 delay(250);break;/*/7显示程序在液晶模块上显示字符,需要3个最基本的控制操作:写指令代码、写显示数据和读显示数据。液晶初始化和显示程序如下:/*显示程序*/1602液晶初始化:void init()lcden=0;write_com(0 x38);/*假设为5*7 的点阵*/write_com(0 x0c);/*开显示,0 x0e显示光标,光标不闪烁,当为0 x0f时光标就闪烁,0 x0c时没光标*/write_com(0 x04);/*没写入一个数光标就自动加一*/write_com(0 x01);/*数据指针清零,所有显示清零*/write_com(0 x80);/*写入显示首地址*/1602液晶写指令函数:void write_com(uchar com)delay(10);lcdrs=0;RW=0;lcden=0;_nop_();lcden=1;P0=com;lcden=0;1602液晶写数据函数:void write_date(uchar date)delay(10);lcden=0;lcdrs=1;RW=0;_nop_();lcden=1;P0=date;lcden=0;lcdrs=0;显示函数:void display(uchar aa)uchar P=0;aa=num;if(aa=4)P+;switch(P)case 0:write_date(2);write_date(K);write_date(H);write_date(Z);break;case 1:write_date(5);write_date(0);write_date(0);write_date(H);write_date(Z);break;default:write_date(1);write_date(0);write_date(0);write_date(H);write_date(Z);break;/*/11.5 本章小结本章设计了一个低频信号发生器,利用10位的DAC芯片TLC5615完成数/模转换,将单片机编程产生的数字信号转换为所需信号波形,电路结构简单,稳定性较好,基本达到了设计要求。但在信号精度及其它功能的扩展上还有较大的潜力可以挖掘,这些都有待于通过对电路的改进和对元器件的最佳选择来进一步完善。11.6 思考与练习1.TLC5615有哪些特性,其工作方式和内部结构如何?根据TLC5615的时序,编写其初始化程序。2.TLC5615是一个10位的DAC芯片,在TLC5615输出子程序中,为什么取i=12,而不是i=10?输出0 x8000对应的模拟电压值是多少?3.对幅度、频率选择子程序进行改进和优化。4.若每种波形均采用256个离散样值表示,存入寄存器,采用中断方式进行调用,请重新编写信号发生器程序。结束结束