电阻电容测量.docx

上传人:b****3 文档编号:26470116 上传时间:2023-06-19 格式:DOCX 页数:19 大小:147.08KB
下载 相关 举报
电阻电容测量.docx_第1页
第1页 / 共19页
电阻电容测量.docx_第2页
第2页 / 共19页
电阻电容测量.docx_第3页
第3页 / 共19页
电阻电容测量.docx_第4页
第4页 / 共19页
电阻电容测量.docx_第5页
第5页 / 共19页
点击查看更多>>
下载资源
资源描述

电阻电容测量.docx

《电阻电容测量.docx》由会员分享,可在线阅读,更多相关《电阻电容测量.docx(19页珍藏版)》请在冰豆网上搜索。

电阻电容测量.docx

电阻电容测量

 

1系统方案整体设计

1.1设计方案论证

1.2系统整体框图

2系统硬件设计

2.1多谐振荡器模块

2.3LCD显示模块

2.2单片机模块

2.4ADC0832转换模块

3系统软件设计

3.1主程序设计

3.2电容值计算程序设置

3.3电阻值计算程序设计

3.4显示程序

3.5程序整体设计图

4程序清单

5仿真结果

 

1系统方案整体设计

1电阻、电容设计方案比较

电阻、电容、电感测试仪的设计可用多种方案完成,例如利用模拟电路,电阻可用比例运算器法和积分运算器法,电容可用恒流法和比较法,电感可用时间常数发和同步分离法等、使用可编程逻辑控制器(PLC)、振荡电路与单片机结合或CPLD与EDA相结合等等来实现。

在设计前对各种方案进行了比较:

1)利用纯模拟电路

虽然避免了编程的麻烦,但电路复杂,所用器件较多,灵活性差,测量精度低,现在已较少使用。

2)可编程逻辑控制器(PLC)

应用广泛,它能够非常方便地集成到工业控制系统中。

其速度快,体积小,可靠性和精度都较好,在设计中可采用PLC对硬件进行控制,但是用PLC实现价格相对昂贵,因而成本过高。

3)采用CPLD或FPGA实现

应用目前广泛应用的VHDL硬件电路描述语言,实现电阻,电容,电感测试仪的设计,利用MAXPLUS

集成开发环境进行综合、仿真,并下载到CPLD或FPGA可编程逻辑器件中,完成系统的控制作用。

但相对而言规模大,结构复杂。

4)利用振荡电路与单片机结合

利用555多谐振荡电路将电阻,电容参数转化为频率,而电感则是根据电容三点式电路也转化为频率,这样就能够把模拟量近似的转换为数字量,而频率f是单片机很容易处理的数字量,一方面测量精度高,另一方面便于使仪表实现自动化,而且单片机构成的应用系统有较大的可靠性。

系统扩展、系统配置灵活。

容易构成各种规模的应用系统,且应用系统有较高的软、硬件利用系数。

单片机具有可编程性,硬件的功能描述可完全在软件上实现,而且设计时间短,成本低,可靠性高。

综上所述,利用振荡电路与单片机结合实现电阻、电容、电感测试仪更为简便可行,节约成本。

所以,本次设计选定以单片机为核心来进行。

1.1设计方案论证

对电阻的测量,可将待测电阻与一标准电阻串联后接在+5V的电源上,根据串联分压原理,利用ADC测定电阻两端电压后,即可得到其阻值。

对电容的测量,可将其与已知阻值的电阻RA和RB组成基于NE555的多谐振荡器如下图:

其产生的方波信号频率为:

f

故通过测定方波信号的频率可以比较精确的测定C的值,测

定方波信号频率的方法有测频法和测周法。

 

 

(1)测频法:

利用外部电平变化的外部中断,测算1s内

的波数,从而实现对波数的测定;

(2)测周期法:

通过测算某两次电平变化引发的中断之间的

时间,实现对频率的测定。

简而言之,测频法是直接根据定义测量频率,测周法是通

过测定周期间接测定频率,本方案采用测周法来测量。

 

1.2系统整体框图

→←←

←←←

图1系统整体框图

 

2系统硬件设计

2.1多谐振荡器模块

该模块由NE555构成多谐振荡器,其中R10取100欧姆,R8取197欧姆,C5为被测电容。

如下图所示:

图2多谐振荡器模块

NE555(TimerIC)为8脚时基集成电路,大约在1971年发布,在当时是唯一非常快速且商业化的TimerIC,在往后的30年中非常普遍被使用,且延伸出许多的应用电路,后来基于CMOS技术版本的TimerIC如MOTOROLA的MC1455已被大量的使用,但原规格的NE555依然正常的在市场上供应,尽管新版IC在功能上有部份的改善,但其脚位劲能并没变化,所以到目前都可直接的代用。

NE555是属于555系列的计时IC的其中的一种型号,555系列IC的接脚功能及运用都是相容的,只是型号不同的因其价格不同其稳定度、省电、可产生的振荡频率也不大相同;而555是一个用途很广且相当普遍的计时IC,只需少数的电阻和电容,便可产生数位电路所需的各种不同频率的脉波信号。

2.2单片机模块

单片机电路是本设计的核心部分,本设计选用了常用的AT89S52单片机。

AT89S52是低功耗、高性能、经济的8位CMOS微处理器,工作频率为0—24MHz,内置4K字节可编程只读闪存,128x8位的内部RAM,16位可编程I/O总线。

AT89S52工作的最简单的电路是其外围接一个晶振和一个复位电路,给单片机接上电源和地,单片机就可以工作了。

图3单片机模块

2.3LCD显示模块

显示模块由LCD1602组成,本设计使用的是2行16个字的1602液晶模块作为测量值显示部分。

其中字符型液晶模块是一种用5x7点阵图形来显示字符的液晶显示器,根据示的容量可以分为1行16个字、2行16个字、2行20个字等等。

图4LCD显示模块

2.4ADC0832转换模块

ADC0832是一个8位CMOS型逐次比较式A/D转换器,具有三态锁存输出功能,最短转换时间为100us,

图5ADC0832转换模块

3系统软件设计

3.1主程序设计:

配置单片机定时器0为计数模式,TH0,TL0初值均为0x00;外部中断0与多谐振荡器的脉冲输出端相连,NE555的参考电压引脚(4)与单片机IO口相连,系统上电后单片机给NE555参考电压引脚拉高,NE555开始震荡,同时外部中断接收多谐振荡器输出,当中断触发两次即表示计时一个周期,同时将多谐振荡器参考电压拉低,多谐振荡器停止震荡。

取出定时器0中的值即得到一个周期的时间,再计算电容,完成显示。

3.2电容值计算程序设置:

多谐振荡器震荡频率与电阻电容的关系为f=1.43/{C*(R1+2R2)},其中f的单位是赫兹,电阻单位是欧姆,电容单位是法拉。

单片机晶振为12M所以单片机机器周期为1us,计数器里面的值以us为单位。

为了统一单位我将所以单位以ms为标准,作用计数器值应乘以1000。

得到的电容值就是以uf为单位,而不再是法拉。

3.3电阻值计算程序设计:

将被测电阻与一标准电阻串联接在+5V上,根据串联分压原理,利用ADC0804测量被测电阻两端电压,经AD转换将模拟量转换成数字量,通过LCD1602显示出来。

转换公式为:

V

=

3.4显示程序:

计算得到的电容值,是一个浮点数对于整数部分采用求余数和求商的方法得到百位,十位和个位。

对于小数部分,因为浮点数不允许进行求余数操作,所以我将这个数强制转化为int形,再乘以10,再求余数得到十分位,同理乘以100得到百分位。

再将每一位数送入液晶显示。

3.5程序整体设计图

NONO

YSYS

YS

 

YS

4程序清单

#include

#include

#defineucharunsignedchar

#defineuintunsignedint

#defineLCD_DataP0

unsignedcharReadADC(void);

voiddelay1(unsignedcharx);

ucharJi_s=0,Ji_s1=0,Ji_s2=0,m4,js=0,T_flag;

floatR1=100,R2=197;//欧姆

ucharcodetable[]="THECAPIS:

";

ucharcodetable0[]="THERIS:

";

ucharcodetable1[]="uF";

sbitADC_CLK=P1^1;

sbitADC_DO=P1^3;

sbitADC_DI=P1^2;

sbitADC_CS=P1^0;

sbitlcden=P2^2;

sbitlcdrs=P2^0;

sbitlcdrw=P2^1;

sbit_reset=P1^4;

sbitstart=P2^7;

sbitp3_1=P3^1;

sbitp3_0=P3^0;

ucharget_ad();

ucharjishu=0;

uchartemp;

voiddelay(void)

{

uinty;

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

}

voidwrite_com(ucharcom)

{

lcdrs=0;

lcdrw=0;

P0=com;

delay();

lcden=1;

delay();

lcden=0;

}

voidwrite_data(uchardate)

{

lcdrs=1;

lcdrw=0;

P0=date;

delay();

lcden=1;

delay();

lcden=0;

}

voidinit()

{

ucharnum,num1;

lcden=0;

write_com(0x38);//显示模式设置

write_com(0x0e);//D=1开显示C=1显示光标

write_com(0x06);//N=1读或写一个字符后地址指针加一且光标加一

write_com(0x01);//清屏

write_com(0x80);//设置数据地址指针

for(num=0;num<11;num++)

{

write_data(table[num]);

delay();

}

write_com(0xc8);

for(num1=0;num1<2;num1++)

{

write_data(table1[num1]);

delay();

}

}

voidinitt()

{

ucharnum2;

lcden=0;

write_com(0x38);//显示模式设置

write_com(0x0e);//D=1开显示C=1显示光标

write_com(0x06);//N=1读或写一个字符后地址指针加一且光标加一

write_com(0x01);//清屏

write_com(0x80);//设置数据地址指针

for(num2=0;num2<9;num2++)

{

write_data(table0[num2]);

delay();

}

}

floatJi_sT()

{

ucharnT;

floatT,CAP;

nT=Ji_s;//计数个数减1得到周期数nT

T=nT;//单位换算单片机机器周期1US

CAP=1.43*1000*T/(R1+2*R2);//多谐振荡器震荡周期

returnCAP;

}

voidcount()

{

floatC;

floatC1,C2,C3;

ucharshi,ge,sf,bf;

C=Ji_sT();

C3=C/10;

shi=(int)C3%10;

write_com(0xc1);

write_data(0x30+shi);

ge=(int)C%10;

write_com(0xc2);

write_data(0x30+ge);

write_com(0xc3);

write_data(0x2e);

C1=C*10;

sf=(int)C1%10;

write_com(0xc4);

write_data(0x30+sf);

C2=C*100;

bf=(int)C2%10;

write_com(0xc5);

write_data(0x30+bf);

}

 

voidcount1()

{

floatdata1;

floatr;

uchara1,a2;

data1=ReadADC();;

r=data1/256*5*1.7*10;

a1=(int)r/10;

a2=(int)r%10;

write_com(0xc1);

write_data(0x30+a1);

write_com(0xc2);

write_data('.');

write_com(0xc3);

write_data(0x30+a2);

write_com(0xc4);

write_data('K');

write_com(0xc5);

write_data(0xf4);

}

unsignedcharReadADC(void)

{

unsignedchari,ch;

ADC_CS=0;//片选,DO为高阻态

ADC_CLK=0;

delay1

(2);

ADC_DI=1;

ADC_CLK=1;//第一个脉冲,起始位

delay1

(2);

ADC_CLK=0;

delay1

(2);

ADC_DI=1;

ADC_CLK=1;//第二个脉冲,DI=1表示双通道单极性输入

delay1

(2);

ADC_CLK=0;

delay1

(2);

ADC_DI=0;

ADC_CLK=1;//第三个脉冲,DI=1表示选择通道1(CH2),DI=0表示选择通道0(CH1),

delay1

(2);

ADC_CLK=1;

delay1

(2);

ADC_CLK=0;//第一个下降沿为去数做准备

delay1

(2);//这里加一个脉冲才能读出正确的数据,不加的话读出的数据少一位,且是错的

for(i=0;i<8;i++)//读出数据

{

ADC_CLK=1;

delay1

(2);

ADC_CLK=0;

delay1

(2);

ch=(ch<<1)|ADC_DO;//在每个脉冲的下降沿DO输出一位数据,最终ch为8为数据

}

ADC_CS=1;//取消片选,一个转换周期结束

return(ch);//把转换结果返回

}

 

voidmain()

{if(p3_1==0)

{

init();

TMOD=0x01;//定时器0工作在计时模式

TH0=0x00;

TL0=0x00;

ET0=1;

TR0=0;

EX0=1;

EA=1;

while

(1)

count();

}

if(p3_0==0)

{ReadADC();

initt();

count1();

 

}

}

voidint0(void)interrupt0//第一次中断开始计数,第二个中断停止计数

{

T_flag=!

T_flag;

if(T_flag==1)

{

_reset=1;

TR0=1;//开始计时

}

if(T_flag==0)

{TR0=0;//停止计时

EX0=0;//关闭中断

_reset=0;//停止发出方波

Ji_s=TH0*256+TL0;//计算计数器的值

TH0=0x00;//恢复初值

TL0=0x00;

}

}

////////////////////////////////////////////////////////////////////////

voiddelay1(unsignedcharx)

{

unsignedchari;

for(i=0;i

}

5仿真电路

 

 

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 法律文书 > 调解书

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1