数字电流表设计
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一、原理及方案论证
1、数字电流表工作原理
1.1采样电阻网络
原理如下图所示,输入被测电流通过量程转换开关S1——S4,流经采样电阻R1——R4,由欧姆定律可知:U=I*R ,因而转换输出电压为0V ——0.1V 的电压,输出电压可再经后续放大电路放大处理。
1.2高共模抑制比放大电路
如下图,由双运放组成的同相输入高共模抑制比放大电路,其闭环输出可表示为:
为
使
共模输入为0,可令R1/R2=R4/R3,此时电路的差动闭环增益为Kd=1+R1/R2, U0=Kd(U1-U2); 下图即Kd=11,U0=11(U1-U2);
)21)(3
*14*22121(21)221(*)3*14*21(0U U R R R R R R U U R R R R U -++++-=
1.3通用A/D转换器
ADC0832 是美国国家半导体公司生产的一种 8 位分辨率、双通道 A/D 转换芯片。由于它体积小,兼容性强,性价比高而深受单片机爱好者及企业欢迎,其目前已经有很高的普及率。
ADC0832 具有以下特点:
◆ 8 位分辨率;
◆双通道 A/D转换;
◆输入输出电平与 TTL/CMOS 相兼容;
◆ 5V 电源供电时输入电压在 0~5V 之间;
◆工作频率为 250KHZ,转换时间为 32μS;
◆一般功耗仅为 15mW;
◆ 8P、14P—DIP(双列直插)、PICC 多种封装;
◆商用级芯片温宽为0°C to +70°C,工业级芯片温宽为- 40°C to +85°
C;
芯片接口说明
CS_ 片选使能,低电平芯片使能。
CH0 模拟输入通道 0,或作为 IN+/-使用。
CH1 模拟输入通道 1,或作为 IN+/-使用。
GND 芯片参考 0 电位(地)。
DI 数据信号输入,选择通道控制。
DO 数据信号输出,转换数据输出。
CLK 芯片时钟输入。
Vcc/REF 电源输入及参考电压输入(复用)。
1.4 AT89C52单片机
AT89C52 是美国ATMEL 公司生产的低电压,高性能CMOS 8 位单片机,片内含8k bytes 的可反复擦写的只读程序存储器(PEROM)和256 bytes 的随机存取数据存储器(RAM ),器件采用ATMEL 公司的高密度、非易失性存储技术生产,与标准MCS-51 指令系统及8052 产品引脚兼容,片内置通用
8 位央处理器(CPU)和Flash 存储单元,功能强大AT89C52 单片机适合于
许多较为复杂控制应用场合。
主要性能参数
·与MCS-51 产品指令和引脚完全兼容
·8k 字节可擦写Flash 闪速存储器
·1000 次擦写周期
·全静态操作:0Hz-24MHz
·三级加密程序存储器
·256 ×8 字节内部RAM
·32 个可编程I /O 口线
·3 个16 位定时/计数器
·8 个断源
·可编程串行UART 通道
·低功耗空闲和掉电模式
功能特性概述
AT89C52 提供以下标准功能:8k 字节Flash 闪速存储器,256 字节内部RAM,32 个I /O 口线,3 个16位定时/计数器,一个6 向量两级断结构,一个全双工串行通信口,片内振荡器及时钟电路。同时,AT89C52 可降至0Hz 的静态逻辑操作,并支持两种软件可选的节电工作模式。空闲方式停止CPU 的工作,但允许RAM,定时/计数器,串行通信口及中断系统继续工作。掉电方式保存RAM 中的内容,但振荡器停止工作并禁止其它所有部件工作直到下一个硬件复位。
2、方案论证
本设计采用精密采样电阻(9欧、0.9欧、0.09欧、0.01欧),电阻精度可达0.1%可忽略;八位A/D精度为5/256(V);因而除去放大电路增益误差及线性误差,电流表精度约为(5/256)/11,约为1.7mA;对于1000mA的总量程精度可达0.1%,因而方案可达设计要求。
二、系统硬件电路的设计
系统仿真接线简图
本设计中用到AT89C52单片机、八位ADC AD0832、发光二极管、六位八段显示数码管LED,通用运放 UA741 、PNP管及必要的电阻、电容元件等。系统原
理方框图电路仿真简图如上图。
系统方框图
三、系统程序设计
程序流程图如下:
系统程序流程图
C语言程序如下:
#include
#include"segment.h"
#define ADC0809BASE 0x4000
//ADC转换通路地址定义
/**********************************/
xdata unsigned char ADCIN0 _at_ (ADC0809BASE+0);
xdata unsigned char ADCIN1 _at_ (ADC0809BASE+1);
xdata unsigned char ADCIN2 _at_ (ADC0809BASE+2);
xdata unsigned char ADCIN3 _at_ (ADC0809BASE+3);
xdata unsigned char ADCIN4 _at_ (ADC0809BASE+4);
xdata unsigned char ADCIN5 _at_ (ADC0809BASE+5);
xdata unsigned char ADCIN6 _at_ (ADC0809BASE+6);
xdata unsigned char ADCIN7 _at_ (ADC0809BASE+7);
/************************************
启动ADC转换,并等待完成后返回转换结果
************************************/
unsigned char ADC0809_Convert(void)
{
while(!(P3&&0x04));//读取INT0的状态,等待上次转换结束,低电平表示正在转换
ADCIN0 = 0;
//ADCIN1 = 0;
while(!(P3&&0x04));//读取INT0的状态,为0则循环等待
return (ADCIN0);
//return (ADCIN1);
}
unsigned char t;
/************************************************
************************************************/
main()
{
while(1)
{
t=ADC0809_Convert();//测出AD值
dianya=t*3.921;//计算电压值1000/255