La capacité à mesurer étant bien inférieure à 1 nF (50-100 pF), vous rencontrerez de sérieux problèmes en essayant de la mesurer avec l'ADC de l'Arduino en raison de sa capacité d'entrée (14 pF selon la fiche technique). Ajoutez les capacités parasites des fils, des en-têtes et de la carte Arduino elle-même et vous vous retrouverez facilement avec une capacité d'entrée de 25 pF, qui est du même ordre de grandeur que ce que vous essayez de mesurer (= UNE TRÈS MAUVAISE CHOSE).
Que faire alors? Eh bien, les principales options sont les suivantes ...
Utiliser un circuit de mesure externe
Cela signifierait inclure des appareils actifs (amplis op, comparateur, minuteries ...) et des composants passifs de précision . Une vraie solution HW.
La précision de la mesure dans ce cas dépendrait entièrement de la conception (topologie du circuit et sélection des composants) du circuit externe. Le circuit fournirait soit une tension analogique, soit un signal dont la fréquence pourrait être mesurée par l'Arduino sans introduire d'erreurs significatives supplémentaires.
Un exemple utilisant une minuterie 555 (un condensateur de compensation supplémentaire de 4 pF est nécessaire entre OUT et TH pour une précision améliorée):
Source: Utiliser des techniques analogiques pour mesurer la capacité des capteurs capacitifs, un article de Martin Tomasz publié dans Electronic Design.
Considérez le circuit externe comme un "capteur "ou comme circuit de conditionnement de signal pour un" capteur "(la capacité à mesurer). En fait, la capacité dynamique que vous essayez de mesurer provient probablement d'un capteur (humidité, humidité?), N'est-ce pas?
Connectez le condensateur directement aux broches analogiques de Uno et calibrez les lectures
Cela peut sembler incroyable, mais quelque chose d'aussi simple que cela fonctionne (au détriment de la précision, bien sûr):
Comment ça? Parce que le problème de capacité d'entrée que nous avons détecté au début est suffisamment important pour nuire gravement à la précision, mais ne rend pas la mesure complètement irréalisable. Ainsi, nous pouvons étalonner cet effet tout en conservant une mesure valide (bien qu'avec une précision réduite) dans la plage cible (50-100 pF).
L'étalonnage est effectué via certaines valeurs par défaut codées en dur dans ce qui suit Esquisse Arduino (source ici à partir de braulio777). Pour une meilleure précision, vous devez calibrer les valeurs de IN_STRAY_CAP_TO_GND
et R_PULLUP
dans l'esquisse en comparant les mesures de certains condensateurs avec leurs valeurs de capacité déjà connues (à condition que vous puissiez le faire).
// Compteur de capacité numérique // Mesure de 0,000pF à 1000uF # include <LiquidCrystal.h>LiquidCrystal lcd (11, 9, 5, 4, 3, 2); const int OUT_PIN = A4; const int IN_PIN = A0; const float IN_STRAY_CAP_TO_GND = 24.48; const float IN_CAP_TO_GND = IN_STRAY_CAP_TO_GND; const float R_PULLUP = 34.8; const int MAX_ADC_VALUE = 1023; void setup () {pinMode (OUT_PIN, OUTPUT); pinMode (IN_PIN, OUTPUT); lcd.begin (16, 2); } boucle void () {pinMode (IN_PIN, INPUT); digitalWrite (OUT_PIN, HIGH); int val = analogRead (IN_PIN); digitalWrite (OUT_PIN, LOW); if (val < 1000) {pinMode (IN_PIN, OUTPUT); capacité flottante = (float) val * IN_CAP_TO_GND / (float) (MAX_ADC_VALUE - val); lcd.setCursor (0,0); lcd.print ("Capacitance ="); lcd.setCursor (0,1); lcd.print (""); lcd.setCursor (0,1); lcd.print (capacitance, 3); // pour la meilleure précision lcd.print ("pF"); } else {pinMode (IN_PIN, OUTPUT); retard (1); pinMode (OUT_PIN, INPUT_PULLUP); non signé long u1 = micros (); non signé t long; int digVal; faire {digVal = digitalRead (OUT_PIN); non signé long u2 = micros (); t = u2 > u1? u2 - u1: u1 - u2; }
while ((digVal < 1) && (t < 400000L)); pinMode (OUT_PIN, INPUT); val = analogRead (OUT_PIN); DigitalWrite (IN_PIN, HIGH); int déchargeTime = (int) (t / 1000L) * 5; délai (déchargeTime); pinMode (OUT_PIN, OUTPUT); digitalWrite (OUT_PIN, LOW); digitalWrite (IN_PIN, LOW); capacité flottante = - (float) t / R_PULLUP / log (1.0 - (float) val / (float) MAX_ADC_VALUE); lcd.setCursor (0,0); lcd.print ("Capacitance ="); if (capacité > 1000.0) {lcd.setCursor (0,1); lcd.print (""); lcd.setCursor (0,1); lcd.print (capacité / 1000,0, 2); lcd.print ("uF"); } else {lcd.setCursor (0,1); lcd.print (""); lcd.setCursor (0,1); lcd.print (capacité, 2); lcd.print ("nF"); } while (millis ()% 1000! = 0);}}
L'exemple de code ci-dessus affiche les valeurs mesurées sur un écran LCD. Pour votre application, la meilleure option est probablement d'écrire des données sur une carte SD externe.
Divulgation: Je n'ai pas testé moi-même le code ci-dessus.