цифровая электроника
вычислительная техника
встраиваемые системы

 

Измеритель индуктивности и емкости на Arduino

Автор: Mike(admin) от 23-11-2018, 07:05

Практически все радиолюбители знакомы с таким устройством как мультиметр, который отлично подходит для измерения напряжения, тока, сопротивления и т.д. Мультиметр может легко измерить эти величины. Но иногда нам нужно измерять индуктивность и емкость, что не так просто при использовании обычного недорогого мультиметра.


Измеритель емкости и индуктивности на Arduino

Существуют некоторые специальные мультиметры, которые могут измерять индуктивность и емкость, но они являются дорогими. Но можно собрать такой LC-метр своими руками. Это можно сделать с помощью Arduino, как будет показано в данном проекте, в котором мы будем измерять и выводить значения индуктивности и емкости вместе с частотой на ЖК-дисплее 16x2.


В этом проекте мы будем измерять индуктивность и емкость, используя параллельную цепь LC. Эта схема напоминает контур, который начинает резонировать на определенной частоте. Всякий раз, когда мы прикладываем импульс, эта LC-цепь начнет резонировать, и эта резонансная частота будет в форме аналоговой (синусоидальной волны), поэтому нам нужно преобразовать ее в меандр. Для этого мы прикладываем эту аналоговую резонансную частоту к операционному усилителю (741 в нашем случае), который осуществляет такое преобразование при 50% скважности. Теперь мы измеряем частоту, используя Arduino, и, используя некоторый математический расчет, мы можем найти индуктивность или емкость. Для определения частоты используется такая формула:


f=1/(2*время)


Здесь время выводится функцией 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% скважностью. Чтобы мы могли измерить это с помощью функции pulseIn(). Эта функция даст нам период времени, который можно легко преобразовать в частоту путем обратного пропорциональности периода времени. Поскольку функция pulseIn измеряет только один импульс, так что теперь, чтобы получить правильную частоту, мы должны умножить ее на 2. Теперь мы имеем частоту, которая может быть преобразована в индуктивность, используя приведенную выше формулу. При измерении индуктивности (L1) значение конденсатора (C1) должно составлять 0,1 мкФ, а при измерении емкости (C1) значение индуктивности (L1) должно составлять 10 мГн.


Схема подключения Arduino для реализации измерителя индуктивности и емкости (LC-метр) представлена ниже. Цепь LC состоит из катушки индуктивности и конденсатора. Чтобы преобразовать синусоидальную резонансную частоту в цифровую или прямоугольную волну, мы использовали операционный усилитель, а именно 741. Здесь нам нужно применить отрицательное напряжение питания к операционному усилителю для получения точной выходной частоты. Таким образом, мы использовали 3-вольтовую батарею, подключенную с обратной полярностью, означает, что отрицательный контакт 741 подключен к отрицательной клемме аккумулятора, а положительный контакт батареи подключен к заземлению оставшейся цепи.


Измеритель емкости и индуктивности на Arduino. Схема

Измеритель емкости и индуктивности на Arduino

Здесь у нас есть кнопка для изменения режима работы, независимо от того, измеряем индуктивность или емкость. ЖК-дисплей 16x2 используется для показа индуктивности или емкости с частотой LC-схемы. Для контроля яркости ЖК-дисплея используется 10-килоомный потенциометр. Цепь питается от питания Arduino 5v. Код программы для Arduino представлен далее.



#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);
}



© digitrode.ru


Теги: Arduino



   Благодарим Вас за интерес к информационному проекту digitrode.ru.
   Если Вы хотите, чтобы интересные и полезные материалы выходили чаще, и было меньше рекламы,
   Вы можее поддержать наш проект, пожертвовав любую сумму на его развитие.


Уважаемый посетитель, Вы зашли на сайт как незарегистрированный пользователь.
Мы рекомендуем Вам зарегистрироваться либо войти на сайт под своим именем.

Комментарии:

Оставить комментарий