低频正弦波发生器设计解读.docx
《低频正弦波发生器设计解读.docx》由会员分享,可在线阅读,更多相关《低频正弦波发生器设计解读.docx(24页珍藏版)》请在冰豆网上搜索。
![低频正弦波发生器设计解读.docx](https://file1.bdocx.com/fileroot1/2022-10/29/8320410f-f5ad-4cca-83ee-774fc1708f99/8320410f-f5ad-4cca-83ee-774fc1708f991.gif)
低频正弦波发生器设计解读
单片机课程设计报告
设计题目:
波形发生器设计
学院自动化与信息工程学院
专业电子信息科学与技术
班级电技081
姓名
学号
指导教师
一、设计目的
信号发生器是电子测量领域中最基本、应用最广泛的一类电子仪器。
在研制、生产、测试和维修各种电子元件、部件以及整机设备时,都学要有信号源,由它产生不同频率不同波形的电压、电流信号并加到被测器件或设备上,用其他仪器观察、测量被测仪器的输出响应,以分析确定它们的性能参数。
信号发生器可以产生多种波形信号,如正弦波,三角波,方波等,因而广泛用于通信、雷达、导航、宇航等领域。
二、设计的主要内容和要求
实验要求设计一个波形发生器,功能要求分为基本要求和创新要求两部分:
1.1基本任务:
(1)设计一款能够产生3种以上波形的波形发生器;
(2)设计波形选择按钮,可以通过按键选择不同波形;
(3)LED或LCD显示波形代号(如:
1为正弦波,2为方波,3为锯齿波,4为三角波);
(4)其他功能(创新部分)。
1.2创新部分
(1)波形频率调节,可以通过按键选择调节波形频率;
(2)波形幅值调节,可以通过按键选择调节幅值频率;
(3)方波占空比调节,可以通过按键调节方波占空比;
(4)增加滤波环节。
三.整体设计思路
本实验设计的整体思路是采用AT89S52单片机和DAC0832芯片,直接连接键盘和显示。
该种方案主要对AT89S52单片机的各个I/O口充分利用。
P1口是连接键盘,P0口接显示电路,P2口连接DAC0832输出波形。
这样总体来说,能对单片机各个接口都利用上,而不在多用其它芯片,从而减小了系统的成本。
也对按照系统便携式低频信号发生器的要求所完成。
占用空间小,使用芯片少,低功耗。
能使输出频率有较好的稳定性,充分体现了模块化设计的要求,而且这些芯片及器件均为通用器件,在市场上较常见,价格也低廉,样品制作成功的可能性比较大,所以经过全组同学的讨论后决定采用此方案。
对于实验设计的模块化要求,该方案在实现上很清晰。
在硬件设计方面,实现基本功能时主要有三个模块,即波形选择控制模块、波形输出显示模块、数码管显示模块。
在实现创新功能时,在原有三大模块的基础上增加了低通滤波模块。
在软件设计方面,基于程序实现的简单易懂的特点,我们决定使用C语言程序实现波形发生、转换等程序。
利用Proteus软件结合Keil实现程序的调试以及仿真。
主要程序结构除了主函数外,分为延时控制子函数、正弦波发生子函数、方波发生子函数、锯齿波发生子函数、三角波发生子函数、波形选择控制键子函数。
四、硬件设计
实验硬件设计主要有四个模块。
在实现基本功能时主要有三个模块,即波形选择控制模块、波形输出显示模块、数码管显示模块。
在实现创新功能时,在原有三大模块的基础上增加了低通滤波模块。
具体模块的设计思路如下:
1、波形选择控制模块。
通过P1口和开关K0-K8相连接来控制各种波形输出以及变化功能。
根据K1-K4键状态进行输出波形的选择。
根据K5-K6键状态进行方波占空比调节,K7-K8键状态进行波形频率变化的调节。
开关键向下接“0”,相应的控制键产生作用输出相应波形或者进行波形变化,向上拔接“1”,无波形输出或波形变化。
2、波形输出显示模块。
主要由DAC0832芯片,滑动电阻和运算放大器组成。
通过P2口和DAC0832芯片相连接输出波形。
滑动变阻器将DAC0832输出电流转换成电压值并通过电阻的变化控制相应电压的变化,再通过运算放大器后输出实现输出波形的幅值大小变化。
3、数码管显示模块。
该模块的实现比较简单。
通过数码管各管脚与单片机相连接,同时添加一个上拉电阻控制数码管的静态输出。
4、低通滤波模块。
该模块是在实现创新要求时添加的。
由于方案设计中正弦波,三角波,锯齿波的实现是由采样不同电压值输出实现的,添加低通滤波模块可以缓解输出波形的阶梯化。
5、整体电路设计。
波形选择控制模块、波形输出显示模块、数码管显示模块、低通滤波模块组成。
由AT89S52单片机和DAC0832芯片,直接连接键盘和显示。
P1口是连接键盘,P0口接显示电路,P2口连接DAC0832输出波形。
滑动变阻器接0832将输出电流转换成可调电压,也就完成了输出波形的幅值控制。
5、软件设计
本实验在软件实现方面采用的是C语言实现,在一定程度上增强了程序的易理解性。
利用Proteus软件结合Keil实现C语言程序的调试以及单片机波形的仿真。
1、模块介绍:
本方波发生器的软件设计中主要包含主要程序结构除了主函数外,分为延时控制子函数、正弦波发生子函数、方波发生子函数、锯齿波发生子函数、三角波发生子函数、波形选择控制键子函数。
(1)主程序主要完成初始化、检查有无按键按下、以及调用显示等等。
主程序的流程图如下所示。
(2)、正弦波发生子程序主要是循环输出事先定义的数值形成。
定义256个正弦波采样值然后等间隔采样且循环输出。
正弦波频率变化也是由采样间隔的变化控制的。
(3)方波发生子程序:
通过恒定幅值的负电压,与零电压相互交替输出形成方波。
电压的输出时间由延时控制子函数控制。
同时其占空比和频率变化也是由延时控制子函数控制的。
(4)三角波发生子程序:
和正弦波发生原理类似,三角波发生子程序主要是循环输出事先定义的数值形成。
定义256个三角波采样值然后等间隔采样且循环输出。
三角波频率变化也是由采样间隔的变化控制的。
(5)锯齿波发生子程序:
和三角波发生原理类似,锯齿波发生子程序主要是循环输出事先定义的数值形成。
定义128个锯齿波采样值然后等间隔采样且循环输出。
锯齿波频率变化也是由采样间隔的变化控制的。
延时控制子程序:
延时设置主要靠for循环完成。
延时时间不等于0时,每自减1程序执行126个循环知道延时时间减为0跳出循环,结束延时。
(7)、波形选择控制键子程序:
该程序主要通过判断S1~S8的按键是否按下执行相应的程序。
当判断某一按键按下时,设置数码管的静态显示值,同时定义S的值,使主函数在运行时能执行相应的case产生相应的波形或者变换。
另外,波形控制子函数的每次按键选择后都会对n,p进行初始化设置,使每个波形形成时的初始采样间隔恒定。
在频率以及占空比变化时再通过改变p的值实现采样间隔的控制,实现频率或者占空比的大小可变。
2、程序的源程序代码
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
sbits1=P1^0;//定义S1~S8控制单片机P1口输入
sbits2=P1^1;
sbits3=P1^2;
sbits4=P1^3;
sbits5=P1^4;
sbits6=P1^5;
sbits7=P1^6;
sbits8=P1^7;
uintd1,d2;
uints,p;
uintn;
ucharcodebxnum[]={0xc0,0xF9,0xA4,0xB0,0x99,0x92,0x82,//设置数码管初始化
0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E};
ucharcodesintab[256]=//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,0xff,0xff,0xff,0xff,0xff,0xfe,0xfd,
0xfd,0xfc,0xfb,0xfa,0xf9,0xf8,0xf7,0xf6,
0xf5,0xf4,0xf2,0xf1,0xef,0xee,0xec,0xea,
0xe9,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,0x69,
0x66,0x63,0x60,0x5d,0x5a,0x57,0x55,0x51,
0x4e,0x4c,0x48,0x45,0x43,0x40,0x3d,0x3a,
0x38,0x35,0x33,0x30,0x2e,0x2b,0x29,0x27,
0x25,0x22,0x20,0x1e,0x1c,0x1a,0x18,0x16,
0x15,0x13,0x11,0x10,0x0e,0x0d,0x0b,0x0a,
0x09,0x08,0x07,0x06,0x05,0x04,0x03,0x02,
0x02,0x01,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x02,
0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,
0x0a,0x0b,0x0d,0x0e,0x10,0x11,0x13,0x15,
0x16,0x18,0x1a,0x1c,0x1e,0x20,0x22,0x25,
0x27,0x29,0x2b,0x2e,0x30,0x33,0x35,0x38,
0x3a,0x3d,0x40,0x43,0x45,0x48,0x4c,0x4e,
0x51,0x55,0x57,0x5a,0x5d,0x60,0x63,0x66,
0x69,0x6c,0x6f,0x72,0x76,0x79,0x7c,0x80
};
ucharcodejctab[128]=//128个采样点取值输出锯齿波
{
0x00,0x02,0x04,0x06,0x08,0x0a,0x0c,0x0e,
0x10,0x12,0x14,0x16,0x18,0x1a,0x1c,0x1e,
0x20,0x22,0x24,0x26,0x28,0x2a,0x2c,0x2e,
0x30,0x32,0x34,0x36,0x38,0x3a,0x3c,0x3e,
0x40,0x42,0x44,0x46,0x48,0x4a,0x4c,0x4e,
0x50,0x52,0x54,0x56,0x58,0x5a,0x5c,0x5e,
0x60,0x62,0x64,0x66,0x68,0x6a,0x6c,0x6e,
0x70,0x72,0x74,0x76,0x78,0x7a,0x7c,0x7e,
0x80,0x82,0x84