Post Go back to editing

2 Wire BIOZ Measurement using AD5941 and Adafruit Feather M0

Category: Hardware

Hi, i am developing a prototype for 2-wire bioimpedance measurement using the AD5941 in combination with an adafruit feather M0 MCU. Currently i am in a breakout-board prototyping stage and want to move to a custom PCB soon. I used the latest example code and libraries from Github and ported the ADICUP3029Port.c file and main.c file from the 2WireBIOZ example to my specific MCU in the Arduino Framework.

I expect to measure impedances of up to 15kOhm and want to measure at a single excitation frequency of 100kHz with a minimum sampling rate of 10Hz.

I followed the Application Note AN-1557, but connected the second measuring lead to AIN2, as the code example states. I am using a 10k Resistor (non precision accuracy for now, will replace that later) as RCAL and when measuring a 10k Resistor as my unknown Z  i get the following readings:

Could that deviation come from using a non-precision RCAL? Also, i would expect a Reactance much closer to 0. However, when measuring a 1k Resistor as unknown impedance i get the following readings:

How is a negative Resistance possible? Is a 1k Resistor just too small, when calibrating with 10k?

Some more general Questions:

  1. Is it necessary to split AGND and DGND for the device to work properly?
  2. Should not connected pins of the AD5941 be left floating or should they be pulled to GND?

Please also have a look at my schematic and the application parameters below for obvious errors.

Thank you and Kind Regards



Application Parameters

/* !!Change the application parameters here if you want to change it to none-default value */
void AD5940BIOZStructInit(void)
  AppBIOZCfg_Type *pBIOZCfg;


  pBIOZCfg->SeqStartAddr = 0;
  pBIOZCfg->MaxSeqLen = 512; /** @todo add checker in function */

  pBIOZCfg->DftNum = DFTNUM_8192;
  pBIOZCfg->NumOfData = -1; /* Never stop until you stop it manually by AppBIOZCtrl() function */
  pBIOZCfg->BIOZODR = 10;    /* ODR(Sample Rate) 20Hz */
  pBIOZCfg->FifoThresh = 4; /* 4 */
  pBIOZCfg->ADCSinc3Osr = ADCSINC3OSR_2;

   /* Configure Switch matrix */
  pBIOZCfg->DswitchSel = SWD_CE0; // Measuring Lead 1
  pBIOZCfg->PswitchSel = SWP_CE0;
  pBIOZCfg->NswitchSel = SWN_AIN2; // Measuring Lead 2
  pBIOZCfg->TswitchSel = SWN_AIN2;

  /* Configure Sweep parameters */
  pBIOZCfg->SweepCfg.SweepEn = bFALSE; /* Measuring at single Frequency */
  pBIOZCfg->SweepCfg.SweepStart = 1000;
  pBIOZCfg->SweepCfg.SweepStop = 200000.0;
  pBIOZCfg->SweepCfg.SweepPoints = 100; /* Max is 100 */
  pBIOZCfg->SweepCfg.SweepLog = bFALSE;
  pBIOZCfg->PwrMod = AFEPWR_HP;

  /* Configure Measurement setup */
  pBIOZCfg->SinFreq = 100000.0;
  pBIOZCfg->RcalVal = 10000.0;