Sketch arduino pour la mesure de la capacité d’un condensateur

Montage

Sortie série

L’affichage de la sortie série peut se faire de trois manières différentes :

Code à téléverser

// 2 plaques d'aluminium séparées par un isolant mince branchées entre A0 et A2 const int OUT_PIN = A2; const int IN_PIN = A0; float seuil= 300; int openPin=8 ; //Capacité internet du microcontroleur à calibrer (méthode petites capacités <1nF) const float capacite_microcontroleur = 28; const float R_PULLUP = 34.8; //en k ohms const int tension_max = 1023; void setup() { pinMode(OUT_PIN, OUTPUT); pinMode(IN_PIN, OUTPUT); Serial.begin(9600); } void loop() { // On mesure la tension aux bornes du condensateur pinMode(IN_PIN, INPUT); digitalWrite(OUT_PIN, HIGH); int val = analogRead(IN_PIN); digitalWrite(OUT_PIN, LOW); if (val < 1000) { //Pour les petites capacités inférieures à 1 nF pinMode(IN_PIN, OUTPUT); //Calcul de la capacité float capacite = (float)val * capacite_microcontroleur / (float)(tension_max - val); Serial.print(F("Valeur de la capacité = ")); Serial.print(capacite, 3); Serial.print(F(" pF (")); Serial.print(val); Serial.println(F(") ")); } else { //Pour les grandes capacités supérieures à 1 nF //décharge du condensateur pinMode(IN_PIN, OUTPUT); delay(1); //On débute la charge du condensateur pour le dipole RC pinMode(OUT_PIN, INPUT_PULLUP); unsigned long u1 = micros(); unsigned long t; int digVal; do { digVal = digitalRead(OUT_PIN); unsigned long u2 = micros(); t = u2 > u1 ? u2 - u1 : u1 - u2; } while ((digVal < 1) && (t < 400000L)); // On stoppe la charge lorsque les conditions sont remplies pinMode(OUT_PIN, INPUT); //On lit la valeur val = analogRead(OUT_PIN); //On décharge le condensateur pour la mesure digitalWrite(IN_PIN, HIGH); int dischargeTime = (int)(t / 1000L) * 5; delay(dischargeTime); pinMode(OUT_PIN, OUTPUT); digitalWrite(OUT_PIN, LOW); digitalWrite(IN_PIN, LOW); //On calcule la capacité float capacite = -(float)t / R_PULLUP / log(1.0 - (float)val / (float)tension_max); Serial.print(F("Valeur de la capacité = ")); if (capacite > 1000.0) { Serial.print(capacite / 1000.0, 2); Serial.println(F(" uF")); } else { Serial.print(capacite, 2); Serial.println(F(" nF")); } } delay(1000); }