Kampis Elektroecke

Impedanzmessung mit dem AD5933 Impedance Converter

In diesem Artikel zeige ich, wie mit Hilfe eines AD5933 die Impedanzen von beliebigen Bauteilen gemessen und bestimmt werden können. Bei dem AD5933 handelt es sich um einen integrierten Baustein, welcher mit Hilfe eines programmierbaren Frequenzgenerators, einem ADC und einem FFT-Block den realen und imaginären Widerstand eines unbekannten Bauteils bestimmen kann. Als Hardwareplattform habe ich mein XMEGA-A3BU Xplained, einen IA Pmod von Digilent und meine AVR Bibliothek verwendet.

Vor der ersten Benutzung muss der I2C initialisiert und der AD5933 konfiguriert werden.

I2CM_Config_t Config_I2CM = {
	.Device = I2C_DEFAULT_INTERFACE,
	.BitRate = I2C_CLOCK,
	.Timeout = I2C_TIMEOUT_DISABLE,
};

AD5933_Configuration_t Config_AD5933 = {
	.ClockSource = AD5933_CLOCK_INT,
	.Gain = AD5933_GAIN_5,
	.OutputVoltage = AD5933_OUTPUT_2V,
};

AD5933_Init(&Config_I2CM, &Config_AD5933);

Während der Initialisierung wird ein Reset des Chips durchgeführt, der Chip in den Standby-Modus gesetzt und die Taktquelle, die Verstärkung sowie die Ausgangsspannung eingestellt.


Achtung:

Bei der Verstärkung ist darauf zu achten, dass die Verstärkung entsprechend des Messbereichs eingestellt wird. Eine zu große Verstärkung bei kleinen Impedanzen führt zu einem Übersteuern des ADCs und damit zu falschen Messungen.


Für eine Impedanzmessung stehen zwei Messmodi zur Verfügung:

  • Eine Einzelmessung mit der aktuellen Ausgangsfrequenz
  • Ein Sweep über einen bestimmten Frequenzbereich

Zudem muss der AD5933 vor der ersten Messung mit einer bekannten Impedanz kalibriert werden. Durch die Kalibration wird ein Verstärkungsfaktor bestimmt, der für die Berechnung der unbekannten Impedanz benötigt wird. Für eine Messung mit einer konstanzen Frequenz würde die Kalibrierung folgenermaßen aussehen:

AD5933_SingleFrequency_t Config_Single = {
	.Frequency = 50000,
	.SettlingCycles = 1,
	.Mult = AD5933_SETTLING_X1,
};

AD5933_CalPoint_t AD5933_SingleCalibrationData;
const float CalibrationImpedance = 100;

AD5933_ConfigSingleFrequency(&Config_Single);
AD5933_SingleCalibration(&AD5933_SingleCalibrationData, CalibrationImpedance);

Die Settling Time, also die Zeit, die vergeht bis der ADC mit dem Messen beginnt, nachdem eine neue Frequenz angelegt worden ist, soll hier bei einem Zyklus der Ausgangsfrequenz liegen. Dies entspricht einer Zeit von 1 / 30 kHz = 33,33 µs.

Nach der Kalibration befindet sich der AD5933 im Messmodus und das Ausgangssignal ist aktiv.

Nun kann direkt eine Messung durchgeführt werden. Dazu wird die unbekannte Impedanz an den AD5933 angeschlossen und die Einzelmessung gestartet.

AD5933_DataPoint_t AD5933_SingleImpedance;
AD5933_SingleMeasurement(&AD5933_SingleCalibrationData, &AD5933_SingleImpedance);

Der AD5933 wiederholt dann die letzte Frequenz und vermisst die unbekannte Impedanz und am Ende der Messung wechselt der Chip in den Power Down-Modus.

Das Ergebnis der Messung ist der Phasenwinkel, sowie die Impedanz des unbekannten Bauteils. In meinem Beispiel sind bei einem unbekannten Widerstand (200 Ohm) folgende Werte berechnet worden:

Impedanz [Ω]
195,09
Phase [rad]
1,192093E-07

Eine Kontrolle mittels Multimeter ergibt einen tatsächlichen Widerstand von 199,8 Ohm. Dies entspricht einem Fehler von ~2,3%. Zum Vergleich: Mein Multimiter (Fluke 179 True RMS) hat laut Datenblatt bis 600 Ohm eine Genauigkeit von 0,9%). Nichts desto trotz ist das Ergebnis schon sehr gut. Das Datenblatt des Herstellers gibt an, dass der AD5933 die Impedanzen auf 0,5% genau bestimmen kann.


Hinweis:

Standardmäßig wird der Winkel in Radiant gespeichert! Über den Aufruf

AD5933_EnableDegree(TRUE);

kann die Winkelausgabe auf Grad umgestellt werden.


Für frequenzabhängige Bauteile besteht die Möglichkeit einen Frequenzsweep durchzuführen, um so die Impedanz über einen bestimmten Frequenzbereich zu bestimmen. In diesem Beispiel soll der Sweep bei einer Frequenz von 30 kHz beginnen und aus je 100 Schritten mit einer Schrittweite von 100 Hz durchgeführt werden.

AD5933_SweepSetup_t Config_Sweep = {
	.StartFrequency = 30000,
	.FrequencyIncrement = 100,
	.Cycles = AD5933_SWEEP_LENGTH,
	.SettlingCycles = 1,
	.Mult = AD5933_SETTLING_x1,
};

AD5933_ConfigSweep(&Config_Sweep);

Auch in diesem Fall muss der AD5933 kalibriert werden, wobei man bei einem Frequenzsweep für jeden Frequenzpunkt einen Kalibrationswert erhält.

AD5933_CalPoint_t AD5933_SweepCalibrationData[100];
AD5933_DataPoint_t AD5933_SweepImpedance[100];

const float CalibrationImpedance = 100;

AD5933_SweepCalibration(AD5933_SweepCalibrationData, CalibrationImpedance);

Das Ergebnis des Frequenzsweeps ist ein Array mit Phasen- und Impedanzinformationen für jeden Frequenzpunkt während des Sweeps.


Info:

Durch die Verwendung von frequenzabhängigen Kalibrationswerten bringt den Vorteil mit sich, dass der Frequenzgang des AD5933 mit in den Kalibrationswerten berücksichtigt wird. Ein Nachteil ist, dass die Kalibration u. U. sehr lange dauern kann und sehr viel Speicher benötigt, da ein Array aus zwei Gleitpunktzahlen gespeichert wird. Eine zeit- und speicherschonendere Variante ist eine Zweipunktkalibration, bei der an zwei Frequenzpunkten je ein Kalibrationswert berechnet und daraus die, für den Frequenzsweep notwendigen, Kalibrationswerte gebildet werden, um den Frequenzgang des AD5933 zu kompensieren.

AD5933_CalPoint_t CalA;
AD5933_CalPoint_t CalB;
		
uint32_t FreqA = 30000;
uint32_t FreqB = 60000;

AD5933_SetStartFrequency(FreqA);
AD5933_SingleCalibration(&CalA, CalibrationImpedance);

AD5933_SetStartFrequency(FreqB);
AD5933_SingleCalibration(&CalB, CalibrationImpedance);

double dF = FreqB - FreqA;
double dG = CalB.GainFactor - CalA.GainFactor;
double dP = CalB.Phase - CalA.Phase;

AD5933_SweepMeasurment2PC(dG, dF, dP, Config_Sweep.FrequencyIncrement, CalA.GainFactor, CalA.Phase, AAD5933_SweepImpedance);

Die Werten dF, dP und dG werden für die Berechnung der Kalibrationswerte desFrequenzsweeps genutzt. Diese Methode hat allerdings den Nachteil, dass der Bereich zwischen den beiden verwendeten Frequenzpunkten linearisiert wird und dadurch ein Fehler entsteht. Außerdem ist der berechnete Wert nur gültig, wenn sich die Messfrequenz in dem, für die Kalibration verwendeten, Bereich befindet.


Das komplette Beispiel steht in meinem GitHub-Repository zum Download bereit.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert