Все радиолюбители знакомы с мультиметром (тестером), который является отличным инструментом для измерения напряжения, тока, сопротивления и т. д. Но иногда нужно измерить индуктивность и емкость, что невозможно с обычным мультиметром. Существуют специальные мультиметры, которые могут измерять индуктивность и емкость, но они являются дорогостоящими.
В статье описано создание измерителя частоты, ёмкости и индуктивности, используя Arduino с отображением значений на дисплее LCD 1602. В схеме предусмотрена кнопка для переключения между отображением емкости и индуктивности.
Принципиальная схема проекта.

Переменное сопротивление RV1 используется для управления яркостью дисплея 1602. Схема питается от вывода +5В Arduino, сама плата получает питание от адаптера USB или 12В. Кнопка SA1 изменяет режим работы схемы — измерение индуктивности или емкости.
Скетч для Arduino
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 117 118 119 120 121 122 123 124 125 126 127 128 | #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); } |