单片机自动增益放大器讲诉.docx
《单片机自动增益放大器讲诉.docx》由会员分享,可在线阅读,更多相关《单片机自动增益放大器讲诉.docx(24页珍藏版)》请在冰豆网上搜索。
单片机自动增益放大器讲诉
自动增益放大器
摘要:
本系统有四个模块组成:
程控放大器,峰值检测,液晶。
程控放大器采用两片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();
功能:
用来接收从器件传来的数据,并判