На платформе Arduino можно собрать простой измеритель емкости и индуктивности. Прибор позволяет измерять индуктивность катушек от единиц мкГн до десятков мГн и емкость конденсаторов от десятков пФ до 0,5 мкФ с достаточно большой точностью. Схема собрана на компараторе LM311 и нескольких пассивных элементах, на плате Arduino собран частотомер (до 6,5 МГц).
Измерение емкости и индуктивности происходит достаточно просто, так как L/C элементы представляют собой колебательный контур, то компаратор совместно с колебательным контуром будет генерировать частоту, а частотомер на Arduino произведет пересчет частоты в значения индуктивности или емкости. В уст-ве две кнопки управления, первая переключение режимов измерения L/C, вторая калибровка нуля. Из схемы видно, что в уст-ве уже имеется индуктивность и емкость, индуктивность необходима для измерения емкости, а так же для измерения малых величин индуктивности. Емкость нужна для измерения индуктивности, при этом индуктивность встроенная в прибор может иметь большой разбег в номинале, а конденсатор должен быть точным, от него зависит базовая погрешность прибора. При первоначальной настройке прибора необходимо закоротить контакты «⊥» и «L», нажать на кнопку калибровки нуля, при этом произойдет измерение индуктивности встроенная в прибор, значение индуктивности будет сохранено в энергонезависимой памяти. Далее можно подключить любую катушку или конденсатор выбрать нужный режим (L/C) и провести измерение. Для измерения емкости необходимо нажать на кнопку L/C, закоротить контакты «⊥» и «L», а емкость подключить к контактам «⊥ или L» и «C».
При измерении индуктивности или емкости значения индуктивности или емкости внутренних элементов (L1 C1), будут автоматически вычтены из конечного результата. Полученные значения выводятся на LCD индикатор 1602 на первую строку, а во второй строке выводится резонансная частота.
#include <FreqCount.h> // freqcount.zip #include <LiquidCrystal.h> LiquidCrystal lcd(8, 7, 2, 3, 4, 6);// RS,E,D4,D5,D6,D7 #include <EEPROM.h> unsigned long f; const float c = 1000.0*pow(10,-12); float l_pop=0.00; float l,c_iz; int l_int; byte lc,w; void setup() {Serial.begin(9600); lcd.begin(16, 2);// LCD 16X2 FreqCount.begin(1000); pinMode(13,INPUT);pinMode(12,INPUT); l_pop = float(EEPROM.read(0)*256 + EEPROM.read(1))/100; Serial.println(float(EEPROM.read(0)*256 + EEPROM.read(1))/100); } void loop() { lcd.setCursor(0,1);lcd.print("F = "); if(FreqCount.available()&&w==0){f = FreqCount.read();lcd.print(f);lcd.print(" Hz ");} if(digitalRead(13)==HIGH){ l_pop = float(1000000/(4*PI*PI*f*f*c));lcd.clear();lcd.setCursor(0,0);lcd.print(" calibration 0 "); l_int=round(l_pop*100);EEPROM.update(0,highByte(l_int)); EEPROM.update(1,lowByte(l_int));delay(1000); } if(digitalRead(12)==HIGH&&lc==0){lc=1;delay(200);w=1;} if(digitalRead(12)==HIGH&&lc==1){lc=0;delay(200);w=1;} if(lc==0){ l = float(1000000/(4*PI*PI*f*f*c))-l_pop; lcd.setCursor(0,0);lcd.print("L = "); if(l<=1000){lcd.print(l,1);lcd.print(" uH ");} if(l>1000){lcd.print(l/1000,3);lcd.print(" mH ");}} if(lc==1){ c_iz=float(1000000000000/(4*PI*PI*f*f*l_pop*pow(10,-6))-c*pow(10,12)); lcd.setCursor(0,0);lcd.print("C = "); if(c_iz<=1000){lcd.print(c_iz,1);lcd.print(" pF ");} if(c_iz>1000){lcd.print(c_iz/1000,2);lcd.print(" nF ");}} w=0;}
В скетче необходимо указать точную емкость эталонного конденсатора:
const float c = 1000.0*pow(10,-12); // == 1000 пФ
Конденсатор 0,1 мкФ |
Конденсатор 82 пФ |
Эталонный конденсатор |
Так прибор способен проводить измерения емкости только до 0,5 мкФ, было принято решение немного доработать уст-во. Добавлена еще одна клемма для подключения электролитических конденсаторов емкостью от 0,1 до 10000 мкФ и пара резисторов.
Процесс измерения емкости электролитических конденсаторов достаточно прост, через резистор номиналом 1 кОм подается напряжение 5 В на конденсатор, одновременно аналоговый вход микроконтроллера производит измерение напряжения подаваемое на конденсатор, как только напряжение достигнет 63% от 5 В, микроконтроллер подсчитает время заряда и пересчитает его по формуле: T = RC. Как и в первых двух режимах измерения, можно воспользоваться кнопкой калибровки нуля, для более точного измерения емкости конденсаторов небольшого номинала.
#include <FreqCount.h> #include <LiquidCrystal.h> LiquidCrystal lcd(8, 7, 2, 3, 4, 6);// RS,E,D4,D5,D6,D7 #include <EEPROM.h> unsigned long f,time0,time1,time2; const float c = 1000.0*pow(10,-12); float l_pop=0.00; float l,c_iz,c_uf,null0; int l_int; byte lc,w; void setup() {Serial.begin(9600);lcd.begin(16, 2);// LCD 16X2 FreqCount.begin(1000);// 1000 мс - время измерения частотомера pinMode(13,INPUT);pinMode(12,INPUT);pinMode(A0,INPUT); l_pop = float(EEPROM.read(0)*256 + EEPROM.read(1))/100; // eeeprom } void loop() { ///////////////////// F /////////////////////////////////////////////////// if(lc<2){lcd.setCursor(0,1);lcd.print("F = "); if(FreqCount.available()&&w==0){f = FreqCount.read();lcd.print(f);lcd.print(" Hz ");}} //////////////////// calib 0 ////////////////////////////////////////////// if(digitalRead(13)==HIGH&&lc<2){ l_pop = float(1000000/(4*PI*PI*f*f*c));lcd.clear();lcd.setCursor(0,0);lcd.print(" calibration 0 "); l_int=round(l_pop*100);EEPROM.update(0,highByte(l_int)); EEPROM.update(1,lowByte(l_int));delay(1000);} ///////////////////////// button L/C/Cuf ////////////////////////////////////// if(digitalRead(12)==HIGH){lc++;lcd.clear();w=1;delay(200);if(lc>2){lc=0;}} /////////////////// L ///////////////////////////////////////////////////// if(lc==0){ l = float(1000000/(4*PI*PI*f*f*c))-l_pop; lcd.setCursor(0,0);lcd.print("L = "); if(l<=1000){lcd.print(l,1);lcd.print(" uH ");} if(l>1000){lcd.print(l/1000,3);lcd.print(" mH ");}} ////////////////// C pF nF //////////////////////////////////////////////// if(lc==1){ c_iz=float(1000000000000/(4*PI*PI*f*f*l_pop*pow(10,-6))-c*pow(10,12)); lcd.setCursor(0,0);lcd.print("C = "); if(c_iz<=1000){lcd.print(c_iz,1);lcd.print(" pF ");} if(c_iz>1000){lcd.print(c_iz/1000,3);lcd.print(" nF ");}} //////////////// C uF ///////////////////////////////////////////////////// if(lc==2){ lcd.setCursor(15,0); lcd.print("*"); pinMode(9,OUTPUT);digitalWrite(9,HIGH); time0=micros();while(analogRead(A0)<644){time2=micros()-time0;if(time2>=10000000){break;}}time1=micros()-time0; while(analogRead(A0)>0){pinMode(9,OUTPUT);digitalWrite(9,LOW);} lcd.setCursor(0,0);c_uf=time1;c_uf=c_uf/1000-null0;c_uf=abs(c_uf); if(time1>=10000000){lcd.setCursor(1,0);lcd.print(" TEST uF ");} else{lcd.print(" C = ");lcd.print(c_uf);lcd.print(" uF ");} if(digitalRead(13)==HIGH){null0=c_uf;lcd.clear();lcd.setCursor(0,0);lcd.print(" calibration 0 ");delay(1000);} delay(100);}w=0;}//loop
Идея не нова, но реализация выглядит «вкусно». Непременно спробую повторить. Спасибо Автору!
Евгений (UA9WNA)