基于st89c51单片机和DA的数控音频功率放大器设计.docx
《基于st89c51单片机和DA的数控音频功率放大器设计.docx》由会员分享,可在线阅读,更多相关《基于st89c51单片机和DA的数控音频功率放大器设计.docx(14页珍藏版)》请在冰豆网上搜索。
基于st89c51单片机和DA的数控音频功率放大器设计
数控音频功率放大器
一.设计要求
(1)输入信号为30mv峰峰值的正弦波,频率范围20HZ~20KHZ,输入阻抗Ri≥20KΩ,前级程控放大器增益通过单片机键盘输入控制,增益可预置为10db,20db,30db,40db。
(2)后级功率放大器输出功率≥3W(8Ω负载)。
(3)液晶显示。
二.原理框图
三.方案对比选择
用DAC0832控制前级放大
前级放大100倍后用单片机控制DAC0832进行衰减。
经对比选择用DAC0832控制前级放大比较简单,而且较精确。
四.电路图设计
五.主要元件选择及参数设计
(1)运放LF353
前级放大分别放大10倍,总共放大100倍。
LF353的工作电压是+15v,各引脚的接法见上图。
将7号输出脚的信号作为DAC0832的输入。
(2)功率放大器TDA2030
TDA2030的工作电压是+15v。
它将输入的电流进行放大,然后驱动喇叭响。
具体接法见上图。
利用TDA2030进行功率放大。
TDA2030具有体积小,输出功率大,失真小等特点。
功率放大器内含多种保护电路,工作安全可靠性高,主要保护电路有:
短路保护,热保护,地线偶然开路,电源极性反接,以及负载泄放电压反冲等。
其中,热保护电路能够容易承受输出的过载,甚至是长时间的,或者环境温度超过时均起到保护作用。
与普通电路相比较,散热片可以有更小的安全系数。
结温超过时,也不会对器件有所损害。
(3)单片机STC89S52
STC89S52是比较常用的52系列单片机。
它的工作电压是+5v。
外围电路加上12M的晶振,使其正常工作。
P2口控制DAC0832。
通过对P2口赋值来改变输出增益的大小。
(4)1602液晶
1602显示容量为16乘2个字符。
工作电压为+5v。
编号
符号
引脚说明
编号
符号
引脚说明
1
VSS
电源地
9
D2
DateI/O
2
VDD
电源正极
10
D3
DateI/O
3
VL
液晶显示偏压信号
11
D4
DateI/O
4
RS
数据/命令选择端
12
D5
DateI/O
5
R/W
读写选择端
13
D6
DateI/O
6
E
使能端
14
D7
DateI/O
7
D0
DateI/O
15
BLA
背光源正极
8
D1
DateI/O
16
BLK
背光源负极
(5)DAC0832
DI0~DI7:
数据输入线,TLL电平。
ILE:
数据锁存允许控制信号输入线,高电平有效。
CS:
片选信号输入线,低电平有效。
WR1:
为输入寄存器的写选通信号。
XFER:
数据传送控制信号输入线,低电平有效。
WR2:
为DAC寄存器写选通输入线。
Iout1:
电流输出线。
当输入全为1时Iout1最大。
Iout2:
电流输出线。
其值与Iout1之和为一常数。
Rfb:
反馈信号输入线,芯片内部有反馈电阻.Vcc:
电源输入线(+5v~+15v)Vref:
基准电压输线 (-10v~+10v)AGND:
模拟地,摸拟信号和基准电源的参考地DGND:
数字地,两种地线在基准电源处共地比较好.
六.软件编程
按照电路图的设计焊接好硬件电路。
就开始软件编程。
程序主要分为两个部分,即液晶显示部分和控制DAC0832的部分。
由于本设计采用的是用按键分别控制。
可以在主函数中调用一个键盘扫描的函数,当相应的不同按键按下后控制液晶显示和单片机P2的输出,从而控制DAC0832的输出增益。
源程序见附录。
七.调试部分
本次实验的调试部分花了大量的时间。
当程序写好编译通过后,下载到单片机中,调试硬件看有无显示和输出。
调试主要分为3个部分。
分别是液晶显示部分,前级放大部分,功放输出部分。
首先是液晶部分,经过几次程序的修改,和对液晶部分电路的检测终于将液晶部分调出有显示。
然后检查前级放大部分。
在输入端输入峰峰值为50mv的正弦波。
用示波器检查运放的输出。
最后一遍联合按键控制用示波器观察DAC0832输出部分的波形。
结果显示良好。
八.实验心得体会与总结
经过这次试验,我还是有一些收获的。
首先感觉到我们所学知识的肤浅,既没学活也没学深。
以后要想做好电信专业的工作,我们还有很长的路要走。
我也认识到模拟电路是一门很值得研究而且可以大有作为的学科,要想成功做出一个模拟电路出来需要付出许多汗水,并不是能够将电路设计出来就算成功,由于模拟电路本身的特点,理论值和实际情况往往有着很大的区别,当我们设计出一个合理的电路并把它焊接出来后,心中小有成就感,然而在调试的过程中却遭受了失败的一次次打击,我们甚至出现了上午把电路板调试好,下午输出信号完全混乱的情况,幸运的是我们任然坚持到最后并且品尝到了成功的喜悦。
可以说完成理论设计只是完成了整个课题的很小一部分,调试过程占了很大的比重,在这个过程中通过与同学交流我们学到了很多,比如说电源要接去耦电容、液晶背光灯调节电阻的几种解法,单片机程序中几个函数的用法,电路虚焊的检验方法等等。
通过这次实验,进一步验证了我的编程能力,使我看到了自己有许多需要提高和改进的地方,也增强了我学习本专业的兴趣和信心,可以说以后不管是读研还是找工作,我要想成为一名合格的电子工程师还有很长的路要走。
。
。
附录一实验电路图
附录二实验源程序
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitE=P1^2;
sbitRS=P1^0;
sbitRW=P1^1;
sbitkey1=P1^3;
sbitkey2=P1^4;
sbitkey3=P1^5;
sbitkey4=P1^6;
sbitkey5=P1^7;
voidlcd_init();
voidwrite_comm(uchar);
voidwrite_data(uchar);
voidwrite_string(uchar,uchar,uchar*);
voidlcd_delay();
voiddelay_ms(uint);
voiddelay_ms(uinti)//延时i毫秒
{
uintj;
while(i--)
{
for(j=0;j<=74;j++)
{
_nop_();
}
}
}
voidlcd_init()
{
lcd_delay();
write_comm(0x38);//显示模式控制:
设置16*2显示,5*7点阵,8位数据口
write_comm(0x08);//关显示
write_comm(0x01);//清屏
write_comm(0x06);//输入模式控制:
光标右移,整屏不移动
write_comm(0x0c);//开显示,显示光标,光标闪烁
//0x0e,开显示,显示下光标,光标不闪烁
write_comm(0x80);
write_comm(0x02);//数据指针清零
}
voidwrite_comm(uchari)
{
RS=0;
RW=0;
P0=i;
lcd_delay();
E=0;
lcd_delay();
E=1;
}
voidwrite_data(uchari)
{
RS=1;
RW=0;
P0=i;
lcd_delay();
E=0;
lcd_delay();
E=1;
}
voidwrite_string(ucharrow,ucharcolumn,uchar*dis_buffer)
{
switch(row)//这种结构保持以后升级到多行显示液晶
{
case1:
write_comm(0x80+column);break;
case2:
write_comm(0x80+0x40+column);break;//重新调整数据地址指针
default:
break;
}
while(*dis_buffer!
='\0')//'\0'结束符
{
write_data(*dis_buffer);
dis_buffer++;
column++;
if(column==16)
{
column=0;
row++;
if(row>=3)
return;
else
switch(row)//这种结构保持以后升级到多行显示液晶
{
case1:
write_comm(0x80);break;
case2:
write_comm(0x80+0x40);break;//重新调整数据地址指针
default:
break;
}
}
}
}
voidlcd_delay()
{
uchari;
for(i=0;i<255;i++);
}
voidmain()
{
lcd_init();
//cntl1=1;cntl3=1;cntl2=0;cntl4=0;cntl5=1;cntl6=0;
write_string(1,0,"Gain:
");
while
(1)
{
if(key1==0)
{
delay_ms(15);
if(key1==0)
{
while(!
key1);
P2=0x02;
write_string(2,0,"0dB");
}
}
if(key2==0)
{
delay_ms(15);
if(key2==0)
{
while(!
key2);
P2=0x08;
write_string(2,0,"10dB");
}
}
if(key3==0)
{
delay_ms(15);
if(key3==0)
{
while(!
key3);
P2=0x1A;
write_string(2,0,"20dB");
}
}
if(key4==0)
{
delay_ms(15);
if(key4==0)
{
while(!
key4);
P2=0x51;
write_string(2,0,"30dB");
}
}
if(key5==0)
{
delay_ms(15);
if(key5==0)
{
while(!
key5);
P2=0xff;
write_string(2,0,"40dB");
}
}
}
}
.