Post Go back to editing

Looking to measure current noise in EIS - AD5941

Category: Software
Product Number: AD5941

Hi, I'm looking to measure open-circuit current noise for EIS using the AD5941. Can you please confirm if the following methods are correct?

My protocol is to run a two-wire setup for a known resistor across SE, RE, and CE. 

I run an EIS measurement at a set frequency and set RTIA, and then obtain the DFT values of that known resistor. From there, I use the following equation: 

I_{RMS} = (DFT_{MAGNITUDE} * V_{DD}) / ((2^{16} - 1) * R_{TIA})

Is that equation correct for calculating the I_RMS using the DFT? I know that I don't need to measure RCAL since I'm only measuring current, but I wanted to ask to make sure.

Lastly, is the theoretical value for the I_RMS equivalent to the AC Voltage RMS divided by the sum of the known resistor and the 100 Ohms in series with SE? 

Thank you!



Added AD5941 to title.
[edited by: kbaudue at 3:31 PM (GMT -5) on 6 Feb 2024]
Parents
  • Hi,

    Since you are measuring only current,

    if using EIS example code in GitHub,

    1) you may remove below sections:

    - /* RLOAD Measurement */

    -   /* RCAL Measurement */ 

    inside measure sequence (AppIMPSeqMeasureGen()).

    2) To reduce complexity, you may not enable DFT block in measure sequence:

    AD5940_AFECtrlS(AFECTRL_ADCCNV|AFECTRL_DFT, bTRUE);  /* Start ADC convert and DFT */

    3) You may just do data process as below. It returns current input from SE. (load includes the 100ohm resistor at SE)

    static AD5940Err AppIMPDataProcess(int32_t * const pData, uint32_t *pDataCount)
    {
    uint32_t i, datacount;
    datacount = *pDataCount;
    float *pOut = (float *)pData;
    for(i=0;i<datacount;i++)
    {
    pData[i] &= 0xffff;
    pOut[i] = AppAMPCalcCurrent(pData[i]);
    }
    return AD5940ERR_OK;
    }

  • Hi Akila, 

    Is this still accounting for the AC amplitude? If I understand correctly, I use the following method: 

    1. Apply AC signal at set frequency to two-electrode configuration

    2. Poll the ADC register and NOT the DFT one

    3. Use the Current and Voltage code from the Amperometry example 

    I also have a few questions about the amperometry example: ad5940-examples/examples/AD5940_Amperometric/Amperometric.c at master · analogdevicesinc/ad5940-examples (github.com)

    AppAMPCalcVoltage uses a k-factor: 1.835/1.82 - what is the origin of these values?

    It also uses a 1.8V Ref Voltage, what pin do I measure that from? 

    The RTIA magnitude it uses, in the EIS case, is this just the RTIA I set for that measurement?

    From the current measurements, how would I obtain RMS from these values since I'm using an AC signal instead of the DC one used in Amperometry? 

    Thank you!

  • Is there a followup for this? Thank you!

  • Hi,

    1) k-factor is required because factory calibration was done at 1.835V.

    2) 1.8V Ref Voltage can be measured from VREF_1V82 pin.

    3) Could you please clarify? In EIS code, RTIA value is not used for impedance calculation. It uses ratiometric calculation. ( Rz = (1/DftRzRload - 1/DftRload)*DftRcal*RCAL)

    4) You may use the statistics block inside AD5940 to calculate mean or variance of measured data.

         Kindly refer to AD5940_StatisticCfgS(&stat_cfg) function in AD5940.c.

         For using statistics block, fifo source must to set to FIFOSRC_VAR or FIFOSRC_MEAN.

Reply
  • Hi,

    1) k-factor is required because factory calibration was done at 1.835V.

    2) 1.8V Ref Voltage can be measured from VREF_1V82 pin.

    3) Could you please clarify? In EIS code, RTIA value is not used for impedance calculation. It uses ratiometric calculation. ( Rz = (1/DftRzRload - 1/DftRload)*DftRcal*RCAL)

    4) You may use the statistics block inside AD5940 to calculate mean or variance of measured data.

         Kindly refer to AD5940_StatisticCfgS(&stat_cfg) function in AD5940.c.

         For using statistics block, fifo source must to set to FIFOSRC_VAR or FIFOSRC_MEAN.

Children
  • AppAMPCalcCurrent(), to convert to voltage and current, uses the RTIA in its function. 

    I am asking if this is the same RTIA I set when I measure the current from the ADC?

  • Hi Akila, I notice the link refers to the LPRTIA. Since I'm using the HS Loop for EIS, i wanted to quantify the current using the HS Loop. Is the process the same? Is there a calibration function for the HSRTIA or can I simply use the actual gain value of the RTIA (i.e. HSRTIA_40K = 40,000 Ohms) when calculating the current. 

    I currently have it set to apply a sinusoid voltage across a two-electrode configuration and I poll the ADC (i.e. ADCCNV) results through the SINC3 filter (i.e. AFE_ReadResult(AFERESULT_SINC3) since that is recommended to always be enabled. Or should I poll the SINC2 Notch as per the Amperometric code if I want to measure current noise?

  • Hi,

      You may use AD5940_HSRtiaCal() function defined in AD5940.c

    Sinc3 filter is used to reduce noise.

    Hence, to measure current noise, you may bypass filters as below:

    adc_filter.BpNotch = bTRUE; 
    adc_filter.BpSinc3 = bTRUE; 
    adc_filter.Sinc2NotchEnable = bTRUE

  • Hi Akila, 

    Thanks for the response! 

    Will polling the SINC3 filter after I bypass it give me the results directly from the ADC? I can't find an AFERESULT_ADC similar to AFERESULT_SINC3 and AFERESULT_SINC2NOTCH. 

    Also, do you have any recommendations for the filter settings for the calibration? For reference, here are the frequencies I'm looking to measure noise at (using 10 mV sinusoid excitation with a 1.1V bias):

    1. 200 kHz

    2. 100 kHz

    3. 10 kHz

    4. 1000 Hz

    5. 100 Hz

    6. 10 Hz

    7. 1 Hz

    8. 0.1 Hz

    Thank you!

  • Hi Akila, 

    Sorry about the inconvenience, but I wanted to ask about the open-circuit noise (measuring current without an electrochemical cell). This means applying a 0V signal and then reading the results through the ADC via the SE0 pin. 

    What settings need to be enabled / disabled such that I can achieve this 0V signal across SE0, RE0, and CE0? I ask because I know that the HSDAC has a standard 1.1V bias when not using the LPDAC, so I'm not too sure how to go about this. 

  • Hi,

    Yes. After bypassing Sinc3 filter, calling AD5940_ReadAfeResult() reads directly from ADCDAT register.

    You may refer to AD5940_GetFreqParameters() function in defined in AD5940.c for calibration filter settings w.r.t. frequency.

  • Hi,

    Kindly refer to this thread for measuring open circuit potential (VOCP): (+) AD5941 Potentiometry Basic Example and OCP Basic Example - Q&A - Precision ADCs - EngineerZone (analog.com)

    Open circuit noise current can be obtained by VOCP /RTIA  where RTIA is the feedback resistor.

  • Hi Akila, 

    The code there primarily uses the LPTIA. I was looking to measure it through the HSTIA since that's what we're running EIS on. Any direction or examples would be appreciated.

    My thought process is to disable the waveform generator and sample the SE0 pin through the ADC. The link mentioned shorting RE0 to AIN3 but in the case of EIS where I have this switch configuration: 

      sw_cfg.Dswitch = SWD_CE0;
      sw_cfg.Pswitch = SWP_RE0;
      sw_cfg.Nswitch = SWN_SE0;
      sw_cfg.Tswitch = SWT_TRTIA|SWT_SE0LOAD;
    1. If I disable the waveform generator and sample the SE0 pin through the ADC, is this effectively the same as VSE0 - VRE0 since it's already a differential measurement? If not, can you please provide an example of the proper switch configuration for sampling through AIN3?
    2. Additionally, because of the internal SE0 load, can you please confirm if this is the following formula for OCP Current noise: Vocp / (RTIA + 100) to account for the 100 Ohm load? 
    Thank you!
  • Hi Akila, 

    Just wanted to follow up on this. Along with the questions I had earlier, I had a few more:

    The examples you gave me refer to the LPTIA. For the HSTIA, it requires Vzero to be enabled via the LPDAC. Is there any way to measure it using the default 1.1V bias on the HSTIA? Would this be equivalent to 

    AD5940_ADCMuxCfgS (ADCMUXP_VSE0 ,ADCMUXN_VREF1P1); // for measurement of SE0 w.r.t. V1P1

    AD5940_ADCMuxCfgS (ADCMUXP_VRE0 ,ADCMUXN_VREF1P1); // for measurement of RE0 w.r.t. V1P1

    Can you please explain how this configuration utilizes the HSTIA? 

    Additionally, the code you provided:

    "1) Connect the two terminals of your load to AIN2 and IN3 respectively and measure the voltage across them,

    AD5940_ADCMuxCfgS(ADCMUXP_AIN3, ADCMUXN_AIN2);

    AD5940_AFECtrlS(AFECTRL_ADCPWR|AFECTRL_SINC2NOTCH, bTRUE);
    AD5940_Delay10us(16*25);
    AD5940_AFECtrlS(AFECTRL_ADCCNV, bTRUE); /* Start ADC convert*/
    AD5940_Delay10us(WaitClks);

    while (!(AD5940_INTCTestFlag(AFEINTC_1, AFEINTSRC_SINC2RDY)));

    AD5940_INTCClrFlag(AFEINTSRC_SINC2RDY);
    afeResult = AD5940_ReadAfeResult(AFERESULT_SINC2);
    AD5940_AFECtrlS(AFECTRL_ADCPWR|AFECTRL_ADCCNV|AFECTRL_SINC2NOTCH, bFALSE); /* Stop ADC */

    measured_voltage = AD5940_ADCCode2Volt(afeResult&0xffff, ADCPGA_1, 1.82);

    another way:

    1) Measure voltage of SE0 w.r.t. VERO0, (AD5940_ADCMuxCfgS (ADCMUXP_VSE0 ,ADCMUXN_VZERO0);)

    2)Measure voltage of RE0 w.r.t. VZERO0, (AD5940_ADCMuxCfgS (ADCMUXP_VRE0 ,ADCMUXN_VZERO0);)

    3) Subtract (1) from (2). "

     Utilizes a WaitClcks - but if I want to bypass the filters, what value do I use for the number of data (DATA_COUNT) and SINC3 and SINC2 OSRs? For Data_count, if I just want to conduct a single measurement, is it just a value of 1? 

    Thank you!