正弦波方波三角波的发生电路设计概要.docx
《正弦波方波三角波的发生电路设计概要.docx》由会员分享,可在线阅读,更多相关《正弦波方波三角波的发生电路设计概要.docx(25页珍藏版)》请在冰豆网上搜索。
正弦波方波三角波的发生电路设计概要
正弦波﹑方波﹑三角波的发生电路设计
摘要现今世界中电子技术与电子产品的应用越加广泛,人们对电子技术的要求也越来越高。
因此如何根据实际要求设计出简便实用的电子技术物品便显得尤为重要。
灵活、快速的选用不同特征的信号源成了现代测量技术值得深入研究的课题。
能将简单的易获取的信号转换为自己所需的复杂信号是一项必不可少的技术。
我们有必要做好这相关方面的研究,为被测电路提供所需要的信号及各种波形,以便完成各种相关试验。
信号源在各种试验应用和实验测试处理中,仿真各种测试信号,提供给被测电路,用来满足实验的各种要求。
关键词:
单片机,信号发生器,波形
ABSTRACT:
Theapplicationofelectronictechnologyandelectronicproductsintoday'sworldincreasinglyextensive,peoplealsomoreandmorehightotherequirementofelectronictechnology.Accordingtoactualrequirementssohowtodesignsimpleandpracticalelectronictechnologyitems,itbecomesveryimportant.Flexible,fast,choosedifferentcharacteristicsofthesignalsourceisworthstudyingdeeplythemodernmeasuringtechnology.Canbesimple,easytoobtainsignalcanbeconvertedintotheircomplexsignalisanessentialtechnology.Itisnecessaryforustodotherelatedresearch,toprovidetherequiredsignalcircuitundertestandvariouswaveform,tocompletevariousrelatedexperiment.Signalsourceinvarioustestapplicationandtestprocessing,simulationoftestingsignal,providedtothecircuitundertest,tosatisfytherequirementsoftheexperiments.
KEYWORDS:
Microcontroller,signalgenerator,waveform
第一章前言
1.1课题研究背景
函数信号发生器是一种常用信号源。
通常能够产生正弦波、方波、三角波等多种波形,因其时间波形可用某种时间函数来描述而得名。
函数信号发生器在电路实验和设备检测中具有十分广泛的应用,密切地联系着工业、农业、生物医学等产业,并对它们的发展起到极大的促进作用。
伴随着单片机技术的快速发展与普遍应用,函数信号发生器的性能和性价比将会有更大的提升空间。
基于单片机的函数信号发生器将为智能化生活提供实质的帮助。
1.2波形介绍
1.2.1正弦波
正弦信号可用如下形式表示:
f(t)=Asin(ωt+θ),其中,A为振幅,ω是角频率,θ为初相位。
正弦函数为一周期信号如下图1所示:
图1正弦波
1.2.2三角波
三角波波形如下图2所示:
图2三角波
1.2.3方波
方波函数是我们常用且所熟知的简单波形函数,做脉冲等,其表示形式如下:
方波波形如下图3所示:
图3方波
当方波下半段幅值为0时,就为矩形波,一个原理,所以不再赘述矩形波。
1.3硬件介绍
1.3.1AT89C51单片机
1.AT89C51单片机的简介
AT89C51单片机是一种带4k字节的闪存(FPEROM-FLASH编程和可擦只读存储器)的低电压、高性能CMOS8位微处理器。
AT89C2051是一种带2k字节flash可编程单片机可擦除只读存储器(ROM)。
单片机可擦除只读存储器可以抹去反复1000次。
该设备采用ATMEL高密度非易失存储器制造技术,和行业标准的MCS-51指令集和输出管兼容。
由于多功能8位CPU和闪存在单一芯片,ATMELAT89C51单片机的结合是一种有效的微控制器,AT89C2051的精简版本。
AT89C51为许多嵌入式控制系统提供了一个解决方案概述高灵活性和低价格的特点。
能够提供以下标准特性:
4k字节的Flash闪存,128字节的内部RAM,32个I/O端口线,两个16位定时器/计数器,一个两个阶段5向量中断结构、全双工串行通信端口,芯片上的时钟振荡器电路及时。
同时,AT89C51单片机静态逻辑运算可以减少到0赫兹,和两个软件支持可选的节能工作模式。
免费停止CPU的工作方式,但是允许RAM,定时器/计数器,串行通信端口和中断系统继续工作。
电方式节省内存的内容,但振荡器停止工作和其他工作,直到下一个硬件复位所有部分。
2.AT89C2051的功能
单片机各功能部件的运行都是以时钟频率为基准的,有条不紊地进行工作。
因而时钟频率直接影响单片机的速度,时钟电路的质量也直接影响单片机系统的稳定性。
常用的时钟电路方式有两种:
一种是内部时钟方式,一种是外部时钟方式,这里采用的是内部时钟方式,外接晶振。
时钟电路由片外晶体、微调电容和单片机的内部电路组成。
选取频率为11.0592MHz的晶振,微调电容是瓷片电容。
89S52单片机的P0.7口作为波形输出口,若接示波器,则可通过示波器来观察波形,是一个矩形波。
1.3.2DAC0832转换器
1.DAC0832转换器的简介
DAC0832DAC0832是8分辨率的D/A转换集成芯片。
与微处理器完全兼容。
这个DA芯片以其价格低廉、接口简单、转换控制容易等优点,在单片机应用系统中得到广泛的应用。
D/A转换器由8位输入锁存器、8位DAC寄存器、8位D/A转换电路及转换控制电路构成。
2.DAC0832的功能
(1)分辨率
它反映了最小输出模拟电压值的变化。
定义为满量程输出电压之比2n,其中n位DAC。
分辨率有一定的与数字量的输入数字的关系。
全系列的5v,使用8位DAC,分辨率为5v/256=19.5mV;当使用DAC分辨率为5v/1024=4.88mV。
显然,位数越高分辨率越高。
(2)建立时间
建立时间是描述DAC转换速度快慢的参数。
定义为从输入数字量变化到输出达到终值误差±1/2LSB(最低有效位)所需的时间。
(3)接口形式
接口是DAC的输入/输出特性。
包括输入数字量的形式:
十六进制或BCD,是否输入。
DAC0832是使用一个非常常见的8D/A转换器,因为它和输入数据寄存器,它可以直接与单片机接口。
DAC0832输出电流的形式,需要时将可以外部运算放大器的电压输出。
属于系列芯片和DAC0830DAC0831,它们可以相互替换。
根据数据输入过程中,有三种单片机和DAC0832连接方式:
二级缓冲单级缓冲的连接方法连接模式,直接连接。
第二章发生电路设计原理
2.1功能和基本原理
AT89C51外接12M晶振作为时钟频率,设计并使用功率降低。
使用电复位复位电路,其工作原理是,得电,相当于电容的两端短路,因此TST引脚为高电平,那么电容器充电。
RST端电压下降缓慢,在一定程度上,是低水平,单片机就开始工作。
产生方波计划:
低于100赫兹的频率,根据定时器溢出时间1us,定时器溢出时代的等效频率值,当达到规定的数量,达到的状态的方波的输出接脚;对于大于100HZ的频率,直接根据频率值设置其定时溢出的时间,当溢出时间达到时,将输出管脚取反达到方波的产生。
产生三角波计划的想法:
产生峰值电压5v的三角波,一个周期需要时间510次,可以计算每次溢出的时间,然后每次加权可以实现三角波电压波形;生成正弦波程序理念:
设定一个周期的正弦波表,通过20个数据,相当于255倍,每个周期时间,时间可以计算为每个时间的溢出,每个点可以得到电压加权正弦电压,即正弦波的形成。
2.2红外电路
红外的工作原理:
51单片机对遥控的解码和我们前面所讲的串口并口通信不同,他不是单纯的用高电平代表1,低电平代表0。
这一点大家要从思想上面转变过来。
他是发送一连串的数据帧,这个数据帧就是一连串的二进制代码,单片机通过区分高电平的持续时间来区别红外编码的。
我们就以HC6800单片机上的红外接头为例来说明,当高电平的脉冲宽度为1.12ms的时候单片机认为它为0,当高电平的脉冲宽度为2.25的时候单片机认为它为1。
单片机是通过判断脉冲的宽度来得到信息位为0还是为1的。
根据各部分的功能。
可将它们分为5部分,分别为引导码、地址码、地址码、数据码、数据反码。
遥控器发射代码时.均是低位在前。
高位在后。
分析可以得到.引导码高电平为4.5ms,低电平为4.5ms。
当接收到此码时.表示一帧数据的开始。
单片机可以准备接收下面的数据。
地址码由8位二进制组成,共256种。
地址码重发了一次。
主要是加强遥控器的可靠性.如果两次地址码不相同.则说明本帧数据有错.应丢弃。
不同的设备可以拥有不同的地址码.因此。
同种编码的遥控器只要设置地址码不同,也不会相互干扰。
在同一个遥控器中.所有按键发出的地址码都是相同的。
数据码为8位,可编码256种状态,代表实际所按下的键。
数据反码是数据码的各位求反,通过比较数据码与数据反码.可判断接收到的数据是否正确。
如果数据码与数据反码之间的关系不满足相反的关系.则本次遥控接收有误.数据应丢弃。
在同一个遥控器上.所有按键的数据码均不相同。
数据码为十六进制的0CH,数据反码为十六进制的0F3H(注意低位在前).两者之和应为0FFH。
2.3复位电路
这种复位电路的工作原理是:
单片机的复位电路在刚接通电时,刚开始电容是没有电的,电容内的电阻很低,通电后,5V的电通过电阻给电容进行充电,电容两端的电会由0V慢慢的升到4V左右(此时间很短一般小于0.3秒),RC构成的微分电路在上电瞬间产生一个微分脉冲,其宽度大于两个机器周期,89C51将复位。
正因为这样,复位脚的电由低电位升到高电位,引起了内部电路的复位工作,RST端电压慢慢下降,降到一定电压值以后,即为低电平,单片机开始正
常工作(这是单片机的上电复位,也叫初始化复位);当按下复位键时,电容两端放电,电容又回到0V了,于是又进行了一次复位工作(这是手动复位原理)。
下图4为复位电路
图4复位电路
2.4LCD显示部分电路
为了节约成本,采用1602来作为显示器,用独立按键来控制不同的显示,能完成基本的显示功能。
图5LCD液晶显示电路
2.5电源部分
本电源设计了两个接口,方便不同接口的电源接入,并且在电源部分加上滤波电容,起过滤接入电源的杂波的作用,为了电路中得到+12V、-12V和+5V的直流工作电压,用变压器变压后再通过芯片和电容设计出所需要的电路。
图6电源电路
2.6外部时钟电路
图7采用11.0592MHz的晶振和两个22pf的电容组成时钟电路部分
图7外部时钟电路
2.7显示接口电路
功能:
驱动Led液晶显示器,扫描按钮。
LCD1602液晶显示和一个矩阵的按钮。
按键时,通过P2口将数字信号发送到LCD1602,LCD1602显示液晶点阵设计,如字母、数字、符号,其外部电压5v。
扫描通过使用软件程序实现,当按键时,立即扫描发现,立即调用子程序,执行相应的功能。
与单片机连接如图8所示:
图8部分电路图
2.8独立按键部分
图9为用独立按键来控制不同的输出波形
图9独立按键
2.9波形转换电路
功能:
转换波形样本值编码模拟值,完成波形的输出。
由一块DAC0832和LF356运放。
DAC0832是两个输入数据寄存器的8位DAC。
当前生产的DAC芯片分为两种,一种是芯片内部数据寄存器设置,不需要外加电路,就可以直接与微机接口连接。
另一种类型的芯片没有数据寄存器、输出信号变化状态的数据输入行,所以你不能直接与微机接口连接,必须通过并口与微机接口相连。
DAC0832有20条引线的双列直插式CMOS设备,里面有两个级别的数据寄存器,完成8位D/A转换,且不需要额外的电路。
DAC0832是电流输出类型,在示波器上显示波形,通常需要电压信号和电流信号,电压信号的转换可以使用运算放大器LF356实现。
单片机发送DAC0832数字编码,生成不同的输出。
先利用采样定理对各种波形进行抽样,然后把各种采样值进行编码,收到的数字量存入各个波形表,执行程序时通过查表的方法依次取出,D/A转换后输出波形可以计算出来。
假如N个点构成波形的一个周期,DAC0832输出N个样本值,样本点能形成一个轨迹,即,一个周期。
重复输出N点之后,成为第二个周期。
利用单片机的晶振控制输出周期的速度,也就是控制输出的波形的频率。
从而控制输出波形和振幅和频率,如正弦波,取20个样值点。
具体连接的电路图如图10所示:
示:
图10D/A转换的电路连接图
2.10串口通信模块
图11中通过MAX232进行TTL电平和232电平转换,从而单片机和上位机之间通信提供通道。
图11串口通信电路
通信电路的目的就是让通信双发的电平匹配,单片机用的是TTL电平,上位机的串口用的是232电平。
TTL电平的逻辑1的电压范围是+3.3V到+5V,逻辑0的电压范围是0到+3.3V;232电平的逻辑1的电压范围是-15V到-5V,逻辑0的电压范围是+5V到+15V。
因此设计串口通信电路就是让这两种电平统一。
第三章软件设计
信号发生器的软件设计包括主程序、延时子程序、系统初始化程序、键盘中断子程序、定时器中断子程序。
3.1主程序
#include
unsignedchari,sqar_num=128;//最大值100,默认值50
unsignedcharcho=0;//0:
正弦波。
1:
方波。
2:
三角波。
unsignedcharnum=0;
unsignedcharTIME0_H=0xff,TIME0_L=0xd9;//定时器0的初值设置;全局变量.对应正弦波
sbitchg=P1^0;//三角波100Hz.
sbitfreq_u=P1^1;
sbitfreq_d=P1^2;
sbitduty_u=P1^3;
sbitduty_d=P1^4;
sbitcs=P3^7;
bitflag=0;
unsignedintFREQ=50;//初始化频率,50HZ
sbitrs=P3^5;
sbitlcdcs=P3^0;
unsignedcharTempBuffer[7];
unsignedcharvalue1[]={"Frequency:
"};
voiddelay(unsignedintms)
{
unsignedinti,j;
for(j=0;jfor(i=0;i<120;i++);
}
unsignedcharcodesin_num[]={
0,0,0,0,0,0,0,0,1,1,1,1,1,2,2,2,
2,3,3,4,4,4,5,5,6,6,7,7,8,8,9,9,
10,10,11,12,12,13,14,15,15,16,17,18,18,19,20,21,
22,23,24,25,25,26,27,28,29,30,31,32,34,35,36,37,
38,39,40,41,42,44,45,46,47,49,50,51,52,54,55,56,
57,59,60,61,63,64,66,67,68,70,71,73,74,75,77,78,
80,81,83,84,86,87,89,90,92,93,95,96,98,99,101,102,
104,106,107,109,110,112,113,115,116,118,120,121,123,124,126,128,
129,131,132,134,135,137,139,140,142,143,145,146,148,149,151,153,
154,156,157,159,160,162,163,165,166,168,169,171,172,174,175,177,
178,180,181,182,184,185,187,188,189,191,192,194,195,196,198,199,
200,201,203,204,205,206,208,209,210,211,213,214,215,216,217,218,
219,220,221,223,224,225,226,227,228,229,230,230,231,232,233,234,
235,236,237,237,238,239,240,240,241,242,243,243,244,245,245,246,
246,247,247,248,248,249,249,250,250,251,251,251,252,252,253,253,
253,253,254,254,254,254,254,255,255,255,255,255,255,255,255,255
};
//调节部分--频率
voidfreq_ud(void)
{
unsignedinttemp;
if(freq_d==0)
{FREQ--;}
elseif(freq_u==0)
{FREQ++;}
if(cho==1|cho==3)//三角波256次中断一周期,特殊处理下。
否则他的频率是100(+\-)n*2Hz.
{
temp=0xffff-3906/FREQ;//方波,三角波默认为100hz,切换后频率也为50HZ65336-10^6/(256*FREQ)
TIME0_H=temp/256;
TIME0_L=temp%256;
}
elseif(cho==0|cho==3)//正弦波三角波默认周期50hz65536-10^6//(512*FREQ)
{
temp=0xffff-1953/FREQ;
TIME0_H=temp/256;
TIME0_L=temp%256;
}
}
//调节部分--方波的占空比
voidduty_ud(void)//方波也采用512次中断构成一个周期。
{
if(duty_d==0&sqar_num>0)
sqar_num--;
elseif(duty_u==0&sqar_num<255)
sqar_num++;
}
//波形发生函数
voidsint(void)
{
if(!
flag)
{
cs=0;P2=sin_num[num++];cs=1;
if(num==0){num=255;flag=1;}
}
elseif(flag)
{
cs=0;P2=sin_num[num--];cs=1;
if(num==255){num=0;flag=0;}
}
}
voidsquare(void)
{
if(i++else{cs=0;P2=0X00;cs=1;}
}/*
voidtriangle(void)
{
cs=0;P2=num++;cs=1;
}*/
voidtriangle(void)
{
if(~flag)
{
cs=0;P2=num++;cs=1;
if(num==0){num=255;flag=1;}
}
elseif(flag)
{
cs=0;P2=num--;cs=1;
if(num==255){num=1;flag=0;}
}
}
//1602显示开始
voidwrite_command(unsignedcharcommand)
{
rs=0;
P0=command;
lcdcs=1;
lcdcs=0;
}
voidwrite_data(unsignedchardata0)
{
rs=1;
P0=data0;
lcdcs=1;
lcdcs=0;
}
voidinit_1602()
{
delay(15);
write_command(0x38);
delay(5);
write_command(0x0c);
delay(5);
write_command(0x06);
delay(5);
}
//1602显示结束
/*******************频率值转换为字符串**********************/
voidtemp_to_str()
{
TempBuffer[0]=FREQ/1000+'0';//千位
TempBuffer[1]=FREQ%1000/100+'0';//百位
TempBuffer[2]=FREQ%1000%100/10+'0';//十位
TempBuffer[3]=FREQ%1000%100%10+'0';//个位
TempBuffer[4]='H';
TempBuffer[5]='Z';
TempBuffer[6]='\0';
}
/*******************频率显示*****************/
voidshow_frequency()
{
unsignedchari;
//init_1602();//初始化lcd
write_command(0x8a);//液晶显示位置
temp_to_str();
/*for(i=0;i{
write_data(value1[i]);
delay(5);
}*/
for(i=0;i{
write_data(TempBuffer[i]);
delay(5);
}
}
voidmain()
{
TMOD=0X01;
TH0=0xff;
TL0=0xd9;
IT0=1;//设置中断触发方式,下降沿
EA=1;
EX0=1;
ET0=1;
IP=0X01;//键盘中断级别高
init_1602();/