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 :
La broche
D11, paramétrée en sortie digitale, charge (ou décharge) le condensateur à travers la résistance \(R\).L’entrée analogique
A0mesure 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 :
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 :
Le calcul de la capacité C du condensateur est :
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 fonctionanalogRead()détecte le seuil de 63% de la tension du condensateur.