使用Arduino的LC电表:测量电感和频率

本文介绍了如何利用Arduino构建一个LC电表,用于测量电感和频率。通过并联LC电路产生谐振,使用741运算放大器将正弦波转换为方波,然后用Arduino的pulseIn()函数测量频率,从而计算电感和电容。项目中还包括一个按钮用于模式切换,以及16x2LCD显示屏显示测量结果。
摘要由CSDN通过智能技术生成

原文:https://circuitdigest.com/microcontroller-projects/arduino-lc-meter-measure-inductance

使用Arduino的LC电表:测量电感和频率

ARDUINO的

经过**萨达姆** 2018年9月5日
在这里插入图片描述
使用Arduino的LC表:测量电感和频率

所有嵌入式爱好者都熟悉万用表,它是测量电压,电流,电阻等的绝佳工具。万用表可以轻松地对其进行测量。但是有时我们需要测量电感和电容,而这是普通万用表无法实现的。有一些特殊的万用表可以测量电感和电容,但价格昂贵。我们已经使用Arduino构建了频率表电容表电阻表。因此,今天我们将使用Arduino制造电感****LC仪表。在这个项目中,我们将在16x2 LCD显示屏上显示电感和电容值以及频率。电路中有一个按钮,用于在电容和电感显示之间切换。

所需组件

  1. Arduino Uno
  2. 741运算放大器IC
  3. 3v电池
  4. 100欧姆电阻
  5. 电容器
  6. 电感器
  7. 1N4007二极管
  8. 10k电阻
  9. 10k pot
  10. 电源供应
  11. 按钮
  12. 面包板或PCB
  13. 连接线

在这里插入图片描述

计算频率和电感

在本项目中,我们将通过并联使用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);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值