Salve a tutti spero che qualcuno mi aiuti a risolvere un problema software che ho in contratto nella realizzazione di un LC meter appunto un induttanzimetro capacimetro, premetto che su internet c’è molto materiale ma quasi tutto per PIC o cmq non certo per Arduino, vi è un solo progetto con Arduino, ma che si differenzia non poco dal progetto più blasonato per PIC. La mia massima ispirazione è stato l’ottimo lavoro che potete trovare in questa pagina, ma con firmware già pronto alla scrittura, http://capasoblog.blogspot.it/2007/12/capaso-lc-meter-capacimetro.html, e cmq sempre per pic. Cioè LM311 e PIC. Io ho realizzato il medesimo schema ma utilizzando l’atmel 328p programmato con arduino, il tutto funziona egreggiamente nel senso che per la realizzazione definitiva bisogna applicare alcune formule, che data la frequenza di L1 e C1, e inseguito L1-C1-C2 è possibile ricavale L incognita oppure C incognita. Vi è un post in Inglese http://forum.arduino.cc/index.php/topic,8437.0.html dove viene realizzato un lc meter ma anche se il principio è lo stesso l’autore non fa una vera e propria calibrazione in quando nel codice addirittura inserisce, frequenza iniziale, capacita, e induttanza iniziale, e non utilizza lm311 bensi un altro comparatore. La mia domanda è questa, vi sono due librerie per leggere frequenze con arduino superiori a 100 khz una è FreqCounter Page has moved essa però non è compatibbile con gli ultimi ambienti di sviluppo arduino ma con la versione 0.22 si… Oppure FreqCount http://www.pjrc.com/teensy/td_libs_FreqMeasure.html#compare ma è divisa in due tipi che hanno una precisione differente in base alla frequenza da misurare. Sono riuscito con tutti è due i tipi a visualizzare la frequenza esatta sia con L1+C1(cioè F1) sia con L1+C1+C2(capacità di precisione quindi F2) comparato con un oscilloscopio. Il problema sorge adesso in quanto io dovrei memorizzare F2 dopo che entra in funzione un relè che mette in parallelo c2, in un certo istante, e memorizzare il valore in una variabile, è non deve essere più modificato, idem per F1 dopo aver staccato dal circuito ovviamente C2. Infatti dopo che ho memorizzato i valori di F1 e F2, posso tramite calcoli ricavarmi, Lx o Cx incognite infatti quando queste vengono messe sotto viene generata un’altra frequenza. Sono disposto a postare tutto il progetto, e il codice se qualcuno mi aiuta. In definitiva queste librerie possono essere stoppare. Il codice come lo scrivereste voi. Io vi posto il mio ora vediamo un pò… In base a queste formule :
F1=LETTA DAL MICRO IN UN DETERMINATO ISTANTE come faccio dato che la libreria parte in loop ???
F2=LETTA E MEMORIZZATA IN UN ALTRO ISTANTE QUANCO C2 E SOTTO IL CIRCUITO come faccio dato che la libreria parte in loop ??? e non c’è modo di stopparla??
APPLICARE NELLA FASE DI CALIBRAZIONE Cc=F2^/(F1^-F2^)*1015 Pf(il valore di c2) Lc=1/4?^*F1^*Cc avendo ora questi valori si può calcolare
Cx e Lx
ecco il codice----
#include <math.h>
#include <LiquidCrystal.h>
#include <FreqCounter.h> //compatibile solo con Arduino 0023
boolean Rele = 7;//pin assegnato al relè
LiquidCrystal lcd(12, 11, 6, 4, 3, 2);
unsigned long frq;
float Cx, Lx, Cc, Lc;
void setup() {
Serial.begin(57600);
lcd.begin(16, 2);//16 COLONNE e 2 RIGHE schermo LCD MODELLO HD44780
lcd.print("Induttanzimetro");//scrivo
pinMode (Rele, OUTPUT);//imposto il relè come uscita
}
float F2x(){ //ho provato con una funzione esterna ma la frequenza viene incrementata continuamente lo stesso
digitalWrite(Rele, HIGH); //metto sotto c2
delay(2000);
float F2 = 0;
F2 =frq; //immetto il valore della funzione frq in f2
return F2;
}
/*float calibF2(){ //tutto questo codice idem non funziona
float F2=0;
digitalWrite(Rele, HIGH);
delay(2000); //eccito il Relè per inserire c2 e misurare F2
//lcd.print("calibrazione attendere");
F2 = frq;
delay(2000);
digitalWrite(Rele, LOW); //diseccito il Relè per togliere c2 misuro F1
return F2;
//return F1=frq;
//delay(1000);
//passo al calcolo di Cc e Lc note
//Cc=((F2*F2)/((F1*F1)-(F2*F2)))*0.000000001015;
//Lc=(1/(39.478417*(F1*F1)*Cc));
//Fine calibrazione
//lcd.setCursor(0, 1);
//lcd.print(Cc);
//lcd.setCursor(5 , 1);
//lcd.print(Lc);
//delay(100);
//lcd.print("calibrazione terminata");
}*/
void loop() {
digitalWrite(Rele, LOW);
delay(2000);
FreqCounter::f_comp = 106;
FreqCounter::start(1000);
while (FreqCounter::f_ready == 0)
frq = FreqCounter::f_freq;
// lcd.setCursor(0, 1);
//lcd.print(frq);
float c;
c = F2x();
lcd.setCursor(0, 1);
lcd.print(c);
digitalWrite(Rele, LOW);
//lcd.setCursor(5 , 1);
//lcd.print(Lc);
}