电阻电容测量.docx
《电阻电容测量.docx》由会员分享,可在线阅读,更多相关《电阻电容测量.docx(19页珍藏版)》请在冰豆网上搜索。
电阻电容测量
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仿真电路