Circuit RC - Mesurer la constante de temps à l'aide d'un microcontrôleur
Mesure de la constante de temps
Méthode : Principe de la mesure et montage
Le montage est donné ci-contre. La carte Arduino est utilisée :
pour appliquer une tension de 5 volts aux bornes de l'assemblage résistance - condensateur en série grâce à une sortie numérique ;
pour mesurer la tension aux bornes du condensateur à l'aide d'une entrée analogique.
On peut placer un interrupteur poussoir en dérivation sur le condensateur pour permettre une décharge instantanée avant de mesurer la durée de la charge.
Une fois le condensateur déchargé, la sortie numérique n°2 de la carte passe à l'état haut, une tension \(U_0 = 5\ \mathrm V\) s'applique aux bornes du montage.
Lors de la charge, la tension aux bornes du condensateur est donnée par la relation suivante :
\(U_C = U_0 \times \left(1- e^{-\dfrac{t}{\tau}}\right)\)
On en déduit que pour \(t=\tau\) :
\(U_C = 0{,}632 \times U_0\)
En mesurant la tension aux bornes du condensateur à l'aide de la carte Arduino, on peut déterminer la date t à laquelle ce niveau est atteint, et donc connaître \(\tau\).
Remarque : Précision des mesures
Pour obtenir des mesures suffisamment précises, il faut utiliser des composants conduisant à des constantes de temps longues : quelques centaines de millisecondes au minimum.
Deux associations ont donné des résultats satisfaisants :
\(C = 100\ \mathrm{\mu F}\) et \(R = 10\ \mathrm{k\Omega}\), soit \(\tau = 1\ \mathrm s\)
\(C = 100\ \mathrm{nF}\) et \(R = 10\ \mathrm{M\Omega}\), soit \(\tau = 1\ \mathrm s\)
Méthode : Montage
Le montage ci-dessous utilise un condensateur chimique : attention à la polarité.
L'interrupteur poussoir permet de court-circuiter le condensateur si la décharge est trop lente.
Le schéma est aussi téléchargeable au format Fritzing pour édition ou au format vectoriel.
Méthode : Le programme
Le programme renvoie les résultats sur le moniteur série. Il est possible de le modifier pour un affichage sur écran LCD, mais le gain est minime.
unsigned long temps0, temps1; // Deux variables temps pour mesurer tau
float tau; // Constante de temps (décimal)
int pinU = 2; // Broche alimentant le circuit RC
void setup() {
// put your setup code here, to run once:
Serial.begin(9600) ; // Initialisation de la communication série
pinMode(pinU, OUTPUT); // On définit la borne d'alimentation du circuit en Sortie
digitalWrite(pinU, 0); // On applique une tension nulle en entrée du circuit RC
}
void loop() {
// put your main code here, to run repeatedly:
digitalWrite(pinU, 0);
Serial.println("Décharge du condensateur");
Serial.println("Pressez l'interrupteur poussoir de court-circuit si décharge trop longue");
while (analogRead(A0) > 0) { // On s'assure que le condensateur se décharge
Serial.println(analogRead(A0)); // On lit la tension aux bornes du condensateur (valeur entre 0 et 1023)
delay(500);
}
Serial.println("La mesure va commencer dans 5 secondes"); // On va commencer la mesure
Serial.println("Lachez l'interrupteur de court-circuit");
delay(5000);
Serial.println("Mesure en cours");
temps0 = micros(); // On relève t0
digitalWrite(pinU, 1); // On applique 5V en entrée du circuit RC
while (analogRead(A0) < 647) { // Tant que le niveau lu est inférieur à 647 (63.2% de 1023)
// on boucle sans rien faire
}
temps1 = micros(); // Une fois sorti de la boucle on mesure t1
tau = (temps1 - temps0) * 1e-6; // Calcul de tau, convertie en secondes
Serial.print("Constante RC en s : ");
Serial.println(tau, 3); // On affiche tau avec 3 chiffres après la virgule
Serial.println("Nouvelle mesure dans 5 secondes");
delay(5000);
}
Exemple : Exemples de mesures
Ci-contre la mesure réalisée avec les deux composants suivants (valeurs mesurées au multimètre) :
Condensateur \(C=98{,}2\ \mathrm{nF}\) ;
Résistance \(R=10{,}6\ \mathrm{M\Omega}\)
Dans ces conditions, la constante de temps calculée est \(\tau_{calc}=1{,}04\ \mathrm s\).
Avec le montage, on obtient par la mesure \(\tau_{mes} = 1{,}061\ \mathrm s\)
Ci-contre la mesure réalisée avec les deux composants suivants (valeur mesurée au multimètre pour la résistance) :
Condensateur \(C=100\ \mathrm{\mu F}\) ;
Résistance \(R=9{,}81\ \mathrm{k\Omega}\)
Dans ces conditions, la constante de temps calculée est \(\tau_{calc}=0{,}981\ \mathrm s\).
Avec le montage, on obtient par la mesure \(\tau_{mes} = 1{,}044\ \mathrm s\)
Complément : Prolongements possibles
À partir du même montage et en modifiant légèrement le programme, on peut l'utiliser pour déterminer la valeur d'une capacité inconnue si on fournit aux élèves la valeur de la résistance R.
Il peut être envisagé de leur faire modifier le programme en ce sens.
Variante - Étude statistique - Répétabilité de la mesure
Principe
Il s'agit d'effectuer une série d'un grand nombre de mesures consécutives afin d'effectuer une étude statistique (incertitude de type A ou répartition des résultats).
Les résultats sont envoyés sur le moniteur série et formatés de façon à générer un fichier csv
.
Les mesures de la constante de temps τ peuvent être récupérée directement dans le moniteur série par un copier/coller
ou envoyés dans un fichier par l'intermédiaire de l'application Coolterm par exemple.
Méthode : Programme modifié permettant de mesurer consécutivement plusieurs mesures de la constante de temps
Le programme ci-dessous effectue 10000 mesures de la constante de temps. Toutes les instructions sont exécutées dans la boucle void setup
, donc le programme s'arrête dès que le nombre de mesures choisi (modifiable dans le programme) est atteint.
/*Ce programme effectue 100 mesures de la constante de temps
d'un circuit RC.
Les résultats sont envoyés vers le moniteur série et peuvent
être récupérés par un copier/coller ou capturés via un logiciel
de type CoolTerm
*/
unsigned long temps0, temps1; // Deux variables temps pour mesurer tau
float tau; // Constante de temps (décimal)
int pinU = 2; // Broche alimentant le circuit RC
int compt = 0; // Compteur de mesures
void setup() {
// put your setup code here, to run once:
Serial.begin(9600) ; // Initialisation de la communication série
Serial.print("Numero mesure");
Serial.print(";");
Serial.println("Tau");
pinMode(pinU, OUTPUT); // On définit la borne d'alimentation du circuit en Sortie
digitalWrite(pinU, 0); // On applique une tension nulle en entrée du circuit RC
while (compt < 10000) {
digitalWrite(pinU, 0);
compt++;
while (analogRead(A0) > 1) { // On s'assure que le condensateur se décharge
// On boucle sans rien faire
}
temps0 = micros(); // On relève t0
digitalWrite(pinU, 1); // On applique 5V en entrée du circuit RC
while (analogRead(A0) < 647) { // Tant que le niveau lu est inférieur à 647 (63.2% de 1023)
temps1 = micros();
}
// Une fois sorti de la boucle on mesure t1
tau = (temps1 - temps0) * 1e-6; // Calcul de tau, convertie en secondes
Serial.print(compt);
Serial.print(";");
Serial.println(tau, 8); // On affiche tau
}
Serial.println("Terminé");
}
void loop() {
}
Exemple : Exemples de résultats
On donne le bilan des 10000 mesures, dont leur répartition ci-contre.
La feuille de calcul avec l'analyse statistique des mesures est fournie en téléchargement.