Любители электроники наверняка знакомы с таким прибором как мультиметр, с помощью которого можно измерять напряжение, ток, сопротивление и т.д. Со всем этим мультиметр справляется достаточно легко. Но иногда у любителей электроники возникает необходимость измерения индуктивности и емкости и с этой задачей уже не справится обычный мультиметр. Для этой цели созданы специализированные мультиметры, но они стоят значительно дороже обычных.
На нашем сайте мы уже рассматривали создание измерителя емкости, измерителя частоты и измерителя сопротивления (омметра) на основе платы Arduino. А в этой статье мы рассмотрим создание измерителя емкости и индуктивности (Inductance LC Meter) на основе платы Arduino. Измеренные значения емкости и индуктивности мы будем показывать на экране ЖК дисплея 16х2. Кнопка в схеме проекта будет использоваться для переключения между режимом измерения емкости и индуктивности.
Необходимые компоненты
- Плата Arduino Uno (купить на AliExpress).
- Микросхема операционного усилителя 741.
- ЖК дисплей 16х2 (купить на AliExpress).
- Батарея на 3v (для питания операционного усилителя) и источник питания для остальной части схемы.
- Резистор 100 Ом (купить на AliExpress).
- Конденсаторы (купить на AliExpress).
- Индуктивности.
- Диод 1n4007 (купить на AliExpress).
- Резистор 10 кОм (купить на AliExpress).
- Потенциометр 10 кОм (купить на AliExpress).
- Кнопка.
- Макетная или печатная плата и соединительные провода.
Реклама: ООО «АЛИБАБА.КОМ (РУ)» ИНН: 7703380158
Внешний вид некоторых из использованных в проекте компонентов показан на следующем рисунке.
Расчет частоты и индуктивности
В этом проекте мы будем измерять емкость и индуктивность с помощью LC цепи, включенной параллельно – то есть, по сути, это хорошо известный нам LC контур. Эту цепь можно сравнить со звонком, который начинает резонировать на определенной частоте. При подаче на эту цепь импульса она начинает резонировать и на ее выходе образуется синусоидальное колебание на резонансной частоте. Это синусоидальное колебание нам необходимо преобразовать в прямоугольную волну. Для этого мы будем использовать операционный усилитель на микросхеме 741, который будет преобразовывать синусоидальное колебание в последовательность прямоугольных импульсов с коэффициентом заполнения 50%. Затем мы будем измерять частоту этих импульсов с помощью платы Arduino и затем с помощью ряда математических преобразований мы можем определить измеряемые индуктивность или емкость. Для этого мы будем использовать обычную формулу, связывающую частоту и время для прямоугольной волны:
f=1/(2*time)
где time (время) будет определяться с помощью функции pulseIn() .
Также нам известна формула для расчета частоты LC контура:
f=1/2*Pi* square root of (LC)
square root – квадратный корень.
Из этого выражения мы можем выразить индуктивность L:
f2 = 1/ (4Pi2LC)
L= 1/ (4Pi2 f2C)
L = 1/(4* Pi * Pi * f * f * C)
Поскольку синусоидальная волна с выхода LC контура имеет одинаковую длительность положительность и отрицательной полуволны, то компаратор на основе операционного усилителя преобразует ее в прямоугольную волну (последовательность прямоугольных импульсов) с коэффициентом заполнения 50% — мы можем измерить частоту этой прямоугольной волны с помощью функции pulseIn() в Arduino. Эта функция определит нам временной период, который мы затем переведем в значение частоты с помощью выше приведенной формулы. Поскольку функция pulseIn измеряет только один импульс, поэтому чтобы получить правильное значение частоты мы его в формуле умножаем на 2. А когда у нас значение частоты, мы с помощью формулы для LC контура определим значение индуктивности.
Примечание: во время измерения индуктивности (L1) емкость C1) в нашем проекте должна быть 0.1 мкФ, а во время измерения емкости (C1) индуктивность (L1) должна быть равна 10 мГн. Если вы хотите изменить эти значения, то вам необходимо будет внести соответствующие изменения в код программы.
Работа схемы
Схема измерителя емкости и индуктивности на основе платы Arduino представлена на следующем рисунке.
Кнопка в схеме используется для смены режима – измерения емкости или индуктивности. ЖК дисплей используется для отображения результатов измерений. Потенциометр предназначен для управления яркостью ЖК дисплея. Схема запитывается от контакта 5v платы Arduino, а саму плату Arduino можно запитать через USB кабель от компьютера или с помощью адаптера на 12 В.
Внешний вид собранной на макетной плате схеме показан на следующих рисунках, а также на них показан пример работы схемы в режиме измерения емкости и в режиме измерения индуктивности.
Объяснение программы для Arduino
Полный код программы приведен в конце статьи, здесь же мы рассмотрим его основные фрагменты.
Сначала в программе нам необходимо подключить библиотеку для работы с ЖК дисплеем и инициализировать необходимые нам для работы контакты и переменные.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
#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; |
Далее, в функции setup мы инициализируем ЖК дисплей и последовательную связь чтобы показывать измеренные значения емкости и индуктивности на экране ЖК дисплея и в окне монитора последовательной связи (serial monitor).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
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); } |
Затем в функции loop мы будем формировать прямоугольный импульс фиксированной длительности для последующей подачи его на LC контур. Этот импульс зарядит LC контур. После снятия импульса LC контур начнет резонировать. После преобразования волны с выхода LC контура в прямоугольную мы ее считываем платой Arduino и с помощью функции pulseIn() мы измеряем длительность ее импульса, и на основании этой измеренной длительности мы рассчитываем частоту.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
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 "); |
После получения значения частоты мы рассчитываем значение индуктивности.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
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 "); } } |
С помощью аналогичного фрагмента кода мы можем определить и значение емкости.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
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 "); } } |
Исходный код программы (скетча)
Код программы достаточно объемный, но по своей сути он достаточно простой, мы надеемся, что его понимание не вызовет у вас затруднений.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 |
#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); } |
Видео, демонстрирующее работу схемы
Фото собранного проекта от читателя нашего сайта
Читатель нашего сайта (его зовут Александр) собрал описанный в данной статье проект измерителя емкости и индуктивности на основе платы Arduino и решил поделиться с нами фотографиями собранного проекта, за что мы выражаем ему огромную признательность.
Здесь картинки представлены в сжатом виде (они кликабельны) в целях экономии интернет трафика, в оригинальном качестве вы можете скачать их с яндекс.диска или с гугл диска (ссылка в комментариях).
46 ответов к “Измеритель емкости и индуктивности на Arduino”
Добрый день господа. Хочу тоже собрать данную схему. Пока подбираю компоненты. Тоже планирую собирать на нано. Единственное что не понял какой все же ОУ брать HA17741 или какой? Может кто подскажет?
Не специалист, к сожалению, в операционных усилителях, но я думаю ответ на этот вопрос достаточно легко найти на соответствующих ресурсах в сети интернет
Пока что взял LM741 дальше посмотрим как пойдет.
Будем признательны если отпишитесь потом о своих успехах
Здравствуйте, скажите, если вместо индуктивности и емкости подключить катушку звукоснимателя значения индуктивности и емкости на много выше то прибор сделает замер? Или иначе смыл прибора в чем.. Замерять известные данные что ли.
Добрый день. Конечно сможет если внесете соответствующие изменения в программу — нужно просто поменять значение известной емкости/индуктивности на свое. Смысл прибора в том, что вы один из параметров делаете известным — емкость или индуктивность, а значение второго параметра (неизвестное) измеряете. То есть если у вас в схеме известный конденсатор, то вы сможете измерять неизвестную индуктивность, и наоборот
Спасибо, смысл понял, попробую под свои хотелки переделать, мне нужны все параметры датчика они все неизвестны. ( индуктивность, резонансная частота, емкость, сопротивление)
Будем признательны если отпишитесь нам здесь потом о своих успехах
Здравствуйте люди , прошу вас пожалуйста кто сможет собрать на макетной плате или же спаять саму схему за денежное вознаграждение буду очень благодарен, ибо у меня таких знакомых нету и к сожалению необходимо использовать данный диплом как дипломный проект , но к сожалению навыками к сборке и пайке не обладаю , хотелось бы желающим помочь отписать мне на почту +79817320711, я бы выкупил ваш собранный данный прибор либо же оплатил саму сборку и комплектующие к ней.
Эх, видимо уже форум на сайте нужно создавать чтобы желающие могли публиковать там подобные предложения.
деление измеренной частоты на Delay=15 это подгонка под правильный результат или для чего это?
а, понял, это усреднение результата
Да, именно так
Здравствуйте, хотелось бы узнать зачем в данной схеме нужна батарейка ,и для чего нужен после 2 диода делитель напряжения между МК и катушкой с конденсатором ? Также хотел бы спросить не проще было бы с 10 выхода выводить кнопку сразу на землю без соединения его с лмкой ? Извините за глупые вопросы , не очень сильно разбираюсь в схемотехнике и с физикой тоже тяжело , буду очень вам благодарен за подробный ответ!
Добрый вечер.
1. Насчет батарейки есть же ответ в тексте статьи — чтобы подать отрицательное напряжение смещения на операционный усилитель.
2. Там не делитель напряжения, а просто токоограничивающий резистор.
3. Кнопку можно выводить и на землю, но здесь она кроме подачи уровня LOW на 10 контакт дополнительно она еще блокирует работу операционного усилителя во время нажатия. Наверное, это улучшает стабильность работы схемы, чтобы во время переключения работы не возникало нежелательных переходных процессов
Измерением частоты внутреннего компаратора как в примере pcbway.com/project/shareproject/_______________________________________________________PIC_16F628A.html
Ну здесь же используется микроконтроллер PIC, почему вы думаете что аналогичное решение заработает на плате Ардуино Нано? Если бы это был отдельный микроконтроллер AVR то, наверное, еще можно было придумать что-нибудь аналогичное, ну а когда он в составе платы его некоторые функции могут быть заблокированы. За удобство работы с платой Ардуино приходится же чем то платить, ну как минимум уменьшением числа свободных контактов микроконтроллера AVR в ее составе
Просто заинтресовало, на avr не видел ни одного проекта измерителя lc в сети с использованием внутреннего компаратора
Ну точный ответ на этот вопрос я не знаю, но, возможно, внутренний компаратор AVR по своему устройству чем то отличается от внутреннего компаратора PIC и поэтому не подходит для таких проектов
А если использовать встроенный компаратор, например у нано?
И каким образом вы хотите его использовать здесь? Что то не очень понял. Но я думаю что вряд ли он подойдет для этих задач
Измерением частоты внутреннего компаратора, как у измерителя lc на pic16f628
Здраствуйте, еще раз, я собрал на макетке это устройство с LM741CN, но при измерении оно замерят импульс полсекунды, а после уходит в ноль. И то замеряет оно по нарастающей. Попытаюсь поменять на к140уд708, вдруг что выйдет
Добрый вечер. К сожалению, тут пока больше ничего не могу полезного вам посоветовать, поэтому остается только пожелать вам успехов
резистор R1 надо взять мощностью на 0,250вт ,индуктивность 1mH,на 10 мне кажется опечатка,показывает неправильно,если есть эталонные конденсаторы то делаем калибровку изменяя числовые значения delayMicroseconds(100);
digitalWrite(charge, LOW);
delayMicroseconds(50) в строках 36,38,у меня оптимально вышло 900,400,а так схема для домашнего пльзования отличная,для интервала 2-15р надо другую индуктивность 3,5mH,до 15мкф меряет все конденсаторы,после низкочастотные через раз или вообще не меряет,предел 30мкф
прошу прощения за неточность резистор 1 вт
Хорошо, спасибо за конструктивные комментарии. Надеюсь, они помогут другим пользователям нашего сайта, которые будут собирать данный проект
Здраствуйте, у меня появилось два вопроса. Я начинающий электроник, поэтому не совсем понимаю, на что уходит земля со схемы в итоге и какой минимальной мощности брать резисторы, чтобы они не сгорели?
И можно ли заменить LM741 на LM741CN без изменения самой схемы или придётся всё же что-то подправить?
Я думаю что заменить можно ничего не меняя
Благодарю за ответы.
Да не за что, заходите к нам еще
Добрый вечер. Она никуда не уходит, она является общим проводом в схеме. Резисторы можно брать самые обычные, у нас вся схема питается же всего от 5 В.
Здравствуйте Admin — new, я вот подумал, если хотите то могу фотками и «печаткой» поделиться. Видео нет, да и не нужно оно. Надумаете дайте знать и адрес, куда скинуть всё.
Добрый вечер. Загрузите на какой-нибудь файлообменник (например, яндекс.диск или облако от mail.ru), а здесь ссылку напишите для скачивания. Буду признателен.
Вот ссылка:
https://drive.google.com/folderview?id=1WQCcxdIJegyk7kPk5f-Ubd55F-RyCl1s
Все детали за исключением оу, как на схеме. Печатная плата только «от руки по клеткам», я так делаю всегда. Если захотите, то в lay будет не сложно сделать по образцу, как-то так короче.
Хорошо, спасибо. В ближайшее время добавлю ваши фото в статью.
С НОВЫМ ГОДОМ ВАС!
Здравствуйте, скажите пожалуйста, можно ли использовать arduino nano вместо UNO?
По настройке, нужно ли подбирать какие либо детали или нет? Я понял что нужно собрать по схеме, «закинуть» скетч и только выбирая кнопкой режим измерения ставить либо С1 — 0,1 мкФ. — для измерения индуктивности, либо L1 — 10 мГн — для измерения ёмкости? Я правильно понимаю?
Спасибо, и вас с наступившим Новым годом.
Да, можно использовать arduino nano. В основном вы все правильно поняли. Но если вдруг у вас все сразу не заработает так, как надо (а такое бывает), то советовал бы начать отладку проекта с использованием только одного режима работы — либо для измерения емкости, либо для измерения индуктивности
Здравствуйте, собрал я данный девайс. Работает, только врёт немного. Изначально мне нужно было измерять индуктивность. Проблема в том, что цифры прыгают — так очень неудобно. Единственный метод настройки — подгонка конденсатора, чтоб точно уже известную индуктивность «поймать», ну и потом уже неизвестную мерять, больше не додумаюсь не до чего. Скажите, а в скетче ничего нельзя поменять чтоб подогнать, мож значение какое?
Заранее благодарен.
Александр, можно попробовать поизменять значения переменных capacitance и inductance
Здравствуйте, спасибо вам, но вроде разобрался. Перепробовал разные оу(конденсатор 100n) и нашёл подходящий — НА17741,но так у меня получилось, у других может и подругому будет. Показывает от 1mH и выше вроде правильно, если ниже индуктивность, то не очень на мой взгляд. Спасибо вам за схему!
Спасибо и вам за полезный комментарий к статье.
а если ввести постоянную составляющую при подаче импульса — то не получиться избавиться от ОУ ?
Не получится. Операционный усилитель в этой схеме используется для преобразования синусоидального колебания в последовательность прямоугольных импульсов. А если вы от него избавитесь, то каким образом вы будете осуществлять это преобразование? Есть, конечно, способы. Но они вряд ли будут проще использования ОУ, которые сейчас достаточно дешево стоят