目录
摘要---------------------------------------------------------------------2 第一章设计原理与论证
1.测量放大部分----------------------------------------------------------3 (1)前置放大电路的设计------------------------------------------------3 (2)程控增益放大部分--------------------------------------------------4
2.滤波部分---------------------------------------------------------------4 第二章系统整体设计方案
1.系统原理框图----------------------------------------------------------6
2.整体电路图------------------------------------------------------------6
3.滤波部分---------------------------------------------------------------7
4.单片机控制部分--------------------------------------------------------7
5.软件流程---------------------------------------------------------------8 第三章主要参数计算
1.前端放大电路及程控放大部分-------------------------------------------8
2.通频带计算-------------------------------------------------------------8
3.抗干扰措施------------------------------------------------------------10 第四章参数测试分析
1.放大器测试------------------------------------------------------------10
2.程控滤波器测试-------------------------------------------------------11
3.结论------------------------------------------------------------------11 附录(总程序)-----------------------------------------------------------12
可控放大器
【摘要】
本着简单、准确、可靠、稳定、通用的原则,采用了分级设计匹配互连的思想。系统的特色在于:通过模拟开关,改变反馈电阻阻值,从而改变放大器增益,增益从10dB到60dB可调步距为10dB。
用单片机STC89C52对可编程滤波器芯片MAX262进行程序控制,可以同时对两路输入信号进行二阶低通、高通、带通、带阻以及全通滤波处理,滤波器的中心频率在15kHz~50kHz频率范围内实现64级程控调节,其Q值在0.5~64范围实现128级程控调节。
要求:
1.基本要求
(1)放大器输入正弦信号电压振幅为20mV,电压增益为45dB,通频带为100Hz~20kHz,放大器输出电压无明显失真。
(2)滤波器可设置为低通滤波器,其-3dB截止频率fc在1kHz~10kHz范围内可调,调节的频率步进为1KHz,2fc处放大器与滤波器的总电压增益不大于30dB,RL=1k 。
(3)滤波器可设置为高通滤波器,其-3dB截止频率fc在1kHz~10kHz范围内可调,调节的频率步进为0.5kHz,0.5fc处放大器与滤波器的总电压增益不大于30dB, RL=1k 。
(4)截止频率的误差不大于10%。
(5)有设置参数显示功能。
2、发挥部分
(1)放大器电压增益为55dB,输入正弦信号电压振幅为20mV,增益10dB步进可调,通频带为100Hz~50kHz。
(2)制作一个带通滤波器,中心频率25kHz,通频带5kHz,在20kHz和30kHz频率处,要求放大器与带通滤波器的总电压增益不大于45dB。
(3)上述带通滤波器中心频率可设置,设置范围15kHz~35kHz,步进为2kHz。(4)电压增益、截止频率误差均不大于5%。
(5)其他。
第一章设计原理与论证
根据题目要求分以下几部分进行方案设计与论证:
1、测量放大部分
(1)前置放大电路的设计
方案一:
用LM324放大器,其电源电流很小且与电源电压无关,输入偏流电阻是温度补偿的,也不需外接频率补偿,可做到输出电平与数字电路兼容,但其带宽参数无法满足本设计要求故不采用。
方案二:
采用运算放大器OP07,Op07芯片是一种低噪声,非斩波稳零的双极性运算放大器集成电路。由于OP07具有非常低的输入失调电压(对于OP07A最大为25μV),所以OP07在很多应用场合不需要额外的调零措施。OP07同时具有输入偏置电流低(OP07A为±2nA)和开环增益高(对于OP07A为300V/mV)的特点,这种低失调、高开环增益的特性使得OP07特别适用于高增益的测量设备。
为了达到60DB增益采用两级放大,第一级放大倍数为10,总的放大倍数为第一级放大倍数与第二级放大倍数的乘积。
图1
(2)程控增益放大部分
由一增益可软件编程的放大器,将不同幅度的模拟输入信号放大到某个特定范围,便于A/D转换器进行采样;或者将给定信号放大一个由软件设定的增益后输出。
方案一:集成程控增益放大器。它们具有低漂移、低非线性、高共模抑制比和宽频带等优点,但其增益有限,只能实现特定的几种增益切换。所以我们不采用此方案。
方案二:运放+模拟开关+电阻网络。如图1这种方法利用模拟开关切换电阻反馈网络,从而改变放大电路的闭环增益。此种方法通用性强,经济实惠,效果显著。所以我们用此方案。
2、滤波部分
在业自动化的许多领域都要使用滤波器。一般有源滤波器均由运算放大器和RC元件组成。
方案一:使用RC网络,RC电路尽管可以做到体积小和廉价,但要满足此设计要求,需多个图2结构并联,网络仍然过于庞大。而且其上半周内电容C中积蓄得能量到下半周就会被电阻R消耗一半,因此单纯的RC电路Q值不会大于0.5,选择性差,效果同样不佳。所以我们不采用。
图2
方案二:使用MAX262可编程开关电容通用滤波器,它是美国MAXIM公司开发的一种通用有源滤波器,可用微处理器编程控制,方便的构成各种低通、带通、高通、陷波和全通配置,而且不需要外部元件,可靠性高,对使用环境的要求不高。如图3通过单片机(89s52)对该芯片的6个输入端进行有效设置可实现64个不同的中心频率f0,而且Q值可达128完全满足本题目所以我们采用方案二。
单片机与max262的连接图:
第二章系统整体设计方案
1、系统原理框图,见图4。采用模拟开关CD4051控制反馈电阻调节电压增益,优点是电路简单、通用性强。AT89S52直接驱动数码管显示,滤波部分芯片MAX261输入采用4013分频并用模拟开关控制。
2、整体电路图:
3.滤波部分:
4.单片机控制部分:
5.软件流程如下:
总程序框图,见图5
第三章主要参数计算
1、前端放大电路及程控放大部分
放大电路采用反相放大放大倍数计算公式为Avf=-Rw/Rf Av=20lgAvf
当增益Av=10dB Avf=3.16=Rw/10k。由此可计算出Rw=31.6k欧姆,再经过模拟开关CD4051进而可计算出增益分别为20、30、40、50、60时Rw的值(如图)。调节Rw的值即可获得所需的增益。
2、通频带计算
系统选用模式一实现低通、带通,模式三实现高通。同时89C51的ALE信号送到MAX261的CLKA和CLKB引脚作为时钟信号及晶振频率1/6 及2MHz 作为
MAX261的外部时钟时钟频率,MAX261处理的输入信号范围为15kHz~50kHz,通过改变编程数据F0~F5实现64级中心频率调节。根据厂家的芯片资料fclk/f0=40.84+1.57N1及Q=64/(128-N2)并由查表得出下表数据:
f0fclk MODES
F5~F0N1Q6~Q0N2
1,3
15.6 1kHz125kHz125.6601000016001000
15.6 2kHz250kHz125.6601000016001000
3kHz0.5MHz166.5010101042010101
42.1
15.6 4kHz0.5MHz125.6601000016001000
5kHz0.5MHz100.560000000000000
423 6kHz1MHz166.5010101042010101
7kHz1MHz142.9401101127001111
27
1
15.6 8kHz1MHz125.6601000016001000
9kHz1MHz109.960001117000011
6.8
1
10kHz1MHz100.530000000000000
51.8 11kHz2MHz182.2111010052011010
12kHz2MHz166.5010101042010101
42.2
34 13kHz2MHz153.9310001034010001
14kHz2MHz142.9401101127001101
27
1
21 15kHz2MHz133.5201010121001010
1
16kHz2MHz125.6601000016001000
15.6
17kHz2MHz117.810010111100010111
1
18kHz2MHz111.530001117000011
6.8
1
3
19kHz2MHz105.240000113000001
1
20kHz2MHz100.530000000000000
3、抗干扰措施:
宽带放大器的总增益为0—60dB,因此抗干扰措施必须要做的好,才能避免自激和减少噪声。设计中采用了如下方法:
运算放大器采用低噪声、低失调、高开环增益的OP07,;
在电源端并接0.1uf的电容避免电源的高频干扰,并接20uf的电容避免低频干扰。
所有信号耦合用电解电容两端并接高频瓷片电容,以避免高频增益下降。
第四章参数测试分析
1、放大器测试:
增益(dB) Vi(mv)Vout
0 20 21.3mV
10 20
20 20
30 20
40 20 2.1V
50 20
60 20 2、程控滤波器测试:
V i 1
1
1
1
1
1
1
101010
f
V
o
3.结论
基本要求发挥要求实际性能
(1)放大器输入正弦信号电压振幅为10mV,电压增益为40dB,通频带为100Hz~40kHz,放大器输出电压无明显失真。(1)放大器电压增益为
60dB,输入正弦信号电
压振幅为10mV,增益
10dB步进可调,通频
带为100Hz~
100kHz。
电压增益为60dB,输
入正弦信号电压振幅为
10mV,增益10dB步进
可调,通频带为100Hz~
100kHz。
(2)滤波器可设置为低通滤波器,其-3dB截止频率f c在1kHz~20kHz范围内可调,调节的频率步进为1kHz,2f c处放大器与滤波器的总电压增益不大于30dB,R L=1kW。(2)制作一个带通滤波
器,中心频率50kHz,
通频带10kHz,在
40kHz和60kHz频率
处,要求放大器与带通
滤波器的总电压增益不
大于45dB。
低通滤波器,其-3dB
截止频率f c在1kHz~
20kHz范围内可调,调
节的频率步进为1kHz,
2f c处放大器与滤波器的
总电压增益不大于
30dB,R L=1kW。
(3)滤波器可设置为高通滤波器,其-3dB截止频率f c在1kHz~20kHz范围内可调,调节的频率步进为1kHz,0.5f c处放大器与滤波器的总电压增益不大于30dB,R L=1kW。(3)上述带通滤波器中
心频率可设置,设置范
围40kHz~60kHz,步
进为2kHz。
高通滤波器,其-3dB
截止频率f c在1kHz~
20kHz范围内可调,调
节的频率步进为1kHz,
0.5f c处放大器与滤波器
的总电压增益不大于
30dB,R L=1kW。
(4)截止频率的误差不大于10%。(4)电压增益、截止频
率误差均不大于5%。
带通滤波器,中心频
率50kHz,通频带
10kHz,在40kHz和
60kHz频率处,要求放
大器与带通滤波器的总
电压增益不大于45dB。
(5)有设置参数显示功
能。
(5)其他设置参数显示
附录
1.程序
#include
#include
#include
typedef unsigned char uchar; typedef unsigned int uint; typedef unsigned long ulong;
void Write_Max262(void); void Low_Pass(void);
void High_Pass(void);
uchar Fclk_F0_Q(void);
void fd() ;
uchar code Table[13]={
0xc0,0xf9,0xa4,0xb0,0x99,
0x92,0x82,0xf8,0x80,0x90,
0x89,0xc7,0xf6};
uchar code Select[6]={
0x7f,0xbf,0xdf,0xef,0xf7,0xfb};
sbit A0=P1^0;
sbit A1=P1^1;
sbit A2=P1^2;
sbit A3=P1^3;
sbit D0=P1^4;
sbit D1=P1^5;
sbit W_R=P1^6;
sbit sw=P1^7; #define S1 0x38
#define S2 0x34
#define S3 0x2c
#define S4 0x1c
uchar num,dd=0,Mode=3,N1,N2,c,Q=1;
uint f0=40000,fc_H=1000,fc_L=1000,d=0xf6; ulong fclk=200000;
void Delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=124;y>0;y--);
}
void Display(void)
{
static uchar num,Temp;
static uint k;
P2=0xff&d;
k++;
switch(num)
{
case 0:
P0=Table[dd];
break;
case 1:
switch(c)
{
case 0:
P0=Table[0];
Temp=0;
break;
case 1:
P0=Table[10];
Temp=fc_H/1000;
break;
case 2:
P0=Table[11];
Temp=fc_L/1000;
break;
case 3:
P0=Table[8];
Temp=f0/1000;
break;
default:
break;
}
break;
case 2:
P0=Table[Temp/10];
break;
case 3:
P0=Table[Temp%10];
break;
default:
break;
}
switch(c)
{
case 0:
P2=Select[num]&d;
break;
case 1:
case 2:
case 3:
if(k>20)
P2=Select[num]&d;
else
P2=0xff&d;
break;
}
num++;
num%=4;
k%=40;
Delay(1);
}
uchar Keyscan(void)
{
uchar Key;
if((P3&0x3c)==0x3c)
return(0xff);
Delay(10);
if((P3&0x3c)==0x3c)
return(0xff);
Key=P3&0x3c;
while((P3&0x3c)!=0x3c)
{
Display();
}
return(Key);
}
void KeySet(void)
{
uchar i;
switch(Keyscan())
{
case S1:
c++;
c%=4;
break;
case S2:
switch(c)
{
case 1:
fc_H+=1000;
if(fc_H==21000)
fc_H=1000;
break;
case 2:
fc_L+=1000;
if(fc_L==21000)
fc_L=1000;
break;
case 3:
f0+=2000;
if(f0==62000)
f0=40000;
break;
default:
break;
}
break;
case S3:
switch(c)
{
case 1:
fc_H-=1000;
if(fc_H==0)
fc_H=20000;
break;
case 2:
fc_L-=1000;
if(fc_L==0)
fc_L=20000;
break;
case 3:
f0-=2000;
if(f0==38000)
f0=60000;
break;
default:
break;
}
break;
case S4:
switch(c)
{
case 1:
for(i=0;i<3;i++)
{
Q=1;
High_Pass();
Fclk_F0_Q();
Write_Max262();
}
break;
case 2:
for(i=0;i<3;i++)
{
Q=1;
Low_Pass();
Fclk_F0_Q();
Write_Max262();
}
break;
case 3:
for(i=0;i<3;i++)
{
Q=f0/10000;
Fclk_F0_Q();
Write_Max262();
}
break;
}
default :
break;
}
}
void Low_Pass(void)
{
Q=pow(Q,2);
Q*=2;
f0=(uint)(fc_L/(sqrt((1-1/Q)+sqrt(pow(1-1/Q,2)+1))));
}
void High_Pass(void)
{
Q=pow(Q,2);
Q*=2;
f0=(uint)(fc_H*(sqrt((1-1/Q)+sqrt(pow(1 -1/Q,2)+1))));
}
uchar Fclk_F0_Q(void)
{
if(Mode==1)
{
N1=(fclk/f0-28.87872)/1.11072;
N2=(11585.28-Q)/90.51;
}
else
{
N1=(fclk/f0-40.48)/1.57;
N2=(8129-Q)/64;
}
return(N1);
return(N2);
}
void Write_Max262(void)
{
uchar i,j,Temp_Mode,Addr=1;
uint Temp1=0,Temp2=0;
Temp1=(N1<<4)+15;
Temp2=(N2<<4)+15;
W_R=0;
Temp_Mode=Mode;
Temp_Mode=Temp_Mode<<4;
P1=Temp_Mode&0xf0;
_nop_();
_nop_();
W_R=1;
for(i=0;i<3;i++)
{
W_R=0;
P1=Addr | 0xb0;
P1=P1&Temp1;
Addr++;
Temp1>>=2;
Temp1=Temp1|0x000f;
_nop_();
_nop_();
W_R=1;
}
for(j=0;j<4;j++)
{
W_R=0;
P1=Addr | 0xb0;
P1=P1&Temp2;
Addr++;
Temp2>>=2;
Temp2=Temp2|0x000f;
_nop_();
_nop_();
W_R=1;
}
Delay(10);
P1=0xff;
}
void fd()
{ P2=d;
if(sw==0)
{Delay(10);if(sw==0){d--;dd++;if(dd==7 ){d=0xf6;dd=0;}P2=d;}}
while(sw==0) ;
}
void main(void)
{ sw=1;
while(1)
{
fd();
Display();
KeySet();
}
}