多功能波形发生器
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1.设计选题及任务
设计题目:多功能波形发生器
任务与要求:
设计一个由单片机控制的波形发生器。运用单片机系统控制产生多种波形,这些波形包括方波、三角波、锯齿波、正弦波等。信号发生器所产生的波形的频率、幅度均可调节。并可通过软件任意改变信号的波形。
基本要求:
1. 产生方波、三角波、锯齿波、正弦波可通过开关选择
2.波形幅值调围80H~FFH,两档。周期两档
3.有波形指示幅值周期档显示功能。
2.系统概述及硬件简介
随着科技的发展和现代科研的需要,信号发生器已经成为了很多行业进行研究测试不可或缺的工具,但目前使用波形发生器大部分体积大,可靠性差,准确度低。因此为了实验研究方便,研制一种体积小、可靠性强、准确性高的波形发生器显得尤为重要。
方案总体设计框图
图2.1
总体电路图见附录2。由于proteus单片机已默认连接复位电路、晶振电路、以及电源,所以本设计中没有这几个模块的具体电路。
3.软件的实现
系统软件由主程序和外部中断程序,定时器中断程序以及键值判断子程序,显示子程序子程序组成,波形的产生主要通过定时器中断来完成。波形的转换通过改变波形标志位实现。周期的改变可通过定时器的初值改变的方法来实现。幅值可通过初始值的改变而方法来实现,由LCD1602完成显示部分。具体如下所述3.1波形的产生原理
将各种波形的每个周期平均分成255份,把每份的值依次发给P0口,每份的时间间隔通过开启定时器0来控制,当定时时间到时单片机就产生中断,在中
断服务程序里面通过P0口将每份的值发出去,这个值通过DAC0832转换为模拟量。 如图3.1
图3.1
3.2波形的产生过程 3.2.1正弦波的产生过程
对正弦波的一个周期进行等间隔的采样,采样次数为255次,将所采样的数值转化为8位二进制数存放在数组tosin[255]里面。然后定义一个无符号型变量b ,当定时器产生一次中断,单片机就将tosin[b]值赋予P0引脚,同时变量b 自加1,并且当b 加到255时会自动变为0,因为无符号型变量的围是0~255。 程序如下:
{
case 0: //fun==0
正弦波 { P0=tosin[b] ; b++; }break;
3.2.2三角波的产生过程 定义一个无符号变量c ,每当定时器定时时间到达时,如果c 值大于0而小于128,c 自加1,将c 值赋予P0口;如果c 值大于128,则用255减去c 值赋予P0口;
程序如下:
case 1: // fun==1三角波
{
if(c<128) P0=2*c;
else
P0=2*(255-c);
c++; } break;
给赋值结果乘以2,因为不乘2的话,锯
齿波中的变量e 最大可以加到255,但三
角波中赋予P0口的最大值只有128,为了让输出电压幅值统一期间,我们对其乘以
2。
图3.3
3.2.3方波的产生过程
方波较其它波的产生原理较简单,它也是定义一个无符号字符变量d ,当定时器产生一次中断则d 自动加1。当d 小于128时,将0xff 赋予P0口;当d 大于128时,将0x00赋予P0口;
程序如下:
case 2: //fun==2 方波
{
d++;
if(d<=128)
P0=0x00; else
P0=0xff;
}break;
图3.4
3.2.4锯齿波的产生过程
锯齿波的产生是定义一个变量e,每当定时器中断一次,则把n值赋予P0口。同时n自加1。在此处当e加到255时则会自动溢出变为0。
程序如下:
case 3: //fun==3锯Array齿波
{ if(n<255)
{P0=n;}
n++;
}break;
图3.5
3.3波形的选择及调频调幅的实现
波形的选择及调频调幅通过P1口按键选择来实现,具体如下所述
3.3.1波形的选择
在本方案中,我们通过1#按键进行波形选择。具体方法是定义一个变量fun,当1#按键按下一次时,其就自动加1。其不同的数值代表不同的波形。
具体如下:
fun==0代表正弦波
fun==1代表三角波
fun==2代表方波
fun==3代表锯齿波
3.3.2调幅功能的实现
本方案对波形的幅值可以调节为5V、4V、3V、2V、1V;在这里我们定义一个变量“chu”,并且将赋予P0端口的值5等分,也就是把那个值先除以5,再乘以变量“chu”,所以在这里只要改变变量“chu"的值就可以改变输出波形的幅值。在方案中是通过2#按键改变变量的。
void key2(void) //选择幅值
{ chu++;
if(chu==11)
chu=0x01;}
具体的调压方式以正弦波说明如下:
case 0: //fun==0正弦波
{
P0=tosin[b]/5*chu;
b++;
}break;
也就是说,调压功能把将要赋给P0口的值除以5乘以“chu”即可实现。
3.3.3调频功能的实现
由于波形的输出时通过将一个周期的完整波形平均分成255份,每等份的时间是由定时器0初值来确定的。故在这里改变定时器0的初值就可以改变输出波形的频率。
本方案是通过3#按键来调频的,定义一个变量fre,每按一下fre加1,则定时器初值改变,频率改变。
3.4按键中断方式的介绍及程序
本方案采用独立式按键中断来控制单片机的,相比较键盘扫描方式而言大大的节省了CPU运行时间,因为扫描方式单片机不停的忙于扫描键盘,而中断方式不需要,只要键盘有按键按下,硬件就会给单片机一次中断,单片机收到外部中断后采取扫面键盘一次,所以无需不停地扫描。
void exinto(void) interrupt 0
{EA=0;
TR0=1;
key_value=(P1&0Xff);
EA=1;
}
void judge(void) //键值判断程序
{
uchar line;
line=key_value;
if(line==0xfe)key1();
if(line==0xfd)key2();
if(line==0xfb)key3();
key_value=0;
}
4.仿真与调试分析
本次实验我们是在proteus仿真软件下完成的。
系统的仿真波形如下:
正弦波