低频低噪声高增益放大器
一、基本要求
(1)放大器
a.电压放大倍数200~2000倍,放大倍数可预置步进(间隔不大于200倍),有数字显示额外加分。
b.通频带3kHz~5kHz。
c.放大倍数为2000倍时,测得输出噪声电压峰—峰值等效到输入端小于800nV。
d.最大不失真输出幅度不小于8V。
e.输入电阻不小于1kΩ,输出电阻不大于20Ω。
(2)自制供电电源。
单相交流220伏电压供电,电源波动±10%时可正常工作。
(3)自制适合于本放大器测试用的信号源。
发挥部分
(1)电压放大倍数更高、步长更小
(2)等效输入噪声不大于200nV。
(3)等效输入电阻大于10kΩ。
(4)数字显示精度进一步改善
二、方案设计
2.1方案流程图
2.2 信号源制作模块
信号源原理图
信号源效果图
说明:单片机制作4.5KHZ的信号源,为电路提高信号源。
2.3 π网络衰减射随器带通滤波器模块制作
衰减网络
说明:由于单片机制作的信号源输出幅度很大,4V左右,而题目的要求知,信号源提供的电压幅度在10mV左右,因此通过衰减网络达到目的。
射随器
说明:射随器提高输入阻抗,以达到题目指定的要求。
带通滤波器
说明:带通滤波器的范围为3kHz~5kHz,因此可以满足通频带3kHz~5kHz的要求。
2.4 DAC0832程控网络
说明:通过DAC0832实现电压放大倍数200~3000倍的控制,把放大3000倍后的信号作为DAC0832的参考电压,通过数字量实现步进100倍的增益控制。
2.5 后级放大
说明:放大倍数进一步放大,固定放大1000倍。
2.6 电源制作模块
电源电路图说明:制作电源给电路供电。
三、软件设计
软件设计部分的程序流程框图
程序流程框图
键盘扫描
有键按下keyflag=1
Key=ox0e Key=ox0d Key=ox0b Key=ox0f 置倍数3000 倍减倍加置倍数200
LED显示
仿真效果图及原理图
说明:通过键盘控制达到改变增益的目的。
四、系统功能设计与测试
4.2带宽测试
4.3基本功能实现部分
1.放大倍数200~2000实现,发挥至3000倍。
2.步进100倍。
3.最大不失真输出幅度不小于15V
4.输入电阻不小于1kΩ,输出电阻不大于20Ω。
5. 自制供电电源。
单相交流220伏电压供电,电源波动±10%时可正常工作。
6. 自制适合于本放大器测试用的信号源。
附录
1.信号源程序
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit dawr=P3^6;
sbit led=P0^0;
uchar code table[]={128, 154, 180, 203, 223, 238, 249,
255, 255, 249, 238, 223, 203, 180,
154, 128,101, 75, 52, 32, 17, 6,
0, 0, 6, 17, 32,52, 75, 101, 127 };
void main()
{
uint val;
dawr=0;
P2=0;
while(1)
{
for(val=0;val<30;val++)
{
P2=table[val];
}
}
}
2.增益控制程序
#include<stdio.h>
#include<reg52.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
unsigned char dis_data[4]=0; //数码管显示缓冲区unsigned led_seg[10]={0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f}; //定义数码管字形数据uchar x=0;
uint code table[]={200,300,400,500,600,700,800,900,
1000,1100,1200,1300,1400,1500,
1600,1700,1800,1900,2000,2100,2200,2300,
2400,2500,2600,2700,2800,2900,3000};
uchar dac;
void delayms(uint x)
{
uint j;
for(x;x>0;x--)
for(j=11;j>0;j--);
} //延时xms
void timer(void) interrupt 3 using 3
{
TH1=0xe0; //重置定时器初值
TL1=0;
P2=~(0x00|(1<<x));
P0=dis_data[x++];
if(x>3) x=0;
}
void calculate(uint db)
{ //定义增益值变量
uchar sw=0,gw=0,sfw=0,bfw=0; //定义数据位变量
P3=(uint)(db*255.0/3000.0); //改DA sw=(int)db/1000; //计算十位
gw=(int)db/100%10; //计算个位
sfw=(int)db/10%10; //计算十分位
bfw=(int)db%10; //计算百分位
dis_data[3]=led_seg[sw]; //刷新显示
if(sw==0) dis_data[3]=0x00; //十位灭零
delayms(1);
dis_data[2]=led_seg[gw];
delayms(1);
dis_data[1]=led_seg[sfw];
delayms(1);
dis_data[0]=led_seg[bfw];
delayms(1);
}
void main(void)
{
uchar key=0;
bit keyflag=1;
uint dac=0; //定义DA转换器变量
TMOD=0x10; //初始化定时器TH1=0xe0; //置定时器初值TL1=0;
EA=1;
ET1=1;
TR1=1;
P3=0;
dis_data[3]=led_seg[0];
dis_data[2]=led_seg[0];
dis_data[1]=led_seg[0];
dis_data[0]=led_seg[0]|0x20;
while(1) //键盘扫描程序{
key=P2&0xf0;
key>>=4;
switch(key)
{
case 0x0e:
if(keyflag)
{
dac=0;
calculate(table[dac]);
keyflag=0;
}
break;
case 0x0d:
if(keyflag){
dac+=1;
if(0<=dac&&dac<=28)
calculate(table[dac]);
keyflag=0;
}
break;
case 0x0b:
if(keyflag)
{
dac-=1;
if(0<=dac&&dac<=28)
calculate(table[dac]);
keyflag=0;
}
break;
case 0x07:
if(keyflag)
{
dac=28;
calculate(table[dac]);
keyflag=0;
}
break;
case 0x0f:
keyflag=1;
break;
}
}。