风筝
发表于: 2018-9-15 22:00:32 | 显示全部楼层

所有嵌入式爱好者都熟悉万用表,它是测量电压、电流、电阻等的绝佳工具。万用表可以轻松测量它们。但有时我们需要测量电感和电容,这些是普通万用表无法测量的。有一些特殊的万用表可以测量电感和电容,但它们很昂贵。我们已经使用Arduino开发板制作了频率计、电容表和电阻表。所以今天我们将使用Arduino开发板制作一个电感式LC测量仪。在本篇文章中,我们将在显示屏LCD1602上显示电感、电容值和频率。电路中有一个按钮,用于在电容和电感显示之间切换。


需要的组件

●     Arduino Uno开发板

●     运算放大器741

●     3v电池

●     电容

●     电感

●     1n4007二极管

●     电源

●     按钮

●     面包板

●     连接导线

Components-Required-for-LC-Meter-Using-Arduino.jpg


计算频率和电感

在本篇文章中,我们将通过并联使用LC电路来测量电感和电容。该电路类似于环或钟,它在特定频率下开始谐振。每当我们施加脉冲时,该LC电路将开始谐振,并且该谐振频率是模拟(正弦波)的形式,因此我们需要将其转换为方波。为此,我们将此模拟共振频率应用于运算放大器(在我们的例子中为741),该运算放大器将其转换为占空比为50%的方波(频率)。现在我们可以使用Arduino开发板测量频率,通过一些数学计算,我们可以得出电感或电容。我们使用了以下的LC电路频率响应公式。

  1. f=1/(2*time)
复制代码

其中time是pulseIn()函数的输出


现在我们有LC电路频率

  1. f=1/2*Pi* square root of (LC)
复制代码

我们可以通过以下公式得到电感:

  1. f2 = 1/ (4Pi2LC)
  2. L= 1/ (4Pi2 f2C)
  3. L = 1/(4* Pi * Pi * f * f * C)
复制代码

正如我们已经提到的那样,我们的波是正弦波,所以它在正和负幅度上具有相同的时间周期。这意味着比较器将其转换为占空比为50%的方波。这样我们就可以使用Arduino的pulseIn()函数来测量它。该函数将为我们提供一个时间段,通过反转时间段可以很容易地将其转换为频率。由于pulseIn函数仅测量一个脉冲,所以现在要获得正确的频率,我们必须将它乘以2。现在我们可以通过使用上面的公式转换成电感来得到频率。

注意:在测量电感(L1)时,电容(C1)值应为0.1uF,而在测量电容(C1)时,电感(L1)值应为10mH。


电路图和说明

在这个LC测量仪电路图中,我们使用Arduino来控制项目操作。在此,我们使用了LC电路。该LC电路由一个电感和一个电容组成。为了将正弦谐振频率转换为数字或方波,我们使用运算放大器即741。这里我们需要对运算放大器施加负电源以获得准确的输出频率。因此我们使用了反极性连接的3v电池,意味着741负极引脚连接到电池负极端子,电池正极引脚连接到剩余电路的地。有关更多说明,请参见下面的电路图。

Circuit-Diagram-for-LC-Meter-Using-Arduino.png


无论我们是测量电感还是电容,我们都有一个按钮来改变操作模式。LCD1602用于显示LC电路频率的电感或电容。10k电位器用于控制LCD的亮度。电路使用Arduino的5v电源供电,我们可以使用USB或12v适配器为Arduino供电。

Circuit-Hardware-for-LC-Meter-Using-Arduino.jpg


LC-Meter-Using-Arduino.jpg


编程说明

这个LC测量仪的编程部分非常简单。完整的Arduino代码在本文末尾给出。


首先,我们需要包含LCD库,并声明一些引脚和宏。

  1. #include<LiquidCrystal.h>
  2. LiquidCrystal lcd(A5, A4, A3, A2, A1, A0);

  3. #define serial

  4. #define charge 3
  5. #define freqIn 2
  6. #define mode 10

  7. #define Delay 15

  8. double frequency, capacitance, inductance;

  9. typedef struct
  10. {
  11.   int flag: 1;
  12. }Flag;

  13. Flag Bit;
复制代码

之后,在setup函数中,我们初始化了LCD和串行通信,以通过LCD和串口监视器显示测量值。

  1. void setup()
  2. {
  3. #ifdef serial
  4.   Serial.begin(9600);
  5. #endif
  6.   lcd.begin(16, 2);
  7.   pinMode(freqIn, INPUT);
  8.   pinMode(charge, OUTPUT);
  9.   pinMode(mode, INPUT_PULLUP);
  10.   lcd.print(" LC Meter Using ");
  11.   lcd.setCursor(0, 1);
  12.   lcd.print("     Arduino    ");
  13.   delay(2000);
  14.   lcd.clear();
  15.   lcd.print("Circuit Digest");
  16.   delay(2000);
  17. }
复制代码

然后在loop函数中,将固定时间周期的脉冲施加到LC电路,LC电路将为LC电路充电。去除脉冲后,LC电路开始谐振。 然后我们通过使用pulseIn()函数读取运算放大器的方波转换,并通过乘以2进行转换。这里我们也采用了一些这样的样本。 以下是计算频率的方式:

  1. void loop()
  2. {
  3.   for(int i=0;i<Delay;i++)
  4.   {
  5.     digitalWrite(charge, HIGH);
  6.     delayMicroseconds(100);
  7.     digitalWrite(charge, LOW);
  8.     delayMicroseconds(50);
  9.   double Pulse = pulseIn(freqIn, HIGH, 10000);
  10.   if (Pulse > 0.1)
  11.     frequency+= 1.E6 / (2 * Pulse);
  12.     delay(20);
  13.   }
  14.   frequency/=Delay;
  15. #ifdef serial
  16.   Serial.print("frequency:");
  17.   Serial.print( frequency );
  18.   Serial.print(" Hz     ");
  19. #endif

  20.   lcd.setCursor(0, 0);
  21.   lcd.print("freq:");
  22.   lcd.print( frequency );
  23.   lcd.print(" Hz      ");
复制代码

得到频率值后,我们使用以下的代码片段将它们转换为电感、

  1. capacitance = 0.1E-6;
  2.     inductance = (1. / (capacitance * frequency * frequency * 4.*3.14159 * 3.14159)) * 1.E6;
  3. #ifdef serial
  4.     Serial.print("Ind:");
  5.     if(inductance>=1000)
  6.     {
  7.     Serial.print( inductance/1000 );
  8.     Serial.println(" mH");
  9.     }
  10.     else
  11.    {
  12.     Serial.print( inductance );
  13.     Serial.println(" uH");
  14.   }
  15. #endif

  16.     lcd.setCursor(0, 1);
  17.     lcd.print("Ind:");
  18.     if(inductance>=1000)
  19.     {
  20.     lcd.print( inductance/1000 );
  21.     lcd.print(" mH            ");
  22.     }
  23.     else
  24.    {
  25.     lcd.print( inductance );
  26.     lcd.print(" uH              ");
  27.   }
  28.   }
复制代码

通过使用以下的代码,计算电容值。

  1. if (Bit.flag)
  2.   {
  3.     inductance = 1.E-3;
  4.     capacitance = ((1. / (inductance * frequency * frequency * 4.*3.14159 * 3.14159)) * 1.E9);
  5.     if((int)capacitance < 0)
  6.     capacitance=0;
  7. #ifdef serial
  8.     Serial.print("Capacitance:");
  9.     Serial.print( capacitance,6);
  10.     Serial.println(" uF   ");
  11. #endif
  12.     lcd.setCursor(0, 1);
  13.     lcd.print("Cap: ");
  14.     if(capacitance > 47)
  15.     {
  16.       lcd.print( (capacitance/1000));
  17.     lcd.print(" uF                 ");
  18.     }
  19.     else
  20.     {
  21.        lcd.print(capacitance);
  22.        lcd.print(" nF                 ");
  23.     }
  24.   }
复制代码

这就是我们使用Arduino开发板计算频率、电容和电感的方法,然后将其显示在LCD液晶显示屏上。


代码

本文使用的完整代码如下所示: main.rar (903 Bytes, 下载次数: 161)

跳转到指定楼层
Amber
发表于: 2019-7-27 09:56:53 | 显示全部楼层

我直接用信号发生器给方波信号为啥检测不到频率
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题 700 | 回复: 1482



手机版|

GMT+8, 2024-4-28 12:53 , Processed in 0.072213 second(s), 8 queries , Gzip On, MemCache On. Powered by Discuz! X3.5

YiBoard一板网 © 2015-2022 地址:河北省石家庄市长安区高营大街 ( 冀ICP备18020117号 )

快速回复 返回顶部 返回列表