基于AD7705与51单片机的数字电压表.docx
- 文档编号:29384522
- 上传时间:2023-07-22
- 格式:DOCX
- 页数:24
- 大小:488.14KB
基于AD7705与51单片机的数字电压表.docx
《基于AD7705与51单片机的数字电压表.docx》由会员分享,可在线阅读,更多相关《基于AD7705与51单片机的数字电压表.docx(24页珍藏版)》请在冰豆网上搜索。
基于AD7705与51单片机的数字电压表
大连海事大学信息科学技术学院
2012年专业技能大赛
基于51单片机的数字万用表
论文
队名:
风中旗舰
队长:
石镇嘉11级电信2班
队员:
吴俊峰11级通信1班
队员:
耿钰11级通信3班
2012年6月2日
一、摘要及关键词…………………………………………………1
二、总设计流程图…………………………………………………2
三、方案比较………………………………………………………3
四、各单元设计原理
4.1供电电压的选取……………………………………………3
4.2AD7705采集与转换(测量直流电压)……………………4
4.3单片机内部数据处理………………………………………5
4.41602液晶显示器……………………………………………5
五、扩展部分
5.1AD7705采集与转换(测量电流)…………………………7
5.2AD7705采集与转换(测量电阻)…………………………8
5.3短路检测…………………………………………………9
六、系统调试流程…………………………………………………10
七、总结
7.1元件清单及其特性………………………………………10
7.2设计总结…………………………………………………11
7.3比赛心得…………………………………………………11
八、PCB板及原理图………………………………………………12
附录:
详细程序…………………………………………………12
参考文献…………………………………………………………20
一、摘要及关键词
摘要:
在比赛中我们通过A/D芯片(AD7705)对外部电压值进行采集,经转换后传输给单片机(89C52),使用液晶(1602)输出测量得到的电压值。
该实验板可以测量不同增益下对应范围的电压值,并使部分量程下精确度理论上达到8增益。
对于-20~20V,增益值为1。
在拓展中,我们根据闭合电路欧姆定律,改进程序及实验板,使之能够测量电流、电阻,同时能对短路状态做出检测。
关键词:
A/D7705
双极性多量程电压测量
多量程电流电阻测量
短路检测
二、总设计流程图
三、方案比较
本次比赛基础要求设计量程为0-5V,精确度至少为0.02V的电压表。
根据精确度计算公式:
精确度=量程/2^n(n为ADC的位数),结合扩展的25V,做出以下方案比较:
方案一:
使用STC12C51进行模数转换,但由于其内置ADC精度不够(8位),勉强能够满足基础要求,但无法达到扩展要求。
故舍弃此方案。
方案二:
ADC选用AD7705,单片机采用89C52,使用AD780提供基准电压。
16位AD处理25V时精度为0.0004。
同时使用继电器完成自动量程转换,但由于电路的复杂程度和比赛时间,最终我们没有做此扩展。
方案三:
ADC选用AD7705,单片机采用89C52,使用AD780提供基准电压。
充分利用89c52的丰富I/O口及AD7705的高精度、双极性特性将作品设计成拥有五档电压测量、五档电流测量、七档电流测量及短路检测的多用表。
最终我们组决定使用方案三完成比赛。
四、各单元设计原理
1、供电电压选取
由于实验要求使用A/D测量0~5V电压,使用DCPowerSupply提供外部供电电压,或以USB接口给系统上电,经过AD780芯片,对A/D输入适合工作的基准电压,为AD7705、单片机提供稳定的2.5V工作电压。
2、AD7705对模拟量的采集及转换(测量电压)
(1)AD7705为16位双极性模数转换器,它包括一个Σ-Δ(或电荷平衡)ADC、片内带静态RAM的校准微控制器、时钟振荡器、数字滤波器和一个双向串行通信端口。
该器件的电源电流仅为320μA,使得它理想地用于电池供电的仪器中。
器件具有两种可选电源电压范围分别是2.7~3.3V或4.75~5.25V。
它具有高精度校准、测量的能力,适应电压表的精度要求。
(2)设计实验板共有5个量程,分别为:
-200mV~200mV对应增益值为8
-2~2V对应增益值为1
-20~20V对应增益值为1
-200~200V对应增益值为1
-500~500V对应增益值为1
(3)实验通过开关使不同阻值分压电阻接入电路来改变电压表量程。
开关抬起有效。
如图连接A/D与单片机,对A/D进行初始化,设置为双极性、无缓冲、增益为1、滤波器不工作、自校准、更新速率为20Hz的状态。
通过编译的读、写程序,完成A/D对外部模拟量的采集和处理,并将数据传送给单片机。
3、单片机数据处理(直流电压)
(1)本作品设计有五个电压档位。
在程序中我们通过设置switch语句实现对不同档位的选取和控制,AD转换后的数据被传输至单片机中对应档位的数据处理函数,单片机根据相应档位的参数设置将数据处理还原为真实电压值,并转换为可被液晶读取的2进制形式。
(2)测量直流电压的公式为:
电压真值=数据V/增益值*对应的档位参数
4、1602液晶显示器
(1)对1602进行初始化,设置相关功能。
1602液晶初始化程序:
显示器模块原理图:
(2)关于显示正负号及小数点,本次显示000.00000精度
(3)关于数据处理之后的输出,将经过单片机处理得到的数据V发送至1602液晶,通过display函数(部分程序如下),实现液晶对数据的显示。
同时设计保护数据,当测得数据大于档位上限时,系统输出档位上限值。
voiddisplay()(部分程序)
{chardisp[9]="12345678";
disp[0]=(v/10000000)+0x30;
v%=10000000;disp[1]=(v/1000000)+0x30;
v%=1000000;disp[2]=(v/100000)+0x30;
v%=100000;disp[3]=(v/10000)+0x30;
v%=10000;disp[4]=(v/1000)+0x30;
v%=1000;disp[5]=(v/100)+0x30;
v%=100;disp[6]=(v/10)+0x30;
v%=10;disp[7]=(v/1)+0x30;
……
五、扩展部分
1、电流测量
利用闭合电路欧姆定律,在测电压的基础上可以实现对电流的测量。
实验中共有五个档位,分别为:
-2~2mA对应增益值为8
-20~20mA对应增益值为8
-200~200mA对应增益值为8
-2~2A对应增益值为8
-15~15A对应增益值为1
对于电流数据的处理,将AD采集到的数据v输入单片机后,根据计算公式对v进行处理,以第一档程序举例:
其中对数据处理的公式为:
电流真值=数据/增益值*对应的档位参数
2、电阻测量
(1)本次比赛的电阻测量在说明中并没有,我们组为了充分利用AD7705资源、锻炼组员的能力,额外做了电阻测量和短路检测的拓展。
(2)电阻测量的原理为:
根据闭合电路欧姆定律R=U/I,由于前两步已完成对电压与电流的测量,所以此处只需要在数据处理时,使用某档位电压/对应档位流过待测电阻的电流值即可。
(3)电阻测量的档位及对应增益值
0~20Ω对应增益值为2
0~200Ω对应增益值为2
0~2kΩ对应增益值为2
0~20kΩ对应增益值为2
0~200kΩ对应增益值为2
0~2MΩ对应增益值为2
0~100MΩ对应增益值为1
(4)电阻测量的数据处理(20Ω档为例)
电阻测量的数据处理公式为:
U/Rx=2.5/(Rx+Ro)
Ro:
相应电阻档的已知串联电阻
3、短路检测
在P2.5连接蜂鸣器系统,当表笔两端电阻小于15Ω时,P2.5赋低电平,蜂鸣器工作。
六、系统调试流程
1、给开发系统上电,调节液晶对比度,检测电路各处有无短路、断路、或元件工作状态不正常的情况。
2、依次按下所有开关,检查各档位跳转情况。
3、进入电压档,依次从大量程检测至小量程,计算理论与实际的偏差,通过对程序的控制和对硬件的修改。
使误差保持在0.1%以下。
4、按照步骤3的方法测量电流、电阻,记录数据,检测精确度。
5、进入20Ω档,接通短路检测端口,将正负表笔短接,检测蜂鸣器发声是否正常。
6、多次测量各物理量,检测实验板稳定性。
最后将实验板断电,做好实验记录。
七、总结
1、元件清单及其特性
表7-1:
元件清单
元件名称
规格型号
单位
数量
ADC
AD7705
片
1
瓷片电容
33pF
只
1
瓷片电容
0.1uF
只
1
电解电容
1uF
只
1
电解电容
10uF
只
1
电阻
5M
只
2
电阻
1M
只
2
单片机
STC89C52
片
1
基准电压芯片
AD780
片
1
无源晶振
2.4576M
只
1
液晶
1602
块
1
自锁开关
个
20
表7-2:
STC89C52主要功能特性
兼容MCS51指令系统
8K可反复擦写FlashROM
32个双向I/O口
256x8bit内部RAM
3个16位可编程定时/计数器中断
时钟频率0-24MHz
2个串行中断
可编程UART串行通道
2个外部中断源
共6个中断源
2个读写中断口线
3级加密位
2、设计总结
本次比赛,我们组使用AD7705模数转换器,完成了对直流电压、电阻,电流,短路检测等量的测量,分别有5个、7个、5个档位。
1602液晶上行显示档位,下行显示实时数据。
实验功能基本实现,精确度达到要求范围。
3、比赛心得
本次比赛是我们进入大学以来参加的第一次电子设计大赛,从一开始对此的一无所知,对各种知识的渴求,一点点学习我们需要的知识,在网上搜寻资料寻找最合适的AD芯片,对AD的学习,编写程序,焊制电路板,调试系统,改进和更新……每一步都是不容易的。
在这个过程中,我们不仅收获了知识,还有与学长的交流,与队员之间的默契,调试成功的喜悦。
回想这次比赛,需要改进的有几点:
(1)在调试过程中对元器件的损耗,由于错误的使用外部电压导致元件烧坏的事情应注意避免;
(2)在写程序的过程中,对已有材料的借鉴,开始并没有很好的和我们自己的实验结合上,耽误了一些时间;
(3)硬件处理方面,由于电路的复杂,开始用手焊的孔板测试,在电路连接上出现较多失误,导致调试失败。
以后要认真连好每一条线、每一元件。
八、PCB板及原理图
附录:
部分程序
/*****************************************************
文件名称:
ad7705.c
功能:
数字万用表
说明:
电压五档、电流五档、电阻七档
设计者:
石镇嘉、吴俊峰、耿钰
***************************************************/
#include
#include
#defineuintunsignedint
#defineucharunsignedchar
sbitADC_CLK=P1^7;
sbitADC_DIN=P3^0;
sbitADC_DOUT=P3^0;
sbitADC_DRDY=P3^1;
sbitlcden=P3^2;
sbitlcdrs=P3^3;
sbitU=P2^7;
sbitI=P3^5;
sbitR=P1^5;
/*电压档*/
sbita=P1^4;
……
/*电流档*/
sbitf=P2^0;
……
/*电阻档*/
sbitk=P1^0;
……
/*短路口*/
sbitDUANLU=P2^5;
/********************函数声明***********************************/
Voiddelayms(uintxms);
uintchoose();
voidreadad_16deal_choose();
voidInitADC(void);50
……
voiddisplay();
voiddisplay0();
……
charcodetable0[]="welcome!
";//欢迎界面
charcodetable11[]="DC-200mV~200mV";//档符显示
……
charcodetable35[]="0~200k";100
charcodetable36[]="0~2M";
charcodetable37[]="0~100M";
/******************************************************/
voidmain()
{
DUANLU=1;
InitLCD();
while
(1)
{
InitADC();
readad_16deal0();
readad_16deal_choose();
display();
}
}
uintchoose()
{U=0;a=0;b=0;c=0;d=0;e=0;
I=1;f=0;g=0;h=0;i=0;j=0;
R=0;k=0;l=0;m=0;n=0;o=0;p=0;q=0;
if(U)
{
if(a)ch=11;
elseif(b)ch=12;
elseif(c)ch=13;
elseif(d)ch=14;
elseif(e)ch=15;
}
elseif(~I)
……
returnch;
}
voidreadad_16deal_choose()//各档处理函数选择
{switch(choose())
{
case11:
readad_16deal11();break;//电压
……
case21:
readad_16deal21();break;//电流
……
case31:
readad_16deal31();break;//电阻
……
}
}
voiddelayms(uintxms)
{
uinti,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
voidInitADC(void)
{
ucharz;
ADC_CLK=1;
ADC_DIN=1;
for(z=0;z<40;z++)
{
ADC_CLK=0;
ADC_CLK=1;
}//防止接口迷失,通信寄存器返回到等待写状态
WriteToReg_ADC(0x20);//通道1,下一个写时钟寄存器
WriteToReg_ADC(0x00);//写时钟寄存器设置更新速率为20Hz0x03:
200Hz
WriteToReg_ADC(0x10);//通道1,下一个写设置寄存器
//WriteToReg_ADC(0x40);//写设置寄存器,设置成双极性、无缓冲、增益为1、滤波器不工作、自校准
switch(choose())
{case0:
display0();break;
case11:
WriteToReg_ADC(0x58);break;//增益8以下全为双极性
……
case37:
WriteToReg_ADC(0x40);break;//增益1
}
delayms(50);
}
voidInitLCD(void)
{
lcden=0;
write_com(0x38);//设置16*2显示,5*7点阵,8位数据接口
write_com(0x0c);//开显示,不显示光标
write_com(0x06);//写一个字符后地址指针加1
write_com(0x01);//显示清零,数据指针清零
}
voidwrite_com(ucharcom)
{
lcdrs=0;
P0=com;
delayms(5);
lcden=1;
delayms(5);
lcden=0;
}
voidwrite_data(uchardate)
{
lcdrs=1;
P0=date;
delayms(5);
lcden=1;
delayms(5);
lcden=0;
}
/*********写ad转换寄存器**********/
uintWriteToReg_ADC(uintbyteword)
{
uintToken,z;
uintAD16bit_WriteToReg;
ADC_CLK=1;
Token=0x80;
AD16bit_WriteToReg=byteword;
for(z=0;z<8;z++)
{
if(AD16bit_WriteToReg&Token)
ADC_DIN=1;//输入数据位
else
ADC_DIN=0;
delayms
(1);
ADC_CLK=1;
delayms
(1);
ADC_CLK=0;
ADC_CLK=1;
Token=Token>>1;
}
ADC_CLK=1;
ADC_DIN=1;//结束
return(TRUE);
}
/******************读16位AD数值******************/
uintReadADC_16BitValue()
{
uintz;
unsignedlongAD16bit;
//uintAD16bit;
WriteToReg_ADC(0x38);
while(ADC_DRDY);//等待数据准备
{//delayms(5);
ADC_CLK=1;
AD16bit=0x0000;
for(z=0;z<16;z++)
{
AD16bit=AD16bit<<1;
ADC_CLK=0;
delayms
(1);
if(ADC_DOUT==1)AD16bit=AD16bit|0x0001;
ADC_CLK=1;
}
}
ADC_CLK=1;
ADC_DIN=1;
return(AD16bit);
}
voidreadad_16deal0()
{
charcount=0;
readad_16bit=ReadADC_16BitValue();
if((readad_16bit>0x8000)&(readad_16bit<0x8000))
AC=1;
if(readad_16bit>0x8000)DATA=readad_16bit-0x8000;
if(readad_16bit<0x8000)DATA=0x8000-readad_16bit;
DATAF=DATA;
}
/****电压-200~200mV为例*************/
voidreadad_16deal11()//200m300
{DATAF2=DATAF/32767*31250000;
v0=DATAF2;
v=v0;
if(v>20000000)v=20000000;
for(count=0;count<14;count++)
{
write_com(0x80+count);
write_data(table11[count]);
}
}
/*******电流-2~2mA为例*********************/
voidreadad_16deal21()//2mA
{DATAF2=DATAF/32767*2500000000/8/106;
v0=DATAF2;
v=v0;
if(v>200000)v=200000;
for(count=0;count<14;count++)
{
write_com(0x80+count);
write_data(table21[count]);
}
}
/*******电阻20Ω为例********************/
voidreadad_16deal31()//20Ω
{DATAF2=(DATAF/32767*125000)*2040/(250-(DATAF/32767*125));
v0=DATAF2;
v=v0;
if(v>2000000)v=2000000;
//if(DATAF<30000)D=1;
//elseD=0;
for(count=0;count<13;count++)
{
write_com(0x80+count);
write_data(table31[count]);
}
write_com(0x80+13);
write_data(0xf4);
}
voiddisplay()//档符显示前移到各档处理函数中
{//本函数可共用
chardisp[9]="12345678";
disp[0]=(v/10000000)+0x30;//0对应的十进制ASCII码48换为十六进制即为0x30
v%=10000000;
disp[1]=(v/1000000)+0x30;
v%=1000000;
disp[2]=(v/100000)+0x30;
v%=100000;
disp[3]=(v/10000)+0x30;
v%=10000;
disp[4]=(v/1000)+0x30;
v%=1000;
disp[5]=(v/100)+0x30;
v%=100;
disp[6]=(v/10)+0x30;
v%=10;
disp[7]=(v/1)+0x30;
if(readad_16bit<0x8000)550
{
write_com(0x80+0x41);
write_data('-');
}
if(readad_16bit>0x8000)
{
write_com(0x80+0x41);
write_data('+');
};
for(count=0;count<3;count++)
{
write_com(0x80+0x42+count);
write_data(disp[count]);
}
write_com(0x80+0x42+3);
write_data('.'
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 AD7705 51 单片机 数字 电压表