Post Go back to editing

Problem in measuring impedance at lower frequency from 10 Hz to 1k Hz using AD5933

Hello everyone, I am developing an impedance measurement system using AD5933 with a microcontroller. I can measure impedance from 47 ohms to several mega ohms from frequency range 5k to 100k Hz. Now I want to measure impedance from frequency range 10 Hz to 4k Hz. I have uploaded my AFE picture. I know there are many threads related to lower frequency excitation, I have gone through them but I did not get an appropriate idea.

I have uploaded a picture below. According to my understanding after going through this table, we can measure impedance at a low-frequencies by simply giving an external clock to AD5933 pin. I have tried but it's just working for 16Mhz and 4Mhz external oscillator clock. For lower frequencies from 10Hz to 1K Hz how can we measure impedance, do we need any calculation for settling cycle register?


  • Quite an elaborate AFE you got there... The suspect would be the circuit R8R9R10C3 that acts as a low-pass filter with a time constant (R8||R9||R10)*C3 = 1.41630901288kOhm*1μF = 1.4 ms, so operating frequencies lower than a few KHz start noticeably leaking through. The suggestion would be to increase the resistors R8, R9, R10 (and, of course, R13 to keep R13/R10 ratio the same) or C3 or all the above. And prepare for long sweep duration.

    If your current number of settling cycles works for your measurements at high MCLK, there should be not need to change it at lower MCLK.

  • Thank you for your reply, I got this circuit from chabowski paper [1],  In this paper page num. 16 it is discussed that (ICA and ICB are for DC bias canceller. the voltage detectors are averaged on R8 and R9 and its correspond to DC bias voltage. 

    I think it's not an AFE problem because now I am trying to measure lower frequencies without AFE. I have measured 20kohm resistor with RFB 10kohm, it gives correct measurement from frequency sweep (5k-100k) by using 16Mhz external clock (settling cycle 0x64) and from 1khz to 5khz by using the 4Mhz external clock (settling cycle=0x0F), but when I am connecting 2Mhz external clock it acts as I have shown in video (running infinitely). but if I change the settling cycle from 0x0x0F to 0x05 it gives the result that I have shown in the image (not correct), I have measured 20kohm with 10kohm RFB. 



         Konrad Chabowski, Tomasz Piasecki, Andrzej Dzierka, Karol Nitsch

         Metrology & Measurement System, Vol. XXII (2015), No. 1, pp. 13–24.

  • Running sweep without end could indicate some I2C issue. Your movie also shows unchanging value in the right column, which is suspicious - the status register and Re and Im registers do not contain correct values or red incorrectly. People reported I2C errors at low MCLK, but below 100KHz - much lower than yours. As to number of selling cycles - it should not be zero, but that would be the only restriction.
    Again, commenting without seeing the circuit is always a crapshoot.

  • I have uploaded my circuit and external oscillator output. It's working for  16Mhz or 4Mhz, but for lower frequencies, it's not working. Now I am giving 2Mhz frequency, I want to take measurement from 300 Hz to 5000 Hz.

  • This circuit should work fine if Vexc is set at maximum and gain is set at 1x.
    Do you have control over I2C speed of your microcontroller? Something similar to, say, Arduino's Wire.setClock() function that could reduce the I2C clock below 100KHz?

  • Thanks for your reply, I am using Teensy3.2 and Arduino IDE for programming. yes, I can control the i2c speed, I have mentioned the function below. now I am using 400Khz. but minimum speed will be 100kHz,

    Vexc = 1.98Vp-p;

    gain= X1;

    Wire.begin(I2C_MASTER, 0x00, I2C_PINS_18_19, I2C_PULLUP_EXT, 400000);

  • I have tried with Arduino UNO with 50kHz i2c frequency, but I am facing the same problem.

  • AFAIK with Wire library you can go as low as 31KHz if you call Wire.setClock(31000L) after Wire.begin(). Maybe that would resolve your operation issues at low MCLK.

  • Snorlax, I think I am doing some mistake in my code, I saw the post as you mentioned above, can you please tell what is L in the picture below that must be an integer as gennyelectro said, I am using the function for frequency code I mentioned below  

    byte getFrequency(float freq, int n){
    	long val = long((freq/(MCLK/4)) * pow(2,27));
    	byte code;
    	  switch (n) {
    	    case 1:
    	      code = (val & 0xFF0000) >> 0x10; 
    	    case 2:
    	      code = (val & 0x00FF00) >> 0x08;
    	    case 3:
    	      code = (val & 0x0000FF);
    	      code = 0;
    	return code;  

  • Your function should work just fine as long as you change your global MCLK value in accordance with the clock frequency you feed the AD5933 chip.
    As to the "L" gennyelectro discussed - it is the integer number of full cycles encompassed by the 1024-long sampled sequence to eliminate the effects of the DFT artifacts. Not sure if it is directly related to your problem.

  • sorry for the late reply. I have solved my problem, Actually i was not waiting between reads.

  • Great, best of luck with the rest of your endeavor!

Reply Children
No Data