Projet électronique : Capacimètre Numérique à base du microcontrôleur PIC16F877A

Projet électronique Capacimètre Numérique à base du microcontrôleur 1

 

Principe de fonctionnement du montage électronique :

Plusieurs techniques sont disponible dans la littérature pour la mesure de la capacité plus au mois compliquées. La plus part de ses méthodes nécessitent soit la connaissance de fréquence avec précision ou une calibration manuelle.

Méthode ampèremètre-voltmètre :

Le principe de la méthode consiste d’imposer une tension sinusoïdal à une fréquence fixe àla borne du condensateur puis mesurer le courant efficace. L’impédance égale à 1/(cw) en module égale le rapport entre la tension et le courant en valeurs efficaces.

Dans cette technique il faut connaitre trois paramètres : La fréquence, la tension et le courant qui n’est pas évident à mettre en ouvre !

Pour plus des renseignements sur les autres méthodes, pour pouvez télécharger le fichier PDF suivant :  Cours Mesure Capacité 

Méthode pont diviseur des capacités :

C’est une méthode originale très simple à mettre en œuvre, elle est semblable à la méthode utilisée dans le projet Ohmmètre Numérique Le circuit de base est un pont diviseur de capacité !

Projet électronique Capacimètre Numérique à base du microcontrôleur pont diviseur

Projet électronique Capacimètre Numérique à base du microcontrôleur simulation 1

Avec C_REF la capacité de référence connue est fixe avec une grande précision. C_MES : la capacité à mesurée. La tension Vin est un tension sinusoïdal  à fréquence fixe, la précision de fréquence n’a pas trop d’importance. La tension d’entrée doit être inférieur à 5V  (valeur maximale). Pour simplifié les calculs, on prend C_REF =C1, C_MES=C2.
Projet électronique Capacimètre Numérique à base du microcontrôleur équation

On constate dans l’équation (1) que la capacité C2 (C_MES) ne dépend que de la tension d’entrée, la tension de sortie et la capacité de référence C1. La formule montre que la capacité C2 est indépendante de la fréquence ! C’est cette équation qu’on va implémenter dans le microcontrôleur.

Le microcontrôleur PIC16F877A fait l’acquisition des des tensions Vin (AN0) et Vout (AN1), puis il calcul la valeur maximale des deux signaux ensuite déduire la capacité C2 en utilisant l’équation (2).

Remarque :

Le circuit de mesure n’est pas protéger contre les surtensions ainsi que l’alternance négative de la sinusoïde peut détruire le port du microcontrôleur 🙁 . Voila un petit montage qui permet d’écrêter la tension à +/-5V puis supprimer l’alternance négative.

Le circuit est robuste, il permet de faire les mesures même si le signal est distordu tant qu’il est périodique (signal écrêté) ! 

Projet électronique Capacimètre Numérique à base du microcontrôleur protéction

  • Vin0 : La tension sinusoïdal  d’entrée du montage non protégée de fréquence fixe
  • Vin : La tension d’entrée du pont protégée
  • Vout : La tension de sortie du pont
  • R1 : Résistance de la protection des diodes
  • D1, D2 : Diode Zener Pour limiter la tension à +/-4.7V
  • D3 : Diode de suppression de l’alternance négative
  • C2 : Capacité de référence
  • C2 : Capacité à mesurée

Absence de D3 : Vin = 10v AC, f=50Hz :

Projet électronique Capacimètre Numérique à base du microcontrôleur simulation 2 jpg

On constate que le micro est bien protégé contre la surtension, par contre l’alternance négative est encore présente !

Présence de D3 : Vin = 10v AC, f=50Hz : 

Projet électronique Capacimètre Numérique à base du microcontrôleur simulation 3

Présence de D3 : Vin = 4v AC, f=50Hz : 

Projet électronique Capacimètre Numérique à base du microcontrôleur simulation 4

 

Programme MikroC :

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



/* LCD pinout settings */
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;

// Pin direction
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()
{
   // Initialisation LCD, ADC
   Lcd_Init();
   ADC_Init();
   Lcd_Cmd(_LCD_CLEAR);
   Lcd_Cmd(_LCD_CURSOR_OFF);

   Lcd_Out(1, 5, "Capacitence");
   Lcd_Out(2, 16, "uF");


   TRISA =  0xFF;
   TRISB =  0x00;

   PORTB=0x00;
   PORTB=0x00;

   ADCON1=0x00;

   while(1)
   {
       // Mesure de la valeur maximale de la tension d'entrée (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);

       // Mesure de la valeur maximale de la tension de sortie (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);

       // Calcul de la valeur de la capacité C1 en uF
       Capa_uF = 1e6*C2*((Max_Vin/Max_Vout) - 1.0);
       FloatToStr(Capa_uF, Capa_F_Char);
       
       // Mise à jour des valeurs maximales
       Count_Perdiode++;
       if( Count_Perdiode == Count_Max)
       {
           Max_Vout =Init_Vlaue;
           Max_Vin  = Init_Vlaue;
           Count_Perdiode=0;
       }

       // Affichage
       Lcd_Out(2,3,Capa_F_Char);
       Lcd_Out(2, 16, "uF");
       Lcd_Out(2,12,"   ");
       

   }

}

Commentaires sur le programme :

  • La valeur Max_Count permet de définir une période de réinitialisation des valeurs maximales des tensions mais pourquoi faire ? Le programme permet de garder en mémoire les valeurs maximales des tensions, si par exemple une excursion est apparue peut générer une fausse mesure d’ou l’intérêt de définir une période de mise à zéro. Vous pouvez  augmenter la valeur pour augmenter la période de réinitialisation
  • La capacité C1 est fixée à 1uF, vous pouvez changer la valeur à condition de changer la valeur externe de C2. Le choix de sa valeur dépend de la valeur de C1, de préférence plus proche de C2 pour gagner en précision.

Télécharger gratuitement le fichier du projet électronique : Capacimètre Numérique à base du microcontrôleur PIC16F877A (Schéma ISIS + Code MikroC ) :