Projeto eletrônico: Medidor de capacitância digital baseado no microcontrolador PIC16F877A

Tempo de leitura: 4 minutes

Princípio de funcionamento da montagem eletrônica:

Várias técnicas estão disponíveis na literatura para medições de capacidade mais complicadas. A maioria de seus métodos requer conhecimento preciso da frequência ou calibração manual.

Método amperímetro-voltímetro:

O princípio do método consiste em impor uma tensão senoidal em uma frequência fixa no terminal do capacitor e, em seguida, medir a corrente eficaz. A impedância igual a 1 / (cw) no módulo é igual à razão entre a tensão e a corrente em valores rms.

Nesta técnica você tem que conhecer três parâmetros: A frequência, a tensão e a corrente que não são fáceis de implementar!

 

Método de ponte divisora ​​de capacidade:

Este é um método original muito fácil de implementar, semelhante ao método usado no projeto do ohmímetro digital. O circuito básico é uma ponte divisora ​​de capacitância!

Com C_REF a capacitância de referência conhecida é fixada com grande precisão. C_MES: a capacidade a ser medida. Tensão Vin é uma tensão senoidal de frequência fixa, a precisão da frequência não é muito importante. A tensão de entrada deve ser inferior a 5 V (valor máximo). Para simplificar os cálculos, usamos C_REF = C1, C_MES = C2.

Vemos na equação (1) que a capacitância C2 (C_MES) depende apenas da tensão de entrada, da tensão de saída e da capacitância de referência C1. A fórmula mostra que a capacitância C2 é independente da frequência! É esta equação que implementaremos no microcontrolador.

O microcontrolador PIC16F877A adquire as tensões Vin (AN0) e Vout (AN1), então calcula o valor máximo dos dois sinais e então deriva a capacitância C2 usando a equação (2).

Observação :

O circuito de medição não é protegido contra sobretensões, portanto a meia onda negativa da onda senoidal pode destruir a porta do microcontrolador 🙁. Aqui está um pequeno conjunto que torna possível cortar a tensão para +/- 5V e, em seguida, remover a alternância negativa.

O circuito é robusto, permite que as medições sejam feitas mesmo que o sinal seja distorcido, desde que seja periódico (sinal cortado)!

 

  • Vin0: A tensão de entrada senoidal do conjunto desprotegido de frequência fixa
  • Vin: A tensão de entrada da ponte protegida
  • Vout: A tensão de saída da ponte
  • R1: Resistência da proteção do diodo
  • D1, D2: diodo Zener Para limitar a tensão a +/- 4,7V
  • D3: diodo de supressão de meia onda negativa
  • C2: Capacidade de referência
  • C2: Capacidade a ser medida

 

Ausência de D3: Vin = 10v AC, f = 50Hz:

Presença de D3: Vin = 4v AC, f = 50Hz:

Programa MikroC:

#define                 C2                1e-6
#define                 Ref_ADC           5.0
#define                 Max_ADC           1023.0
#define                 Init_Vlaue        0.0
#define                 Count_Max         256

/* Configurações de pinagem de LCD */
sbit LCD_RS at RB0_bit;
sbit LCD_EN at RB1_bit;
sbit LCD_D4 at RB2_bit;
sbit LCD_D5 at RB3_bit;
sbit LCD_D6 at RB4_bit;
sbit LCD_D7 at RB5_bit;

// Direção do pino
sbit LCD_RS_Direction at TRISB0_bit;
sbit LCD_EN_Direction at TRISB1_bit;
sbit LCD_D4_Direction at TRISB2_bit;
sbit LCD_D5_Direction at TRISB3_bit;
sbit LCD_D6_Direction at TRISB4_bit;
sbit LCD_D7_Direction at TRISB5_bit;


double                          Capa_uF=0.0;
double                          Max_Vin=0.0;
double                          Max_Vout=0.0;
double                          ADC_Volt=0.0;

unsigned int                    Data_ADC=0;
long                            Count_Perdiode=0;

long                            i=0;
char                            Capa_F_Char[16];
char                            Max_Vin_Char[16];
char                            Max_Vout_Char[16];

void main()
{
   // LCD de inicialização, ADC
   Lcd_Init();
   ADC_Init();
   Lcd_Cmd(_LCD_CLEAR);
   Lcd_Cmd(_LCD_CURSOR_OFF);

   Lcd_Out(1, 5, "Capacitância");
   Lcd_Out(2, 16, "uF");

   TRISA =  0xFF;
   TRISB =  0x00;

   PORTB=0x00;
   PORTB=0x00;

   ADCON1=0x00;

   while(1)
   {
       // Meça o valor máximo da tensão de entrada (Vin)
       Data_ADC= ADC_Read(0);
       ADC_Volt =(double)Data_ADC * Ref_ADC/Max_ADC;
       if( ADC_Volt>= Max_Vin)  Max_Vin= ADC_Volt;
       FloatToStr(Max_Vin, Max_Vin_Char);

       // Meça o valor máximo da tensão de saída (Vout)
       Data_ADC= ADC_Read(1);
       ADC_Volt =(double)Data_ADC * Ref_ADC/Max_ADC;
       if( ADC_Volt>= Max_Vout)  Max_Vout= ADC_Volt;
       FloatToStr(Max_Vout, Max_Vout_Char);

       // Calcule o valor do capacitor C1 em uF
       Capa_uF = 1e6*C2*((Max_Vin/Max_Vout) - 1.0);
       FloatToStr(Capa_uF, Capa_F_Char);
       
       // Atualize os valores máximos
       Count_Perdiode++;
       if( Count_Perdiode == Count_Max)
       {
           Max_Vout =Init_Vlaue;
           Max_Vin  = Init_Vlaue;
           Count_Perdiode=0;
       }

       // Exibição
       Lcd_Out(2,3,Capa_F_Char);
       Lcd_Out(2, 16, "uF");
       Lcd_Out(2,12,"   ");
       

   }

}

 

Comentários do programa:

O valor Max_Count é usado para definir um período de reinicialização para os valores máximos de tensão, mas por que fazer isso? O programa permite manter na memória os valores máximos das tensões, se por exemplo ocorreu uma excursão pode gerar uma falsa medição ou o interesse de definir um período de zeragem. Você pode aumentar o valor para aumentar o período de reinicialização

O capacitor C1 é fixado em 1uF, você pode alterar o valor com a condição de alterar o valor externo de C2. A escolha de seu valor depende do valor de C1, de preferência mais próximo de C2 para ganho de precisão.