原文:https://circuitdigest.com/microcontroller-projects/arduino-lc-meter-measure-inductance
使用Arduino的LC电表:测量电感和频率
经过**萨达姆** 2018年9月5日
使用Arduino的LC表:测量电感和频率
所有嵌入式爱好者都熟悉万用表,它是测量电压,电流,电阻等的绝佳工具。万用表可以轻松地对其进行测量。但是有时我们需要测量电感和电容,而这是普通万用表无法实现的。有一些特殊的万用表可以测量电感和电容,但价格昂贵。我们已经使用Arduino构建了频率表,电容表和电阻表。因此,今天我们将使用Arduino制造电感****LC仪表。在这个项目中,我们将在16x2 LCD显示屏上显示电感和电容值以及频率。电路中有一个按钮,用于在电容和电感显示之间切换。
所需组件
- Arduino Uno
- 741运算放大器IC
- 3v电池
- 100欧姆电阻
- 电容器
- 电感器
- 1N4007二极管
- 10k电阻
- 10k pot
- 电源供应
- 按钮
- 面包板或PCB
- 连接线
计算频率和电感
在本项目中,我们将通过并联使用LC电路来测量电感和电容。该电路就像一个环或铃,以一定的频率开始谐振。每当我们施加一个脉冲时,该LC电路就会开始谐振,并且该谐振频率采用模拟(正弦波)形式,因此我们需要将其转换为Squire波形。为此,我们将此模拟谐振频率应用于运算放大器(在本例中为741),它将在占空比为50%的情况下将其转换为单正弦波(频率)。现在,我们使用Arduino测量频率,并通过一些数学计算可以找到电感或电容。我们使用了给定的LC电路频率响应公式。
f = 1 /(2 *time)
其中时间是*pulseIn()*函数的输出
现在我们有了LC电路的频率:
f = 1/2 * Pi *(LC)的平方根
我们可以解决它以获得电感:
f 2 = 1 /(4Pi 2 LC)
L = 1 /(4Pi 2 f 2 C)
L = 1 /(4 * Pi * Pi * f * f * C)
正如我们已经提到的,我们的波是正弦波,因此它在正振幅和负振幅中具有相同的时间段。这意味着比较器会将其转换为占空比为50%的方波。这样我们就可以使用Arduino的pulseIn()函数对其进行测量。此功能将为我们提供一个时间段,可以通过反转时间段轻松地将其转换为频率。由于pulseIn功能仅测量一个脉冲,因此现在要获得正确的频率,我们必须将其乘以2。现在我们可以使用上述公式将其转换为电感频率。
***注意:***在测量电感(L1)时,电容器(C1)的值应为0.1uF,而在测量电容(C1)时,电感器(L1)的值应为10mH。
电路图和说明
在此LC Meter电路图中,我们使用Arduino来控制项目操作。在此,我们使用了LC电路。该LC电路由一个电感器和一个电容器组成。为了将正弦谐振频率转换为数字或方波,我们使用了运算放大器741。在这里,我们需要对运放施加负电源以获得准确的输出频率。因此,我们使用了极性相反的3v电池,这意味着741的负极引脚连接到电池负极端子,而电池的正极引脚连接到其余电路的接地端。有关更多说明,请参见下面的电路图。
无论测量电感还是电容,这里都有一个按钮可以更改操作模式。16x2 LCD用于显示LC电路频率下的电感或电容。一个10k的电位器用于控制LCD的亮度。使用Arduino 5v电源为Circuit供电,我们可以使用USB或12v适配器通过5v为Arduino供电。
测量频率和电容
测量频率和电感
编程说明
该LC Meter项目的编程部分非常容易。本文结尾给出了完整的Arduino代码。
首先,我们必须包括LCD的库,并声明一些引脚和宏。
#include<LiquidCrystal.h>
LiquidCrystal lcd(A5, A4, A3, A2, A1, A0);
#define serial
#define charge 3
#define freqIn 2
#define mode 10
#define Delay 15
double frequency, capacitance, inductance;
typedef struct
{
int flag: 1;
}Flag;
Flag Bit;
之后,在设置功能中,我们**初始化了LCD和串行通讯,**以通过LCD和串行监视器显示测量值。
void setup()
{
#ifdef serial
Serial.begin(9600);
#endif
lcd.begin(16, 2);
pinMode(freqIn, INPUT);
pinMode(charge, OUTPUT);
pinMode(mode, INPUT_PULLUP);
lcd.print(" LC Meter Using ");
lcd.setCursor(0, 1);
lcd.print(" Arduino ");
delay(2000);
lcd.clear();
lcd.print("Circuit Digest");
delay(2000);
}
然后在循环功能中,向LC电路施加一个固定时间周期的脉冲,该脉冲将为LC电路充电。去除脉冲后,LC电路开始谐振。然后,我们使用*pulseIn()*函数读取来自运算放大器的方波转换,然后乘以2进行转换。这里我们也对此进行了一些采样。这就是频率的计算方式:
void loop()
{
for(int i=0;i<Delay;i++)
{
digitalWrite(charge, HIGH);
delayMicroseconds(100);
digitalWrite(charge, LOW);
delayMicroseconds(50);
double Pulse = pulseIn(freqIn, HIGH, 10000);
if (Pulse > 0.1)
frequency+= 1.E6 / (2 * Pulse);
delay(20);
}
frequency/=Delay;
#ifdef serial
Serial.print("frequency:");
Serial.print( frequency );
Serial.print(" Hz ");
#endif
lcd.setCursor(0, 0);
lcd.print("freq:");
lcd.print( frequency );
lcd.print(" Hz ");
获得频率值后,我们使用给定的代码将其转换为电感
capacitance = 0.1E-6;
inductance = (1. / (capacitance * frequency * frequency * 4.*3.14159 * 3.14159)) * 1.E6;
#ifdef serial
Serial.print("Ind:");
if(inductance>=1000)
{
Serial.print( inductance/1000 );
Serial.println(" mH");
}
else
{
Serial.print( inductance );
Serial.println(" uH");
}
#endif
lcd.setCursor(0, 1);
lcd.print("Ind:");
if(inductance>=1000)
{
lcd.print( inductance/1000 );
lcd.print(" mH ");
}
else
{
lcd.print( inductance );
lcd.print(" uH ");
}
}
通过使用给定的代码,我们计算出电容。
if (Bit.flag)
{
inductance = 1.E-3;
capacitance = ((1. / (inductance * frequency * frequency * 4.*3.14159 * 3.14159)) * 1.E9);
if((int)capacitance < 0)
capacitance=0;
#ifdef serial
Serial.print("Capacitance:");
Serial.print( capacitance,6);
Serial.println(" uF ");
#endif
lcd.setCursor(0, 1);
lcd.print("Cap: ");
if(capacitance > 47)
{
lcd.print( (capacitance/1000));
lcd.print(" uF ");
}
else
{
lcd.print(capacitance);
lcd.print(" nF ");
}
}
这就是我们使用Arduino计算频率,电容和电感并将其显示在16x2 LCD上的方式。
#include<LiquidCrystal.h>
LiquidCrystal lcd(A5, A4, A3, A2, A1, A0);
#define serial
#define charge 3
#define freqIn 2
#define mode 10
#define Delay 15
double frequency, capacitance, inductance;
typedef struct
{
int flag: 1;
}Flag;
Flag Bit;
void setup()
{
#ifdef serial
Serial.begin(9600);
#endif
lcd.begin(16, 2);
pinMode(freqIn, INPUT);
pinMode(charge, OUTPUT);
pinMode(mode, INPUT_PULLUP);
lcd.print(" LC Meter Using ");
lcd.setCursor(0, 1);
lcd.print(" Arduino ");
delay(2000);
lcd.clear();
lcd.print("Circuit Digest");
delay(2000);
}
void loop()
{
for(int i=0;i<Delay;i++)
{
digitalWrite(charge, HIGH);
delayMicroseconds(100);
digitalWrite(charge, LOW);
delayMicroseconds(50);
double Pulse = pulseIn(freqIn, HIGH, 10000);
if (Pulse > 0.1)
frequency+= 1.E6 / (2 * Pulse);
delay(20);
}
frequency/=Delay;
#ifdef serial
Serial.print("frequency:");
Serial.print( frequency );
Serial.print(" Hz ");
#endif
lcd.setCursor(0, 0);
lcd.print("freq:");
lcd.print( frequency );
lcd.print(" Hz ");
if (Bit.flag)
{
inductance = 1.E-3;
capacitance = ((1. / (inductance * frequency * frequency * 4.*3.14159 * 3.14159)) * 1.E9);
if((int)capacitance < 0)
capacitance=0;
#ifdef serial
Serial.print("Capacitance:");
Serial.print( capacitance,6);
Serial.println(" uF ");
#endif
lcd.setCursor(0, 1);
lcd.print("Cap: ");
if(capacitance > 47)
{
lcd.print( (capacitance/1000));
lcd.print(" uF ");
}
else
{
lcd.print(capacitance);
lcd.print(" nF ");
}
}
else
{
capacitance = 0.1E-6;
inductance = (1. / (capacitance * frequency * frequency * 4.*3.14159 * 3.14159)) * 1.E6;
#ifdef serial
Serial.print("Ind:");
if(inductance>=1000)
{
Serial.print( inductance/1000 );
Serial.println(" mH");
}
else
{
Serial.print( inductance );
Serial.println(" uH");
}
#endif
lcd.setCursor(0, 1);
lcd.print("Ind:");
if(inductance>=1000)
{
lcd.print( inductance/1000 );
lcd.print(" mH ");
}
else
{
lcd.print( inductance );
lcd.print(" uH ");
}
}
if (digitalRead(mode) == LOW)
{
Bit.flag = !Bit.flag;
delay(1000);
while (digitalRead(mode) == LOW);
}
delay(50);
}