信号发生器报告.docx
- 文档编号:29377318
- 上传时间:2023-07-22
- 格式:DOCX
- 页数:27
- 大小:293.24KB
信号发生器报告.docx
《信号发生器报告.docx》由会员分享,可在线阅读,更多相关《信号发生器报告.docx(27页珍藏版)》请在冰豆网上搜索。
信号发生器报告
电子设计竞赛
函数信号发生器的设计与总结报告
函数信号发生器的设计与总结报告
摘要
以STC89C52单片机为控制核心,外围采用模拟/数字转换电路(DAC0832)、运放电路(OP37)、倍频电路(HCF4046)、按键和1602显示电路等。
P1口接DACO832信号输入并数模转换,程序控制产生三种波形,通过P3口接8个按键,控制频率、幅值,由按键选择三种波形输出。
由OP37运放实现DAC0832输出电流到电压的转换,通过CD4046与CD4060组成的100倍频电路,尽量达到题目频率要求。
在LCD1602上实时显示频率与幅值,波形在示波器上显示。
关键词:
单片机倍频发生器OP37LCD1602
一:
方案设计与论证
本题目要求设计一个函数信号发生器,基本要求是能够产生正弦波,三角波和方波,波形输出频率范围在1~1MHz之间,波形无明显失真,无明显噪声,具体要求如下:
1、频率步进:
1~10KHz,步进不大于10Hz,10KHz~1MHz,步进不大于100Hz;
2、输出电压:
0~5V可调,步进不大于0.1V,测试条件为负载50Ω,输出频率1KHz;
3、能实时显示输出信号类型,频率,电压。
显示和实测误差不大于5%;
4、能够通过按键或其他方法直接设置频率和电压。
即不用按步进慢慢调,直接输入。
5、不得使用现成的DDS信号和信号产生芯片。
综合考虑,本系统大体可分为以下几个部分:
信号发生部分、显示部分、后级电压转换部分、输出信号切换部分、倍频部分
下面对重要模块进行方案比较
1、信号发生部分
方案1:
采用模拟分立元件或单片压控函数发生器
模拟分立元件或单片压控函数发生器可产生正弦波,方波,三角波,通过调整外部元件可改变输出频率,但采用模拟器件由于元件分散性太大,即使使用单片函数发生器,参数也一与外部元件有关,外接的电阻电容对参数影响很大,因而产生的频率稳定性较差,精度低,抗干扰能力低,成本也高,而且灵活性较差,不能实现任意波形以及波形运算输出等智能化的功能。
方案2:
采用锁相式频率合成方案。
锁相式频率合成是一个高稳定度和精确度的大量离散频率的技术,它在一定程度上解决了既要频率稳定精确,又要频率在较大范围可变的矛盾。
但频率受VCO可变频率范围的影响,高低频率比不可能做的很高,而且只能产生方波或正弦波,不能满足任意波形的要求。
方案3:
采用单片机和数模/转换DAC0832实现波形的产生。
波形的产生是通过STC89C52执行正弦波波形发生程序,向D/A转换器的输入端按一定的规律发生数据,从而在D/A转换电路的输出端得到相应的电压波形。
通过CD4046与CD4518分频实现倍频,已达到最高1MHz的频率。
在89C52的P3口接8个按扭,通过软件编程来选择各种波形、幅值电压和频率,每种波形对应一个按钮。
此方案的特点是电路原理比较简单,实现起来比较容易。
方案论证:
经比较,方案三能更好地实现题目要求,三种波形的产生可由程序控制,并通过按键选择波形输出,在示波器上显示波形。
波形的幅值与频率步进也可以用程序改变,具有线路简单、结构紧凑等优点。
在本设计的基础上,通过按钮设定所需要的波形频率,并在LCD1602上显示频率、幅值和信号源,输出波形稳定,精度高,滤波好,抗干扰效果好,连接简单,性价比高。
因此我们设计中采用方案三。
方案选定:
方案3
2、显示部分
方案1:
数码管显示
由于本题要求实时显示输出信号的幅度,频率,而数码管不能显示字符。
同时数码管静态显示占用过多的I/O口,动态显示又得进行扫描,占用系统资源大。
方案2:
LED点阵显示
LED点阵显示虽然能显示字符和数字,但显示效果不好,目不易编程。
方案3:
LCD1602显示
LCD液晶编程简单,可以同时显示字符和数字,信息量较大,用串行通讯可减少I/O口的占用量。
而且1602的成本中等,是值得考虑的选择。
方案论证:
结合本题要求和LCD1602的优良特性即不但能显示字符和数宇,而且显示效果较好,容易编程实现。
方案选定:
方案3
3、后级电压转换部分
前级的信号输出的幅度会由于频率的改变而改变,难以定量控制。
可以通过后级电压转换达到题目的输出要求。
方案1:
用晶体管搭成放大电路
分立的晶体管构成的放大电路,有动态范围广、通频带较宽、灵敏度高、能承受的较大的功率等特点。
但是,分立元件组成的电路元件参数的计算麻烦,电路调试困难,而且在高频段抗干扰能力不足。
方案2:
用运算放大器构成放大电路
运算放大器搭成的放大电路简单,调试简单,可靠性高。
根据信号的频率要求,一定要采用低噪声,宽频带的高速运放。
OP37具有较高的频带,用来作末级放大,则可达到题目提出的高指标。
方案3:
用数字电位器控制
采用数字电位器代替机械电位器,结合运放。
此方案便于数字控制,自动化程度高。
但成本高且精度低。
方案论证:
用运算放大器构成的放大电路调试简单,可靠性高,再字电位器代替机械电位器,精度更高,可以很好的达到要求。
方案选定:
方案3。
二:
电路设计
1、信号发生单元电路设计
(1)软件设计
信号发生部分我们依靠STC89C52采用查表法实现正弦波,然后再经过软件编程实现矩形波和三角波。
在按键的选择作用下,输出三种波形,并且幅度和频率都可以通过外部按键控制。
信号发生单元总的信号流图如图1-1。
图1-1
1)正弦波程序设计
DAC0832是8位的D/A转换器件,其工作电压是0-5V,当输入00数字量的时候,输出为0V电压;当输入80数字量的时候,输出为2.5V电压;当输入FF数字量的时候,输出为5V电压。
将一个周期内的正弦波形等分为256份,那么第1点的角度为0°,对应的正弦值为Asin0°;第2点的角度为360°/256,对应的正弦值为Asin(360°/256)……,如此计算下去,将这些模拟量正弦值都转换为单极性方式下的数字量,就可以得到一张按照点号顺序排列的正弦波波形数据表格。
其实在计算正弦波形数据的时候,并不需要算出整个0-2π区间的每一个值,而只需计算出0-1/2π中的值就行,其他区间的值都可以通过对0-1/2π中的值取不同的变换。
比如1/2π-π的值可以和0-1/2π值一一对应,而π-2π的值可以对0-π区间的值取反得到。
计算值可以用C语言编程得到。
幅度公式为
(N=0,1,2……64)
相应的Y值数字化后的递增量
那么每一个点相对于前一个点的递增率为
(Y2当前的点,Y1为前一个点)
所以每一个点的数字量与递增率A成一一对应关系。
数字量化C程序:
#include
main()
{
intn,i=0,j,k;
floaty=0,a=3.1415926,b=0,c=2.5000,d=0;
for(n=0;n<=64;n++)
{
y=2.5*sin(a*n/128)+2.5;
b=y;//b,y为当前幅度值
d=b-c;//d为递增率
j=d/0.0196;//j为数字递增率,0.0196为δ
k=128+j;//k为数字量
printf(“%d,%f,%f,%d,%d\n”,i,y,d,j,k);
i++;
}
}
在得到正弦波波形数据后,通过查表实现之。
2)三角波程序设计
通过c中数值加一递升,赋给DAC0832即P2口,当c的值为128时,再逐次递减至0,从而循环产生三角波。
流程图为上图choice等于2部分。
3)方波程序设计
通过d值的加一递升,当d值小于129时,赋给DAC0832即P2口0x00,当d值大于128时,d再逐次递减,赋给DAC0832即P2口0xff,直至d为0,从而循环产生方波。
流程图为上图choice等于3部分。
(2)信号发生部分电路设计
信号发生部分部分采用STC89C52单片机和8位DAC0832芯片。
单片机将处理好的数据通过P2口赋给0832,由于0832被接成直通形式,数字量一旦输入,就直接进入D/C寄存器,进行D/A转换。
图1-2为其单元电路。
图1-2
2、显示部分单元电路设计
显示部分采用LCD1602显示相应的信号源、电压、频率。
相应的信号源、电压、频率可由外部按键控制,通过voiddsiplay()函数及时在1602上得以显示,形成一个友好的人机交互界面。
单元电路如图1-3。
图1-3
3、后级电压转换部分单元电路设计
由于DAC0832是电流输出型的D/A,故要在示波器上观看相关信号时需要将变化的电流转换成电压形式。
我们在0832的Iout端口的输出级加了一级OP37运算放大器,该款运放性能优秀,输入失调电压只有10nV、低漂移、高开环增益,它能够最大程度的捕捉小电流并把它转换成电压形式。
运放的6输出端即为本设计的输出电压Uout端。
C4、C5用于去除电源噪声,防止干扰。
单元电路如图1-4。
图1-4
对于这个8位D/A转换器,当反馈电阻为Rf=R/2时,输出电压的计算公式可写成
上式表明输出的模拟电压正比于输入的数字量Dn,从实现了从数字量到模拟量的转换。
可通过改变参考电压Vref的极性使输出电压为正或负。
4、倍频电路部分单元电路设计
CD4016是通用的CMOS锁相环集成电路,其特点是电源电压范围宽(3V-18),输入阻抗高(约100M),动态功耗小,在中心频率f0为10kHz下功耗仅为600uw,属微功耗器件。
CD4518是一个同步加计数器,在一个封装中含有两个可互换二/十进制计数器,其功能引脚分别为1-7和9-15.该CD4518计数器是单路系列脉冲输入(1脚或2脚;9脚或10脚),4路BCD码信号输出(3脚-6脚;11脚~14脚)。
由锁相环CD4046与计数器CD4518实现100倍倍频。
当从14l脚输入频率f1l的信号时,在3脚(相位比较信号输入信号)、4脚(压控振荡器输出信号)之间接计数器4518,输出端4脚频率f2=100f1,实现100倍频,使输出频率达到题日要求。
具体电路连接如图1-5。
图1-5
5、软件设计总体流程图
本软件设计过程中主要实现利用按键来控制不同波形的输出以及频率和幅值的控制。
当按键1按下时,函数发生器就进行以10Hz为最小单位的频率步进升;当按键2按下时,函数发生器就进行以10Hz为最小单位的频率步进降;当按键3按下1次时,函数发生器就输出正弦波,按下2次时,输出三角波,按下3次时,输出方波;KEY4、KEY5实现以0.1V为最小单位的电压步进;KEY6、KEY7、KEY8键用于实现对输出信号频率和电压的任意控制;同时这些变化都会实时的显示在液晶上,经过信号发生部分的处理后也会实时的显示在示波器上。
图1-6
6总体电路图
电路总体电路图如图1-7所示。
图1-7
三:
测试方法与测试结果
1、测试仪器:
万用表UT52、示波器TDS754A。
2、测试方法:
将焊出的函数信号发生器直接连接到示波器上,通过按键3调出各个信号,在每个信号下分别通过按键1、2、6、7、8设置出50Hz、100Hz、200Hz、500Hz、1KHz、5KHz、10KHz、20KHz测试频率,在示波器上测出实际频率。
再通过按键4、5、6、7、8设置出1V、1.5V、2V、2.5V、3V、3.5V、4V、4.5V、5测试幅值,在示波器上测出实际峰峰值。
获取测试数据后,列表整理并和理论值进行比较,计算出误差,评估函数信号发生器的性能。
3、测试结果:
正弦波测试数据表1-1
设定频率/Hz
50
100
200
实际频率/Hz
48.9
95.2
195.0
实际峰峰值/V
5.0
5.0
5.0
方波测试数据表1-2
设定频率/Hz
50
100
200
实际频率/Hz
49.5
100.3
198
实际峰峰值/V
5
5
5
三角波测试数据表1-3
设定频率/Hz
50
100
200
实际频率/Hz
49.4
100.4
197
实际峰峰值/V
5
5
5
四:
讨论
经过测试,本函数信号发生器基本达到了题设要求,但是精度不高,经过仔细分析产生误差的原因应该由于以下原因造成:
(1)51单片机处理速度太慢,由于我们采用软件方法产生信号,所以输出信号频率不高,后期处理时,求和运放部分没有进行滤波,带来干扰,导致最后输出的信号产生失真
(2)为了节省成本,采用了低成本的元器件,导致倍频电路的外围元器件参数值与原设计值产生误差,未能到100倍频,经过放大后,也对信号的失真产生了影响
改进措施:
采用速度更快的单片机或使用FPGA,信号产生部分采用纯硬件搭建或使用专用信号发生器DDS,而不是利用软件。
采用更精确的元器件,在求和运放后后加上滤波电路,相信这些措施能够改善电路,使其达到理想效果。
[参考文献]
[1]郭天祥.51单片机C语言教程[M].北京;电子工业出版社,2009
[2]谢嘉奎.电子线路[M].北京;高等教育出版社,2006
[3]XX文库.OP37中文资料[EB/OL].
[4]豆丁文库.函数信号发生器[EB/OL].
附:
程序源代码
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitkeyup=P3^0;//频率升
sbitkeydown=P3^1;//频率降
sbitkeychoose=P3^2;//波形选择
sbitvkeyup=P3^3;//幅值
sbitvkeydown=P3^4;
sbitfkeyup=P3^5;//调位升
sbitfkeydown=P3^6;//调位降
sbitfkeywei=P3^7;//调位
sbitrs=P1^0;//时钟读命令
sbitlcden=P1^1;//时钟使能端
uintn=20;
ucharcch=50;//频率计数
ucharnum=0,sjbo=0,jcbo=0,keynum=0,qq=0,bb=0,ss=2,gg=0,vgw,vsw,vbw;
bitsjbobit=0,squnum=0,flag;
uintold_f,t,f,v;//频率标志位,频率值
ucharold_choose,choose=0;//波行选择
ucharcodetitle[]={"SIGNAL:
"};//0x80+9
ucharcodecontent[]={"fre:
"};//0x80+0x40+4
ucharcodecontent1[]={"V:
"};//0x80+0x40+10
ucharcodesignal_type[]={"sintrisqu"};
unsignedcharcodesin[]=
{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,0x78,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,0x02,0x02,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x02,0x02,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};//正弦波的值
voidDelay(unsignedintts)
{
unsignedintx,y;
for(x=ts;x>0;x--)
for(y=110;y>0;y--);
}
voidwrite_com(ucharcom)//时钟写指令
{
rs=0;
lcden=0;
P0=com;
Delay(5);
lcden=1;
Delay(5);
lcden=0;
}
voidwrite_dat(uchardat)//时钟写数据
{
rs=1;
lcden=0;
P0=dat;
Delay(5);
lcden=1;
Delay(5);
lcden=0;
}
voiddisplay(ucharadress,uchardate)
{
write_com(0x80+0x40+adress);
write_dat(0x30+date);
}
voidfkeycheck(void)//频率位调节
{
if((fkeyup&fkeydown&fkeywei)==0)
{
TR0=0;
if(fkeywei==0)
{
Delay(5);
keynum++;
if(fkeywei==0)
{
switch(keynum)
{
case1:
write_com(0x80+0x47);write_com(0x0f);break;
case2:
write_com(0x80+0x46);break;
case3:
write_com(0x80+0x45);break;
case4:
write_com(0x80+0x44);break;
case5:
write_com(0x80+0x4f);break;
case6:
write_com(0x80+0x4e);break;
case7:
write_com(0x80+0x4c);break;
case8:
keynum=0;write_com(0x0c);break;
default:
break;
}
while(fkeywei==0);
}
}
if(fkeywei!
=0)
{
qq=f/1000;
bb=f%1000/100;
ss=f%100/10;
gg=f%10;
if(fkeyup==0)
{
Delay(5);
if(fkeyup==0)
{
switch(keynum)
{
case1:
gg++;if(gg==10)gg=0;display(7,gg);break;
case2:
ss++;if(ss==10)ss=0;display(6,ss);break;
case3:
bb++;if(bb==10)bb=0;display(5,bb);break;
case4:
qq++;if(qq==10)qq=0;display(4,qq);break;
case5:
vgw++;if(vgw==10)vgw=0;display(15,vgw);break;
case6:
vsw++;if(vsw==10)vsw=0;display(14,vsw);break;
case7:
vbw++;if(vbw==10)vbw=0;display(12,vbw);break;
default:
break;
}
while(fkeyup==0);
}}
if(fkeydown==0)
{
Delay(5);
if(fkeydown==0)
{
switch(keynum)
{case1:
gg--;if(gg==-1)gg=9;display(7,gg);break;
case2:
ss--;if(ss==-1)ss=9;display(6,ss);break;
case3:
bb--;if(bb==-1)bb=9;display(5,bb);break;
case4:
qq--;if(qq==-1)qq=9;display(4,qq);break;
case5:
vgw--;if(vgw==-1)vgw=9;display(15,vgw);break;
case6:
vsw--;if(vsw==-1)vsw=9;display(14,vsw);break;
case7:
vbw--;if(vbw==-1)vbw=9;display(12,vbw);break;
default:
break;
}
while(fkeydown==0);
}}
n=qq*1000+bb*100+ss*10+gg;
v=vbw*100+vsw*10+vgw;
TR0=1;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 信号发生器 报告