ARDUINO
NANO = LCMETER
Medindo capacitor de 510pF sem tolerancia especificada
Um simples LCmeter, como muitos já publicados, mas este tem
algumas
caracteristicas diferentes.
São elas :
Usa o arduino nano.
Tem o programa (sketch) aberto, com possibilidades de
alteração.
O oscilador usa um comparador simples e fácil de achar o LM339.
É possivel alterar os valores do tanque oscilador, de forma a
simplificar a montagem com a obtenção destes componentes.
É possivel ajustar os valores dos componentes do oscilador,
no sketch, e obter uma ótima precisão.
O programa original (sketch) foi copiado deste link
http://www.kerrywong.com/2010/10/16/avr-lc-meter-with-frequency-measurement/
Dentro dos problemas do oscilador / frequencimetro, relatados pelo
Kerry e pelo autor da biblioteca do frequencimetro, é posivel
chegar a um otimo LCmeter.
Eu tinha em mente outro tipo de sistema, com o zero antes de cada
medição, mas o tempo de zeragem (via rele) e nova
medição, aliado ao drift do oscilador inviablizou o
projeto.
O programa original foi adaptado para usar o arduino uno (nano),
simplificado e modificado
para um melhor layout (os pinos do arduino para o LCD podem ser
alterados).
Esquema :
Os valores de L e C são discutidos no texto a seguir:
A estabilidade esta ligada diretamente a precisão, assim
escolher um componente com qualidade é fundamental.
Os valores de C e L podem variar de 1000 a 2000pF e L de 50 a
80µH. O importante é que a frequencia do oscilador fique
em torno de 500kHz. Valores de frequencia acima de 600kHz ou abaixo de
400kHz não são aconselhaveis, pois acima de 600kHz temos
problemas de oscilação e abaixo de 400kHz problemas de
pouca variação de frequencia em função de
valores baixos de L ou C.
Planilha excel para calculo e ajuste do oscilador
L µH |
L0 |
C pF |
C0 |
F L+C |
|
F2 +C0+L0 |
|
delta F-F2 |
50 |
|
1000 |
0,1 |
711,763 |
|
711,727 |
|
0,036 |
60 |
|
1500 |
0,1 |
530,516 |
|
530,499 |
|
0,018 |
70 |
|
2000 |
0,1 |
425,359 |
|
425,349 |
|
0,011 |
80 |
|
2500 |
0,1 |
355,881 |
|
355,874 |
|
0,007 |
Os
valores da frequencia na tabela estão em kHz
Tabela
de frequencias, com (50µH e 1000pF) 771kHz a
adição de 0,1pF ocasiona uma variação de
36Hz, já com 355khz (80µH e 2500pF) a
variação pela mesma adição é de
apenas 7Hz.
L µH |
L0 |
C pF |
C0 |
F L+C |
|
F2 +C0+L0 |
|
delta F-F2 |
50 |
0,001 |
1000 |
|
711,763 |
|
711,755 |
|
0,007 |
60 |
0,001 |
1500 |
|
530,516 |
|
530,512 |
|
0,004 |
70 |
0,001 |
2000 |
|
425,359 |
|
425,356 |
|
0,003 |
80 |
0,001 |
2500 |
|
355,881 |
|
355,879 |
|
0,002 |
A
mesma tabela agora com adição de 1nH, mais uma vez mostra
que quanto maior a frequencia do oscilador melhor a resposta.
Optei por uma frequencia em torno de 500kHz, por ter uma boa resposta
de variação e ter estabilidade do
oscilador.
Assim a bobina L foi feita com fio AWG 32 em um transformador de FI
10mm toko com 60 voltas (15 em cada um dos 4 rasgos). Esta bobina
é blindada e ainda pode ser encontrada no comercio ou em
sucatas.
(tenho um bom estoque é só escrever).
Ficou com 63µH, depois de pré-ajustada (a partir deste
ajuste, os proximos serão em software - sketch).
O capacitor usei um de styroflex de 1500pF, o valor medido dele, foi
identico a um de mica prateada de 2% de tolerancia (medido em um
LCmeter).
Fotos da montagem do oscilador LM339 em "dead bug" inseto morto.
Montei o arduino, o regulador de 5V e o display todos em uma placa.
Já o oscilador ficou em uma placa em seprado, pois tem maior
estabilidade e fica longe de locais com calor. A placa do oscilador foi
soldada em uma placa maior para ter mais aterramento e diminuir a
interferencia de capacitancias externas, pois usei uma caixa plastica
para montagem.
Fotos da PCB padrão, com soquete para o LCD.
Procurei não usar componentes dificeis, pois tinha em
mãos indutores e capacitores com otima precisão. Isto
para que a montagem pudesse ser facilmente duplicada.
Para ajuste e aferição do LCmeter usei um capacitor
de 82pF 0,5% e um indutor de 90µH 2%.
Primeiro medi o valor da capacitancia parasita ou do circuito montado e
coloquei o valor na planilha. Recalculei, usando a planilha, a
indutancia em
função da frequencia e capacitancia total.
Para isto
modifiquei o sketch de tal forma que mostra o valor lido de
frequencia e o valor do capacitor ou indutor.
Para
ler a frequencia e o valor do capacitor ou indutor medido, em
ajuste/aferição é preciso retirar as barras destas
linhas e compilar e carregar no arduino :
//
delay(1000); // usado somente
para teste mostrando a frequencia
//
displayFreq(frq); // usado somente para teste mostrando a
frequencia
//
delay(1000);// usado somente para teste mostrando a
frequencia
fica assim :
delay(1000); // usado somente
para teste mostrando a frequencia
displayFreq(frq); // usado somente para teste mostrando a
frequencia
delay(1000);// usado somente para teste mostrando a
frequencia
Fiz varias alterações dos valores de L e C no sktech,
até ao ler os valores padrão, as leituras ficavam dentro
da tolerancia. (os valore de L e de C no sketch é que importam
nas medições).
Fotos do LCmeter medindo 82pF 0,5% e 90µH 2%.
Quando obtive exito, medi outros valores de L de 10 pF até
1500pF (entre 0,5 a 2%) obtendo leituras dentro das toleracias. Repeti
com indutores de 90 a 2160pF (2%) obtendo leituras dentro da tolerancia.
Para uma leitura com maior conforto, o ideal é esperar o
oscilador estabilizar o que acontece de 2 a 5 minutos. O oscilador
corre sempre, alguns Hz no inicio e depois estabiliza com cerca de 5Hz
por minuto.
10pF 3%
270pF 5%
1500pF 1,5nF 2%
1µH comercial 10%
5,6µH comercial 10%
180µH 2%
360µH 2%
720µH 2%
2160µH 2%
Para obter melhores leituras, principalmente abaixo de 1µH
é necessario melhorar os valores da planilha na casa de
1µH e ou 1pF.
Uma parte muito importante são as pontas de
medição, para não provocar
alterações de capacitancia, usei dois pedaços de
cabo coaxial, com cerca de 10cm cada, o lado vivo tem somente o centro
ligado ao vivo e a malha ligada ao terra (no conector), já o
terra tambem tem somente o centro ligado a ponta de
medição e no concetor BNC, o centro do coaxial e os
terras dos dois cabos estão ligados juntos ao terra do BNC.
Foto :
A ponta terra é a verde a azul é a ponta viva ....
é a idade !
Frente do aparelho com caixa de plástico duro.
Parte trazeira com vista da placa de aterramento do oscilador.
Lateral da caixa chave indutor / capacitor e BNC para
medições.
Lateral da caixa entrada de Vcc 9V.
Vista da caixa lado superior botão de ZERO
(calibração).
Montei outros dois osciladores para teste :
Este oscilador teve um comportamento melhor ( fiacava estavel em pouco
tempo)...mas não é possivel duplicar, devido a bobina
osciladora.
Biblioteca
frequency counter
Biblioteca e sketch ...library and sketch zip
file
Sketch do LCmeter
/**
* baseado no trabalho de
* AVR LC/Frequency Meter
* Kerry Wong
* http://www.kerrywong.com
*************************************************
* adaptado e modificado por py2ohh miguel
************************************************
*/
#include <LiquidCrystal.h>
#include <FreqCounter.h>
LiquidCrystal lcd(3, 6, 10, 11, 12, 13);// estes pinos podem ser
modificados a gosto
unsigned long frq;
int modo;
int ChvCal = 2; // zero
float F0 = 516015;
float v;
const float Cth = 1515 * 1e-12; // 1500pF+15pF parasita = ajustar este
valor !
const float Lth = 63.42 * 1e-6; //61.1+2,32 µH dos lides +
interno = ajustar este valor !
float l0 = Lth;
float c0 = Cth;
void setup() {
lcd.begin(16, 2);
digitalWrite(7, HIGH);//sensor L/C
digitalWrite(ChvCal, HIGH);
verificachave();
}
void loop() {
FreqCounter::f_comp = 100;//ajuste de leitura de frequencia
FreqCounter::start(1000);//tempos de leitura 1segundo
delay(100);
while (FreqCounter::f_ready == 0)
frq = FreqCounter::f_freq; //lê a frequencia
verificachave();
if (digitalRead(ChvCal) == LOW) {
switch (modo) {
case 1:
c0 = calcV(frq, Cth) + Cth;
F0 = frq ;
break;
case 2:
l0 = calcV(frq, Lth) + Lth;
F0 = frq;
break;
case 3:
break;
default:
break;
}
lcd.setCursor(12, 0);
lcd.print("Cal");
}
displayV(frq);
//Para testes ,mostrando a frequencia retire as duas barras da frente
das 3 linhas abaixo
// Compile o sketch e carregue no nano
// delay(1000); // usado somente
para teste mostrando a frequencia
//
displayFreq(frq); // usado somente para teste mostrando a
frequencia
//
delay(1000);// usado somente para teste mostrando a
frequencia
}
void verificachave() {
if (digitalRead(7) == LOW) {
modo = 2;
lcd.setCursor(0, 0);
lcd.print("INDUTOR ");
} else {
modo = 1;
lcd.setCursor(0, 0);
lcd.print("CAPACITOR
");
}
}
void displayFreq(long fin) {
lcd.setCursor(0, 1);
lcd.print("
");
lcd.setCursor(0, 1);
float f = 0;
if (fin < 1000) {
f = 1.0 * ((float) fin);
lcd.print(f, 0);
lcd.print(" Hz");
} else if (fin >= 1000) {
f = ((float) fin) / 1000.0;
lcd.print(f, 3);
lcd.print(" KHz");
}
}
void displayV(float f) {
//float f = (float) fin;
float v = 0;
lcd.setCursor(0, 1);
lcd.print("
");
lcd.setCursor(0, 1);
switch (modo) {
case 1:
v = calcV(f, c0);
if (v < 1e-9) {
v = (v * 1e12); // pico
lcd.print(v);
lcd.print(" ");
lcd.print("pF");
} else if (v >=
1e-9 && v < 1e-6) {
v = v * 1e9; // n
lcd.print(v);
lcd.print(" ");
lcd.print("nF");
} else if (v >=
1e-6 && v < 1e-4) {
v = v * 1e6; // n
lcd.print(v);
lcd.print(" ");
lcd.print("uF");
} else {
lcd.print("---");
}
break;
case 2:
v = calcV(f, l0);
if (v < 1e-6) {
v = v * 1e9; //nH
lcd.print(v);
lcd.print(" ");
lcd.print("nH");
} else if (v >= 1e-6 && v
< 1e-3) {
v = v * 1e6; //uH
lcd.print(v);
lcd.print(" ");
lcd.print("uH");
} else if (v >= 1e-3 && v
< 1) {
v = v * 1e3;
lcd.print(v);
lcd.print(" ");
lcd.print("mH");
} else if (v >= 1 && v <
100) {
lcd.print(v);
lcd.print(" ");
lcd.print("H");
} else {
lcd.print("---");
}
break;
case 3 :
break;
default:
break;
}
}
float calcV(float f, float VRef) {
float v = 0;
v = ((F0 * F0) / (f * f) - 1.0) * VRef;
return v;
}
xxxxxxxxxxxxxxxxxxxxxxxxxx
73 de py2ohh miguel
aug/2018