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

Montage

Charge d’un condensateur sous tension constante avec un Arduino UNO R3

La broche D8, paramétrée en sortie digitale, charge (ou décharge) le condensateur à travers la résistance.

L’entrée analogique A0 mesure périodiquement la tension 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}\]
  • Il est conseillé de choisir une résistance maximale à \(100~\rm k\Omega\) (la documentation technique précise \(10~\rm k\Omega\)).

Données :

\[R = 100~{\rm k\Omega} \qquad C= 680~{\rm nF}\]

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.

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 pinD8 = 8;               // Broche D8
 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(pinD8, OUTPUT);    // Broche digitale en sortie

    // DECHARGE COMPLETE
    digitalWrite(pinD8,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(pinD8, 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 constante de temps d'un circuit RC
 * David THERINCOURT - 2025
 * Appuyer sur le RESET de l'Arduino pour lancer la mesure
 */

int pinD8 = 8;               // Broche D8
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(pinD8, OUTPUT);    // Broche digitale en sortie

   // DECHARGE COMPLETE
   digitalWrite(pinD8,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(pinD8, 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.