Arduino induktans/kapacitans/motstånd mätaren (2 / 3 steg)
Steg 2: Kod och prestanda
Så tre funktionerna mäta ben kapacitans, induktans och motstånd, måste vi välja vi vill göra, att välja funktionen och användning 2 bitar kan räkna 0-0,0-1,1-0,1-1.
Så vi använder två switch för att välja, vilket gör dem fungerar som en dip-växel med dem som drar ner, att mäta induktans är 0-0, 0-1 för kapacitans, motstånd mot 1-0, det är hur vi väljer att mäta.
För att mäta induktans användning LM393 jämförelseperson att mäta kapacitans LM741, och att mäta motstånd lätt Använd en 10 k resistor och en spänningsavdelare.
Antag att vi vill beräkna R1. Vi vet att R2 har värdet 10k, vi vet att Vin har ett värde på 5V (som vi brukar hitta i Arduino miljön) och att läsa på en analog Vout pin av Arduino är 750.
1.-vi vet att upplösningen på ADC Arduino är 10 bitar, vilket innebär att 1024 är möjligt divisioner (2 upphöjt till 10) för ett indatavärde mellan 0V och 5V. Så om vi sätter 5V på en analog stift, dess värde blir 1023 (1024 kommer inte ihåg som börjar räkna på 0, inte 1); om vi sätter 0V på stift, dess värde blir 0 och om till exempel 2.5V dess värde kommer vi att 511.
Därför, om det värde som ger behandlingen analoga stiftet i dess digitala värde 750, kan vi beräkna Vout, den tillverkade spänningen av spänningsdelare.
>> 5V / 1024 divisioner = 0, 00488V / division
>> 0.00488 volt / division • 750 divisioner = 3.66V
2.-vi kan redan tydliga R1, som var frågan:
>> Vout = (R2 / R1 + R2) • Vin
>> 3,66 V = (10k / R1 + 10k) • 5V
>> R1 + 10 k = 10 k • 5V / 3.66V
>> R1 = (10 k • 5V / 3.66V)-10 k = 3.66KΩ
I allmänhet kan vi beräkna värdet av R1 som:
>> R1 = (R2 • Vin / Vout)-R2
Samma kod är i spanska dokumentation, så om du har några frågor vänligen säga så:
#include LiquidCrystal lcd (13, 8, 7, 5, 4, 2);
#define R_1 A1
#define R_2 A2
#define IND_1 6
#define IND_2 12
#define fuente_pin 11
#define switch_pin 10
#define descarga_pin 9
#define PIN_1 A3
#define PIN_2 A4
Variablerna leer pines
int pin_1;
int pin_2;
Variablerna para inductometro
dubbel pulso;
dubbel frecuencia;
dubbla capacitancia;
dubbla inductancia;
Capacimetro
float R = 1.0e6;
float C = 0;
flyta RC = 0;
lång t_inicio = 0;
flyktiga lång t_alto = 0;
lång T = 0;
flyta VCC = 4,50;
flyta Vref = VCC / 2;
flyta V0 = 0;
flyta error_correccion = 40.;
int retardo_delay = 20;
Variablerna resistometro
int vR_1 = 0;
int vR_2 = 0;
flyta Vin = 5;
flyta Vout = 0;
flyta Res_1 = 10000;
flyta Res_2 = 9000000;
flyta r_1 = 0;
flyta r_2 = 0;
flyta Resistor_1 [8],
flyta Resistor_2 [5].
float ResArreglo_1;
float ResArreglo_2;
void setup() {
LCD.BEGIN (16, 2);
Configuracion de tallar
pinMode (PIN_1, indata);
pinMode (PIN_2, indata);
Configuracion Inductometro
pinMode (IND_1, indata);
pinMode (IND_2, OUTPUT);
capacitancia = 0.000001021;
Delay(200);
Configuracion de Resistometro
pinMode (R_1, indata);
pinMode (R_2, indata);
Configuracion Capacimetro
attachInterrupt (1, stop, RISING);
VREF = VCC / 2;
pinMode (fuente_pin, produktionen);
digitalWrite (fuente_pin, låg);
pinMode (switch_pin, ingång);
pinMode (descarga_pin, ingång);
}
void loop() {
leerpines();
om (pin_1 == låg & & pin_2 == låg) {
digitalWrite (IND_2, hög);
Delay(5);
digitalWrite (IND_2, låg);
delayMicroseconds(100);
Pulso = pulseIn (IND_1, hög, 5000);
LCD.Clear();
om (pulso > 0,1) {
frecuencia = 1.E6 / (2 * pulso);
inductancia = 1. / (capacitancia * älskar * älskar * 4.*3.1459 * 3.14159);
inductancia * = 1E6;
lcd.setCursor (2, 0);
LCD.Print("INDUCTANCIA:");
Delay(200);
om (inductancia > = 1000) {
lcd.setCursor (0, 1);
int valor = (inductancia / 1000) - 0,5;
LCD.Print(Valor);
lcd.setCursor (6, 1);
LCD.Print("MH");
} annat {
lcd.setCursor (0, 1);
int valor_2 = inductancia + 10.
LCD.Print(valor_2);
lcd.setCursor (6, 1);
LCD.Print("uh");
}
} else om (pulso < 0,1) {
lcd.setCursor (2, 0);
LCD.Print ("INSERTAR IND");
}
Delay(300); } om (pin_1 == låg & & pin_2 == hög) {
LCD.Clear();
för (int jag = 0; jag < = 7; i ++) {
Resistor_1 [i] = analogRead(R_1);
ResArreglo_1 = ResArreglo_1 + Resistor_1 [i];
}
vR_1 = (ResArreglo_1 / 8.0);
Vout = (Vin * vR_1) / 1023;
r_1 = Res_1 * (1 / ((Vin / Vout) - 1));
lcd.setCursor (2, 0);
LCD.Print("RESISTENCIA:");
om (r_1 < = 999) {
lcd.setCursor (0, 1);
LCD.Print(r_1);
lcd.setCursor (9, 1);
LCD.Print("Omhs");
} else om (r_1 > = 1000) {
r_1 = r_1 / 1000;
lcd.setCursor (0, 1);
LCD.Print(r_1);
lcd.setCursor (9, 1);
LCD.Print("KOmhs");
}
Delay(500);
ResArreglo_1 = 0;
} om (pin_1 == hög & & pin_2 == låg) {
LCD.Clear();
om (debounce(switch_pin) == låg)
{
pinMode (descarga_pin, produktionen);
digitalWrite (descarga_pin, låg);
Delay(100);
pinMode (descarga_pin, ingång);
digitalWrite (fuente_pin, hög);
t_inicio = micros(); } om (t_alto > 0 & & t_inicio > 0 & & (t_alto - t_inicio) > 0)
{
T = (t_alto - t_inicio);
RC = -T / log ((Vref-VCC) / (V0 - VCC));
VREF = VCC/2
V0 = 0V
C = RC / R; Valor sv uF
lcd.setCursor (0, 0);
LCD.Print("C:");
lcd.setCursor (3, 0);
LCD.Print (C * 1000, 1);
lcd.setCursor (13, 0);
LCD.Print("NF");
lcd.setCursor (0, 1);
LCD.Print("C:");
lcd.setCursor (3, 1);
LCD.Print (C * 1000000 - error_correccion, 0);
lcd.setCursor (13, 1);
LCD.Print("PF"); t_inicio = 0;
t_alto = 0; digitalWrite (fuente_pin, låg);
Delay(2000);
}
}
} void leerpines() {
pin_1 = digitalRead(PIN_1);
pin_2 = digitalRead(PIN_2);
} makulera stop()
{
t_alto = micros();
} int debounce (int stift)
{
int estado;
int previo_estado;
previo_estado = digitalRead(pin);
för (int jag = 0; jag < retardo_delay; i ++)
{
Delay(1);
Estado = digitalRead(pin);
om (estado! = previo_estado)
{
Jag = 0;
previo_estado = estado;
}
}
returnera estado;
}