四位半电压表

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

四位半多功能数字表

一.基本要求:在Proteus平台上设计并仿真实现一台四位半多功能数字电压表

直流电压测量,并具有极性判断和自动量程转换功能。

1.直流电压测量:每秒等效采样次数≥3次

推荐档位:

I档(20mV档):最小电压分辨率:2μV

II档(200mV档):最小电压分辨率:20μV

III档(2V档):最小电压分辨率:0.2mV

IV档(20V档):最小电压分辨率:2mV

2.*交流电压测量:最高频率<=10KHz的正弦波

I档(20V档):最小电压分辨率:20mV

II档(200V档):最小电压分辨率:200mV

3.*交流参数测量:频率、有效值、峰值

4.第1项为基本要求内容,带有“*”的2、3项为选做内容。

5.只能采用通用A/D、集成运放IC、51单片机等器件,不准使用专用

电压测量集成电路完成系统设计。

6.推荐一个参考的系统组成框图如下:

其中第一级的前置放大级推荐采用AD8551自稳零斩波运算放大器。

设计过程:包括元器件选型依据(如前置放大器的设计、A/D分辨率的选择、放大器及滤波器设计、采样率计算、电源设计等)、理论分析及参数计算、系统设计(书面)。

系统框图、元件选型、理论计算、模块电路设计

二系统框图

整体框图

数字电路部分和模拟电路量程初判模块整体电路:

1 .电压极性检测电路

电压极性检测电路采用过零比较器检测负电压的方式实现的,运算放大器LM324的反向端接地,同向端通过100K电阻接输入信号。当输入的测量信号为负时比较器翻转,输出端经过电平转换成TTL信号后送给单片机PA7端口检测,通常情况下输出为高电平,为正电压状态。

2. 电压范围粗测电路

为了粗略地得到被测量的电压范围我们采用多组比较器的方式,通过阶梯式比较的方法确定输入电压的范围。其具体电路如下图(2.2.5)所示。

3. 量程切换电路

量程切换电路包括电压放大电路和无零漂小信号放大电路。

电压变换电路

电压变换电路由衰减电阻、切换继电器和运算放大器组成,对应的是衰减1/2、1/3、1/4和无零漂放大50倍,切换电路如图(2.2.7)所示。电压变换到0-5V标准信号后,再

由A/D转换进行采样,最后由单片机算法还原。

4.差分放大电路:对输入的电压进行去除同模干扰。

5.50hz陷波器:

电路设计,目的是滤去工频交流点,因为电表多由工频电源提供,在50HZ频率段电压干扰很大,所以要滤去。

陷波器的频谱分析图:绿色为幅频响应,红色为相位。

运放模块

1|2放大电路;

100倍放大器:

测试输出:输入10V:

输入5V

输入2V:

2V

输入800mv

800mv

输入80mv:

输入8mv:

单片机外围电路

2.

软件程序流程图

单片机控制系统软件流程如图所示。

三使用器件

单片机系统是以89C51单片机为核心;信号采集与量程转换电路是由0P一07和模拟开关CD4051所组成;积分比较与自动回零电路是由双积分型A/D转换器和过零比较器所组成;开关逻辑控制电路主要元件是模拟开关CD4051;显示采用了1602字符型液晶显示器:基准电压是由TL431稳压所得。采用双电源可以实现的数模隔离。

/*

作品 :

*/

#include

#include

#define addo (20.0/65535.0) #define uchar unsigned char #define uint unsigned int

unsigned long temp;

bit sys=0;

sbit RS = P1^0;

sbit RW = P1^1;

sbit E = P1^2;

sbit CS = P3^0;

sbit BYTE=P1^3;

sbit BUSY=P1^4;

sbit RC = P1^5;

sbit S1 =P1^6;

sbit S2 =P1^7;

unsigned char num1[8] = {0};

unsigned char num2[] = {"Voltage: "}; //-------------延时---------------- void delay(int ms)

{

int x,y;

for(x=ms;x>0;x--)

for(y=110;y>0;y--);

}

//-------------------------------

bit lcd_bz()

{

bit result;

RS = 0;

RW = 1;

E = 1;

_nop_();

_nop_();

_nop_();

_nop_();

result = (bit)(P2 & 0x80);

E= 0;

return result;

}

//-----------------写命令---------------- void lcd_wcmd(unsigned char cmd)

{

while(lcd_bz());//判断LCD是否忙碌

RS= 0;

RW = 0;

E = 0;

_nop_();

_nop_();

P2 = cmd;

_nop_();

_nop_();

相关文档
最新文档