Messen mit der Soundkarte: Kapazität | Soundcard Measurement: Capacity
Kondensatoren messen
mit der Soundkarte
Menü Messen mit der Soundkarte
von Michael Gaedtke
Letzte Änderungen vom 19. März 2007
1. Ein Generator mit dem NE555 Timer
3. Die Bedienung des Programms
Nach der Vorstellung meines einfachen L-Meters für die Soundkarte ist die Frage aufgekommen, ob sich entweder mit dem vorhandenen LC-Generator oder mit einer eigenen Zusatzschaltung auch Kondensatoren messen lassen. Das ist natürlich möglich und erfordert nur minimalen Aufwand. Burkhard Kainka hat auf der Elexs-Seite eine passende Oszillatorschaltung vorgestellt und auch ein Messprogramm dazu bereitgestellt, das allerdings eine serielle RS232-Schnittstelle voraussetzt. Früher war das bei jedem Computer eine Selbstverständlichkeit, heute fehlt diese Schnittstelle insbesondere bei vielen Labtops, da ihr die modernere USB-Schnittstelle den Rang abgelaufen hat. Leider war die alte RS232 erheblich einfacher für Amateurzwecke zu programmieren.
1. Ein Generator mit dem NE555 Timer
Es geht aber auch ohne serielle Schnittstelle und ohne die relativ zeitaufwendige USB-Entwicklung, wenn man die Soundkarte als Schnittstelle aktiviert. Ähnlich wie bei der Messung von Induktivitäten (vgl. dazu mein entsprechendes Tutorial) wird mit einem externen Generator eine Resonanz erzeugt. Ein angeschlossener Kondensator verstimmt den Resonanzkreis, so dass er auf einer neuen Frequenz schwingt. Über die Soundkarte wird diese Frequenz gemessen und aus der Verstimmung gegenüber dem Referenzsignal die angeschlossene Kapazität errechnet.

Alles wissenswerte zum Generator, der mit einem sehr preisgünstigen 555er Timer arbeitet, der sich in fast jeder Bastelkiste finden lassen dürfte, ist bei Elexs beschrieben und braucht hier nicht wiederholt zu werden. Die abgebildete Schaltung ist dem Bauvorschlag von Burkhard Kainka entnommen. Für den Betrieb mit der Soundkarte wird der Generator, der im Originalvorschlag aus der RS232-Schnittstelle mit Strom versorgt wird, zum Beispiel mit einer 9-Volt-Blockbatterie gespeist.
|
|
Anders als der LC-Generator, den wir für die Induktivitäts-Messung verwendet haben, erzeugt der NE555 eine Rechteck-Schwingung. Damit die Eingangsspannung an der Soundkarte nicht zu hoch wird, gibt es am Ausgang des Generators einen Spannungsteiler aus einem 100k- und einem 10k-Widerstand. Die Schaltung kann auf einer kleinen Lochrasterplatine aufgebaut werden. Ich habe inzwischen auch eine Platine entworfen, die mit einer 9V-Blockbatterie versorgt wird und über eine Cinch-Buchse an die Soundkarte angeschlossen wird. |
|
|
Ein Streifen von 70 mal 25 mm reicht für die wenigen Bauteile und einen Steckverbinder für die Anschlüsse aus. Der Bestückungsplan zeigt die Lage der Bauteile und der Anschlüsse auf der einseitigen Platine. Beim Bestücken braucht außer der Polarität des Elkos und der Ausrichtung des ICs, das ich gesockelt eingebaut habe, eigentlich nichts besonderes beachtet zu werden. Das Platinen-Layout ist im Sprint-Layout-Format und steht zum Download bereit. Es kann mit dem kostenfreien Viewer von Abacom ausgedruckt werden. |
Wie im Teil I des Tutorials über die Verwendung der BASS.DLL Library gezeigt, ist das Kernstück des solcher Messprogramme eine Callback-Routine, die auf Signal des Betriebssystems immer dann aufgerufen wird, wenn die Soundkarte einen Puffer mit Samples gefüllt hat. Die Bufferlänge kann mit dem HiWord des Flag eingestellt werden. Die Default-Länge des Recording-Buffers liegt bei 100 ms entsprechend einer Länge von 100 ms * 44100 Samples/s = 4410 Samples * 2 Kanäle * 2 Bytes = 17640 Bytes. Sie wird in der Prozedur StartButtonClick mit dem HiWord des übergebenen Flag auf 200 ms entsprechend 35280 Bytes eingestellt. Dieser Wert ist in der Konstanten cRecordingTime aus der Unit mgMeasTools vorgegeben.
function RecordingCallback
(Handle : HRecord;
Buffer : Pointer;
BufLength : DWord;
User : DWord) : boolean; stdcall;
begin
with WaveRecord do begin
BufferBlocks := BufLength div 4;
CopyMemory(@StereoBuffer,Buffer,BufLength);
end;
Mit dem CopyMemory-Befehl kopieren wir den von der Soundkarte übergebenen Buffer in den StereoBuffer unseres WaveRecords, der als zweidimensionales Array aufgebaut ist. So können wir die Samples des linken und rechten Kanals nach belieben auslesen. Im Anschluss an diese Vorbereitung wird der WaveRecord ausgewertet:
CompensateOffset(WaveRecord); // Offsetanteil
kompensieren
MeasureRMSLevels(WaveRecord); // RMS-Level messen
MeasurePeakLevels(WaveRecord); // Peak-Level messen
MeasureFrequency(WaveRecord); // Frequenz messen
Die entsprechenden Routinen wurden im Teil I des BASS.DLL-Tutorials bereits besprochen. Sie sind hier zur besseren Übersicht in einer eigenen Unit mgMeasTools untergebracht, in der auch eine Reihe von Konstanten und der Record TWaveRecord definiert sind, der die gemessenen Samples und die aus ihnen ermittelten relevanten Daten aufnimmt:
type
TAudioSample = SmallInt; // 16 Bit mit Vorzeichen
TStereoSample = array[Le..Ri] of TAudioSample;
TStereoBuffer = array [0..44100] of TStereoSample;
TMeasValue = record
LeftChannel : extended;
RightChannel : extended;
end; // record
TWaveRecord = record
BufferBlocks : word;
StereoBuffer : TStereoBuffer;
Averaging : boolean; // Messungen mitteln?
CompOffset : boolean; // Offset kompensieren?
Frequency : TMeasValue;
Phase : extended;
RMSLevel : TMeasValue;
dBRMSLevel : TMeasValue;
PeakLevel : TMeasValue;
dBPeakLevel : TMeasValue;
end; // record
Die Unit mgMeasTool enthält außerdem noch zwei Routinen zur Phasenmessung, die hier aber nicht aufgerufen werden, weil die Phaseninformation für die Kapazitätsmessung nicht relevant ist. Nach der Auswertung können zunächst die Messwertanzeigen aktualisiert werden:
with Form1 do begin
with WaveRecord do begin // --- dB-Werte sind negativ
---
ProgressBar1.Position := Round(100+dBPeakLevel.LeftChannel);
Danach folgt die eigentliche Kapazitätsmessung. Dazu muss die optionale gleitende Mittelwertbildung bei der Auswertung der Samples deaktiviert sein, weil die hier vorgenommene Mittelung über jeweils fünf Puffer-Längen (das entspricht einer Sekunde) die subjektiv angenehmere Anzeige bringt.
with
Capacity do begin
RelSignal := Round(100 * WaveRecord.PeakLevel.LeftChannel/
cMaxAudio);
Edit2.Text := FloatToStrF(RefCap,ffFixed,10,1);
if RelSignal < 10
then begin
Edit1.Text := '0,0 pF';
Edit3.Text := 'kein Signal';
end // then
else begin
if NewMeas
then begin
SumFreq := 0.0;
Count := 0;
NewMeas := false;
end; // else
SumFreq := SumFreq + Frequency.LeftChannel;
Count := Count + 1;
if Count = 5 // d.h. jede Sekunde ein mal
then begin
ResFreq := SumFreq/5;
Edit3.Text := FloatToStrF(ResFreq,ffFixed,10,0)+' Hz';
// Teilen durch Null ausschließen:
if ResFreq <= 0.0
then ResFreq := 1.0;
// Autonull durchführen:
if RefFreq < ResFreq
then RefFreq := ResFreq;
Cap := RefCap * RefFreq/ResFreq - RefCap;
Die eigentliche Berechnung steht in der letzten Zeile. Die Referenz-Frequenz RefFreq wird einmal gemessen (dazu dient der Button Null) und in einer ini-Datei gespeichert. Das gilt auch für den Wert des Referenz-Kondensators RefCap, der manuell eingeben werden kann. Was nun folgt, dient nur noch der formatierten Anzeige des gefundenen Kapazitätswerts und dem Rückstellen des Zählers für die Mittelwertbildung:
if Cap < 1.0
then Edit1.Text := FloatToStrF(Cap*1e3,ffFixed,10,1)
+ ' pF';
if Cap >= 1.0
then Edit1.Text := FloatToStrF(Cap,ffFixed,10,3)
+ ' nF';
if Cap >= 10.0
then Edit1.Text := FloatToStrF(Cap,ffFixed,10,2)
+ ' nF';
if Cap >= 100.0
then Edit1.Text := FloatToStrF(Cap,ffFixed,10,1)
+ ' nF';
SumFreq := 0.0;
Count := 0;
end; // if Count = 5
end; // with Capacity
end; // else
end; // with WaveRecord
end; // with Form1
Die Aufnahme neuer Messwerte wird fortgesetzt, solange die Callback-Routine das Ergebnis true zurück gibt:
Result := true;
end; // function RecordingCallback
3. Die Bedienung des Programms

Die Bedienung des Programms, das am Ende dieses Abschnitts zum Download bereit steht, ist ganz einfach:
Mit dem Button Messen
wird der Messvorgang gestartet. Gleichzeitig wird ein ggfs. geänderter Wert der
Referenz-Kapazität übernommen, für die folgenden Berechnungen benutzt und in
der zum Programm gehörenden ini-Datei gespeichert. Der Button CAL wird
deaktiviert, die Buttons Null und Stop werden aktiviert.
Mit dem Button Null wird die Referenz-Frequenz ermittelt
und die Kapazitäts-Anzeige nullgesetzt. Für diesen Abgleichvorgang darf am
Eingang des Messgenerators keine externe Kapazität angeschlossen sein. Daher
misst das System nur die Frequenz, die sich durch die interne Kapazität des
Generators (im Schaltbild 680 pF) ergibt. Das ist die höchste vorkommende Frequenz;
sie sollte bei rund 18.000 Hz liegen, um den Messbereich der Soundkarte bei
einer Samplerate von 44.100 Hz – also rund 20.000 Hz – gut auszunutzen. Zu den
nominellen 680 pF kommen noch einige pF an parasitären Kapazitäten durch
Leiterbahnen und Messkabel hinzu. Außerdem hat der Kondensator natürlich eine
gewisse Herstellungstoleranz. Ich habe meinen Messgenerator mit einem
hochpräzisen 1,5 nF Kondensator abgeglichen, den ich für solche Zwecke mal bei
Ebay ersteigert habe. Die Messung stimmt, wenn ich als Kalibrierwert 722 pF
statt der nominellen 680 pF eingebe.
Der kleine Button Cal dient zur Kalibrierung des
Messsystems. Er gibt das Feld für die Referenz-Kapazität für die Eingabe frei.
Hier muss die Kapazität [in Nanofarad] des Kondensators eingetragen werden, den
man in die Messgeneratorschaltung eingebaut hat. Da die Genauigkeit der Messung
von diesem Referenzwert abhängig ist, sollte der Kondensator ausgemessen werden
oder man verwendet einen (allerdings schwer erhältlichen)
Präzisionskondensator. Es sollte ein hochwertiger Folien- oder Glimmertyp mit
einer möglichst geringen Temperatur- und Feuchtigkeitsempfindlichkeit gewählt
werden.
Der Button Stop bricht den Messvorgang ab. Gleichzeitig
werden die Buttons Messen und Ende aktiviert.
Mit dem Button Ende kann das Programm verlassen werden.
In einem Auswahlfeld kann der Aufnahme-Kanal
ausgewählt werden. Der Generator sollte an den LineIn-Eingang der Soundkarte
angeschlossen werden. Das Programm zeigt an, welche Eingangskanäle von der
Soundkarte angeboten werden. Wichtig ist, dass die Wechselspannung am linken Kanal anliegt, da das Programm
diesen Kanal auswertet. Beim Anschluss über Miniklinkenstecker gehört der linke
Kanal an die Spitze (Tip) des Steckers. Der Ring darunter wäre der Anschluss
für den rechten Kanal; er bleibt frei. Die Masse kommt an den Schaft des
Steckers.
Der unter dem Auswahlfeld liegende Schieberegler
Eingangs-Pegel ermöglicht es, die Empfindlichkeit des Eingangs
einzustellen.
Der Pegel sollte so gewählt werden, dass die logarithmische Aussteuerungsanzeige ungefähr -10 dB
anzeigt. Der Pegelwert bezieht sich auf den Spitzenwert der Eingangsspannung
(Peak) und auf die mögliche Vollaussteuerung des Eingangs (Full Scale). Wenn
sich dieser Pegel nur mit Extrempositionen des Schiebereglers einstellen lässt,
dann muss ggfs. der Spannungsteiler am Ausgang des Messgenerators angepasst
werden.
Die Statuszeile am
unteren Rand des Programmfensters zeigt an, welcher Eingangskanal ausgewählt
ist. Wenn man mit dem Mauszeiger über einen der aktiven Buttons fährt wird eine
kurze Funktionsbeschreibung angezeigt.
Menü Messen mit der Soundkarte
Download dieses Textes als PDF-Datei
Download des Delphi-Quelltextes für das Beispielprogramm
(c) Michael Gaedtke, Im Püllenkamp 2, D-41462 Neuss, Germany – michael@gaedtke.name