比赛论文.docx
- 文档编号:17327604
- 上传时间:2023-07-24
- 格式:DOCX
- 页数:17
- 大小:44.07KB
比赛论文.docx
《比赛论文.docx》由会员分享,可在线阅读,更多相关《比赛论文.docx(17页珍藏版)》请在冰点文库上搜索。
比赛论文
姓名
班级学号
组别
题目
李文文
B0832
DDS函数信号发生器
王秋爽
B0832
张旺
B0832
1.方案比较:
DDS函数信号发生器可以采用单片机控制的DAC0832来做,也可以采用单片机控制的AD9851/AD9850来做,还可使用FPGA来做,相对比较而言,采用单片机控制的DAC0832做出来的所能达到的精度最低,而且做出的硬件电路干扰比较大,产生的波形很不稳定。
2.在申请书基础上实际设计的改变:
申请书上原本是要产用AD9851来做的,但是由于考虑到AD9851芯片价格的昂贵,所以我们最终产用DAC0832来做,原本还需要做波形的存储功能,最后我们也把这一步去掉了。
3.原理框图:
4.电原理图:
DA转换电路
按键控制电路
显示电路
5.原理说明:
1、DAC0832的引脚特性
DAC0832是20引脚的双列直插式芯片。
各引脚的特性如下:
——片选信号,和允许锁存信号ILE组合来决定是否起作用。
ILE——允许锁存信号。
——写信号1,作为第一级锁存信号,将输入资料锁存到输入寄存器(此时,必须和、ILE同时有效)。
——写信号2,将锁存在输入寄存器中的资料送到DAC寄存器中进行锁存(此时,传输控制信号必须有效)。
——传输控制信号,用来控制。
DI7~DI0——8位数据输入端。
IOUT1——模拟电流输出端1。
当DAC寄存器中全为1时,输出电流最大,当DAC寄存器中全为0时,输出电流为0。
IOUT2——模拟电流输出端2。
IOUT1+IOUT2=常数。
RFB——反馈电阻引出端。
DAC0832内部已经有反馈电阻,所以,RFB端可以直接接到外部运算放大器的输出端。
相当于将反馈电阻接在运算放大器的输入端和输出端之间。
VREF——参考电压输入端。
可接电压范围为±10V。
外部标准电压通过VREF与T型电阻网络相连。
VCC——芯片供电电压端。
范围为+5V~+15V,最佳工作状态是+15V。
AGND——模拟地,即模拟电路接地端。
DGND——数字地,即数字电路接地端。
2、DAC0832的工作方式
DAC0832进行D/A转换,可以采用两种方法对数据进行锁存。
第一种方法是使输入寄存器工作在锁存状态,而DAC寄存器工作在直通状态。
具体地说,就是使和都为低电平,DAC寄存器的锁存选通端得不到有效电平而直通;此外,使输入寄存器的控制信号ILE处于高电平、处于低电平,这样,当端来一个负脉冲时,就可以完成1次转换。
第二种方法是使输入寄存器工作在直通状态,而DAC寄存器工作在锁存状态。
就是使和为低电平,ILE为高电平,这样,输入寄存器的锁存选通信号处于无效状态而直通;当和端输入1个负脉冲时,使得DAC寄存器工作在锁存状态,提供锁存数据进行转换。
根据上述对DAC0832的输入寄存器和DAC寄存器不同的控制方法,
DAC0832有如下3种工作方式:
⑴单缓冲方式。
单缓冲方式是控制输入寄存器和DAC寄存器同时接收资料,或者只用输入寄存器而把DAC寄存器接成直通方式。
此方式适用只有一路模拟量输出或几路模拟量异步输出的情形。
⑵双缓冲方式。
双缓冲方式是先使输入寄存器接收资料,再控制输入寄存器的输出资料到DAC寄存器,即分两次锁存输入资料。
此方式适用于多个D/A转换同步输出的情节。
⑶直通方式。
直通方式是资料不经两级锁存器锁存,即,,,均接地,ILE接高电平。
此方式适用于连续反馈控制线路,不过在使用时,必须通过另加I/O接口与CPU连接,以匹配CPU与D/A转换。
3、原理简介
硬件:
利用单片机控制DAC0832实现DA转换,通过软件将相应的数据存储到单片机内部的存储区,给单片机上电后则进行相应的软件操作,单片机数据端口上输出的数据经过DAC0832转换后,直接从DAC0832的输出管脚输出,经示波器测试就能得到相应的波形,在产生不同的波形时可以通过安检来调整,硬件中共涉及到五个按键,一个是控制输出不同的波形,为波形选择按键,剩余的四个两个控制周期的增加和减小,另外两个控制幅度的增加和减小。
任一时刻的产生的波形都能通过1602液晶显示出来,并且将相应的波形的幅度和周期显示出来。
软件:
#include"LCD1602.h"
#include"AT24C02.h"
#include"DAC0832.h"
#include"delay.h"
#defineLcd_1602P3
#defineDAC_DataP0
sbitLcd_Rs=P2^5;
sbitLcd_Rw=P2^6;
sbitLcd_En=P2^7;
sbitKey_Add_fu=P1^0;
sbitKey_Reduce_fu=P1^1;
sbitKey_Choice_type=P1^2;
sbitKey_Reduce_F=P1^3;
sbitKey_Add_F=P1^4;
voidLcd_1602_Check_Busy(void);//Lcd1602Checkbusy
voidLcd_1602_Write_Data(ucharData);//writeData
voidLcd_1602_Write_Command(ucharCommand);//writeCommand
voidLcd_1602_Display(ucharx,uchary,uchartemp);//LCDDisplay
voidLcd_1602_Display_Str(uchar*ip);
voidLcd_1602_Init(void);//LCD1602init
staticucharSan_F=0;//设置一个三角波和锯齿波的峰值
staticucharF_S_F=10;//这个主要是用来设定非正弦波的峰值
staticucharTime=3;//设置一个初始值认为是初始周期调节Time++使得周期可调
staticucharS_Count=0;
staticucharSet=1;//幅度
staticuchark=1;//频率
staticucharfudu=100;//幅度初始值
ucharbeishu=1;//倍数
ucharcodetable1[]=
{'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
ucharcodetable[]={
0x7F,0x83,0x88,0x8C,0x91,0x95,0x9A,0x9E,0xA2,0xA6,0xAB,
0xAF,0xB3,0xB7,0xBB,0xBF,0xC3,0xC6,0xCA,0xCD,0xD1,0xD4,
0xD8,0xDB,0xDE,0xE1,0xE3,0xE6,0xE9,0xEB,0xED,0xF0,0xF2,
0xF3,0xF5,0xF7,0xF8,0xFA,0xFB,0xFC,0xFD,0xFD,0xFE,0xFE,
0xFE,0xFE,0xFE,0xFE,0xFE,0xFD,0xFD,0xFC,0xFB,0xFA,0xF8,
0xF7,0xF5,0xF3,0xF2,0xF0,0xED,0xEB,0xE9,0xE6,0xE3,0xE1,
0xDE,0xDB,0xD8,0xD4,0xD1,0xCD,0xCA,0xC6,0xC3,0xBF,0xBB,
0xB7,0xB3,0xAF,0xAB,0xA6,0xA2,0x9E,0x9A,0x95,0x91,0x8C,
0x88,0x83,0x7F,0x7B,0x76,0x72,0x6D,0x69,0x64,0x60,0x5C,
0x58,0x53,0x4F,0x4B,0x47,0x43,0x3F,0x3B,0x38,0x34,0x31,
0x2D,0x2A,0x26,0x23,0x20,0x1D,0x1B,0x18,0x15,0x13,0x11,
0x0E,0x0C,0x0B,0x09,0x07,0x06,0x04,0x03,0x02,0x01,0x01,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x02,0x03,
0x04,0x06,0x07,0x09,0x0B,0x0C,0x0E,0x11,0x13,0x15,0x18,
0x1B,0x1D,0x20,0x23,0x26,0x2A,0x2D,0x31,0x34,0x38,0x3B,
0x3F,0x43,0x47,0x4B,0x4F,0x53,0x58,0x5C,0x60,0x64,0x69,
0x6D,0x72,0x76,0x7B
};//正弦波数据(0--179)
ucharFlag=0;//Set为波形选择标志
voidFang(void)//产生方波
{
if(Flag==0)
{
if(S_Count++>=Time)
{
Flag=1;
S_Count--;
}
DAC_Data=F_S_F;//方波的非正弦峰值
}
else
{
if(S_Count--<=1)
{
Flag=0;
}
DAC_Data=0;
}
}
voidSanJiao(void)
{
if(Flag==0)
{
if(S_Count++>=Time+100)//Time+100幅度相当于三角波的一个峰值可以自己任意设定这个峰值
{
Flag=1;
}
San_F++;
if(San_F==255)//三角波值随时间的增加而增加,当到最大值则等待
while(San_F!
=255);
}
else
{
if(S_Count--<=1)
{
Flag=0;
}
San_F--;//三角波的值随时间的增加而减少,当减到最小值则等待
if(San_F==0)
while(San_F!
=0);
}
DAC_Data=San_F;
}
voidJuChi(void)
{
if(S_Count++>=Time+100)
{
S_Count=0;
San_F=0;
}
San_F++;
if(San_F==255)while(San_F!
=255);//如果锯齿波到了最大值,则等待,知道时间计数达到时才对其峰值清零
DAC_Data=San_F;
}
voidSin(void)
{
DAC_Data=table[S_Count]/beishu;
S_Count++;
if(S_Count>=180)
{
S_Count=0;
}
Delay_Ms(Time-2);//对正弦波频率的调节
}
voidKey_COUNT(void)//检测按键按下的次数
{
if(Key_Choice_type==0)
{
Delay_Ms(3);
if(Key_Choice_type==0)
{
Set++;//每次有按键按下,波形标志加1
if(Set>4)Set=1;
}
while(Key_Choice_type==0);//等待按键释放
Delay_Ms(3);
while(Key_Choice_type==0);//松手检测
}
}
voidKey_REDUCE_F(void)//减频率函数
{
if(Key_Reduce_F==0)
{
Delay_Ms(3);
if(Key_Reduce_F==0)
{
if(Time<150)Time++;//数字150由自己设定,这个主要是设定调节周期的时间
}//前面设定了Time+100,Time的初值为3,所以对多只能调节的153
}
while(Key_Reduce_F==0);
Delay_Ms(3);
while(Key_Reduce_F==0);
}
voidKey_ADD_F(void)
{
if(Key_Add_F==0)
{
Delay_Ms(3);
if(Key_Add_F==0)
{
if(Time>1)Time--;
}
}
while(Key_Add_F==0);
Delay_Ms(3);
while(Key_Add_F==0);
}
voidKey_ADD_fu(void)//幅度即为峰值的调节
{
if(Key_Add_fu==0)
{
Delay_Ms(3);
if(Key_Add_fu==0)
{
if(Set==3&&beishu>1)//为正弦波的调节
{
beishu--;
}
else
if((Set!
=3)&&((Set==2)||(Set==3)))
{
San_F+=5;//有调节幅度的按键则幅度以5为单位进给
}
else
{
F_S_F+=5;//否则的话方波的峰值以5为单位进给
}
}
}
while(Key_Add_fu==0);
Delay_Ms(3);
while(Key_Add_fu==0);
}
voidKey_REDUCE_fu(void)
{
if(Key_Reduce_fu==0)
{
Delay_Ms(3);
if(Key_Reduce_fu==0)
{
if(Set==3&&beishu<12)
{
beishu++;
}
else
if((Set!
=3)&&((Set==2)||(Set==3))&&(San_F>5))//为锯齿波或者三角波且峰值大于5为前提
{
San_F-=5;//有调节幅度的按键则幅度以5为单位进给
}
else
if((Set==1)&&(San_F>5))
{
F_S_F-=5;//否则的话方波的峰值以5为单位进给为方波
}
}
}
while(Key_Reduce_fu==0);
Delay_Ms(3);
while(Key_Reduce_fu==0);
}
voidmain()
{
Lcd_1602_Init();
while
(1)
{
if(Key_Reduce_fu==0)Key_REDUCE_fu();
if(Key_Add_fu==0)Key_ADD_fu();
if(Key_Reduce_F==0)Key_REDUCE_F();
if(Key_Add_F==0)Key_ADD_F();
if(Key_Choice_type==0)Key_COUNT();
switch(Set)
{
case3:
Sin();
Lcd_1602_Display_Str("Sin:
");
Lcd_1602_Display(1,1,'T');//显示周期
Lcd_1602_Display(2,1,':
');
Lcd_1602_Display(3,1,table1[S_Count*Time/1000]);
Lcd_1602_Display(4,1,'.');
Lcd_1602_Display(5,1,table1[(int)((float)(199*Time/1000)*100)%100/10]);
Lcd_1602_Display(6,1,table1[(int)((float)(199*Time/1000)*100)%10]);//199是开始设定的一个时间是可以改变的
Lcd_1602_Display(8,1,'H');//幅度
Lcd_1602_Display(9,1,':
');
Lcd_1602_Display(10,1,table1[(5*fudu/255)]);//正弦波的幅度也需要再调试一下
Lcd_1602_Display(11,1,'.');
Lcd_1602_Display(12,1,table1[(int)((float)(5*fudu/255)*10)%10]);
break;
case1:
Fang();
Lcd_1602_Display_Str("Fang:
");
Lcd_1602_Display(1,1,'T');//显示周期
Lcd_1602_Display(2,1,':
');
Lcd_1602_Display(3,1,table1[S_Count*Time/1000]);
Lcd_1602_Display(4,1,'.');
Lcd_1602_Display(5,1,table1[(int)((float)(20*Time/1000)*100)%100/10]);
Lcd_1602_Display(6,1,table1[(int)((float)(20*Time/1000)*100)%10]);
Lcd_1602_Display(8,1,'H');//显示幅度
Lcd_1602_Display(9,1,':
');
Lcd_1602_Display(10,1,table1[(5*F_S_F/255)]);//
Lcd_1602_Display(11,1,'.');
Lcd_1602_Display(12,1,table1[(int)((float)(5*F_S_F/255)*10)%10]);
break;
case4:
JuChi();
Lcd_1602_Display_Str("JuChi:
");
Lcd_1602_Display(1,1,'T');//显示周期
Lcd_1602_Display(2,1,':
');
Lcd_1602_Display(3,1,table1[S_Count*Time/1000]);
Lcd_1602_Display(4,1,'.');
Lcd_1602_Display(5,1,table1[(int)((float)(199*Time/1000)*100)%100/10]);
Lcd_1602_Display(6,1,table1[(int)((float)(199*Time/1000)*100)%10]);
Lcd_1602_Display(8,1,'H');//幅度
Lcd_1602_Display(9,1,':
');
Lcd_1602_Display(10,1,table1[(5*San_F/255)]);
Lcd_1602_Display(11,1,'.');
Lcd_1602_Display(12,1,table1[(int)((float)(5*San_F/255)*10)%10]);
break;
case2:
SanJiao();
Lcd_1602_Display_Str("SanJiao:
");
Lcd_1602_Display(1,1,'T');//显示周期
Lcd_1602_Display(2,1,':
');
Lcd_1602_Display(3,1,table1[S_Count*Time/1000]);
Lcd_1602_Display(4,1,'.');
Lcd_1602_Display(5,1,table1[(int)((float)(199*Time/1000)*100)%100/10]);
Lcd_1602_Display(6,1,table1[(int)((float)(199*Time/1000)*100)%10]);
Lcd_1602_Display(8,1,'H');
Lcd_1602_Display(9,1,':
');
Lcd_1602_Display(10,1,table1[(5*San_F/255)]);//幅度
Lcd_1602_Display(11,1,'.');
Lcd_1602_Display(12,1,table1[(int)((float)(5*San_F/255)*10)%10]);
Lcd_1602_Init();
break;
default:
break;
}
}
}
6.测试分析:
将软件和硬件都做好之后便要进行调试,液晶显示部分都显示正常,但是通过示波器测试所得到的波形并不是想象中的那么好,显示的波形很杂,看起来很多干扰。
为了解决这一问题,单独的做了两个工作:
首先要做的便是对电源部分进行处理,做了一个滤波电路,尽量将输入电源中的干扰减小,让输入的电源尽量的纯净,为了达到效果,我们做了两级滤波处理,尽可能的将电源中的干扰减小。
接着要做的就是将输出部分进行处理,将输出的信号同样的进行滤波处理,为了尽可能的得到纯净的波形,我们尽量做了滤波处理的工作。
对于DAC0832的参考电压我们也进行了处理,尽量的在参考电压处送入纯净的电压。
器件名称
器件规格
器件数量
单片机
STC89C51
1
DAC0832
1
电解电容
100uf
3
万能板
1
液晶
1602
1
电位器
502
1
排线
8股
1
插针
40引脚
1
电解电容
104
1
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 比赛 论文