Go Down

Topic: Kapazität messen mit dem Arduino (Read 215 times) previous topic - next topic

Markodk

Hallo,

ich habe erst vor Kurzem angefangen mit dem Arduino zu arbeiten. Ich würde gerne eine Kapazität mithilfe eines Ladevorgangs messen. Dazu habe ich folgende Messroutine gefunden: https://www.arduino.cc/en/Tutorial/CapacitanceMeter.
Nun würde ich gerne wissen, wie klein die Kapazität sein darf, damit der Arduino diese noch messen kann ohne einen sehr großen Widerstand zu verwenden.
Was ich dabei noch nicht richtig verstanden habe, wie die Timerauflösung des Arduinos berechnet wird.
Ich weiß das die maximale Frequenz für einen Timerdurchlauf bei einem 16 MHz µC und 8bit Timer (16 MHz / 8bit) = 62.5 kHz beträgt. Nun spielt ja noch der 10 bit ADC mit rein. Dieser zählt 647 Schritte (63,2 % von 1024 = 647) und gibt mir die dafür benötigte Zeit an.
Wäre es jetzt richtig die 647 Schritte / 62,5 kHz zu teilen, um die Timerauflösung zu berechnen ? Das wären dann 10,35 ms, ist das richtig ?

Vielen Dank im Voraus
 





ardubu

von was möchtest du die Kapazität messen (Kondensator, Akku)?

SpaghettiCode

Hi,

was verstehst Du unter "ohne einen sehr großen Widerstand zu verwenden"?
Die im Link verwendeten 10k liegen im gut zu messenden mittleren Bereich, aber um kleine Kondensatoren im Bereich picoFarrad zu messen, reicht der nicht. Bis 2MOhm kann ich ohne Probleme verwenden, 3,4MOhm sind aber schon zu viel des Guten.
Optimal ist natürlich, wenn der ADC jeden einzelnen Schritt in der while-Schleife messen kann, und beim 648ten sagt: Hier ist Schluss! Aber bei kleinen Kondensatoren muss man sich bei dieser Methode auch mit weniger zufrieden geben.
Es gibt mindestens noch 2 weitere Methoden einen Kondensator zu messen, altmodisch über einen Schwingkreis die Frequenz bestimmen und ausrechnen, und die andere funktioniert über den Komparator des ADC.
Ich teste übrigens auch gerade an einem Messgerät für Kondensatoren und Widerständen, und komme in der 5. oder 6. Evolutionsstufe meines Sketches bis in den einstelligen pF-Bereich mit 0,5pF Auflösung. Der Test auf die Genauigkeit steht noch aus, aber der Plausibilitätstest sieht schon mal sehr gut aus, beim aufsummieren verschiedener Kapazitäten.
Was ist denn Deine Ambition, sich mit dem Messen von Kapazitäten zu befassen?
Sowas gibt es übrigens schon als Eierlegende Wollmilchsau, aber mir war das selber basteln wichtiger.

Gruß André

Markodk

Hallo,

ich würde gerne die Kapazität eines kapazitiven Kraftsensors messen.
Die Grundkapazität des Sensors liegt bei 75 pF und die Kapazitätsänderung bei 5 pF.

Andre du hast geschrieben, dass bei sehr kleinen Kapazitäten ein 10 k Widerstand bei der Methode nicht ausreicht. Aber wie berechne ich den die benötigte Widerstandsgröße ?
Ich weiß, dass R = tau/C ist und nur noch tau in die Gleichung eingesetzt werden muss. Nun ist ja nur die Frage, wie schnell der Arduino messen kann ? Sind die von mir berechneten 10,35 ms richtig oder muss ich da mit einer ganz anderen Rechnung rangehen ?
Ich würde auch gerne erst mal verstehen, warum diese Methode nicht funktioniert bevor ich eine andere ausprobiere.

Gruß Marko

SpaghettiCode

Hi,

hast Du Dir Tau tatsächlich mal ausgerechnet? R in Ohm, C in Farad? (milli, micro, nano, pico ...)
Der ADC misst Arduino Standard 9615 mal pro Sekunde. Wenn Tau also angenommen 1ms wäre, sagt er Dir beim 10. Durchlauf der while Schleife daß der Wert 647 überschritten ist.  Du kannst Deine Skala also nur in 9 Steps teilen.
Den ADC kannst Du zwar auch schneller einstellen, aber mit der oben genannten Methode wirst Du, wenn Deine Messung schnell gehen muss vermutlich nicht glücklich werden.

Und nein, Du hast Dich mit Deinem Wert verhauen, ganz leicht, um ein paar Nullen.

Gruß André


DrDiettrich

#5
Mar 13, 2018, 01:57 pm Last Edit: Mar 13, 2018, 01:58 pm by DrDiettrich
Ich fürchte, Du hast die Bedeutung der Schritte nicht verstanden. Die Messung wird wiederholt bis die Spannung 63,2% von ARef übersteigt, nicht 647 mal. Dabei wird im Beispielcode nicht mitgezählt, wie oft diese Schleife dafür durchlaufen wird. Nun kannst Du natürlich mitzählen und diese Anzahl von Schritten zur Berechnung der Messzeit benutzen, aber wozu? Mit millis() oder micros() kannst Du die vergangene Zeit direkt ausrechnen.

Die Zeitkonstante tau hängt nur von R und C ab, nicht von der Taktrate des ADC. Wenn eine Wandlung (lt. Reference) etwa 100µs dauert, und Du möchtest auf 10% genau messen, dann muß tau mindestens 1000µs werden. Denn bei 1000µs überschreitet die Spannung die Schwelle irgendwann zwischen 900µs und 1000µs (vorletzte und letzte Messung). Oder umgekehrt, bei 1ms Messzeit ist das Ergebnis auf 10% genau, bei 10ms auf 1%. Für beste Ergebnisse sollte der ADC so schnell laufen wie möglich, und die Messzeit sollte möglichst lang werden. Das ist aber nur ein Anhaltspunkt, denn mit steigender ADC Taktrate werden die Ergebnisse ungenauer (8 statt 10 Bit), und mit steigender Messzeit machen Leckströme die Messung ungenauer.

Go Up