单片机自动增益放大器讲诉.docx

上传人:b****1 文档编号:20212337 上传时间:2023-04-25 格式:DOCX 页数:24 大小:138.52KB
下载 相关 举报
单片机自动增益放大器讲诉.docx_第1页
第1页 / 共24页
单片机自动增益放大器讲诉.docx_第2页
第2页 / 共24页
单片机自动增益放大器讲诉.docx_第3页
第3页 / 共24页
单片机自动增益放大器讲诉.docx_第4页
第4页 / 共24页
单片机自动增益放大器讲诉.docx_第5页
第5页 / 共24页
点击查看更多>>
下载资源
资源描述

单片机自动增益放大器讲诉.docx

《单片机自动增益放大器讲诉.docx》由会员分享,可在线阅读,更多相关《单片机自动增益放大器讲诉.docx(24页珍藏版)》请在冰豆网上搜索。

单片机自动增益放大器讲诉.docx

单片机自动增益放大器讲诉

自动增益放大器

摘要:

本系统有四个模块组成:

程控放大器,峰值检测,液晶。

程控放大器采用两片AD603接连组成,放大电压增益可达50dB,增益0.2v步进可调,电压增益误差不大于5%。

放大器输出无明显失真。

峰值测量采用真有效值采样芯片AD637先进行有效值采样,然后通过PCF8951进行AD采样,最后再转换成峰值,液晶采用LCD1602,系统以stc89c51单片机为控制核心,经测试验证,系统运行稳定,操作方便。

 

关键词:

程控放大器,峰值检测,AD采样,单片机。

 

Abstract:

Thissystemhasthreemodules:

SPCamplifiers,peakdetection,liquidcrystal.BytwoAD603program-controlledamplifieramplificationvoltagegainone,cangain1dbstepping0.2v,adjustable,voltagegainerrorisnotmorethan5%.Amplifieroutputwithoutobviousdistortion.MeasuretrueRMSpeakbysamplingAD637chiponsampling,thenPCF8951througheffectivesampling,finallytoADconvertpeak,LCDUSESlcd1602managementsystemwithstc8951SCMascontrolcoreandtested,thesystemrunsstably,convenientoperation.

Key:

SPCamplifierPeakdetectionADsampling

chipSCM

 

1.方案的论证与比较

1.1设计需求

1.1.1基本要求

(1)放大器可以从信号发生器或音乐播放器输入音频信号(50Hz~10KHz),

输出可以带200Ω负载或驱动8Ω喇叭(2~5W)。

(20分)

(2)当输入信号幅度在10mV~5V间变化时,放大器输出默认值保持在2V

±0.2V(有效值)内,波动越小越好。

(30分)

(3)可以显示输入信号幅度和频率。

(10分)

(4)能够在1V~3V范围内步进式调节放大器输出幅度,步距0.2V。

(15分)

(5)能够根据环境噪声调整自动调节放大器输出幅度。

(15分)

(6)其它发挥设计。

(10分)

(7)设计报告。

(20分)

1.1.2发挥部分

(1)输出电压步距可通过按键调整:

0.2v、0.3v、0.4v;

(3)显示当前放大输出。

(4)其它。

 

1.2总体方案

方案一:

选用结电容小,fT高的晶体管,采用多种补偿法,多级放大加深度负反馈,以及组合各种组态的放大电路形式,可以组成优质的宽带放大器,而且成本较低。

但若要全部采用晶体管实现题目要求,有一定困难,首先高频晶体管配对困难,不易购买;其次,理论计算往往与实际电路有一定差距,工作点不容易调整;而且,晶体管参数易受环境影响,影响系统总体性能。

另外,晶体管电路增益调节较为复杂,不易实现题目要求的增益可调。

方案二:

使用专用的集成宽带放大器。

如TITHS6022、NE592等集成电路。

通过外接少数的元件就可以满足本题目要求,甚至远超过题目要求的带宽和增益的指标,但这种放大器难以购买,价格较贵,灵活性不够,不易满足题目扩展功能要求。

方案三:

市面上有多种型号、各具特色的宽频带集成运算放大器。

这些集成运算放大器有的通频带宽,有足够的增益,有的可以输出较高电压,使用方便,有的甚至可以实现增益可调及AGC的功能。

总体上硬件的实现和调试较为简单,所以,我们决定采用多个集成运放级连实现本题目

 

1.3增益控控制:

方案一:

利用电阻网络和拨码开关,手动调节增益,可实现增益控制,但硬件规模较大,控制繁琐且人机界面欠佳,另外,利用电阻网络实现增益调节需使用不同阻值的高精度电阻,这种电阻价格昂贵且不易购买。

方案二:

可以用继电器或模拟开关构成电阻网络,由单片机控制以改变信号增益。

这种方案同样存在方案一电阻网络的缺点,同时,如果使用模拟开关,其导通电阻较大,而且各通道信号会互相干扰,容易影响系统性能。

方案三:

由单片机、D/A转换器和可编程增益放大器AD603构成压控放大器。

单片机通过对控制D/A输出直流电压来控制AD603的内部电阻衰减网络,实现增益调节。

其外围元件少,电路简单,由于AD603带宽最大能达到90MHz,增益范围有40dB,增益精度在±0.5dB,可精确实现增益控制,可以实现题目发挥部分减小增益步进间隔的要求。

所以本部分采用该方案。

 

1.4峰值检测:

方案一:

采用分段逼近式有效值检波电路。

该方法示值虽然是被测电压的有效值,但由于放大器动态范围的限制,对于被测信号会产生一定的波形误差,并且硬件电路搭接复杂,且稳定性能不好。

方案二:

采用真有效值转换芯片AD637和高速A/D芯片PCF8951测量市电有效值。

将从AD603输出的信号通过AD637转换成直流信号后接入PCF8951,利用单片机读取数据后进行相应的幅值变换得到峰值。

利用集成电路芯片测量精度高,误差小、稳定性好,硬件电路实现简单,可减小硬件体积,所以本部分采用该方案。

 

1.5处理器选择:

通过实验测试我以前买的stc89c51可以满足要求,为了节约成本就选择它为微处理器

2.系统设计

2.1理论分析与计算

本系统以可变增益增益放大器AD603为核心,其它各单元电路都是根据AD603及题目要求设计。

由于题目的发挥部分要求电压的输出范围2V~2.5V,对于10mv的小信号,则至少要将信号放大200倍,而且输入信号的频率范围为10Hz~500KHz,故采用两片AD603对信号进行放大,单片AD603增益公式为:

DB=40*Vo+Go;

Vo为1、2脚之间的电压,范围为-500mv—500mv,Go根据5、7脚的不同连接方式Go可取10dB,20dB,30dB。

本系统将AD603的5脚和7脚相连,单级AD603增益调整范围为,-10~+30dB,带宽为90MHz,两级AD603级联,使得增益可调范围扩大到-20dB~+60dB。

可满足题目要求的电压放大和频率的要求,当AD603的增益为46dB的时候电压可以放大200倍,当AD603的增益为48dB的时候电压可以放大250倍.所以只要正确的控制1、2脚之间的电压就能实现电压的不同放大倍数,从而满足题目要求。

2.2总体设计

根据带宽、电压的放大倍数,系统采用两级AD603程控增益放大器,增益可达60dB,能过满足题目的要求,而且AD603能够满足带宽的要求,有效值测量可有多种实现方案,但选用测量有效值的专用芯片AD637,则电路简洁方便,而且精度较高。

由于系统模块所用IO口过多,一般51单片机不能够满足需求,故采用功能较强的C8051f020

单片机作为主控机器。

通过键盘进行增益和档位的调节,而液晶显示增益和峰值。

系统的整体框图如下:

 

 

2.3单元电路电路模块设计

2.3.1自动增益电路

本系统的自动增益控制功能,实际是由增益控制电路转化而来。

在输出级加入检波电路,检出直流电压送入A/D采样,经单片机计算后控制D/A输出,此电压加到AD603的增益控制端,从而控制AD603的增益达到使输出电压恒定的目的。

AD603的简化原理框图如图2-3-1所示,它由无源输入衰减器、增益控制界面和固定增益放大器三部分组成。

图中加在梯型网络输入端(VINP)的信号经衰减后,由固定增益放大器输出,衰减量是由加在增益控制接口的电压决定。

增益的调整与其自身电压值无关,而仅与其差值VG有关,由于控制电压GPOS/GNEG端的输入电阻高达50MΩ,因而输入电流很小,致使片内控制电路对提供增益控制电压的外电路影响减小。

而且,如果AD603的增益用dB表示,则与控制电压成线性关系,以上特点很适合构成本题要求的放大器。

图2-1-1

图2-3-1AD603原理框图

中的“滑动臂”从左到右是可以连接移动的。

当VOUT和FDBK两管脚的连接不同时,其放大器的增益范围也不一样,带宽在9MHz~90MHz之间

为加大中间级的放大倍数及增益调节范围,我们使用两片AD603级联作为中间级放大(图2-3-2)。

如果将AD603的5脚和7脚相连,单级AD603增益调整范围为,-10~+30dB,带宽为90MHz,两级AD603级联,使得增益可调范围扩大到-20dB~+60dB。

可满足题目要求的电压放大。

图2-3-2级联AD603电路图

两级AD603采用+5V,-5V电源供电,两级的控制端GNEG都接地,另一控制端GPOS接D/A输出,从而精确地控制AD603的增益。

AD603的增益与控制电压成线性关系,其增益控制端输入电压范围为-500mv~+500mv,增益调节范围为40dB,当步进1dB时,控制端电压需增大

ΔVG=

=25mv,

由于两级AD603由同一电压控制,所以,步进1dB的控制电压变化幅度为25mv/2=12.5mv。

由于AD603的控制电压需要比较精确的电压值。

我们使用12位的C8051F020的内部DA,可满足指标要求。

另外,通过A/D采样输出信号,由单片机计算后,再去调整D/A输出电压,就可实现AGC功能,扩大通频带.具体电路如下:

2.3.1峰值检测与DA/AD转换

峰值检测是利用真有效值芯片AD637先进行有效值采样然后通过PCF8951进行AD采样把有效值采样回来给单片机,再通过单片机进行数值处理把有效值转换成峰值并计算增益通过pcf8951DA输出到AD603增益控制端,具体电路如下:

2.3.2功率放大部分:

考虑到成本与实际效果功放采用TAD2822来实现,具体电路如下所示:

2.3.3电源部分:

本系统运放使用正负5V电源给单片机系统工作,为了能给系统提供稳定的电源,对市电变压后进行整流,滤波,稳压得到系统工作电源。

电路如下:

此部分电路比较典型,采用通常使用的桥式全波整流,大电容滤波,集成三端固定稳压片稳压。

2.3.3显示部分

本系统用LCD1602显示,电路图如下:

3.系统功能测试

3.1测试使用仪器

Agilent33250A函数信号发生器TektronixTDS2012数字示波器SS7200。

3.2测试结果完整性及结果分析

基础部分

在以下输入电压(Vpp)和频率下,手动调节输出范围在10mV-5mV

10mV/100Hz

0.1V/1kHz

0.5V/10kHz

0.7V/20kHz

0.8V/30kHz

1V/50kHz

幅度(√/×)

2.11

2.02

1.96

2.02

1.97

2.05

信号放大和控制部分在制作部分难易程度有很大的差别,所以我们采用分模块制作方法,信号放大电路中涉及的是低频小信号的处理,所以元件的选定和参数的确定有很大的难度,关键部分还在于电路元件的布局,如何抑制噪声,防止自激是电路布局的难点,我们采用了单点接地的方法。

控制部分电路调试较为简单。

5结束语

本系统有stc8951单片机与AD603、AD637等模块组成,基本实现了题目基本部分与发挥部分的要求。

参考文献

[1]《单片机原理及应用》,陈为:

中国石油出版社

[2]《模拟电子技术基础》,童诗白著,高等教育出版社

[3]《自动增益放大器》XX文库

6附录

6.1附录1集成芯片明细表

1.液晶LCD1602

2.AD603

3.PCF8591

4.AD637

5.TDA2822

6.STC8951

6.2附录2部分参考程序

#include

#include

#include

#include

#include<1602.h>

#definePCF85910x90//PCF8591地址

unsignedcharoutput=2;

unsignedintAD,DA;

voidkeyscan(void);

voiddelay(intms);

/*******************************************************************

DAC变换,转化函数

*******************************************************************/

bitDACconversion(unsignedcharsla,unsignedcharc,unsignedcharVal)

{

Start_I2c();//启动总线

SendByte(sla);//发送器件地址

if(ack==0)return(0);

SendByte(c);//发送控制字节

if(ack==0)return(0);

SendByte(Val);//发送DAC的数值

if(ack==0)return(0);

Stop_I2c();//结束总线

return

(1);

}

/*******************************************************************

ADC发送字节[命令]数据函数

*******************************************************************/

bitISendByte(unsignedcharsla,unsignedcharc)

{

Start_I2c();//启动总线

SendByte(sla);//发送器件地址

if(ack==0)return(0);

SendByte(c);//发送数据

if(ack==0)return(0);

Stop_I2c();//结束总线

return

(1);

}

/*******************************************************************

步进函数函数

*******************************************************************/

voidkeydown(void)

{

P1=0xF0;

if(P1!

=0xF0)//判断按键是否按下如果按钮按下会拉低P1其中的一个端口

{

keyscan();

}

}

/*******************************************************************

步距函数

*******************************************************************/

voidkeyscan(void)

{

P1=0xf0;

delay

(1);

switch(P1)

{

case0xf1:

output=output+0.2;

break;

case0xf2:

output=output+0.3;

break;

case0xf4:

output=output+0.4;

break;

case0xf8:

output=output+0.5;

break;

}

if(output>3)

{

output=1;

}

}

/*******************************************************************

AGC函数

*******************************************************************/

unsignedintAGC(unsignedintad)

{

DA=(log(output/ad)-2)/4;

returnDA;

}

/*******************************************************************

ADC读字节数据函数

*******************************************************************/

unsignedcharIRcvByte(unsignedcharsla)

{unsignedcharc;

Start_I2c();//启动总线

SendByte(sla+1);//发送器件地址

if(ack==0)return(0);

c=RcvByte();//读取数据0

Ack_I2c

(1);//发送非就答位

Stop_I2c();//结束总线

return(c);

}

voiddelay(intms)

{//延时子程序

inti;

while(ms--)

{

for(i=0;i<250;i++)

{

_nop_();//空执行

_nop_();

_nop_();

_nop_();

}

}

}

main()

{

unsignedcharr;

while

(1)

{

keydown();

ISendByte(PCF8591,0x40);

AD=IRcvByte(PCF8591);//ADC0模数转换1

AGC(AD);//增益计算

DACconversion(PCF8591,0x40,DA);//dac数模输出

r=output*1.414;

agc1602(output,r);//1602显示

}

}

/*************************此部分为I2C总线的驱动程序*************************************/

#include

#include

#include

#defineNOP()_nop_()/*定义空指令*/

#define_Nop()_nop_()/*定义空指令*/

sbitSCL=P2^1;//I2C时钟

sbitSDA=P2^0;//I2C数据

bitack;/*应答标志位*/

/*******************************************************************

起动总线函数

函数原型:

voidStart_I2c();

功能:

启动I2C总线,即发送I2C起始条件.

********************************************************************/

voidStart_I2c()

{

SDA=1;/*发送起始条件的数据信号*/

_Nop();

SCL=1;

_Nop();/*起始条件建立时间大于4.7us,延时*/

_Nop();

_Nop();

_Nop();

_Nop();

SDA=0;/*发送起始信号*/

_Nop();/*起始条件锁定时间大于4μs*/

_Nop();

_Nop();

_Nop();

_Nop();

SCL=0;/*钳住I2C总线,准备发送或接收数据*/

_Nop();

_Nop();

}

/*******************************************************************

结束总线函数

函数原型:

voidStop_I2c();

功能:

结束I2C总线,即发送I2C结束条件.

********************************************************************/

voidStop_I2c()

{

SDA=0;/*发送结束条件的数据信号*/

_Nop();/*发送结束条件的时钟信号*/

SCL=1;/*结束条件建立时间大于4μs*/

_Nop();

_Nop();

_Nop();

_Nop();

_Nop();

SDA=1;/*发送I2C总线结束信号*/

_Nop();

_Nop();

_Nop();

_Nop();

}

/*******************************************************************

字节数据发送函数

函数原型:

voidSendByte(UCHARc);

功能:

将数据c发送出去,可以是地址,也可以是数据,发完后等待应答,并对

此状态位进行操作.(不应答或非应答都使ack=0)

发送数据正常,ack=1;ack=0表示被控器无应答或损坏。

********************************************************************/

voidSendByte(unsignedcharc)

{

unsignedcharBitCnt;

for(BitCnt=0;BitCnt<8;BitCnt++)/*要传送的数据长度为8位*/

{

if((c<

elseSDA=0;

_Nop();

SCL=1;/*置时钟线为高,通知被控器开始接收数据位*/

_Nop();

_Nop();/*保证时钟高电平周期大于4μs*/

_Nop();

_Nop();

_Nop();

SCL=0;

}

_Nop();

_Nop();

SDA=1;/*8位发送完后释放数据线,准备接收应答位*/

_Nop();

_Nop();

SCL=1;

_Nop();

_Nop();

_Nop();

if(SDA==1)ack=0;

elseack=1;/*判断是否接收到应答信号*/

SCL=0;

_Nop();

_Nop();

}

/*******************************************************************

字节数据接收函数

函数原型:

UCHARRcvByte();

功能:

用来接收从器件传来的数据,并判

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高中教育 > 初中教育

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1