Mesure de la constante de temps d’un circuit RC avec l’entrée analogique

Principe

Un condensateur est chargé à travers une résistance sous tension constante. Des mesures périodiques de la tension du condensateur permettent de détecter le seuil de 63% de la valeur finale. La constante de temps est alors égale à la durée mesurée entre l’instant initial et l’instant de la détection.

Montage

Schéma du montage avec un Arduino UNO R3

Données :

\[R = 100~{\rm k\Omega} \qquad C= 680~{\rm nF}\]
  • La broche D11, paramétrée en sortie digitale, charge (ou décharge) le condensateur à travers la résistance \(R\).

  • L’entrée analogique A0 mesure périodiquement la tension \(u_C\) aux bornes du condensateur.

Avertissement

La durée de conversion, sur les entrées analogiques, est en moyenne de \(100~\rm µs\). En conséquence, pour une bonne précision (ex. au moins 100 points de mesures sur la durée à mesurer), il faut choisir une constante de temps minimale telle que :

\[\tau_{min} \approx 100\times100\cdot10^{-6} \approx 10~{\rm ms}\]

Avertissement

Il est conseillé de choisir une résistance maximale à \(100~\rm k\Omega\) (la documentation technique précise \(10~\rm k\Omega\)).

Mesure de la constante de temps

Le programme Arduino ci-dessous charge le condensateur sous la tension constante \(5~\rm V\) et mesure les instants t0 (début de la charge) et t1 (63% de la charge) afin de calculer de la constante de temps tau.

Le programme mesure également les valeurs de la tension initiale Nmin et de la tension finale Nmax afin de vérifier si la charge du condensateur est conforme (entre 0 et 1023).

Note

Il faut appuyer sur le bouton Reset de l’Arduino pour lancer la mesure. Il n’y a pas de boucle infinie !

/* Mesure de constante de temps d'un circuit RC
 * David THERINCOURT - 2025
 * Appuyer sur le bouton RESET de l'Arduino pour lancer la mesure
 */

int pinD11 = 11;             // Broche D11
int Nmin, Nmax;              // Valeurs minale et maximale
unsigned long t0;            // Instant initiale
unsigned long t1;            // Instant à 63% de Vcc
unsigned long tau;           // Constante de temps


void setup() {
   // PARAMETRAGE
   Serial.begin(9600);        // Initialisation du port série
   pinMode(pinD11, OUTPUT);    // Broche digitale en sortie

   // DECHARGE COMPLETE
   digitalWrite(pinD11,LOW);   // D8 à 0V
   delay(1000);               // Temporisation pour décharge compléte
   Nmin = analogRead(A0);     // Tension de bébut de charge (10 bit)

   // CHARGE COMPLETE
   int N = 0;                 // Initialisation
   digitalWrite(pinD11, HIGH); // D8 à 5V
   t0 = micros();             // Mesure de l'instant initial
   while (N<646) {            // Boucle tant que la tension inférieure à seuil (0,632*1023=646)
      N = analogRead(A0);      // Lecture de la tension du condensateur
   }
   t1 = micros();             // Mesure de l'instant à 63% de la valeur finale
   tau = t1 - t0;             // Calcul de la constante de temps (µs)

   delay(1000);               // Temporisation pour charge complete
   Nmax = analogRead(A0);     // Tension de fin de charge (10 bit)

   // AFFICHAGE
   Serial.println("-------");  //
   Serial.print("Nmin = ");    //
   Serial.println(Nmin);       //
   Serial.print("Nmax = ");    //
   Serial.println(Nmax);       //
   Serial.print("tau = ");     //
   Serial.print(tau/1000.0);   //
   Serial.println(" ms");      //
}

void loop() {
   // Boucle sans fin pas utilisée ici !
}

Mesures pour des capacités de \(470~\rm nF\), \(680~\rm nF\) et \(1000~\rm nF \quad (\pm10\%)\)

Mesure de la capacité du condensateur

Sachant que le temps caractéristique est défini par la relation :

\[\tau = R \cdot C\]

Le calcul de la capacité C du condensateur est :

\[C = \dfrac{\tau}{R}\]

If suffit donc d’ajouter cette relation dans le code précédent !

/* Mesure de la capacité d'un circuit RC
 * David THERINCOURT - 2025
 * Appuyer sur le RESET de l'Arduino pour lancer la mesure
 */

int pinD11 = 11;             // Broche D11
int Nmin, Nmax;              // Valeurs minale et maximale
unsigned long t0;            // Instant initiale
unsigned long t1;            // Instant à 63% de Vcc
unsigned long tau;           // Constante de temps
float R = 100E3;             // Valeur de la résistance
float C;                     // Valeur de la capacité à calculer

void setup() {
   // PARAMETRAGE
   Serial.begin(9600);        // Initialisation du port série
   pinMode(pinD11, OUTPUT);    // Broche digitale en sortie

   // DECHARGE COMPLETE
   digitalWrite(pinD11,LOW);   // D8 à 0V
   delay(1000);               // Temporisation pour décharge compléte
   Nmin = analogRead(A0);     // Tension de bébut de charge (10 bit)

   // CHARGE COMPLETE
   int N = 0;                 // Initialisation
   digitalWrite(pinD11, HIGH); // D8 à 5V
   t0 = micros();             // Mesure de l'instant initial
   while (N<646) {            // Boucle tant que la tension inférieure à seuil (0,632*1023=646)
      N = analogRead(A0);      // Lecture de la tension du condensateur
   }
   t1 = micros();             // Mesure de l'instant à 63% de la valeur finale
   tau = t1 - t0;             // Calcul de la constante de temps (µs)
   C = tau/R*1E3;             // Calcul de la capacité en nF


   delay(1000);               // Temporisation pour charge complete
   Nmax = analogRead(A0);     // Tension de fin de charge (10 bit)

   // AFFICHAGE
   Serial.println("-------");  //
   Serial.print("Nmin = ");    //
   Serial.println(Nmin);       //
   Serial.print("Nmax = ");    //
   Serial.println(Nmax);       //
   Serial.print("tau = ");     //
   Serial.print(tau/1000.0);   //
   Serial.println(" ms");      //
   Serial.print("C = ");       //
   Serial.print(C);            //
   Serial.println(" nF");      //
}

void loop() {
   // Boucle sans fin pas utilisée ici !
}

Mesures pour des capacités de \(470~\rm nF\), \(680~\rm nF\) et \(1000~\rm nF \quad (\pm10\%)\)

A retenir

  • La fonction micros() renvoie la durée en µs (< 70 min) depuis que la carte Arduino a été mise sous tension. La résolution est de 4 µs !

  • La boucle while (tant que) associée à la fonction analogRead() détecte le seuil de 63% de la tension du condensateur.