找回密码
 注册
关于网站域名变更的通知
查看: 623|回复: 1
打印 上一主题 下一主题

基于stc89c51单片机和DA的数控音频功率放大器DAC0832设计

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2019-1-2 16:32 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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: l
STC89S52是比较常用的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: T
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输出部分的波形。结果显示良好。
八.实验心得体会与总结
经过这次试验,我还是有一些收获的。首先感觉到我们所学知识的肤浅,既没学活也没学深。以后要想做好电信专业的工作,我们还有很长的路要走。我也认识到模拟电路是一门很值得研究而且可以大有作为的学科,要想成功做出一个模拟电路出来需要付出许多汗水,并不是能够将电路设计出来就算成功,由于模拟电路本身的特点,理论值和实际情况往往有着很大的区别,当我们设计出一个合理的电路并把它焊接出来后,心中小有成就感,然而在调试的过程中却遭受了失败的一次次打击,我们甚至出现了上午把电路板调试好,下午输出信号完全混乱的情况,幸运的是我们任然坚持到最后并且品尝到了成功的喜悦。可以说完成理论设计只是完成了整个课题的很小一部分,调试过程占了很大的比重,在这个过程中通过与同学交流我们学到了很多,比如说电源要接去耦电容、液晶背光灯调节电阻的几种解法,单片机程序中几个函数的用法,电路虚焊的检验方法等等。
通过这次实验,进一步验证了我的编程能力,使我看到了自己有许多需要提高和改进的地方,也增强了我学习本专业的兴趣和信心,可以说以后不管是读研还是找工作,我要想成为一名合格的电子工程师还有很长的路要走。。。
附录一  实验电路图
- 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; m
void 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

该用户从未签到

2#
发表于 2019-1-2 17:45 | 只看该作者
资料很详细 谢谢楼主用心
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-6-25 15:18 , Processed in 0.078125 second(s), 26 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表