首页 测量放大器报告

测量放大器报告

举报
开通vip

测量放大器报告课程设计报告 测量放大器 华南师范大学 物理与电信工程学院 2012级通信7班 20123100101 何均良 D 测量放大器 一、 任务 设计并制作一个测量放大器,如下图。输入信号VI取自桥式测量电路的 输出。当 R1=R2=R3=R4 时,VI=0。R2 改变时,产生 VI 不为 0 的电压信 号。测量电路与放大器之间有 1 米长的连接线。  二、要求 1.  基本要求 (1)差模电压放大倍数可预置并显示,AVD=1~1000,步距为1; (2)最大输出电压为±10V,非线性误差<0.5%; (3...

测量放大器报告
课程设计 报告 软件系统测试报告下载sgs报告如何下载关于路面塌陷情况报告535n,sgs报告怎么下载竣工报告下载 测量放大器 华南师范大学 物理与电信 工程 路基工程安全技术交底工程项目施工成本控制工程量增项单年度零星工程技术标正投影法基本原理 学院 2012级通信7班 20123100101 何均良 D 测量放大器 一、 任务 设计并制作一个测量放大器,如下图。输入信号VI取自桥式测量电路的 输出。当 R1=R2=R3=R4 时,VI=0。R2 改变时,产生 VI 不为 0 的电压信 号。测量电路与放大器之间有 1 米长的连接线。  二、要求 1.  基本要求 (1)差模电压放大倍数可预置并显示,AVD=1~1000,步距为1; (2)最大输出电压为±10V,非线性误差<0.5%; (3)在AVD=500 时,输出端噪声电压的峰-峰值小于 1V; (4)通频带0~100Hz; 2.发挥部分  数字显示输出电压有效值。 三、说明 1.直流电压放大器部分只允许采用通用型集成运算放大器和必要的其它元 器件组成,不能使用单片集成的测量放大器。 2.设计报告正文中应包括系统总体框图、核心电路原理图、主要 流程 快递问题件怎么处理流程河南自建厂房流程下载关于规范招聘需求审批流程制作流程表下载邮件下载流程设计 图、 主要的测试结果。完整的电路原理图、重要的源程序、和完整的测试结果用附件 给出。 1、总体 方案 气瓶 现场处置方案 .pdf气瓶 现场处置方案 .doc见习基地管理方案.doc关于群访事件的化解方案建筑工地扬尘治理专项方案下载 : 1.1设计思想:     根据题目的要求,差模电压放大倍数可预置并显示,AVD=1~1000,步距为1,差模放大电路采用仪用放大电路,前级放大实现1000倍或者100倍的放大,实现步距为1用基于AD7520的衰减电路实现,预置数与显示用51单片机开发板的按键与LCD1602来实现。发挥部分,数字显示输出电压有效值,用基于AD637的真有效值转换电路将经过前级仪用放大器放大后的输出信号转换成有效值,并且通过51单片机的内置AD采集口进行有效值信号采集,通过51单片机的LCD1602显示出来。 1.2系统总体框图: LCD1602显示 AD采集有效值 IN(直流信号或交流信号) 51单片机开发板 OUT(示波器看波形) 按键控制输入的预设增益值,LCD1602显示预设增益值与输出信号的有效电压。 高共模抑制仪用放大器 高共模抑制仪用放大器 基于AD7520的衰减电路 基于AD637的有效电压转换电路     2、核心电路原理图: 2.1仪用放大器: 由图可知,它是由运放U1,U2按同相输入接法组成第一级差分放大电路,运放U3组成第二级差分放大电路,其中运放均用UA741芯片。在第一级电路中,输入信号分别加到U1,U2的同相端,R3、R4、R5组成的反馈网络,引入负反馈。各电阻的具体阻值如上图示。 其中中间的电阻是用一个组织为10K的电位器代替普通的电阻,通过调节电位器的阻值大小,可以更加精确地控制对输入信号的放大。通过数学公式计算得到前级放大的倍数控制在100倍到1000倍之间。仪用放大电路能够很好地放大差模信号,抑制共模信号。 2.2基于AD7520的衰减电路: 通过查看AD7520的Datasheet得知,基于AD7520的衰减电路的实现接法如下图示,   然后在AD上做出的原理图如下图示:                     各引脚定义如下图示: 经过前级的仪用放大电路对输入信号进行一定的前级放大,AD7520的置数通过51单片机开发板实现,置数范围有1-1000之间,来实现后级衰减,使输出的信号为放大后所需的信号。置数通过51单片机开发板的按键实现,然后送给AD7520的是为数据口。 3、基于AD637的有效电压转换电路: AD637芯片引脚图与部分引脚的功能如下: 经前级放大电路放大后的输出信号经过电容滤波作用后输入到AD637,经过AD637有效值转换后的输出信号,送至单片机的AD采集口采集,LCD1602显示有效值。, 各个模块接通电源,信号发生器输入初始信号(交流信号或者直流信号),LCD1602初始化,显示预设增益值为0,有效值为0V 三、主要 流程图 破产流程图 免费下载数据库流程图下载数据库流程图下载研究框架流程图下载流程图下载word : 通过按键输入大于等于1小于等于1000的预设增益值(当输入大于1000时,蜂鸣器响起报警),按确定按键后AD口采集输出信号的有效电压。 LCD1602的第一行显示放大的增益值,第二行显示输出信号的电压有效值,通过示波器观察输出信号的波形。 四、主要的测试结果:     输入交流信号: 输入放大倍数 输入信号(mVpp) 输出信号(Vpp) 实际放大倍数 有效值(V) 1000 10 10.000 1000 3.5373 512 10 5.123 512.3 1.8110 100 10 1.002 100.2 0.3542 10 10 0.103 10.3 0.0365     输入直流信号: 输入放大倍数 输入信号(mV) 输出信号(V) 实际放大倍数 有效值(V) 1000 10 10.000 1000 7.0745 512 10 5.123 512.3 3.6220 100 10 1.002 100.2 0.7084 10 10 0.103 10.3 0.0728 附录1:重要源程序 主函数程序: #include #include #include #include #define uchar    unsigned char #define uint    unsigned int #define FSCLK    11059200  //晶振频率 sbit BEEP=P1^4;  //宏定义跟蜂鸣器相连的引脚 uint a=0;    //定义输入的预设增益值,并初始化为0 float res0;  //用于AD数据采集 //定义十位I/O输出,送给AD7520 sbit D10=P0^3; sbit D9=P0^2; sbit D8=P0^1; sbit D7=P0^0; sbit D6=P1^6; sbit D5=P1^5; sbit D4=P1^3; sbit D3=P1^2; sbit D2=P1^1; sbit D1=P1^0; /******************************************************************************** 函数功能 :预设增益值送给AD7520 ** 函数说明 :通过10个I/O口将预设增益值送给AD7520,然后将输入信号放大相应的倍数 ** 入口参数 :预设增益值 ** 出口参数 :10个I/O口的高低电平 ******************************************************************************* void Gain() {                D1=a%2;         D2=a/2%2;         D3=a/4%2;         D4=a/8%2;         D5=a/16%2;         D6=a/32%2;         D7=a/64%2;         D8=a/128%2;         D9=a/256%2;                    D10=a/512%2;            } //主函数 void main() {     uchar key;     LCD_1602_Init(); //液晶显示前进行初始化     Write_1602_String("Gain:0",0X80);//初始化显示增益值     Write_1602_String("EValue:0",0XC0);//初始化显示有效电压值     Write_1602_String("V",0XCF);     ADC_Init(ADC_PORT7); //配置通道P1^7为AD采集口     while(1)     {         key = Key_Scan();//扫描按键,每个按键对应每一个数值,或者复位清零             switch(key)             {    case 1:    a=a*10+1;                         Write_Num(a,0x85);                         break;                 case 2:a=a*10+2;                         Write_Num(a,0x85);                         break;                 case 3:a=a*10+3;                         Write_Num(a,0x85);                         break;                 case 4:a=a+1;                         Write_Num(a,0x85);                         break;                 case 5:a=a*10+4;                         Write_Num(a,0x85);                         break;                 case 6:a=a*10+5;                         Write_Num(a,0x85);                         break;                 case 7:a=a*10+6;                         Write_Num(a,0x85);                         break;                 case 8:a=a+10;                         Write_Num(a,0x85);                         break;                 case 9:a=a*10+7;                         Write_Num(a,0x85);                         break;                 case 10:a=a*10+8;                         Write_Num(a,0x85);                         break;                 case 11:a=a*10+9;                         Write_Num(a,0x85);                         break;                 case 12:a=a+100;                         Write_Num(a,0x85);                         break;                 case 13:a=a*10+0;                         Write_Num(a,0x85);                         break;                 case 14:                         if(a<=1000)    //若输入的预设增益值小于等于1000,则输出放大后的有效电压值                         {                             Gain();                                                    }                         else        //否则输入的预设增益值大于实际的最大增益值,报错,蜂鸣器响起,                         {                             BEEP=0;                             Delay_ms(1000);                             BEEP=1;                         }                         break;                 case 15:a=0;    //复位清零,再次初始化LCD液晶屏                         LCD_1602_Init();                         Write_1602_String("Gain:0",0X80);                         Write_1602_String("EValue:0",0XC0);                         Write_1602_String("V",0XCF);                         break;                                    }         if(a>=1&&a<=1000)         {         //采集P1^7口的AD数据,从而通过LCD1602液晶屏显示输出电压的有效值         res0=GetADCResult(ADC_CH7);            Write_1602_String("EValue:",0XC0);         Write_1602_Data(0x30 + (uint)res0%10);         Write_1602_Data('.');         Write_1602_Data(0x30 + (uint)(res0*10)%10);         Write_1602_Data(0x30 + (uint)(res0*100)%10);         Write_1602_Data(0x30 + (uint)(res0*1000)%10);         Write_1602_Data(0x30 + (uint)(res0*10000)%10);         Delay_ms(1000);         }       }     }        /****************************************************************************** ** 函数功能 :延时函数 ** 函数说明 :利用软件延时,占用CPU,经调试最小延时的单位大约为1ms, ** 入口参数 :time:需要延时的时间,单位ms,如time = 1000,则延时1000ms ** 出口参数 :无 ******************************************************************************* void Delay_ms(uint time) {     uint i,j;     for(i = 0;i < time;i ++)         for(j = 0;j < 930;j ++); } 头文件函数1:键盘扫描 #define KEY_PORT    P3            //定义键盘接口 unsigned char scan,read,key_num;//参考电平;读KEY_PORT口电平;检测到得键盘位数 void Delay_ms(unsigned int time);        //声明延时函数 unsigned char Key_Scan() //键盘扫描程序 {     key_num=0;     KEY_PORT=0xfe;//从下面数起第一行     read=KEY_PORT;     scan=0xf0;     scan=scan&read;     if(scan!=0xf0)         {             Delay_ms(70);//延迟一段时间,消斗,             read=KEY_PORT;             scan=read&0xf0;                if(scan!=0xf0) // 若真的有键按下,再进行判断哪个按键按下                 {                     switch(scan)                         {                             case 0x70:key_num=16;break;                             case 0xb0:key_num=15;break;                             case 0xd0:key_num=14;break;                             case 0xe0:key_num=13;break;                                                }                     while(scan!=0xf0)//松手检测                     {                         while(scan != 0xf0)//松手消抖检测                         {                             Delay_ms(70);                             read=KEY_PORT;                             scan=read&0xf0;                                        }                         Delay_ms(70);                         read=KEY_PORT;                         scan=read&0xf0;                     }                 }         }     KEY_PORT=0xfd;//从下面数起第二行     read=KEY_PORT;     scan=0xf0;     scan=scan&read;     if(scan!=0xf0)         {             Delay_ms(70);             read=KEY_PORT;             scan=read&0xf0;                if(scan!=0xf0)             {                 switch(scan)                 {                     case 0x70:key_num=12;break;                     case 0xb0:key_num=11;break;                     case 0xd0:key_num=10;break;                     case 0xe0:key_num=9;break;                                        }                     while(scan!=0xf0)                     {                         while(scan != 0xf0)                         {                             Delay_ms(70);                             read=KEY_PORT;                             scan=read&0xf0;                                        }                         Delay_ms(70);                         read=KEY_PORT;                         scan=read&0xf0;                     }             }         }     KEY_PORT=0xfb;//从下面数起第三行     read=KEY_PORT;     scan=0xf0;     scan=scan&read;     if(scan!=0xf0)         {             Delay_ms(70);             read=KEY_PORT;             scan=read&0xf0;                if(scan!=0xf0)                 {                     switch(scan)                         {                             case 0x70:key_num=8;break;                             case 0xb0:key_num=7;break;                             case 0xd0:key_num=6;break;                             case 0xe0:key_num=5;break;                                                }                         while(scan!=0xf0)                         {                             while(scan != 0xf0)                             {                                 Delay_ms(70);                                 read=KEY_PORT;                                 scan=read&0xf0;                                            }                             Delay_ms(70);                             read=KEY_PORT;                             scan=read&0xf0;                         }                 }         }     KEY_PORT=0xf7;//从下面数起第四行     read=KEY_PORT;     scan=0xf0;     scan=scan&read;     if(scan!=0xf0)         {             Delay_ms(70);             read=KEY_PORT;             scan=read&0xf0;                if(scan!=0xf0)                 {                     switch(scan)                         {                             case 0x70:key_num=4;break;                             case 0xb0:key_num=3;break;                             case 0xd0:key_num=2;break;                             case 0xe0:key_num=1;break;                                                }                     while(scan!=0xf0)                     {                         while(scan != 0xf0)                         {                             Delay_ms(70);                             read=KEY_PORT;                             scan=read&0xf0;                                        }                         Delay_ms(70);                         read=KEY_PORT;                         scan=read&0xf0;                     }                 }         }     return(key_num); } 头文件函数2:LCD1602液晶屏显示 #include /********************************************************************************************************* ** LCD1602接口定义 *********************************************************************************************************/ sbit RS_1602 = P0^5;    //数据命令选择端 sbit RW_1602 = P0^6;    //写选择端 sbit EN_1602 = P0^7;    //使能信号 #define LCD_PORT    P2     //LCD1602数据接口 /********************************************************************************************************* ** LCD1602宏定义指令集 ** 指令集的指令作为void Write_1602_Com(unsigned char zhiling)参数发送给LCD1602之后可以让液晶LCD1602执行相应的功能, *********************************************************************************************************/ #define CLEAR_SCREEN            0X01        //清屏 #define CURSOR_RESET            0X02        //光标复位 };    /********************************************************************************************************* ** 函数功能 :读写LCD1602时用于读写时序的时钟延时 ** 入口参数 :z:延时长度 ** 出口参数 :无 *********************************************************************************************************/    void LCD_Delay(unsigned char z) {     unsigned char x,y;     for(x = z;x > 0;x --)         for(y = 50;y>0;y--); } /********************************************************************************************************* ** 函数功能 :LCD1602忙碌查询 ** 函数说明 :每次读写液晶时需要事先检测芯片是否处于忙碌状态 ** 入口参数 :无 ** 出口参数 :返回值为1:等待超时 **            返回值为0:芯片处于空闲状态 *********************************************************************************************************/ unsigned char Check_1602_Busy(void) {     unsigned int time=0;     RS_1602 = 0;     RW_1602 = 1;     EN_1602 = 1;     while( (LCD_PORT&0X80) != 0X00)     {         time ++;         if(time > 1000) return 1;//实际测量会遇到有些型号的液晶BF一直为高,如果等待超时跳出循环        }        return 0; } /********************************************************************************************************* ** 函数功能 :向液晶写入数据 ** 函数说明 : ** 入口参数 :待写入的数据,数据为LCD1062用来做显示用的,比如说shuju = 0x30,则显示“0”, **               现成的字符数据可查询"LCD1602液晶完整中文资料.pdf"中“CGROM中字符码与字字符字模关系对照表” ** 出口参数 :无 *********************************************************************************************************/ void Write_1602_Data(unsigned char shuju)//写数据 {     Check_1602_Busy();     RS_1602 = 1;     RW_1602 = 0;     EN_1602 = 1;     LCD_PORT = shuju;     LCD_Delay(1);     EN_1602 = 0;        LCD_Delay(1); } /********************************************************************************************************* ** 函数功能 :在指定位置连续写入一串字符 ** 函数说明 :注意写入字符串的长度,不要超过屏幕单行的显示范围 ** 入口参数 :str:  待写入字符串首地址 **            addr:  写入液晶显示的地址 ** 出口参数 :无 *********************************************************************************************************/ void Write_1602_String(unsigned char *str,unsigned char addr) {     Write_1602_Com(addr);     while(*str)     {         Write_1602_Data(*str);         str++;     }    } /********************************************************************************************************* ** 函数功能 :在指定位置写入一个整数 ** 函数说明 :整数的范围从0~65535,更大的需要采用long整型的进行扩展,注意整数的位数和地址不要超出显示范围 ** 入口参数 :number:待写入的整数 **            addr:  写入液晶显示的地址 ** 出口参数 :无 *********************************************************************************************************/ void Write_Num(unsigned int number,unsigned char addr) {     Write_1602_Com(addr);     if(number/10000 != 0)     {         Write_1602_Data(0x30 + number/10000);         Write_1602_Data(0x30 + number%10000/1000);         Write_1602_Data(0x30 + number%1000/100);         Write_1602_Data(0x30 + number%100/10);         Write_1602_Data(0x30 + number%10);     }        else if(number/1000 != 0)     {         Write_1602_Data(0x30 + number/1000);         Write_1602_Data(0x30 + number%1000/100);         Write_1602_Data(0x30 + number%100/10);         Write_1602_Data(0x30 + number%10);        }        else if(number/100 != 0)     {         Write_1602_Data(0x30 + number/100);         Write_1602_Data(0x30 + number%100/10);         Write_1602_Data(0x30 + number%10);            }     else if(number/10 != 0)     {         Write_1602_Data(0x30 + number/10);         Write_1602_Data(0x30 + number%10);                }     else Write_1602_Data(0x30 + number); } /********************************************************************************************************* ** 函数功能 :液晶初始化 ** 函数说明 :用液晶之前需要先初始化液晶,配置对应的显示模式 ** 入口参数 :time:需要延时的时间,单位ms ** 出口参数 :无 *********************************************************************************************************/ void LCD_1602_Init()//初始化 {     Write_1602_Com(DISPLAY_MOD | DISPLAY_MOD_TWO_LINE | DISPLAY_MOD_5_7);//设置显示模式,两行显示,字符点阵大小为5*7:0X38     Write_1602_Com(DISPLAY_SET | DISPLAY_SET_ON | DISPLAY_SET_CURSOR_OFF | DISPLEY_SET_BLINK_OFF);//开显示,不显示光标,光标不闪烁:0X0F        Write_1602_Com(SET_MOD | SET_MOD_AC_ADD | SET_MOD_MOVE_OFF);//设置写入数据后指针AC加一,画面不动:0X06     Write_1602_Com(CLEAR_SCREEN);//清屏     Write_1602_Com(CURSOR_RESET);     Write_CGRAM();     Write_1602_Com(0x80); 头文件函数3:AD采集 #include /********************************用于配置P1口对应管脚为AD模拟输入口**************************************/ #define ADC_PORT0            0X01 #define    ADC_PORT1            0X02 #define ADC_PORT2            0X04 #define ADC_PORT3            0X08 #define ADC_PORT4            0X10 #define ADC_PORT5            0X20 #define ADC_PORT6            0X40 #define ADC_PORT7            0X80 #define ADC_PORTALL            0XFF /*************************************用于获取对应通道的电压值******************************************/ #define ADC_CH0                0X00 #define ADC_CH1                0X01 #define ADC_CH2                0X02 #define ADC_CH3                0X03 #define ADC_CH4                0X04 #define ADC_CH5                0X05 #define ADC_CH6                0X06 #define ADC_CH7                0X07 /*********************************************定义AD转换速度*********************************************/ #define ADC_SPEEDLL_540     0X00          #define ADC_SPEEDLL_360        0X20 #define ADC_SPEEDLL_180        0X40 #define ADC_SPEEDLL_90        0X60 /***************************************定义转换控制寄存器控制位*****************************************/ #define ADC_POWER          0X80            //电源控制位 #define ADC_FLAG            0X10            //转换结束标志位 #define ADC_START          0X08            //转换开始位 /********************************************************************************************************* ** 函数功能 :内置ADC的初始化配置 ** 函数说明 :使用内置ADC时需要先配置对应的P1口的管脚为模拟输入 ** 入口参数 :port:需要配置为模拟输入的通道,使用或运算可以同时配置多个管脚 **              如:ADC_Init(ADC_PORT0 | ADC_PORT1 | ADC_PORT2)调用此函数后可以同时配置P1^0,P1^1,P1^2为模拟输入 ** 出口参数 :无 *********************************************************************************************************/ void ADC_Init(unsigned char port) {     P1ASF=port;//设置AD转换通道     ADC_RES=0;//清空转换结果     ADC_CONTR=ADC_POWER | ADC_SPEEDLL_540;//打开AD转化器电源 //    IE=0XA0;//开启总中断,ADC中断     _nop_();     _nop_();     _nop_();     _nop_(); } /****************************************************************************** ** 函数功能 :获取ADC对应通道的电压值 ** 函数说明 :每次只能获取一个通道的电压值,不同通道需要分别调用该函数获取 ** 入口参数 :channel:获取该通道的电压值 ** 出口参数 :result: 当前通道的电压值 *********************************************************************************************************/ float GetADCResult(unsigned char channel)//读取通道ch的电压值 {     unsigned int ADC_RESULT = 0;//用来存放结果     float result;     ADC_CONTR = ADC_POWER | ADC_SPEEDLL_540 | ADC_START | channel;//开始转换,并设置测量通道为P1^0     _nop_();//需经过四个CPU时钟延时,上述值才能保证被设进ADC_CONTR控制寄存器     _nop_();     _nop_();     _nop_();     while(!(ADC_CONTR & ADC_FLAG));//等待转换结束     ADC_CONTR &= ~ADC_FLAG;//软件清除中断控制位     ADC_RESULT = ADC_RES;     ADC_RESULT = (ADC_RESULT << 2) | (0x02 & ADC_RESL);    //默认数据存储方式:高八位在ADC_RES,低二位在ADC_RESL低二位     result = ADC_RESULT * 5.0 / 1024.0 ;  //基准电压为电源电压5V,10的分辨率,即1024     return result; } 附录2 完整的测试结果: 输入交流信号: 输入放大倍数 输入信号(mVpp) 输出信号(Vpp) 实际放大倍数 有效值(V) 1000 10 10.000 1000 3.5367 512 10 5.123 512.3 1.820 100 10 1.005 100.5 0.3559 10 10 0.103 10.3 0.0364 1000 8 8.000 1000 2.8302 512 8 4.098 512.3 1.4496 100 8 0.804 100.5 0.2840 10 8 0.082 10.2 0.0290 1000 5 5.000 1000 1.7675 512 5 2.561 512.2 0.9103 100 5 0.502 100.3 0.1780 10 5 0.050 10.1 0.0190 输入直流信号: 输入放大倍数 输入信号(mV) 输出信号(V) 实际放大倍数 有效值(V) 1000 10 10.000 1000 7.0745 512 10 5.123 512.3 3.6220 100 10 1.002 100.2 0.7084 10 10 0.103 10.3 0.0728 附录三:单片机部分原理图 1、按键部分: 其中SW1-SW15的功能依次是:1、2、3、+1、4、5、6、+10、7、8、9、+100、0、“确定”、“清零”。 2、LCD1602部分: 3、单片机最小系统部分:
本文档为【测量放大器报告】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_153723
暂无简介~
格式:doc
大小:224KB
软件:Word
页数:0
分类:生活休闲
上传时间:2017-09-20
浏览量:12