基于单片机的DDS函数信号发生器.docx
《基于单片机的DDS函数信号发生器.docx》由会员分享,可在线阅读,更多相关《基于单片机的DDS函数信号发生器.docx(30页珍藏版)》请在冰豆网上搜索。
基于单片机的DDS函数信号发生器
本科毕业论文设计
基于单片机的DDS函数信号发生器
题目:
专业名称:
学生姓名:
学生学号:
指导老师:
毕业时间:
【内容摘要】信号发生器常被用来当作信号发生源,它可以产生多种波形,如三角波、锯齿波、矩形波(含方波)、正弦波,并且各波形的幅度和频率可调,正是因为信号发生器可以产生各种波形的信号,因此在在电路实验和设备检测生产实践和科技领域中都有着广泛的应用。
本系统主要包括四个部分,电源供电,单片机最小系统,DDS,显示。
本系统主要用89C52单片机与DDS器AD9833构成的函数信号发生器,可产生方波、三角波、正弦波,可以由程序控制改波形的周期,并可以通过按钮实现不同波形切换。
DDS输出信号的幅值为0-2.5V,频率步进1KHz可调,实际信号频率通过4位数码管显示。
对于输出信号幅值的控制,主要是用OP07放大器对其信号放大来实现的。
通过OP07放大器可以把DDS输出信号的幅值放大2倍,从而达到了输出波形幅值在0-5V变化。
【关键词】:
AD9833;89C52;DDS;信号发生器
ABSTRACT
Placingsignageatsignalgeneratorisoftenusedasasignal,itcanproducevariouswaveform,suchastrianglewave,sawtoothwave,rectanglewave(includingsquarewave),sinewave,andthewaveamplitudeandfrequencyadjustable,itisbecausethesignalgeneratorcanproducevariouswaveformsignal,thereforeincircuitexperimentandtestequipmentinthefieldofproductionpracticeandscienceandtechnologyhasawiderangeofapplications.
Systemmainlyincludesfourparts,powersupply,singlechipmicrocomputerminimumsystem,DDSconversion,display.ThissystemmainlyUSESthe89c51andconstituteoftheDDSconverterAD9833functionsignalgenerator,canproducesquarewave,trianglewave,sinewave,canbecontrolledbytheprogramtochangethecycleofthewaveform,andcanimplementdifferentwaveformbypressingthebuttonswitch.Outputsignalamplitudeof0-2.5V,step1KHZfrequencyisadjustable,theactualsignalfrequencythroughthefourdigitaltubedisplay.Forcontroloutputsignalamplitude,mainistouseOP07amplifierforsignalamplification.ThroughtheOP07amplifiercanmagnifyDDSoutputsignalamplitude2times,soastoachievetheoutputwaveformamplitudechangesin0to5v.
Keywords:
AD9833;89C52;DDSconverter;signalgenerator
1绪论
1.1课题研究背景
便携式和智能化越来越成为仪器的基本要求,对传统仪器的数字化,智能化,集成化也就明显得尤为重要。
平时常用信号源产生正弦波,方波,三角波等常见波形作为待测系统的输入,测试系统的性能。
单在某些场合,我们需要特殊波形对系统进行测试,这是传统的模拟信号发生器和数字信号发生器很难胜任的。
新型数字信号发生器,利用单片机的强大功能,设计合适的人机交互界面,使用户能够通过手动的设定,设置所需波形[1]。
1.2研究内容及意义
本文是做基于单片机的信号发生器的设计,将采用编程的方法来实现三角波、方波、正弦波的发生。
根据设计的要求,对各种波形的频率进行程序的编写,通过放大器来调幅,并将所写程序装入单片机的程序存储器中。
在程序运行中,当接收到来自外界的命令,需要输出某种波形时再调用相应的中断服务子程序和波形发生程序,经电路的数/模转换器和运算放大器处理后,从信号发生器的输出端口输出。
1方案论证
1.1单片机选择与论证
一、单片机选择:
方案一:
采用增强型51单片机,内部自带DA
方案二:
采用MCS-51系列89C52单片机
二、方案论证:
我们在网上找了许多增强型的的单片机,内部自带AD及DA的,但是发现一般内部自带8位的AD及DA,但是一般频率达不到要求,考虑到频率的问题,我们放弃了方案一
方案二采用89C52单片机,89C52具有32个I/O口可以满足对I\O口的需求,同时该单片机价格便宜,并且我们对此单片机比较熟悉。
综合考虑,我们选择方案二。
1.2DDS选择与论证
DDS选择
方案一:
采用我们熟悉的8位DA,DAC0832.
方案二:
采用DDS,AD9833.
方案三:
采用内部自带基准源的12位DAMAX531
方案论证:
方案一中选择DAC0832虽符合题目的要求,但是输出精度不高,误差大,输出的波形不圆滑,与理想的正弦波相差大,所以我们放弃方案一。
方案二AD9833为DDS,输出的精度更高,同时也可通程序改进精度,其频率最高可达30M,所以该芯片适合。
方案三中MAX531内部自带2.048V基准源,输出精度高,但价格太贵,且频率达不到我们的要求,我们放弃方案三。
综上所述,我们选择方案二[2]。
图1AD9833引脚图
1.3显示模块
方案一、采用1602液晶屏作为显示模块
方案二、采用数码管作为显示模块
方案论证:
方案一中1602可以显示2行英文字符和数字,电路连接简单,占用单片机I/0口少。
缺点是显示字符小,不易看清,价格太高,程序编写复杂。
图2LCD1602实物图
方案二采用数码管至少要4位,则要占用12个I/O口,数码管显示时采用动态扫描功耗较低。
显示清楚,易于辨认。
程序编写简单,价格低。
缺点是显示信息量较少,不能显示符号。
图34位数码管实物图
综合考虑,我们决定选取方案二。
1.4、电源模块的选取
方案一、采用开关电源模块
方案二、自己制作线性电源电路
方案论证:
方案一中采用开关电源可以提高整个电流源的效率,体积也会相应的减小,但是开关电源的纹波电压大,电源的纹波电流可能会过大,达不到输出精度的要求。
方案二中自己制作线性电源,线性电源具有纹波电压低的特点。
电路中一共要输出两路电源,分别是+15V,+5V我们可以用常用的线性稳压器7815、7805得到稳压的电压输出。
综合上述考虑,我们选择方案二
2硬件电路设计
2.1硬件设计总体框图
图4硬件设计总体框图
2.2系统原理框图简介
本系统主要包括:
电源,单片机最小系统,按键,数码管显示,DDS器,OP07运算放大器6个部分。
系统采用5V供电,用户通过按键设定选择所要输出的波形,单片机控制DDS输出相关的波形,DDS输出的信号经过运算放大器放大信号幅值,然后输出,信号的频率通过数码管显示。
输出的波形类型通过LED状态灯来显示。
2.3电源电路设计
图5电源电路
供电电路采用的是直流线性稳压器组成。
一般直流稳压电源的组成如图2-3所示
图6直流稳压电源组成图
分析:
交流电经过变压器变压得到电压UAC,根据单相桥式整流电路的特性,我们可以计算出整流以后的电压UO[3]。
UO是整流电路的输出端电压瞬时值在一个周期内的平均值,即
Uo=
(公式一)
图2-4整流波形图
根据上图中的波形可得
UO=
(公式二)
二极管正向平均电流:
桥式整流电路两组整流二极管交替导通,由上较长的波形图可以看出,流过每个二极管的平均电流等于输出电流的一半。
即
(公式三)
滤波电容和整流二极管的选择,在未加滤波电容之前,整流二极管有半个周期处于导通状态,二极管的导通角θ=
。
而接入滤波电容后,二极管只在电容器充电时才导通,导通角θ<
。
由于滤波后输出平均电流增大,而二极管的导通角反而减小,所以流过二极管的瞬时电流很大。
这对管子的寿命极为不利。
因此必须选用较大容量的整流二极管。
通常应选择其电大平均整流电流IF大于负载电流IO的2-3倍[4]。
整流滤波后的直流电压UI接在输入端和公共端之间,在输出端可以获得稳定的输出电压UOUT,正常工作时,输入输出电压差为2-3V。
图2-2中,若7815输出的电压接7805,则7805两端的电压差为10V,若流过7805的电流过大,则7805上的功耗就会很大,发热量大时,若没有很好的散热措施,很容易将7805烧坏,所以必须加一个稳压块7809进行缓冲,这个7805两端的电压差变为4V,这样在7805上消耗的功率就会相应的变小,功率也会变小[5]。
图2-2中电解电容的作用是改善负载的瞬态响应,瓷片电容主要是抵消因为长线传输引起的电感效应;
用一片7815得到稳定电压+15V给集成运算放大器供电,7809输出的9V再经一片7805得到5V的输出,供给单片机和DDS等数字芯片。
供给功率管的电源采用另外一个供电电路,主要是为了防止数字电路与模拟大功率器件之前的相互干扰。
图7PCB地线布线规则
同时在PCB走线时,将数字地和模拟地分开走线,最后通过一个0欧电阻连在一起。
最大限度的减小相互之间的干扰。
2.4单片机最小系统设计
本系统主要采用AT89C52单片机,AT89C52是一种低功耗、高性能CMOS8位微控制器,具有8K在系统可编程Flash存储器。
使用Atmel公司高密度非易失性存储器技术制造,与工业80C52产品指令和引脚完全兼容。
片上Flash允许程序存储器在系统可编程,亦适于常规编程器。
在单芯片上,拥有灵巧的8位CPU和在系统可编程Flash,使得AT89C52为众多嵌入式控制应用系统提供高灵活、有效的解决方案[6]。
2.4.1单片机主控电路
图8单片机最小系统
图2-6中,LED1-LED4是输出波形状态指示灯,P0口接的是数码管的段,P2口低4位接数码管的位选,高三位接DDS器AD9833,SW1-SW6是接按键,X1,X2是单片机时钟电路,RST是单片机复位电路。
2.4.2单片机最小系统组成
单片机最小系统是指单片机能工作的最基本的系统,89C52单片机的最小系统主要包括以下几个部分:
4V-5.5V的数字电源,时钟,复位,此外由于我们是从单片机内部存储器读取程序,所以单片机的EA引脚必须接为高电平。
电源部分是通过7805三端稳压芯片得到5V电源。
在单片机的电源端必须接一个瓷片电容,主要起退耦作用,以使单片机能稳定工作。
时钟电路主要是提供单片机内部时钟信号,产生单片机所必须的时钟频率,单片机的一切指令的执行都是建立在这个基础上的,晶振的提供的时钟频率越高,那单片机的运行速度也就越快。
本系统主要采用的是12M晶振,配合2个30pF的电容构成晶体振荡电路。
为确保微机系统中电路稳定可靠工作,复位电路是必不可少的一部分,复位电路首先是进行上电复位,复位电路旁边的1uF电容在上电瞬间给RST端一个瞬时的高电平信号,当这个电容上面的电量充满时高电平的信号将回落,即RST端的高电平信号保持的时间是由外部这个充电电容决定的。
另外,在复位期间,端口引脚处于随机状态,复位后,系统将端口置为全“l”态。
如果系统在上电时得不到有效的复位,则程序计数器PC将得不到一个合适的初值,因此,CPU可能会从一个未被定义的位置开始执行程序,此时会造成单片机在上电的瞬间出现不稳定的情况发生,所以为了能让单片机稳定的工作,必须提供必要的复位电路。
2.5DDS输出设计
DDS输出主要采用DDS控制芯片AD9833。
AD9833是一款低功耗、可编程波形发生器,可以产生正弦波、三角波、方波。
输出频率和相位可软件编程,很容易调整,而不需要外部组件。
频率寄存器是28位的,如果是25M的时钟源,经过编程可以得到0.1Hz的时钟;同样如果是1M的时钟源,可以得到0.004Hz的时钟。
AD9833通过3线串口进行写操作。
串口工作时钟频率高达40M,并与DSP和微处理器标准兼容。
其工作电压在2.3V~5.5V之间。
AD9833还具有休眠功能,可使没被使用的部分休眠,减少该部分的电流损耗,例如,若利用AD9833输出作为时钟源,就可以让DAC休眠,以减小功耗,该电路采用10引脚MSOP型表面贴片封装,体积很小。
图9AD9833引脚图
2.5.1芯片简介
AD9833是ADI公司生产的一款低功耗,可编程波形发生器,能够产生正弦波、三角波、方波输出。
波形发生器广泛应用于各种测量、激励和时域响应领域,AD9833无需外接元件,输出频率和相位都可通过软件编程,易于调节,频率寄存器是28位的,主频时钟为25MHz时,精度为0.1Hz,主频时钟为1MHz时,精度可以0.004Hz[7]。
2.5.2DDS信号发生器的组成
AD9833是一块完全集成的DDS(DirectDigitalFrequencySynthesis)电路,仅需要1个外部参考时钟、1个低精度电阻器和一个解耦电容器就能产生高达12.5MHz的正弦波。
除了产生射频信号外,该电路还广泛应外于各种调制解调方案。
这些方案全都用在数字领域,采用DSP技术能够把复杂的调制解调算法简化,而且很精确[9]。
2.5.3DDS原理及应用
AD933的核心是28位的相位累加器,它由加法器和相位寄存器组成,每来1个时钟,相位寄存器以步长增加,相位寄存器的输出与相位控制字相加后输入到正弦查询表地址中。
正弦查询表包含1个周期正弦波的数字幅度信息,每个地址对应正弦波中0°-360°范围内的1个相位点。
查询表把输入的地址相位信息映射成正弦波幅度的数字量信号,去DAC输出模拟量,相位寄存器每经过228/M个MCLK时钟后回到初始状态,相应地正弦查询表经过一个循环回到初始位置,这样就输出了一个正弦波。
输出正弦波频率为:
fOUT=M(fMCLK/228)
(1)
其中,M为频率控制字,由外部编程给定,其范围为0≤M≤228-1。
VDD引脚为AD9833的模拟部分和数字部分供电,供电电压为2.3V-5.5V。
AD9833内部数字电路工作电压为2.5V,其板上的电压调节器可以从VDD产生2.5V稳定电压,注意:
若VDD小于等于2.7V,引脚CAP/2.5V应直接连接至VDD[10]。
2.6数码管显示电路
图14数码管显示电路
2.6.1数码管显示分析
显示电路为四位数码管,用来显示实时波形的频率。
通过数码管上的显示,我们可以清楚的知道当前波形的频率,以及工作的状态。
并可以通过按键来调节实时的工作频率。
在实际的单片机系统中,往往需要多位显示。
动态显示应用非常广泛是一种最常见的多位显示方法,。
用数码管显示测得的数据,数码管有8段而每段必需占用一个单片机的IO口,所以一位数码管必须占个单片机IO口,本次设计采用4位数码管,则需要32个I/O口,而89C52单片机的I/O口只有32个。
动态显示能够很好的解决数码管占用单片机IO口过多的问题。
所有数码管的段选全部连接在一起,如何能显示不同的内容呢?
动态显示的原理是多位数码管,交替来进行显示,利用人的视觉暂留效果使人看到好像有多个数码管同时显示。
在编程时,要用单片机控制段选和位选,所谓的位选是选中其中一个数码管,然后利用单片机输出段码,需要显示的数字就能显示在这位数码管上了,延时一段时间后,再选中另一个数码管,再输出对应的段码,高速交替。
在动态显示程序中,各个位的延时时间长短是非常重要的,如果延时时间长,则会出现闪烁现象;如果延时时间太短,则会出现显示发暗且有重影。
静态驱动就是给单独每一个LED供电。
这样每个LED都有足够的电流,亮度也相应的比较高。
动态扫描驱动就是把本来供给一个LED灯的电流,同时分给了N个灯,所以它的亮度会有所降低。
当然在同时供给两个led灯电流时不是平均的分配电流,而是led间扫描期间电流不断地交替,扫描的频率依据单片机的速度决定,也就是说各位的数码管上的电流在扫描频率内是供个其中一个led,在下一个扫描频率内是供给了另一个led[12]。
若我们想让这个4位数码管的每段工作时的电流为8mA.Uled为正常工作时的电压取1.7V。
所以我们选取100欧的限流电阻。
这样每个LED工作时的电流约为8mA.在保证LED能亮的同时不会被烧坏。
2.7按键电路
图2-14为键盘接口电路的原理图,图中按键在未按下时,通过一个电阻接到高电平,当按下时,按键导通。
连接单片机的IO口接地变成低电平。
当单片机检测到按键变为低电平时,进行频率的切换。
图15按键电路
3软件设计
3.1软件设计总流程图
图16软件流程图
D9833有一个标准串行接口,可以与一些微处理器直接连接,用外部串行时钟来往自身写数据和控制信息,串行时钟频率最高可达40MHz,在写操作的过程中可能是连续的,也可能一直保持高电平或低电平。
如果有数据/控制信息写入AD9833,FSYNC在16位信息写进AD9833的过程中一直保持低电平。
FSYNC信号显示16位信息被写入AD9833。
3.2波形输出软件设计
当数据传输要到AD9833时,P3.3置低电平。
80C51/80L518-bit字节形式传输数据,所以每次传输只需要SCLK下降沿。
为把数据写入AD9833,第个8-bit数据传输完毕以后P3.3依然要保持低电平,接着初始化下一个字节的的写操作。
结束后,P3.3被置高电平。
在两次写操作的过程中,SCLK必须一直保80C51/80L51本来是以LSB在前的格式输出串行数据的。
但是AD9833首先接受的是MSB(目标寄存器写时,首先4个MSB是控制信息,接下来4个是地址,8个LSB才是数据)。
因此,80C51/80L51的传输例程必须考虑到这点,重新安排位序,让MSB先输出
3.2.1方波产生软件设计
frequency_fun(500000,0x4000);//设定reg0为500k
frequency_fun(100000,0x8000);//设定reg1为100k
write_ad9833_d16(0x2002);//调用reg0频率数据,输出三角波
display_data[3]=10;display_data[2]=5;display_data[1]=0;display_data[0]=0;
delay10s();
write_ad9833_d16(0x2802);//reg1
display_data[3]=10;display_data[2]=1;display_data[1]=0;display_data[0]=0;
delay10s();
frequency_fun(50000,0x4000);//50k,reg0
frequency_fun(20000,0x8000);//20k,reg1
write_ad9833_d16(0x2002);//reg0
display_data[3]=10;display_data[2]=10;display_data[1]=5;display_data[0]=0;
delay10s();
write_ad9833_d16(0x2802);//reg1
display_data[3]=10;display_data[2]=10;display_data[1]=2;display_data[0]=0;
delay10s();
frequency_fun(10000,0x4000);//10k,reg0
frequency_fun(5000,0x8000);//5k,reg1
write_ad9833_d16(0x2002);//reg0
display_data[3]=10;display_data[2]=10;display_data[1]=1;display_data[0]=0;
delay10s();
write_ad9833_d16(0x2802);//reg1
display_data[3]=10;display_data[2]=10;display_data[1]=10;display_data[0]=5;
delay10s();
frequency_fun(2000,0x4000);//2k,reg0
frequency_fun(1000,0x8000);//1k,reg1
write_ad9833_d16(0x2002);//reg0
display_data[3]=10;display_data[2]=10;display_data[1]=10;display_data[0]=2;
delay10s();
write_ad9833_d16(0x2802);//reg1
display_data[3]=10;display_data[2]=10;display_data[1]=10;display_data[0]=1;
delay10s();
//输出方波波形
frequency_fun(1000000,0x4000);//500k,reg0
frequency_fun(200000,0x8000);//100k,reg1
write_ad9833_d16(0x2020);//reg0
display_data[3]=10;display_data[2]=5;display_data[1]=0;display_data[0]=0;
delay10s();
write_ad9833_d16(0x2820);//reg1
display_data[3]=10;display_data[2]=1;display_data[1]=0;display_data[0]=0;
delay10s();
frequency_fun(100000,0x4000);//50k,reg0
frequency_fun(40000,0x8000);//20k,reg1
write_ad9833_d16(0x2020);//reg0
display_data[3]=10;display_data[2]=10;display_data[1]=5