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