课程设计文档格式.docx
《课程设计文档格式.docx》由会员分享,可在线阅读,更多相关《课程设计文档格式.docx(16页珍藏版)》请在冰豆网上搜索。
大电阻,大电容在制作上有困难,参数的精度亦难以保证;
体积大,漏电,损耗显著更是致命的弱点。
一旦工作需求功能有增加,则电路复杂程度会大大增加。
本次设计过程采用系统设计的方法、先分析任务、得到系统要求、然后进行总体设计、划分子系统、然后进行详细设计、决定各个功能子系统中的内部电路、最后进行测试。
因此、设计且制作简易低频信号源体现了我们学生的实践能力。
二、任务分析
能够实现以下功能:
第一、能够不失真的产生三角波、正弦波、矩形波。
第二、(正弦波)三角波频率范围为0.01~80HZ,幅度为1~5V,方波频率为1~10KHZ,幅值为5V。
第三、可以实现按键切换波形功能,幅值可调。
第四、其他功能,比如实现频率显示。
三、方案论证与选择
(一)信号发生电路方案论证
方案一:
通过单片机控制D/A,输出四种波形。
此方案输出的波形不够稳定,抗干扰能力弱,不易调节。
但此方案电路简单、成本低。
方案二:
使用传统的锁相频率合成方法。
通过芯片IC145152,压控振荡器搭接的锁相环电路输出稳定性极好的正弦波,再利用过零比较器转换成方波,积分电路转换成三角波。
此方案,电路复杂,干扰因素多,不易实现。
方案三:
利用MAX038芯片组成的电路输出波形。
MAX038是精密高频波形产生电路,能够产生准确的锯齿波、三角波、方波和正弦波四种周期性波形。
但此方案成本高,程序复杂度高。
以上三种方案综合考虑,选择方案一。
(二)、主控芯片选择
采用51系列单片机外围电路。
51单片机是一款非常适合单片机初学者的单片机。
它是一种低功耗、高性能CMOS8位微控制器、具有8K在系统可编程Flash存储器。
片上Flash允许程序存储器在系统可编程、亦适于常规编程器。
在单芯片上、拥有灵巧的8位CPU和在系统可编程Flash、使得AT89S52在众多嵌入式控制应用系统中得到广泛应用。
采用AVR单片机。
AVR单片机硬件结构采取8位机与16位机的折中策略,即采用局部寄存器存堆(32个寄存器文件)和单体高速输入/输出的方案(即输入捕获寄存器、输出比较匹配寄存器及相应控制逻辑)。
提高了指令执行速度(1Mips/MHz),克服了瓶颈现象,增强了功能;
同时又减少了对外设管理的开销,相对简化了硬件结构,降低了成本。
故AVR单片机在软/硬件开销、速度、性能和成本诸多方面取得了优化平衡,是高性价比的单片机。
采用msp430系列单片机。
MSP430系列单片机是一个16位的单片机,采用了精简指令集(RISC)结构,具有丰富的寻址方式(7种源操作数寻址、4种目的操作数寻址)、简洁的27条内核指令以及大量的模拟指令;
大量的寄存器以及片内数据存储器都可参加多种运算;
还有高效的查表处理指令。
这些特点保证了可编制出高效率的源程序。
方案比较:
由于我们只需要完成简易低频信号源的实验,51单片机完全满足我们的需要,而且51单片机价格实惠,性价比高,编程容易,故选择51单片机作为主控芯片。
(三)键盘方案论证
矩阵式键盘。
矩阵式键盘的按键触点接于由行、列母线构成的矩阵电路的交叉处。
当键盘上没有键闭合时,所有的行和列线都断开,行线都呈高电平。
当某一个键闭合时,该键所对应的行线和列线被短路。
独立式键盘。
独立式键盘具有硬件与软件相对简单的特点,其缺点是按键数量较多时,要占用大量口线。
以上两种方案综合考虑,选择方案二。
四、详细设计
在上一阶段进行总体设计完成后,现在就可以分开独立的完成各个功能模块了。
首先,需要选择使用集成芯片,总体思路是在满足所需功能前提下,能是电路尽可能简单。
数字信号可以通过数/模转换器转换成模拟信号,因此可通过产生数字信号再转换成模拟信号的方法来获得所需要的波形。
89S51单片机本身就是一个完整的微型计算机,具有组成微型计算机的各部分部件,只要将89S51再配置键盘及、数模转换及波形输出、放大电路等部分,即可构成所需的波形发生器,其信号发生器构成系统框图如下图所示。
系统框图
89C51是整个波形发生器的核心部分,通过程序的编写和执行,产生各种各样的信号,并从键盘接收数据,进行各种功能的转换和信号幅度的调节。
当数字信号电路到达转换电路,将其转换成模拟信号也就是所需要的输出波形。
波形ROM表是将信号一个周期等间距地分离成64个点,储存在单片机得RON内。
具体ROM表是通过MATLAB生成的,例如正弦表,MATLAB生成的程序如下:
x=0:
2*pi/64:
2*pi;
y=round(sin(x)*127)+128
下面我们详细介绍各芯片的功能及主要电路
(一)AT89S51的最小系统
典型的51单片机芯片集成了以下几个基本组成部分:
1)一个8位的CPU,2)128B或256B单元内数据存储器(RAM),3)4KB或8KB片内程序存储器(ROM或EPROM,4)4个8位并行I/O接口P0~P3,5)两个定时/计数器。
6)5个中断源的中断管理控制系统。
7)一个全双工串行I/O口UART(通用异步接收、发送器),8)一个片内振荡和时钟产生电路。
P0口功能:
P0口具有两种功能:
第一,P0口可以作为通用I/O接口使用,P0.7—P0.0用于传送CPU的输入/输出数据。
输出数据时可以得到锁存,不需外接专用锁存器,输入数据可以得到缓冲。
第二,P0.7—P0.0在CPU访问片外存储器时用于传送片外存储器de低8位地址,然后传送CPU对片外存储器的读写
P1口功能:
P1口的功能和P0口de第一功能相同,仅用于传递I/O输入/输出数据。
P2口的功能:
2口的第一功能和上述两组引脚的第一功能相同,即它可以作为通用I/O使用。
它的第二功能和P0口引脚的第二功能相配合,作为地址总线用于输出片外存储器的高8位地址。
P3口功能:
P3口有两个功能:
第一功能与其余三个端口的第一功能相同;
第二功能作控制用,每个引脚都不同。
P3.0—RXD串行数据接收口P3.1—TXD串行数据发送口P3.2—INT0外中断0输入
P3.3—INT1外中断1输入P3.4—T0计数器0计数输入P3.5—T1计数器1计数输入
P3.6—WR外部RAM写选通信号P3.7—RD外部RAM读选通信号
51单片机的最小系统由复位电路、晶振电路等组成。
P0口为开漏输出,作为输出时需加上上拉电阻,阻值一般为10K
复位电路:
51单片机最小系统复位电路的极性电容C1的大小直接影响单片机的复位时间,一般采用10~30uF,51单片机最小系统容值越大需要的复位时间越短。
51单片机高电平复位。
以当前使用较多的AT89系列单片机来说,在复位脚加高电平2个机器周期(即24个振荡周期)可使单片机复位。
复位后,主要特征是各IO口呈现高电平,程序计数器从零开始执行程序。
复位方式有两种。
a.手动复位:
按钮按下,复位脚得到VCC的高电平,单片机复位,按钮松开后,单片机开始工作。
b.上电复位:
上电后,电容电压不能突变,VCC通过复位电容(10μF电解)给单片机复位脚施加高电平5V,同时,通过10KΩ电阻向电容器反向充电,使复位脚电压逐渐降低。
经一定时间后(约10毫秒)复位脚变为0V,单片机开始工作。
复位电路晶振电路
晶振电路:
51单片机内部具有一个高增益的反相放大器,由于构成振荡器,通常在引脚XTAL1和XTAL2跨接石英晶体振荡器和两个补偿电容构成自激振荡器如图2所示,51单片机最小系统晶振Y1也可以采用6MHz或者11.0592MHz,在正常工作的情况下可以采用更高频率的晶振,51单片机最小系统晶振的振荡频率直接影响单片机的处理速度,频率越大处理速度越快。
51单片机最小系统起振电容C2、C3一般采用22-33PF,并且电容离晶振越近越好。
(二)数/模转换电路DAC0832的引脚及功能
由于单片机产生的是数字信号,要想得到所需要的波形,就要把数字信号转换成模拟信号,所以该文选用价格低廉、接口简单、转换控制容易并具有8位分辨率的数模转换器DAC0832。
DAC0832主要由8位输入寄存器、8位DAC寄存器、8位D/A转换器以及输入控制电路四部分组成。
但实际上,DAC0832输出的电量也不是真正能连续可调,而是以其绝对分辨率为单位增减,是准模拟量的输出。
DAC0832是电流型输出,在应用时外接运放使之成为电压型输出。
DAC0832的数据口和单片机的P0口相连。
CSDA:
片选信号输入线(选通数据锁存器),低电平有效;
WR:
数据锁存器写选通输入线,负脉冲(脉宽应大于500ns)有效。
由ILE、CS、WR1的逻辑组合产生LE1,当LE1为高电平时,数据锁存器状态随输入数据线变换,LE1的负跳变时将输入数据锁存;
1、DAC0832芯片:
DAC0832是8分辨率的D/A转换集成芯片。
与微处理器完全兼容。
这个DA芯片以其价格低廉、接口简单、转换控制容易等优点,在单片机应用系统中得到广泛的应用。
D/A转换器由8位输入锁存器、8位DAC寄存器、8位D/A转换电路及转换控制电路构成。
2、DAC0832的主要特性参数如下:
分辨率为8位;
电流稳定时间1us;
可单缓冲、双缓冲或直接数字输入;
只需在满量程下调整其线性度;
单一电源供电(+5V~+15V);
低功耗,200mW。
3、DAC0832结构:
D0~D7:
8位数据输入线,TTL电平,有效时间应大于90ns(否则锁存器的数据会出错);
ILE:
数据锁存允许控制信号输入线,高电平有效;
CS:
WR1:
XFER:
数据传输控制信号输入线,低电平有效,负脉冲(脉宽应大于500ns)有效;
WR2:
DAC寄存器选通输入线,负脉冲(脉宽应大于500ns)有效。
由WR1、XFER的逻辑组合产生LE2,当LE2为高电平时,DAC寄存器的输出随寄存器的输入而变化,LE2的负跳变时将数据锁存器的内容打入DAC寄存器并开始D/A转换。
IOUT1:
电流输出端1,其值随DAC寄存器的内容线性变化;
IOUT2:
电流输出端2,其值与IOUT1值之和为一常数;
Rfb:
反馈信号输入线,改变Rfb端外接电阻值可调整转换满量程精度;
Vcc:
电源输入端,Vcc的范围为+5V~+15V;
VREF:
基准电压输入线,VREF的范围为-10V~+10V;
AGND:
模拟信号地
DGND:
数字信号地
4、DAC0832的工作方式:
根据对DAC0832的数据锁存器和DAC寄存器的不同的控制方式,DAC0832有三种工作方式:
直通方式、单缓冲方式和双缓冲方式。
本设计选用直通方式。
(三)运算放大电路和低通滤波电路
LM324的5管脚与DAC0832的(IOUT2)12管脚相连,LM324的6管脚与DAC0832的(IOUT1)11管脚相连,LM324的7管脚与DAC0832的REF(9)管脚相连.
第一级运算放大器的作用是将DAC0832输出的电流信号转化为电压信号V1,第二级运算放大器的作用是将V1通过反向放大电路-(R2/R1)倍。
题目要求输出的电压在0-5V可调,而V1的电压大约是5V,所以R1选择5K的电阻,R2选择10K的电位器,这样最大的输出电压为5*(10/2)=10,最小电压为0,可以实现题目要求的0-5V。
在第二个运算放大器的输出端连了一个低通滤波器。
如果不加低通滤波器,也能够生成波形,但是产生的信号中毛刺很多,加一个低通滤波器不仅起到的滤波的作用,还起到了平滑的作用。
低通滤波器的截止频率F=1/(2*pi*R3*C6),这里我们选择R3为100欧姆电阻,C6为104电容,截止频率F=16KHZ。
实验表明,此时的输出波形效果不错。
(四)按键模块
独立按键使用起来简单方便,在编写程序时必须对其进行消抖,原因如下:
当按键未按下时输出高电平,当按键按下时输出低电平。
通常按键为机械式开关,由于机械触点的弹性作用,一个按键在闭合时不会马上稳定的接通,断开时也不会马上断开,因而在闭合和断开的瞬间都会伴随着一串的抖动。
中断系统是使处理器具有对外界异步事件的处理能力而设置的。
当中央处理器CPU正在
处理某件事的时候外界发生了紧急事件,要求CPU暂停当前的工作,转而去处理这个紧
急事件。
在波形发生器中,用两个开光直接与外部中断0和外部中断1的管脚相连,其中S1开光用来改变波形,S2开光用来改变频率。
在程序主函数中,我们写了个死循环一直输出一个默认的波形,当S1或S2按下又抬起时,程序会暂时跳出死循环,进入中断处理程序,从而对波形和频率进行改变。
五、流程图
软件设计上,根据功能分了几个模块编程。
模块主要有:
主程序模块、外部中断0模块,外部中断1模块。
(一)主程序:
主程序先是进行一些初始化的工作,然后根据波形标志flag的值进入相应的while循环。
在while循环中,单片机根据地址标志位不停低查表,然后把查得的值赋给DAC0832的数据口,然后地址标志位加一,并判断地址标志位是否等于64,如果是就置0再往下执行,如果不是直接往下执行。
然后根据频率标志位进行相应的延时。
主程序流程图
(二)中断服务程序:
本程序中两个外部中断分别起到了控制波形和频率的作用。
在程序中还加入了消抖部分。
六、调试过程;
1.不通电,用万用表根据电路图仔细检查各线路连接是否正常。
2.首先是调试单片机部分,DA和运算放大器芯片不接。
用软件通过串口下程序。
看是否可以正常下程序。
3.当可以正常下程序时,给51单片机下一个让所有I/0口一会儿输入0,延时,再输出1,以此类推。
用万用表测量各I/O口得电压是不是一会儿高,一会儿低。
4.安上DA和运算放大器芯片,给单片机下一个输出正弦波的测试程序,通过示波器看输出是否正常。
5.给单片机下一个完整的程序,分别按下S1,看波形是否改变。
按下S2,看频率是否改变。
6.观察LM324的电源连接是否正确
七、心得体会
经过长达一周的设计与思考,最终在电路板上完成了基于单片机简易低频信号源的设计与调试。
其间遇到了许多问题,但最后都一一得到解决。
现将心得体会总结如下:
1.焊接电路时必须对每个节点焊的很好,否则很容易出现虚焊,导致出现排查错误时不容易发现错误而耽误完成整个设计的时间。
2.编程时必须非常的仔细,每个步骤都必须进行测试,每出现编一步,观察下实验现象是否正确。
3.设计初期要考虑周到,否则后期改进很困难。
应该在初期就多思考几个方案,进行比较论证,选择最合适的方案动手设计。
总体设计在整个设计过程中非常重要,应该花较多的时间在上面。
4.方案确定后,才开始设计。
设计时,多使用已学的方法,如列真值表,化简逻辑表达式,要整体考虑,不可看一步,做一步。
在整体设计都正确后,再寻求简化的方法。
5.在设计某些模块的时候无法把握住整体,这时可以先进行小部分功能的实现,在此基础上进行改进,虽然可能会多花一些时间,但这比空想要有效的多。
6.尽可能是电路连线有序,模块之间关系清楚,既利于自己修改,也利于与别人交流。
如果电路乱的连自己都看不懂,那还如何改进和扩展。
7.很多难点的突破都来自于与同学的交流,交流使自己获得更多信息,开拓了思路,因此要重视与别人的交流。
8.应该有较好的理论基础,整个实验都是在理论的指导下完成了,设计过程中使用了许多理论课上学的内容。
本次设计把理论应用到了实践中,同时通过设计,也加深了自己对理论知识的理解和掌握。
最后还要在此感谢我的指导老师周厚奎老师和我的组员们,他们在整个过程中都给予了我充分的帮助与支持。
八、参考文献
[1]郭天翔主编:
《新概念51单片机C语言教程-入门、提高、开发、拓展》,北京,电子工业出版社,2009年
[2]清华大学教研组编,阎石主编:
《数字电子技术基础》(第四版),北京,高等教育出版社,2004年
[3]谢维成、杨加国主编:
《单片机原理与应用及C51程序设计》(第二版),北京,清华大学出版社,2009年
[4]马忠梅.单片机C程序设计[M],北京:
被恶警航空航天大学出版社,2007年
[5]谭浩强.C程序设计[M],北京:
清华大学出版社,2002年
[6]李广弟.单片机基础[M],北京:
北京航空航天大学出版社,2007年
[7]阎石.模拟电子技术基础[M].
[8]康华光.电子技术基础[M].高等教育出版社.
附录一仿真结果
如图所示,我们可以正确得得到仿真波形
图(a)方波图(b)锯齿波
图(c)三角波图(d)正弦波
附录二系统设计电路图
附录三源程序
#include<
reg51.h>
intrins.h>
sbits1=P3^2;
sbits2=P3^3;
unsignedintt,i,f,flag;
unsignedcharcodesine[]={
135,145,158,167,176,188,199,209,218,226,234,240,245,249,252,254,254,253,251,247,243,237,230,222,213,204,193,182,170,158,
146,133,121,108,96,84,72,61,50,41,32,24,17,11,7,3,1,0,0,2,5,9,14,20,28,36,45,55,66,78,90,102,114,128,
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,4,8,12,16,20,24,28,32,36,40,45,49,53,57,61,65,69,73,77,81,85,89,93,97,101,105,109,113,117,121,125,130,134,138,142,
146,150,154,158,162,166,170,174,178,182,186,190,194,198,202,206,210,215,219,223,227,231,235,239,243,247,251,255,
0,13,26,39,52,65,78,91,104,117,130,143,156,169,182,195,208,221,234,247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,
247,247,247,247,247,247,247,242,229,216,203,190,177,164,151,138,125,112,99,86,73,60,47,34,21,8,
0,8,16,24,32,40,48,56,64,72,80,88,96,104,112,120,128,136,144,152,160,168,176,184,192,200,208,216,224,232,240,248,
248,240,232,224,216,208,200,192,184,176,168,160,152,144,136,128,120,112,104,96,88,80,72,64,56,48,40,32,24,16,8,0
};
voiddelay(unsignedcharz)
{
unsignedcharx,y;
for(x=z;
x>
0;
x--)
for(y=110;
y>
y--);
}
voidmain()
EA=1;
ET0=0;
EX0=1;
EX1=1;
IT0=1;
IT1=1;
f=3;
flag=0;
t=0;
P1=0x00;
while
(1)
{
i=f;
P2=sine[64*flag+t];
while(i--);
t++;
if(t==64)t=0;
}
voidkey1()interrupt0
EX0=0;
delay(10);
if(s1==0)
flag++;
if(flag==5)flag=0;
while(!
s1);
voidkey2()interrupt2
EX1=0;
if(s2==0)
f+=3;
if(f==30)f=3;
s2);