Messen mit der Soundkarte: Kapazität | Soundcard Measurement: Capacity

Kondensatoren messen
mit der Soundkarte

Menü Messen mit der Soundkarte

Druckfassung

von Michael Gaedtke

Letzte Änderungen vom 19. März 2007

1. Ein Generator mit dem NE555 Timer

2. Anbindung der Soundkarte

3. Die Bedienung des Programms

4. Downloads

 

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.

 

Top

2. Anbindung der Soundkarte

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

Top

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.

Top

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