Diskussion:Trimmerkondensatoren
Vorschlag von Chat GPT
Direktmessung mit Arduino (RC-Ladezeit)
Prinzip: Trimmer bildet mit hochohmigem Widerstand einen RC-Lader. Arduino schaltet Pin auf HIGH → misst Ladezeit bis Input als HIGH erkannt wird. Vorteil: nur Arduino (keine Zusatz-ICs). Nachteil: sehr empfindlich gegen Leckströme, Störungen; nötige Widerstandswerte sind groß.
Schaltung (einfach)
Vcc (5V)
|
R = 4.7 MΩ
|
+----> Arduino digital Pin D2 (Input)
|
C_trimmer (1.5..5 pF) --- GND
(Anmerkung: Pin D2 wird als Eingang gemessen; für Ladevorgang schaltest du vorher ein Ausgang auf LOW/INPUT usw. — Code sorgt dafür.)
Teile
Arduino (Uno/Nano)
R = 4.7 MΩ (oder 10 MΩ, siehe Hinweise)
Trimmer (1.5–5 pF)
kurze, abgeschirmte Verbindungskabel, Masse gut verbinden
Theorie (genau, Ziffern)
Ladegesetz: V(t)=Vcc(1−e−t/(RC)) V(t)=V cc
(1−e −t/(RC) ). Wenn die Input-Schaltschwelle Vth≈0,63 Vcc V th
≈0,63V cc
gilt, dann ist
t≈−RCln(1−VthVcc)≈R⋅C t≈−RCln(1− V cc
V th
)≈R⋅C
(bei Vth≈0,63Vcc V th
≈0,63V cc
ist der Faktor ≈1).
Beispiel (R = 4{,}7 MΩ):
C = 5 pF → τ=RC=4,7⋅106⋅5⋅10−12=23,5 μs τ=RC=4,7⋅10 6 ⋅5⋅10 −12 =23,5 μs
C = 1.5 pF → τ=7,05 μs τ=7,05 μs
Diese Zeiten liegen im Mikrosekundenbereich — gut messbar mit micros() oder besser mit Timer-Input-Capture (higher resolution). Verwende Mittelung (z. B. 100 Messungen) zur Rauschminderung.
Arduino-Sketch (vereinfachte Variante mit micros() — funktional) const int measPin = 2; // Pin zum Messen const unsigned int N = 200; // Mittelungsanzahl
void setup(){
Serial.begin(115200); pinMode(measPin, INPUT);
}
unsigned long measureTime(){
// Entlade: Pin als Ausgang LOW kurz pinMode(measPin, OUTPUT); digitalWrite(measPin, LOW); delayMicroseconds(20);
// Schalte auf INPUT (High-Z) und starte Zeitmessung bis HIGH
pinMode(measPin, INPUT);
unsigned long t0 = micros();
while (digitalRead(measPin) == LOW) {
if (micros() - t0 > 1000000UL) return 0; // Timeout (sicher)
}
return micros() - t0;
}
void loop(){
unsigned long sum = 0;
for (unsigned int i=0;i<N;i++){
unsigned long dt = measureTime();
if (dt==0) { Serial.println("Timeout"); break; }
sum += dt;
delayMicroseconds(100); // kurze Pause
}
float avg = (float)sum / N; // avg time in microseconds
// Näherung C = avg / R (R in seconds -> R [ohm] * C [F] = seconds)
float R = 4.7e6; // Ohm
float tau = avg * 1e-6; // s
float C = tau / R; // Farad
float C_pf = C * 1e12; // pF
Serial.print("t_us="); Serial.print(avg); Serial.print(" C_pf=");
Serial.println(C_pf, 3);
delay(200);
}
Kalibrierung & Mapping auf Winkel
Messe t (oder berechnetes C) bei bekannten Winkelpositionen (z. B. 0°, 90°, 180°).
Erzeuge Lookup-Tabelle oder lineare Regression: angle = a * C + b oder angle = map(C_pf, Cmin, Cmax, angleMin, angleMax).
Tipps & Einschränkungen
Leitungen extrem kurz halten; parasitäre Kapazität kann größer sein als 5 pF.
Abschirmung (Coax oder Ground-Shield) reduziert Störeinflüsse.
Hoher Widerstand macht Leckströme / Input-Leakage relevant → ggf. Wähle 4.7 MΩ statt 10 MΩ.
Wenn Messwerte sehr instabil: verwende Option B (Oszillator) oder einen C-to-D IC (FDC1004 / AD7746).