程控放大器的设计.docx
《程控放大器的设计.docx》由会员分享,可在线阅读,更多相关《程控放大器的设计.docx(11页珍藏版)》请在冰豆网上搜索。
程控放大器的设计
程控放大器的设计
开放实验报告
课题名称程控放大器的设计
学生姓名
系、年级专业信息工程系、11、12级电子信息工程
指导教师王少杰
2014年5月15日
程控放大器的设计
一.实验目的
1、了解程控放大器原理。
2、掌握在Proteus中进行电子电路设计与仿真方法。
3、学会Proteus虚拟仪器仪表的使用。
二.实验内容
1、在Proteus中,设计基于数字电位器的程控放大器,并进行仿真。
2、在Proteus中利用虚拟仪器仪表测量放大器的技术参数。
三.电路设计
1、程控放大器原理
2、程控放大器电路
3、程序设计
4、仿真结果与分析
5、结论
1、程控放大器电路原理如下:
其工作原理是:
通过单片机的SPI总线来控制数字电位器MCP41010,通过对数字电位器MCP41010写时序能够操作操控MCP41010的阻值大小,进一步控制电路中的电压大小,实现单片机对电路电压的放大与缩小。
四.实验分析
MCP41010是数字电位器MCP41XXX系列中的10K阻值的数字电位器,内部有256个抽头,能够精确地对电压实现放大与缩小,采用低功耗CMOS技术,结口是SPI串行接口,最大INL和DNL误差为1LSB,静态工作电流最大值为1uA,关断功能可断开所有的电阻电路,最大限度的节能功耗,单电源工作(),在上电时抽头复位到半量程(80h),MCP41XXX系列数字电位器分为变阻器模式和电位器模式。
本次试验使用MCP41010的变阻器模式,通过对单片机的,,(CS,SI,SCK)三个引脚进行输出控制,利用单片机的计数功能对外部按键(增大,减少)进行计数,单片机内部通过按键数多少对MCP41010时序写入,进一步控制MCP41010的抽头数,来改变电路的电压大小,实现程序控制电压的放大与缩小。
五.仿真结果
仿真开始
放大波形
缩小波形
源程序附后:
#include<>
#include<>
#defineucharunsignedchar
#defineuintunsignedint
ucharcodeP_P0[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
ucharcodeP_Pshi[]={0x40,0x79,0x24,0x30,0x19,0x12,0x12,0x78,0x00,0x10};
sbitK1=P3^4;
sbitK2=P3^5;
sbitCS=P1^5;
sbitSI=P1^6;
sbitSCLK=P1^7;
uchari=0,j=0,k=200,Count=175;
voiddelay(uintx)//延时
{
while(x--);
}
voidSend_Data(ucharx)//发送数据
{
ucharn=2,i,command=0x11;
CS=0;
for(i=0;i<8;i++)
{
SCLK=0;
if(command&0x80)
{
SI=1;
}
else
{
SI=0;
}
SCLK=1;
for(;n!
=0;n--);
command<<=1;
}
for(i=0;i<8;i++)
{
SCLK=0;
if(x&0x80)
{
SI=1;
}
else
{
SI=0;
}
SCLK=1;
for(;n!
=0;n--);
x<<=1;
}
for(;n!
=0;n--);
CS=1;
}
voidKey_read(void)//读按键
{
if(K1==0)
{
Send_Data(Count);
i=0;
do
{
i++;
Send_Data(Count);
}while(K1==0);
}
if(K2==0)
{
Send_Data(Count);
j=0;
do
{
j++;
Send_Data(Count);
}while(K2==0);
}
}
voidled_scan(void)//数码管显示
{
P0=P_Pshi[k/100];
P2=0x01;
delay(125);
P2=0x00;
P0=P_P0[k/10%10];
P2=0x02;
delay(125);
P2=0x00;
P0=P_P0[k%10];
P2=0x04;
delay(125);
P2=0x00;
P0=P_P0[0];
P2=0x08;
delay(125);
P2=0x00;
}
voidmain()
{
IE=0x8a;
IP=0x02;
TMOD=0x66;
TH0=255;
TL0=255;
TH1=255;
TL1=255;
TCON=0x55;
while
(1)
{
Send_Data(Count);
Key_read();
led_scan();
}
}
voidtimer0(void)interrupt1
{
if(i>20)
{
i=0;
Count++;
k--;
if(Count>256)
{
Count=0;
}
}}
voidtimer1(void)interrupt3
{
if(j>20)
{
Count--;
j=0;
k++;
if(Count==0)
{
Count=255;
}
}
}