测电阻.docx
《测电阻.docx》由会员分享,可在线阅读,更多相关《测电阻.docx(15页珍藏版)》请在冰豆网上搜索。
测电阻
简易电阻、电容、电感测试仪
方案的选择
目前,测量电子元件集中参数R、L、C的仪表种类较多,方法也各不相同,这些方法都有其优缺点。
电阻R的测试方法最多。
最基本的就是根据R的定义式来测量。
在如图1中,分别用电流表和电压表测出通过电阻的电流和通过电阻的电压,根据公式
求得电阻。
这种方法要测出两个模拟量,不易实现自动化。
而指针式万用表欧姆档是把被测电阻与电流一一对应,由此就可以读出被测电阻的阻值,如图2所示。
这种测量方法的精度变化大,若需要较高的精度,必须要较多的量程,电路复杂。
图2
图3
图1
能同时测量电器元件R、L、C的最典型的方法是电桥法(如图3)。
电阻R可用直流电桥测量,电感L、电容C可用交流电桥测量。
电桥的平衡条件为
通过调节阻抗
、
使电桥平衡,这时电表读数为零。
根据平衡条件以及一些已知的电路参数就可以求出被测参数。
用这种测量方法,参数的值还可以通过联立方程求解,调节电阻值一般只能手动,电桥的平衡判别亦难用简单电路实现。
这样,电桥法不易实现自动测量。
Q表是用谐振法来测量L、C值(如图4)。
它可以在工作频率上进行测量,使测量的条件更接近使用情况。
但是,这种测量方法要求频率连续可调,直至谐振。
因此它对振荡器的要求较高,另外,和电桥法一样,调节和平衡判别很难实现智能化。
图4
用阻抗法测R、L、C有两种实现方法:
用恒流源供电,然后测元件电压;用恒压源供电,然后测元件电流。
由于很难实现理想的恒流源和恒压源,所以它们适用的测量范围很窄。
很多仪表都是把较难测量的物理量转变成精度较高且较容易测量的物理量。
基于此思想,我们把电子元件的集中参数R、L、C转换成频率信号f,然后用单片机计数后在运算求出R、L、C的值,并送显示,转换的原理分别是RC振荡和LC三点式振荡。
其实,这种转换就是把模拟量进拟地转化为数字量,频率f是单片机很容易处理的数字量,这种数字化处理一方面便于使仪表实现智能化,另一方面也避免了由指针读数引起的误差。
器件的选择
电阻(20K、510K、100K、2K、1K、470、10K)、电容(1000pF、0.1uF、22uF、30pF)、独石电容(2200pF、1000pF)、三级管(9013)、小按钮、发光二极管、四位共阴LED显示器、555芯片、74LS197、CD4052、89S51、
电路原理图
设计方案的总体方框图
具体的工作电路图
六、电路的工作原理
测量电阻的电路模块
555电路构成的多谐振荡电路,由该电路可以测出量程在100Ω~1MΩ的电阻。
该电路的振荡周期为
其中
为输出高电平的时间,
为输出低电平的时间。
则:
为了使振荡频率保持在10~100KHz这一段单片机计数的高精度范围内,需选择合适的C和R的值。
取
,得到
测
的RC振荡电路
测量电容的振荡电路与测量电阻的振荡电路完全一样。
取R1=R2=510K,则
,其分析过程如测量电阻的方法一样。
测
的电容三点式振荡电路
电感的测量是采用电容三点式振荡电路来实现的,如图所示。
三点式电路是指:
LC回路中与发射极相连的两个电抗元件必须是同性质的,另外一个电抗元件必须为异性质的,而与发射极相连的两个电抗元件同为电容时的三点式电路,成为电容三点式电路。
在这个电容三点式振荡电路中,C4C5分别采用1000pF、2200pF的独石电容,其电容值远大于晶体管极间电容,可以把极间电容忽略。
振荡公式:
,其中
则电感的感抗为
在测量电感的时候,发现电感起振频率非常的高,大致到达3MHz左右,而单片机的最大计数频率大约为500KHz,在频率方面达不到测量电感频率,于是我们把测电感的电容三点式电路得出的频率经过74LS197对该频率进行二分频满足单片机计数要求。
多路选择开关电路
利用CD4052实现测量类别的转换,CD4052是双4选一的模拟开关选择器件。
当选择了某一通道的频率后,输出频率通过通过IOB4作为CPU定时器的时钟源并开始计数,当计数到3秒后读出计数器的值,除以3就得到了被测R/C/L所对应产生的频率,通过计算得到要被测值。
IOA4
IOA3
测量类别
0
0
Y0-R
0
1
Y1-C
1
0
Y2-L
1
1
*
总体的工作原理:
测量R、C时用555构成的多谐振荡电路来实现转换成频率信号
、
,测量L时用电容三点式振荡电路来实现转换成频率
,由于输出的频率过大,超过了单片机频率计数的最大范围,因此通过接74LS197(
直接接CR0,用Q1直接输出),实现对频率的二分频。
三个频率都接到模拟开关CD4052。
单片机根据所选通道,向模拟开关送两路地址信号,取得振荡频率,作为单片机的时钟源,通过计数则可以计算出被测频率,再通过该频率计算出各个参数。
数据处理后,把R、L、C的值送数码管显示相应的参数值。
当要测量电阻、电容、电感的时候按下对应的按钮并使其对应发光二极管亮。
实验扩展
测量电阻、电容的时候可以用两个量程来实现测量,这样的话可以提高测量精度,再用继电器来实现对量程的选择。
也还可以把测量电阻、电容、电感的测量端接到一个继电器上,这样的话就只需一个测量端,然后通过程序来实现电路的选择。
程序:
#include
sbitled_R=P1^0;
sbitled_C=P1^1;
sbitled_L=P1^2;
sbitbutton_r=P1^3;
sbitbutton_c=P1^4;
sbitbutton_l=P1^5;
sbitled_a=P0^3;
sbitled_b=P0^5;
sbitled_c=P0^6;
sbitled_d=P0^7;
sbitad_l=P1^6;
sbitad_h=P1^7;
sbitfff=P3^0;
bitT_flag=0;//时间到标志位
unsignedchart0h,t0l;
unsignedcharled_buf_a=0,led_buf_b=0,led_buf_c=0,led_buf_d=0;
unsignedintfunc=1,counter=4000,N,N_T0;
unsignedcharled_code[]={0x3f,0x06,0x5b,0x4f,0x72,0x6d,0x7d,0x07,0x7f,0x6f,0x00};//共阴数码管段码
//0123456789全暗
unsignedlongR,C,L,f,result;
//函数声明
voidbutton(void);
voidR_measure(void);
voidC_measure(void);
voidL_measure(void);
voidled(unsignedintx);
voiddisplay(void);
//voiddelay1(void);
voiddelay2(void);
voidinitialization(void)
{
//T0初始化设置
TMOD=0x25;//00100101T1,定时器模式2T0,方式1,计数器模式
IE=0x8a;//10001010开总中断和T1溢出中断
TH1=0x06;//晶振使用12M时,每条指令1uS,T11S溢出250uS*4000=1S
TL1=0x06;
TH0=0;
TL0=0;
TCON=0x55;//01010101T0,允许计数,下降沿触发T1,边沿触发方式
led_C=0;
led_L=0;
led_R=1;
}
voidbutton(void)
{
button_r=1;
if(button_r==0)
{
//delay1();//防抖动
if(button_r==0)
{
while(button_r==0);
func=1;//功能1:
测电阻
led_C=0;
led_L=0;
led_R=1;
ad_h=0;
ad_l=0;
}
}
button_c=1;
if(button_c==0)
{
//delay1();
if(button_c==0)
{
while(button_c==0);
func=2;//功能2:
测电容
led_R=0;
led_L=0;
led_C=1;
ad_h=0;
ad_l=1;
}
}
button_l=1;
if(button_l==0)
{
//delay1();
if(button_l==0)
{
while(button_l==0);
func=3;//功能3:
测电感
led_R=0;
led_C=0;
led_L=1;
ad_h=1;
ad_l=0;
}
}
}
voidR_measure(void)//电阻测量,以Ω为单位
{
while(T_flag==0);
if(T_flag==1)
{
T_flag=0;
f=N*65536+t0h*256+t0l;//Hz
}
//电阻计算公式
R=721500000/f-10000;
led(R);
display();
}
voidC_measure(void)//电容测量,以pF为单位
{
while(T_flag==0);
if(T_flag==1)
{
T_flag=0;
f=N*65536+t0h*256+t0l;//Hz
}
//电容计算公式
C=942938/f;//pf
led(C);
display();
}
voidL_measure(void)//电感测量,以uH为单位
{
while(T_flag==0);
if(T_flag==1)
{
T_flag=0;
f=N*65536+t0h*256+t0l;//Hz
}
//电感计算公式
f/=100000;
L=922/(f*f);//L=922*10^10/(f*f)uH
led(L);
display();
}
voidled(unsignedintx)//BCD代码转换
{
charexp;
if(x>=0&x<1000)
{
exp=0;
}
if(x>=1000&x<10000)
{
exp=1;
x/=10;
}
if(x>=10000&x<100000)
{
exp=2;
x/=100;
}
led_buf_a=led_code[x/100];
led_buf_b=led_code[x%100/10];
led_buf_c=led_code[x%10];
led_buf_d=led_code[exp];
}
//动态显示程序,要显示的四个BCD码存在led_buf_a~led_buf_d中
voiddisplay(void)
{
inti;
P0=0x00;
for(i=500;i>0;i--)
{
P2=led_buf_a;
led_a=1;
delay2();
led_a=0;
P2=led_buf_b;
led_b=1;
delay2();
led_b=0;
P2=led_buf_c;
led_c=1;
delay2();
led_c=0;
P2=led_buf_d;
led_d=1;
delay2();
led_d=0;
}
}
/*
voiddelay1(void)
{
inti;
for(i=80;i>0;i--);
}
*/
voiddelay2(void)
{
intj;
for(j=100;j>0;j--);
}
voidmain(void)
{
P2=0;
initialization();
while
(1)
{
button();
if(func==1)
{
R_measure();
}
if(func==2)
{
C_measure();
}
if(func==3)
{
L_measure();
}
}
}
//T0中断程序
voidtimer0(void)interrupt1
{
TF0=0;
N_T0++;
}
//T1中断程序
voidtimer1(void)interrupt3
{
TF1=0;
counter--;
if(counter==0)
{
N=N_T0;
N_T0=0;
t0h=TH0;
t0l=TL0;
TH0=0;
TL0=0;
T_flag=1;
counter=4000;
}
}