EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
基于stc89c51单片机和DA的数控音频功率放大器DAC0832设计 5 y3 |' @3 n9 \; D' @" d; ^/ P# B
! y1 {0 n# R) f) u) c8 N! ]
) s8 j: S2 \! q3 p7 z一.设计要求 (1)输入信号为30mv峰峰值的正弦波,频率范围 20HZ~20KHZ,输入阻抗Ri ≥20KΩ,前级程控放大器增益通过单片机键盘输入控制,增益可预置为 10db,20db,30db,40db。 (2)后级功率放大器输出功率≥3W(8Ω负载)。 (3)液晶显示。 二.原理框图 0 n8 O( @0 H8 I3 G
三.方案对比选择 用DAC0832控制前级放大
0 n, y; O- E4 j" C/ W4 b7 |前级放大100倍后用单片机控制DAC0832进行衰减。 经对比选择用DAC0832控制前级放大比较简单,而且较精确。 四.电路图设计 9 m, ]! p7 c/ a6 f
5 n& t# M/ p O$ w
& c/ w4 }# s8 x' f五.主要元件选择及参数设计 (1) 运放LF353 ' o7 ?: H i& W3 h/ {
/ ?$ c/ I7 c" `- F1 o2 I0 D/ @前级放大分别放大10倍,总共放大100倍。LF353的工作电压是+15v,各引脚的接法见上图。将7号输出脚的信号作为DAC0832的输入。 (2)功率放大器TDA2030 , J: o; m/ f B: ?* y9 l# ^
TDA2030的工作电压是+15v。它将输入的电流进行放大,然后驱动喇叭响。具体接法见上图。利用TDA2030进行功率放大。TDA2030具有体积小,输出功率大,失真小等特点。功率放大器内含多种保护电路,工作安全可靠性高,主要保护电路有:短路保护,热保护,地线偶然开路,电源极性反接,以及负载泄放电压反冲等。其中,热保护电路能够容易承受输出的过载,甚至是长时间的,或者环境温度超过时均起到保护作用。与普通电路相比较,散热片可以有更小的安全系数。结温超过时,也不会对器件有所损害。 (3)单片机STC89S52
+ r' @$ {0 Y$ y( z1 q" V! h: lSTC89S52是比较常用的52系列单片机。它的工作电压是+5v。外围电路加上12M的晶振,使其正常工作。P2口控制DAC0832。通过对P2口赋值来改变输出增益的大小。 (4)1602液晶 4 T9 [7 H, [' w# S# E
' u) E8 I# d- m. t, X
1602显示容量为16乘2个字符。工作电压为+5v。 $ V' y0 L/ Z2 `: r3 e
6 F: C% Y: r. U
(5)DAC0832
& Y" \/ [# S# o7 \; ~) y: TDI0~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输出部分的波形。结果显示良好。 八.实验心得体会与总结 经过这次试验,我还是有一些收获的。首先感觉到我们所学知识的肤浅,既没学活也没学深。以后要想做好电信专业的工作,我们还有很长的路要走。我也认识到模拟电路是一门很值得研究而且可以大有作为的学科,要想成功做出一个模拟电路出来需要付出许多汗水,并不是能够将电路设计出来就算成功,由于模拟电路本身的特点,理论值和实际情况往往有着很大的区别,当我们设计出一个合理的电路并把它焊接出来后,心中小有成就感,然而在调试的过程中却遭受了失败的一次次打击,我们甚至出现了上午把电路板调试好,下午输出信号完全混乱的情况,幸运的是我们任然坚持到最后并且品尝到了成功的喜悦。可以说完成理论设计只是完成了整个课题的很小一部分,调试过程占了很大的比重,在这个过程中通过与同学交流我们学到了很多,比如说电源要接去耦电容、液晶背光灯调节电阻的几种解法,单片机程序中几个函数的用法,电路虚焊的检验方法等等。 通过这次实验,进一步验证了我的编程能力,使我看到了自己有许多需要提高和改进的地方,也增强了我学习本专业的兴趣和信心,可以说以后不管是读研还是找工作,我要想成为一名合格的电子工程师还有很长的路要走。。。 附录一 实验电路图 - q/ e) O6 e8 k( _9 J3 l* V
$ v4 W' H: y# ?' H: |4 I9 [' G! e7 S8 w
附录二 实验源程序 #include<reg51.h> #include <intrins.h> #define uchar unsigned char #define uint unsigned int sbit E=P1^2; sbit RS=P1^0; sbit RW=P1^1; sbit key1=P1^3; sbit key2=P1^4; sbit key3=P1^5; sbit key4=P1^6; sbit key5=P1^7;
, K# X P% ~# W! n; mvoid lcd_init(); void write_comm(uchar); void write_data(uchar); void write_string(uchar,uchar,uchar *); void lcd_delay(); void delay_ms(uint); void delay_ms(uint i) //延时i毫秒 { uint j; while(i--) { for(j=0;j<=74;j++) { _nop_(); } } } void lcd_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); //数据指针清零 } void write_comm(uchar i) { RS=0; RW=0; P0=i; lcd_delay(); E=0; lcd_delay(); E=1; } void write_data(uchar i) { RS=1; RW=0; P0=i; lcd_delay(); E=0; lcd_delay(); E=1; } void write_string(uchar row,uchar column,uchar *dis_buffer) { switch(row) //这种结构保持以后升级到多行显示液晶 { case 1:write_comm(0x80+column);break; case 2: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) //这种结构保持以后升级到多行显示液晶 { case 1:write_comm(0x80);break; case 2:write_comm(0x80+0x40);break; //重新调整数据地址指针 default:break; } } } } void lcd_delay() { uchar i; for(i=0;i<255;i++); } void main() { 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"); } } } }
, C( y* V% n% i0 x1 T2 i2 y, J7 p
4 _$ j; |. C8 |, c. Z+ R |