пятница, 15 декабря 2017 г.

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


      При ремонте радиоэлектронной аппаратуры мы часто сталкиваемся с необходимостью измерения емкости конденсаторов, чтобы определить неисправную деталь или, например, хотим узнать емкость SMD-конденсатора, выпаянного со старой платы. Можно, конечно, купить готовый прибор для измерения емкости, но стоит он недешево и не все могут себе его позволить. Поэтому Раджа Дилип из Индии разработал и опубликовал на сайте circuitdigest.com простой измеритель емкости неизвестных конденсаторов. 
      Схема получилась недорогой и легкой в повторении. Измеритель емкости собран на Arduino UNO, триггере Шмитта и генераторе на 555 микросхеме



Для изготовления понадобятся:

1. Универсальный таймер NE555 (аналог КР1006ВИ1)
2. Инвертирующий триггер Шмитта 74HC14 (аналог 1564ТЛ2)
3. Резисторы 0.125Вт сопротивлением 1KΩ (2 шт.) и 10кОм (1шт.)
4. Конденсаторы 100nF и 1000мкФ
5. LCD индикатор 1602
6. Макетная плата и провода


Принципиальная схема:

    Электрическая схема измерителя емкости с использованием Arduino показана на рисунке ниже. Схема проста, для отображения измеренной емкости конденсатора на 2,3,4,5,6,7 выводы Arduino подключен индикатор 1602 . Генератор прямоугольных имульсов на 555 микросхеме в астабильном режиме с измеряемым конденсатором в качестве частотозадающего подключен через инвертирующий триггер Шмитта на микросхеме 74HC14 к 8 выводу Arduino. Триггер Шмитта необходим для преобразования сигнала генератора в стабильный цифровой сигнал. Для фильтрации помех было добавлено пару конденсаторов по питанию.
    Данная схема позволяет достаточно точно измерять емкости в диапазоне от 10нФ до 10мкФ .

Генератор прямоугольных импульсов основе 555 таймера

    Прежде всего, мы поговорим о генераторе прямоугольных импульсов основе 555 таймера или если точнее о режиме астабильного мультивибратора для  555 таймера. Мы знаем, что емкость конденсатора не может быть измерена непосредственно в цифровой цепи, другими словами, Arduino UNO работает с цифровыми сигналами и не может напрямую измерять емкость конденсатора. Таким образом, мы используем генератор для связи конденсатора с цифровым миром.
    Проще говоря, мультивибратор обеспечивает прямоугольный сигнал на выходе, частота которого напрямую связана с емкостью частотозадающего конденсатора. Поэтому сначала мы получаем прямоугольные импульсы, частота которых зависит от емкости измеряемого конденсатора и подаем этот сигнал на Arduino UNO для вычисления соответствующего значения.
    Схема включения микросхемы 555 в астабильном режиме выглядит так:



Частота выходного сигнала зависит от резисторов R1, R2 и конденсатора C. 
Частоту можно определить по уравнению:





где 
f - частота ренератора, Гц
R1 и R2 - сопротивление резисторов, Ом
C - емкость конденсатора, Ф (фарады)
    Зная значения сопротивлений и емкости в приведенном выше уравнении, мы можем рассчитать частоту выходных импульсов.
    Так как согласно схемы R1=1кОм, а R2=10кОм формулу можно упростить:





   
 Преобразуем формулу, Чтобы можно было вычислить емкость конденсатора, зная частоту:





       В нашем скетче (см. ниже) для вывода значения емкости 
в нФ (нанофарадах), необходимо полученные результаты (в фарадах) умножить «1000000000». 




    
    Также в скетче используется число «20800» вместо 21000, поскольку точные значения сопротивлений R1 и R2 составили 0.98кОм и 9.88кОм соответственно. Вы можете использовать свое число, в зависимости от точности используемых резисторов.
В общем, если мы знаем частоту импульсов генератора, мы можем рассчитать значение емкости конденсатора.


Триггер Шмитта - преобразователь уровня:

    Для согласования выхода генератора и входа микроконтроллера Arduino Uno используется триггер Шмитта на микросхеме 74HC14.
    Как видно из схемы ниже - 74HC14 состоит из шести триггеров Шмитта с инвертирующим выходом.

   Таблица истинности инвертированного выхода триггера Шмитта показана ниже, соответственно нужно в программе Arduino UNO инвертировать сигнал высокого и низкого состояния сигнала на входе. 

     В итоге с генератора мы получим сигнал, безопасный для входа Arduino.

Измерение емкости при помощи Arduino:

      В Arduino есть специальная функция pulseIn, которая позволяет определить длительность высокого или низкого состояния прямоугольного импульса: 
 Htime = pulseIn (8, HIGH);
 Ltime = pulseIn (8, LOW); 
      Данная функция pulseIn измеряет время, в течение которого высокий или низкий уровень присутствует на 8 выводе Arduino, измеряет время высокого (Htime) и низкого уровня сигнала (Ltime) в микросекундах. Когда мы сложим Htime и Ltime, то получим продолжительность цикла и, инвертируя его, узнаем частоту частоту.
    Зная частоту, рассчитаем емкость при помощи формулы, которую мы обсудили ранее.


Итог и тестирование:

    Итак, для проверки, я подключил измеряемый конденсатор к схеме таймера 555, который генерирует прямоугольные импульсы на выходе, частота которых напрямую связана с емкостью конденсатора. Этот сигнал передается через триггер на вход Arduino. Arduino измеряет частоту сигнала. Зная частоту, программа Arduino вычисляет емкость используя формулы, обсуждаемые ранее.

   Посмотрим, какие результаты я получил:

    После подключения электролитического конденсатора емкостью 1мкФ, результат получился 1091.84нФ ~ 1мкФ . 
   
 При измерении полимерного конденсатора емкостью 0.1мкФ результат составляет 107.70нФ ~ 0.1 мкФ.

   Затем я подключил керамический конденсатор 0.1мкФ и результат составил 100.25нФ ~ 0,1мкФ.  

    При измерении электролитического конденсатора 4.7мкФ показания составили 4842.83 нФ ~ 4.8 мкФ


   Таким образом, мы можем запросто измерить емкость любого конденсатора.

Код Arduino:

#include <LiquidCrystal.h>
LiquidCrystal lcd(2, 3, 4, 5, 6, 7);
int32_t Htime;
int32_t Ltime;
float Ttime;
float frequency;
float capacitance;
void setup()
{
pinMode(8,INPUT); // Вывод 8 в качестве входа сигнала
lcd.begin(16, 2);
lcd.setCursor(0,0);
lcd.print("capacitance =");
}
void loop()
{
for (int i=0;i<5;i++) // Замеряем время пять раз
{
Ltime=(pulseIn(8,HIGH)+Ltime)/2; // Получаем среднее значение для каждого цикла
Htime=(pulseIn(8,LOW)+Htime)/2;
}
Ttime = Htime+Ltime;
frequency=1000000/Ttime;
capacitance = (1.44*1000000000)/(20800*frequency); // Вычисление емкости в нФ
lcd.setCursor(0,1);
lcd.print(capacitance);
lcd.print(" nF ");
delay(500);
}

Видео работы:




4 комментария:

  1. а есть проект протеуса этой схемы?

    ОтветитьУдалить
  2. Формула расчёта ёмкости конденсатора в описании отличается от формулы в скече. Формула в описании описании: c=(1.44/((r1+2*r2)*f))*Farad; в скетче: c=(1.44*farad)/((r1+2*r2)*f) какая формула верна?

    ОтветитьУдалить
  3. А разве (a*b)/(c+d) не то же самое, что (a/(c+d))*b?

    ОтветитьУдалить