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

 



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

Автор: Mike(admin) от 25-06-2017, 19:55

Как с помощью Arduino измерить емкость конденсатора?


Зачастую конденсаторы маркируются довольно сложным и непонятным несведущему человеку образом. Это затрудняет использование неизвестных (или даже непромаркированных) конденсаторов в дальнейших проектах, поскольку узнать их емкость не так-то просто, особенно, если у вас нет цифрового мультиметра для их проверки.


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

Но при наличии Arduino можно самостоятельно сделать простой измеритель емкости, который поможет определить емкость конденсатора.


Принцип измерения емкости


Измерение емкости в данном случае основано на свойстве резисторно-конденсаторных (RC) цепей, которое носит название «постоянная времени». Постоянная времени RC-цепи определяется как время, необходимое для того, чтобы напряжение на конденсаторе достигло 63,2% от его напряжения при полной зарядке. Большие конденсаторы требуют больше времени для зарядки и, следовательно, имеют большие постоянные времени. Емкость в RC-цепочке связана с постоянной времени по уравнению: Tc = R* C (произведение сопротивления на емкость). Соответственно, емкость определится как: C = Tc/R.


В данном проекте будут представлены три измерителя емкости, которые способны измерять более точно в микрофарадном, нанофарадном и пикофарадном диапазонах. Каждый измеритель емкости (кроме третьего) имеет RC-цепь с известными значениями резисторов и неизвестным значением конденсатора. Arduino будет измерять напряжение на конденсаторе и записывать время, необходимое для достижения 63,2% от его напряжения при полной зарядке (постоянная времени). Поскольку значение сопротивления уже известно, мы можем использовать приведенную выше формулу в программе, которая рассчитает неизвестную емкость.


Измеритель емкости от 0.1 мкФ до 3900 мкФ


Схема данного измерителя представлена ниже (R1 = 10 KОм, R2 = 220 Ом).


Измеритель емкости от 0.1 мкФ до 3900 мкФ на Arduino

Код (скетч) для такого измерителя емкости на основе Arduino:



#define analogPin      0          
#define chargePin      13         
#define dischargePin   11        
#define resistorValue  10000.0F   

unsigned long startTime;
unsigned long elapsedTime;
float microFarads;                
float nanoFarads;

void setup(){
  pinMode(chargePin, OUTPUT);     
  digitalWrite(chargePin, LOW);  
  Serial.begin(9600);             
}

void loop(){
  digitalWrite(chargePin, HIGH);  
  startTime = millis();
  while(analogRead(analogPin) < 648){       
  }

  elapsedTime= millis() - startTime;
  microFarads = ((float)elapsedTime / resistorValue) * 1000;   
  Serial.print(elapsedTime);       
  Serial.print(" mS    ");         

  if (microFarads > 1){
    Serial.print((long)microFarads);       
    Serial.println(" microFarads");         
  }

  else{
    nanoFarads = microFarads * 1000.0;      
    Serial.print((long)nanoFarads);         
    Serial.println(" nanoFarads");          
    delay(500); 
  }

  digitalWrite(chargePin, LOW);            
  pinMode(dischargePin, OUTPUT);            
  digitalWrite(dischargePin, LOW);          
  while(analogRead(analogPin) > 0){         
  }

  pinMode(dischargePin, INPUT);            
}

Пример результатов измерения емкости электролитического конденсатора 470 мкФ:


Измеритель емкости от 0.1 мкФ до 3900 мкФ на Arduino

В первом столбце показана постоянная времени конденсатора, а второй столбец – величина емкости. Единицы будут автоматически изменяться с микрофарад на нанофарады. Вы заметите, что с большими конденсаторами для Arduino требуется больше времени для вывода показаний. Это связано с тем, что более крупные конденсаторы имеют большие постоянные времени и поэтому требуют больше времени, чтобы достичь 63,2% от их напряжения при полной зарядке. Например, конденсатор емкостью 3900 мкФ может потребовать несколько минут для отображения следующего показания.


Измеритель емкости от 0.0047 мкФ до 180 мкФ


Схема данного измерителя представлена ниже (R1 = 10 KОм, R2 = 3.1 КОм, R3 = 1.8 КОм).


Измеритель емкости от 0.0047 мкФ до 180 мкФ на Arduino

Код (скетч) для такого измерителя емкости на основе Arduino:



const byte pulsePin = 2;
const unsigned long resistance = 10000;

volatile boolean triggered;
volatile boolean active;
volatile unsigned long startTime;
volatile unsigned long duration;

ISR (ANALOG_COMP_vect)
  {
  unsigned long now = micros ();
  if (active)
    {
    duration = now - startTime;
    triggered = true;
    digitalWrite (pulsePin, LOW); 
    }
  }

void setup ()
  {
  pinMode(pulsePin, OUTPUT);
  digitalWrite(pulsePin, LOW);
  Serial.begin(9600);
  Serial.println("Started.");
  ADCSRB = 0;          
  ACSR =  _BV (ACI)     
        | _BV (ACIE)    
        | _BV (ACIS0) | _BV (ACIS1);  
   }  

void loop ()
  {
  if (!active)
    {
    active = true;
    triggered = false;
    digitalWrite (pulsePin, HIGH); 
    startTime = micros ();  
    }

  if (active && triggered)
    {
    active = false;
    Serial.print ("Capacitance = ");
    Serial.print (duration * 1000 / resistance);
    Serial.println (" nF");
    triggered = false;
    delay (3000);
    }
}

Пример результатов измерения емкости пленочного конденсатора 10 нФ:


Измеритель емкости от 0.0047 мкФ до 180 мкФ на Arduino

Измеритель емкости от 18 пФ до 470 мкФ


Схема данного измерителя представлена ниже.


Измеритель емкости от 18 пФ до 470 мкФ на Arduino

Код (скетч) для такого измерителя емкости на основе Arduino:



const int OUT_PIN = A2;
const int IN_PIN = A0;
const float IN_STRAY_CAP_TO_GND = 24.48;
const float IN_CAP_TO_GND  = IN_STRAY_CAP_TO_GND;
const float R_PULLUP = 34.8;  
const int MAX_ADC_VALUE = 1023;

void setup()
{
  pinMode(OUT_PIN, OUTPUT);
  pinMode(IN_PIN, OUTPUT);
  Serial.begin(9600);
}

void loop()
{
    pinMode(IN_PIN, INPUT);
    digitalWrite(OUT_PIN, HIGH);
    int val = analogRead(IN_PIN);
    digitalWrite(OUT_PIN, LOW);

    if (val < 1000)
    {
      pinMode(IN_PIN, OUTPUT);

      float capacitance = (float)val * IN_CAP_TO_GND / (float)(MAX_ADC_VALUE - val);

      Serial.print(F("Capacitance Value = "));
      Serial.print(capacitance, 3);
      Serial.print(F(" pF ("));
      Serial.print(val);
      Serial.println(F(") "));
    }
    else
    {
      pinMode(IN_PIN, OUTPUT);
      delay(1);
      pinMode(OUT_PIN, INPUT_PULLUP);
      unsigned long u1 = micros();
      unsigned long t;
      int digVal;

      do
      {
        digVal = digitalRead(OUT_PIN);
        unsigned long u2 = micros();
        t = u2 > u1 ? u2 - u1 : u1 - u2;
      } while ((digVal < 1) && (t < 400000L));

      pinMode(OUT_PIN, INPUT);  
      val = analogRead(OUT_PIN);
      digitalWrite(IN_PIN, HIGH);
      int dischargeTime = (int)(t / 1000L) * 5;
      delay(dischargeTime);   
      pinMode(OUT_PIN, OUTPUT);  
      digitalWrite(OUT_PIN, LOW);
      digitalWrite(IN_PIN, LOW);

      float capacitance = -(float)t / R_PULLUP
                              / log(1.0 - (float)val / (float)MAX_ADC_VALUE);

      Serial.print(F("Capacitance Value = "));
      if (capacitance > 1000.0)
      {
        Serial.print(capacitance / 1000.0, 2);
        Serial.print(F(" uF"));
      }
      else
      {
        Serial.print(capacitance, 2);
        Serial.print(F(" nF"));
      }

      Serial.print(F(" ("));
      Serial.print(digVal == 1 ? F("Normal") : F("HighVal"));
      Serial.print(F(", t= "));
      Serial.print(t);
      Serial.print(F(" us, ADC= "));
      Serial.print(val);
      Serial.println(F(")"));
    }
    while (millis() % 1000 != 0);    
}

Пример результатов измерения емкости керамического конденсатора 22 пФ:


Измеритель емкости от 18 пФ до 470 мкФ на Arduino

В результате можно сказать, что создание измерителя емкости на Arduino представляет собой довольно простой проект.




© digitrode.ru


Теги: Arduino




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

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

Оставить комментарий
Цитата
  • Группа: Гости
  • ICQ:
  • Регистрация: --
  • Статус:
  • Комментариев: 0
  • Публикаций: 0
^
Из последнего примера:

const float IN_STRAY_CAP_TO_GND = 24.48;
const float R_PULLUP = 34.8;

Откуда такие цифры? На основании чего они высчитываются?
На pic32 код считает некорректно. Плюс наводки от проводов в размере 6пФ.