51单片机函数发生器.docx
《51单片机函数发生器.docx》由会员分享,可在线阅读,更多相关《51单片机函数发生器.docx(15页珍藏版)》请在冰豆网上搜索。
![51单片机函数发生器.docx](https://file1.bdocx.com/fileroot1/2023-2/2/a366fb4c-df4f-4b58-b59d-2bfa02058830/a366fb4c-df4f-4b58-b59d-2bfa020588301.gif)
51单片机函数发生器
目录
摘要………………………………………………………………………3
1设计选题及任务………………………………………………………4
2系统概述………………………………………………………………4
2.1方案论证和比较……………………………………………………4
2.1.1总体方案………………………………………………………4
2.1.2改变幅度方案…………………………………………………5
2.2工作原理……………………………………………………………5
3.单元电路设计与分析…………………………………………………6
3.1.1主控电路…………………………………………………………6
3.1.2数模转换电路…………………………………………………7
3.1.3运算放大电路和低通滤波电路…………………………………8
4安装调试及测量数据分析……………………………………………9
4.1调试过程……………………………………………………………9
4.2频率的测量数据……………………………………………………9
4.3出现的问题与解决的方法…………………………………………9
4.4系统仿真波形………………………………………………………9
4.5效果分析……………………………………………………………10
4.6测量仪器……………………………………………………………10
5结束语…………………………………………………………………10
附录1……………………………………………………………………11
附录2……………………………………………………………………12
摘要
本文以STC89C51单片机为核心设计了一个低频函数信号发生器。
信号发生器采用数字波形合成技术,通过硬件电路和软件程序相结合,可输出自定义波形,如正弦波、方波、三角波、梯形波及其他任意波形,波形的频率和幅度在一定范围内可任意改变。
波形和频率的改变通过软件控制,幅度的改变通过硬件实现。
介绍了波形的生成原理、硬件电路和软件部分的设计原理。
该信号发生器具有体积小、价格低、性能稳定、功能齐全的优点。
关键词:
低频信号发生器;单片机;D/A转换
1设计选题及任务
设计题目:
基于单片机的信号发生器的设计与实现
任务与要求:
设计一个由单片机控制的信号发生器。
运用单片机系统控制产生多种波形,这些波形包括方波、三角波、锯齿波、正弦波等。
信号发生器所产生的波形的频率为100hz、幅度可调节。
并可通过软件任意改变信号的波形。
基本要求:
1.产生三种以上波形。
如正弦波、三角波、矩形波等;
2.频率为100hz;
3.幅度可调,峰峰值在-10V——+10V之间变化。
扩展要求:
产生更多的频率和波形。
分工:
一组负责各元器件资料搜集、电路板设计;一组负责程序编写、总体调试、说明书总结。
2系统概述
2.1方案论证和比较
2.1.1总体方案:
方案一:
采用模拟电路搭建函数信号发生器,它可以同时产生方波、三角波、正弦波。
但是这种模块产生的不能产生任意的波形(例如梯形波),并且频率调节很不方便。
方案二:
采用锁相式频率合成器,利用锁相环,将压控振荡器(VCO)的输出频率锁定在所需频率上,该方案性能良好,但难以达到输出频率覆盖系数的要求,且电路复杂。
方案三:
使用集成信号发生器发生芯片,例如AD9854,它可以生成最高几十MHZ的波形。
但是该方案也不能产生任意波形(例如梯形波),并且价格昂贵。
方案四:
采用AT89C51单片机和DAC0832数模转换器生成波形,加上一个低通滤波器,生成的波形比较纯净。
它的特点是可产生任意波形,频率容易调节,频率能达到设计的500HZ以上。
性能高,在低频范围内稳定性好、操作方便、体积小、耗电少。
经比较,方案四既可满足课程设计的基本要求又能充分发挥其优势,电路简单,易控制,性价比高,所以采用该方案。
2.1.2改变幅度方案:
方案一:
可以将送给DA的数字量乘以一个系数,这样就可以改变DA输出电流的幅度,从而改变输出电压;但是这样做有很严重的问题,单片机在做乘法运算时需要很长的时间,这样的话输出波形的频率就会很低,达不到要求;
并且该方案的输出电压做不到连续可调,当DA的输入数字量比较小时,输出的波形失真就会比较严重。
方案二:
将输出电压通过一个运算放大器的放大。
这样还有个优点是幅度连续可调。
经比较,方案二既可满足课程设计的基本要求,并且电路也挺简单。
2.2工作原理
数字信号可以通过数/模转换器转换成模拟信号,因此可通过产生数字信号再转换成模拟信号的方法来获得所需要的波形。
89C51单片机本身就是一个完整的微型计算机,具有组成微型计算机的各部分部件:
中央处理器CPU、随机存取存储器RAM、只读存储器ROM、I/O接口电路、定时器/计数器以及串行通讯接口等,只要将89C51再配置键盘及、数模转换及波形输出、放大电路等部分,即可构成所需的波形发生器,其信号发生器构成系统框图如下图所示。
图1系统框图
89C51是整个波形发生器的核心部分,通过程序的编写和执行,产生各种各样的信号,并从键盘接收数据,进行各种功能的转换和信号幅度的调节。
当数字信号电路到达转换电路,将其转换成模拟信号也就是所需要的输出波形。
波形ROM表是将信号一个周期等间距地分离成128个点,储存在单片机得ROM内。
3单元电路设计与分析
3.1.1主控电路
设计中主要采用STC89C51型单片机,它具有如下优点:
(1)拥有完善的外部扩展总线,通过这些总线可方便地扩展外围单元、外围接口等。
(2)该单片机内部拥有4K字节的FLASHROM程序存储器空间和256字节的RAM数据存储空间,完全可以满足程序的要求。
由于该芯片可电擦写,故可重复使用。
如果更改程序内容,可将芯片拿下重新烧写。
(3)该单片机与工业标准的MCS-51型机的指令集和输出引脚兼容。
中断系统是使处理器具有对外界异步事件的处理能力而设置的。
当中央处理器CPU正在处理某件事的时候外界发生了紧急事件,要求CPU暂停当前的工作,转而去处理这个紧急事件。
在波形发生器中,用两个开光与P2.0和P2.1的管脚相连,S1和S2共同控制波形的转换。
时钟电路。
由于频率较大时,三角波、正弦波、方波等波中每一点延时时间为几微秒,该电路用11.0592MHz晶振。
图2主控电路图
3.1.2数/模转换电路
由于单片机产生的是数字信号,要想得到所需要的波形,就要把数字信号转换成模拟信号,所以该文选用价格低廉、接口简单、转换控制容易并具有8位分辨率的数模转换器DAC0832。
DAC0832主要由8位输入寄存器、8位DAC寄存器、8位D/A转换器以及输入控制电路四部分组成。
但实际上,DAC0832输出的电量也不是真正能连续可调,而是以其绝对分辨率为单位增减,是准模拟量的输出。
DAC0832是电流型输出,在应用时外接运放使之成为电压型输出。
根据对DAC0832的数据锁存器和DAC寄存器的不同的控制方式,DAC0832有三种工作方式:
直通方式、单缓冲方式和双缓冲方式。
本设计选用直通方式。
DAC0832的数据口和单片机的P0口相连。
CSDA:
片选信号输入线(选通数据锁存器),低电平有效;
WR:
数据锁存器写选通输入线,负脉冲(脉宽应大于500ns)有效。
由ILE、CS、WR1的逻辑组合产生LE1,当LE1为高电平时,数据锁存器状态随输入数据线变换,LE1的负跳变时将输入数据锁存。
图3数模转换电路
3.1.3运算放大电路和低通滤波电路
图4运算放大及低通滤波
LM324的3管脚与DAC0832的(IOUT2)12管脚相连,LM324的2管脚与DAC0832的(IOUT1)11管脚相连,LM324的1管脚与DAC0832的REF(9)管脚相连.
第一级运算放大器的作用是将DAC0832输出的电流信号转化为电压信号V1,第二级运算放大器的作用是将V1通过反向放大电路-(R6/R4)倍。
题目要求输出的电压在-10V-+10V的电压大约是5V,所以R4择10k的电阻,R6选择50K的电位器,这样最大的输出电压为5*(50/10)=25,最小电压为0,可以实现题目要求的-10V-+10V。
在第二个运算放大器的输出端连了一个低通滤波器。
如果不加低通滤波器,也能够生成波形,但是产生的信号中毛刺很多,加一个低通滤波器不仅起到的滤波的作用,还起到了平滑的作用。
低通滤波器的截止频率F=1/(2*pi*R3*C6),这里我们选择R11为1k欧姆电阻,C6为5pF电容,截止频率F=1600HZ。
实验表明,此时的输出波形效果不错。
4安装调试及测量数据分析
4.1调试过程;
1.不通电,用万用表根据电路图仔细检查各线路连接是否正常。
2.首先是调试单片机部分,DA和运算放大器芯片不接。
用STC_ISP_V483软件通过串口下程序。
看是否可以正常下程序。
3.当可以正常下程序时,给51单片机下一个让所有I/0口一会儿输入0,延时,再输出1,以此类推。
用万用表测量各I/O口得电压是不是一会儿高,一会儿低。
4.安上DA和运算放大器芯片,给单片机下一个输出正弦波的测试程序,通过示波器看输出是否正常。
5.给单片机下一个完整的程序,分别按下S1、S2,看波形是否改变。
4.2频率的测量数据
4.3出现的问题与解决的方法:
1.
刚开始写的测试程序输出的波形失真很大。
我想可能是波形的ROM表里的数据值过多,导致输出每个点的时间不够。
因而卧将波形的ROM表里的数据减少,再测试时发现波形变得好多了。
2.
调试波形的时候我发现矩形波的失真比较大。
我想到可能是低通滤波器的截止频率太低了,因而我将RC低通滤波器的电阻由100换成了1K欧姆,效果好了很多。
4.4系统仿真波形:
矩形波
锯齿波
正弦波
4.5效果分析:
4.6测量仪器
示波器
直流稳压电源
万用表
5结束语
基于单片机的信号发生器设计,这个信号发生器的设计中涉及到一个典型的控制过程。
通过单片机控制一个模数转换器DAC0832产生所需要的电流,然后使用运算放大器LM324可以将其电流输出线性地转换成电压输出,再将电压经过运算放大器的放大,可以得到足够幅度的信号。
通过程序的控制,可以产生一系列有规律的波形。
这样一个信号发生装置在控制领域有相当广泛的应用范围。
最终做出来的信号发生器满足了题目中的所有要求:
1.产生五种波形。
正弦波、三角波、矩形波、梯形波,锯齿波。
2.频率为100HZ。
3.幅度可调,峰峰值在-10V——+10V之间变化。
当然还是存在不足的地方,比如不能实现频率的按一个小的步进调整。
并且当频率太小时矩形波会有些失真。
信号发生器可以生成更多的波形,只需要再加些波形表即可。
在这里得感谢学校为我们提供个这样一个实践的机会,当然还得感谢实验室指导老师们的细心指导。
参考文献:
[1]郭天翔.新概念51单片机C语言教程入门、提高、开发、拓展全.北京.电子工业出版社2009.1
[2]童诗白.模拟电路技术基础[M].北京:
高等教育出版社,2000.171~202.
附录1:
总电路
附录2:
程序设计
#include
#include
#defineuint16unsignedchar
#defineuint8unsignedint
sbitbxzh1=P2^0;
sbitbxzh2=P2^1;
uint8b=0,c=0,d=0,e=0,j,i,wave_choice;
uint8codeto_sin[128]=
{0x80,0x86,0x8c,0x92,0x98,0x9f,0xa5,0xab,
0xb0,0xb6,0xbc,0xc1,0xc7,0xcc,0xd1,0xd5,
0xda,0xde,0xe2,0xe6,0xea,0xed,0xf0,0xf3,
0xf6,0xf8,0xfa,0xfc,0xfd,0xfe,0xff,0xff,
0xff,0xff,0xff,0xfe,0xfd,0xfc,0xfa,0xf8,
0xf6,0xf3,0xf0,0xed,0xea,0xe6,0xe3,0xde,
0xda,0xd6,0xd1,0xcc,0xc7,0xc1,0xbc,0xb6,
0xb1,0xab,0xa5,0x9f,0x99,0x92,0x8c,0x86,
0x80,0x79,0x73,0x6d,0x67,0x61,0x5b,0x55,
0x4f,0x49,0x43,0x3e,0x39,0x33,0x2e,0x2a,
0x25,0x21,0x1d,0x19,0x15,0x12,0xf,0xc,0x9,
0x7,0x5,0x3,0x2,0x1,0x0,0x0,0x0,0x0,0x0,
0x1,0x2,0x3,0x5,0x7,0x9,0xc,0xe,0x12,0x15,
0x18,0x1c,0x20,0x25,0x29,0x2e,0x33,0x38,
0x3d,0x43,0x48,0x4e,0x54,0x5a,0x60,0x66,
0x6c,0x73,0x79};//正弦波数据
voiddelay1(uint8z)
{
uint8i;
for(i=z;i>0;i--);
}
voidkeyscanf()
{
uint16a;
if(bxzh1==0&&bxzh2==0)
wave_choice=4;
if(bxzh1==1&&bxzh2==0)
wave_choice=1;
if(bxzh1==0&&bxzh2==1)
wave_choice=2;
if(bxzh1==1&&bxzh2==1)
wave_choice=3;
}
voidmain()
{
P0=0xff;
P2=0xff;
TMOD=0x01;
TH0=0xff;
TL0=0xb2;
EA=1;
ET0=1;
TR0=1;
while
(1)
{
keyscanf();
}
}
voidtime0_int(void)interrupt1//中断服务程序
{
TH0=0xff;
TL0=0xb2;
TR0=1;
if(wave_choice==1)
{
P0=to_sin[b];//正弦波
if(b==128)b=0;elseb++;
}
if(wave_choice==2)//三角波
{
if(c<=64)
{
P0=c+c;
}
else
{
P0=256-c-c;
}
if(c==64)c=0;elsec++;
}
if(wave_choice==3)//方波
{
if(d<=64)
{
P0=0x00;
}
else
P0=0xff;
if(d==128)d=0;elsed++;
}
if(wave_choice==4)//锯齿波
{
if(e<128)
{
P0=e+e;
}
else
{
P0=0;
}
if(e==128)e=0;elsee++;
}
}